test-ly-files: Display symlink creation, add `-v` to `ln`
[sunny256-utils.git] / hf
blobcb06e8b8cc7a8ba17cc57108276ed41152331af6
1 #!/usr/bin/env perl
3 #=======================================================================
4 # hf
5 # File ID: 2a71fba8-5d3b-11df-b18b-90e6ba3022ac
6 # Formatterer HTML-source med mellomrom eller tabulator.
8 # Laget av Øyvind A. Holm <sunny@sunbase.org>
9 # Lisens: GNU General Public License versjon 2 eller nyere
11 # FIXME: Hvis start+end-elementer står på samme linje, blir ikke
12 # innrykket rett. En eller annen rekursiv sjekk på linjene må kanskje
13 # gjøres. Foreløpig får man sette dem på hver sin linje.
14 #=======================================================================
16 use strict;
17 use warnings;
18 use Getopt::Std;
20 my $STD_SPACE = 2;
22 our ($opt_a, $opt_E, $opt_h, $opt_H, $opt_i, $opt_s, $opt_t, $opt_w) =
23 ( 0, 0, 0, 0, 0, 0, 0, 0);
24 our $opt_n = $STD_SPACE;
26 getopts('aEhHi:n:stw');
28 my $is_pre = 0;
29 my $prog_name = $0;
30 $prog_name =~ s#.*/(.+?)$#$1#;
32 print_help() if ($main::opt_h);
34 $| = 1;
36 my $Tabs = "";
37 my $Spaces = " " x $opt_n;
38 $opt_t || ($opt_a = 1);
39 my $tab_indent = $main::opt_i;
40 my $orig_line = "";
41 my @Elements = (
42 "applet", "blockquote", "body", "caption", "center", "colgroup",
43 "div", "dl", "form", "frameset", "html", "map", "noframes",
44 "noscript", "ol", "select", "table", "tbody", "td", "tfoot", "th",
45 "thead", "tr", "ul"
47 my $pre_exp="head|pre|script|rdf:RDF";
49 $tab_indent = 0 if ($tab_indent <= 0);
51 for (; $tab_indent; $tab_indent--) {
52 $Tabs .= "\t";
55 my $line_exp = $main::opt_a ? '^\s+(.*)' : '^\t+(.*)';
56 my $header_indent = "";
58 LINE: while (<>) {
59 # {{{
60 chomp;
61 my $Line = $_;
62 my $Element = "";
63 my $f = "";
64 my $out_line;
66 # Ignorer linjer som begynner med % hvis -s er spesifisert
67 $main::opt_s && ($Line =~ /^%/) && (print($Line), next LINE);
69 unless ($is_pre) {
70 # $Line =~ $main::opt_s ? s/^\s+(.*?)\s+$/$1/ : s/^\t+(.*)/$1/;
71 $Line =~ s/$line_exp/$1/;
72 if ($main::opt_H && $Line =~ /<h([1-6]).*?>/i) {
73 $header_indent = "\t" x ($1-1);
75 ($Line =~ m!</body>!i) && ($header_indent = "");
76 unless ($opt_E) {
77 for $f (@Elements) {
78 if ($Line =~ m!</($f)([ >])!i) {
79 # Slutt-tag ble funnet {{{
80 $Element = $1;
81 $tab_indent--;
82 $Tabs =~ s/\t$//;
83 # $Line =~ s/($Element)/sprintf("\n%s%s", $Tabs, $1)/gei;
84 # }}}
88 $out_line = "$header_indent$Tabs$Line";
90 # Fjern alle whitespace på slutten
91 $opt_w && $out_line =~ s/[ \t]+$//g;
93 # Hvis -t i̲k̲k̲e̲ er spesifisert, vil vi ikke ha TAB’er og de skal
94 # dermed erstattes med space.
95 $opt_t || ($out_line =~ s/\t/$Spaces/g);
97 # Linjer som bare har whitespace tømmer vi. Det er mest
98 # sannsynlig et resultat av indentinga.
99 $out_line =~ s/^[ \t]+$//;
101 print("$out_line\n");
102 unless ($opt_E) {
103 for $f (@Elements) {
104 if ($Line =~ m!<($f)([ >])!i) {
105 # Start-tag ble funnet {{{
106 $Element = $1;
107 $tab_indent++;
108 $Tabs .= "\t";
109 # $Line =~ s/($Element)/sprintf("\n%s%s", $Tabs, $1)/gei;
110 # }}}
114 } else {
115 print("$_\n");
117 $is_pre = 1 if ($Line =~ /<($pre_exp)\b.*>/i);
118 $is_pre = 0 if ($Line =~ m!</($pre_exp)>!i);
119 # }}}
122 sub print_help {
123 # {{{
124 print <<END;
126 HTML formatter
127 Syntax: $0 [valg] [filer [...]]
129 Options:
130 -a Fjern space i begynnelsen av linja også før indenting. Funker
131 bare sammen med «-t»-parameteret. Utenom det er den bestandig
132 på, det vil si at alle spacer skvises.
133 -h Vis denne hjelpen
134 -H Legg til en TAB for hver <h1>, <h2>, <h3> osv for å lettere se
135 strukturen i dokumentet.
136 -i n Start med n TAB’er som indent
137 -n x Bruk x spacer som indent. Standard verdi er $STD_SPACE.
138 Ignoreres hvis «-t»-parameteret brukes.
139 -w Fjern whitespace på slutten av linjene
140 -s Dropp linjer som her en % i starten. Det er datafilene på
141 www.sunbase.org som er sånn.
142 -t Sett inn TAB istedenfor space, akkurat som i gamle dager.
145 exit(0);
146 # }}}
149 =pod
151 =head1 LICENCE
153 This program is free software; you can redistribute it and/or modify it
154 under the terms of the GNU General Public License as published by the
155 Free Software Foundation; either version 2 of the License, or (at your
156 option) any later version.
158 This program is distributed in the hope that it will be useful, but
159 WITHOUT ANY WARRANTY; without even the implied warranty of
160 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
161 See the GNU General Public License for more details.
163 You should have received a copy of the GNU General Public License along
164 with this program; if not, write to the Free Software Foundation, Inc.,
165 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
167 =cut
169 # vim: set ft=perl sw=4 ts=4 sts=4 et fenc=utf8 :
170 # End of file hf