Mercurial > hg > RemoteEditor > vim7
comparison runtime/doc/vim2html.pl @ 0:76efa0be13f1
Initial revision
author | atsuki |
---|---|
date | Sat, 10 Nov 2007 15:07:22 +0900 |
parents | |
children | c16898406ff2 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:76efa0be13f1 |
---|---|
1 #!/usr/bin/env perl | |
2 | |
3 # converts vim documentation to simple html | |
4 # Sirtaj Singh Kang (taj@kde.org) | |
5 | |
6 # Sun Feb 24 14:49:17 CET 2002 | |
7 | |
8 use strict; | |
9 use vars qw/%url $date/; | |
10 | |
11 %url = (); | |
12 $date = `date`; | |
13 chop $date; | |
14 | |
15 sub maplink | |
16 { | |
17 my $tag = shift; | |
18 if( exists $url{ $tag } ){ | |
19 return $url{ $tag }; | |
20 } else { | |
21 #warn "Unknown hyperlink target: $tag\n"; | |
22 $tag =~ s/\.txt//; | |
23 $tag =~ s/</</g; | |
24 $tag =~ s/>/>/g; | |
25 return "<code class=\"badlink\">$tag</code>"; | |
26 } | |
27 } | |
28 | |
29 sub readTagFile | |
30 { | |
31 my($tagfile) = @_; | |
32 my( $tag, $file, $name ); | |
33 | |
34 open(TAGS,"$tagfile") || die "can't read tags\n"; | |
35 | |
36 while( <TAGS> ) { | |
37 next unless /^(\S+)\s+(\S+)\s+/; | |
38 | |
39 $tag = $1; | |
40 my $label = $tag; | |
41 ($file= $2) =~ s/.txt$/.html/g; | |
42 $label =~ s/\.txt//; | |
43 | |
44 $url{ $tag } = "<a href=\"$file#".escurl($tag)."\">".esctext($label)."</a>"; | |
45 } | |
46 close( TAGS ); | |
47 } | |
48 | |
49 sub esctext | |
50 { | |
51 my $text = shift; | |
52 $text =~ s/&/&/g; | |
53 $text =~ s/</</g; | |
54 $text =~ s/>/>/g; | |
55 return $text; | |
56 } | |
57 | |
58 sub escurl | |
59 { | |
60 my $url = shift; | |
61 $url =~ s/"/%22/g; | |
62 $url =~ s/~/%7E/g; | |
63 $url =~ s/</%3C/g; | |
64 $url =~ s/>/%3E/g; | |
65 $url =~ s/=/%20/g; | |
66 $url =~ s/#/%23/g; | |
67 $url =~ s/\//%2F/g; | |
68 | |
69 return $url; | |
70 } | |
71 | |
72 sub vim2html | |
73 { | |
74 my( $infile ) = @_; | |
75 my( $outfile ); | |
76 | |
77 open(IN, "$infile" ) || die "Couldn't read from $infile: $!.\n"; | |
78 | |
79 ($outfile = $infile) =~ s:.*/::g; | |
80 $outfile =~ s/\.txt$//g; | |
81 | |
82 open( OUT, ">$outfile.html" ) | |
83 || die "Couldn't write to $outfile.html: $!.\n"; | |
84 my $head = uc( $outfile ); | |
85 | |
86 print OUT<<EOF; | |
87 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |
88 <html> | |
89 <head> | |
90 <title>VIM: $outfile</title> | |
91 <link rel="stylesheet" href="vim-stylesheet.css" type="text/css"> | |
92 </head> | |
93 <body> | |
94 <h2>$head</h2> | |
95 <pre> | |
96 EOF | |
97 | |
98 my $inexample = 0; | |
99 while( <IN> ) { | |
100 chop; | |
101 if ( /^\s*[-=]+\s*$/ ) { | |
102 print OUT "</pre><hr><pre>"; | |
103 next; | |
104 } | |
105 | |
106 # examples | |
107 elsif( /^>$/ || /\s>$/ ) { | |
108 $inexample = 1; | |
109 chop; | |
110 } | |
111 elsif ( $inexample && /^([<\S])/ ) { | |
112 $inexample = 0; | |
113 $_ = $' if $1 eq "<"; | |
114 } | |
115 | |
116 s/\s+$//g; | |
117 | |
118 # Various vim highlights. note that < and > have already been escaped | |
119 # so that HTML doesn't get screwed up. | |
120 | |
121 my @out = (); | |
122 # print "Text: $_\n"; | |
123 LOOP: | |
124 foreach my $token ( split /((?:\|[^\|]+\|)|(?:\*[^\*]+\*))/ ) { | |
125 if ( $token =~ /^\|([^\|]+)\|/ ) { | |
126 # link | |
127 push( @out, "|".maplink( $1 )."|" ); | |
128 next LOOP; | |
129 } | |
130 elsif ( $token =~ /^\*([^\*]+)\*/ ) { | |
131 # target | |
132 push( @out, | |
133 "<b class=\"vimtag\">\*<a name=\"".escurl($1)."\">".esctext($1)."<\/a>\*<\/b>"); | |
134 next LOOP; | |
135 } | |
136 | |
137 $_ = esctext($token); | |
138 s/CTRL-(\w+)/<code class="keystroke">CTRL-$1<\/code>/g; | |
139 # parameter <...> | |
140 s/<(.*?)>/<code class="special"><$1><\/code>/g; | |
141 | |
142 # parameter {...} | |
143 s/\{([^}]*)\}/<code class="special">{$1}<\/code>/g; | |
144 | |
145 # parameter [...] | |
146 s/\[(range|line|count|offset|cmd|[-+]?num)\]/<code class="special">\[$1\]<\/code>/g; | |
147 # note | |
148 s/(Note:?)/<code class="note">$1<\/code>/gi; | |
149 | |
150 # local heading | |
151 s/^(.*)\~$/<code class="section">$1<\/code>/g; | |
152 push( @out, $_ ); | |
153 } | |
154 | |
155 $_ = join( "", @out ); | |
156 | |
157 if( $inexample == 2 ) { | |
158 print OUT "<code class=\"example\">$_</code>\n"; | |
159 } else { | |
160 print OUT $_,"\n"; | |
161 } | |
162 | |
163 $inexample = 2 if $inexample == 1; | |
164 } | |
165 print OUT<<EOF; | |
166 </pre> | |
167 <p><i>Generated by vim2html on $date</i></p> | |
168 </body> | |
169 </html> | |
170 EOF | |
171 | |
172 } | |
173 | |
174 sub usage | |
175 { | |
176 die<<EOF; | |
177 vim2html.pl: converts vim documentation to HTML. | |
178 usage: | |
179 | |
180 vim2html.pl <tag file> <text files> | |
181 EOF | |
182 } | |
183 | |
184 | |
185 sub writeCSS | |
186 { | |
187 open( CSS, ">vim-stylesheet.css" ) || die "Couldn't write stylesheet: $!\n"; | |
188 print CSS<<EOF; | |
189 body { background-color: white; color: black;} | |
190 :link { color: rgb(0,137,139); } | |
191 :visited { color: rgb(0,100,100); | |
192 background-color: white; /* should be inherit */ } | |
193 :active { color: rgb(0,200,200); | |
194 background-color: white; /* should be inherit */ } | |
195 | |
196 B.vimtag { color : rgb(250,0,250); } | |
197 | |
198 h1, h2 { color: rgb(82,80,82); text-align: center; } | |
199 h3, h4, h5, h6 { color: rgb(82,80,82); } | |
200 .headline { color: rgb(0,137,139); } | |
201 .header { color: rgb(164, 32, 246); } | |
202 .section { color: rgb(164, 32, 246); } | |
203 .keystroke { color: rgb(106, 89, 205); } | |
204 .vim { } | |
205 .example { color: rgb(0, 0, 255); } | |
206 .option { } | |
207 .notvi { } | |
208 .special { color: rgb(106, 89, 205); } | |
209 .note { color: blue; background-color: yellow; } | |
210 .sub {} | |
211 .badlink { color: rgb(0,37,39); } | |
212 EOF | |
213 | |
214 } | |
215 | |
216 # main | |
217 usage() if $#ARGV < 2; | |
218 | |
219 print "Processing tags...\n"; | |
220 readTagFile( $ARGV[ 0 ] ); | |
221 | |
222 foreach my $file ( 1..$#ARGV ) { | |
223 print "Processing ".$ARGV[ $file ]."...\n"; | |
224 vim2html( $ARGV[ $file ] ); | |
225 } | |
226 print "Writing stylesheet...\n"; | |
227 writeCSS(); | |
228 print "done.\n" |