xref: /vim-8.2.3635/runtime/doc/vim2html.pl (revision 166af9bb)
1071d4279SBram Moolenaar#!/usr/bin/env perl
2071d4279SBram Moolenaar
3071d4279SBram Moolenaar# converts vim documentation to simple html
4071d4279SBram Moolenaar# Sirtaj Singh Kang ([email protected])
5071d4279SBram Moolenaar
6071d4279SBram Moolenaar# Sun Feb 24 14:49:17 CET 2002
7071d4279SBram Moolenaar
8071d4279SBram Moolenaaruse strict;
9071d4279SBram Moolenaaruse vars qw/%url $date/;
10071d4279SBram Moolenaar
11071d4279SBram Moolenaar%url = ();
12071d4279SBram Moolenaar$date = `date`;
13071d4279SBram Moolenaarchop $date;
14071d4279SBram Moolenaar
15071d4279SBram Moolenaarsub maplink
16071d4279SBram Moolenaar{
17071d4279SBram Moolenaar	my $tag = shift;
18071d4279SBram Moolenaar	if( exists $url{ $tag } ){
19071d4279SBram Moolenaar		return $url{ $tag };
20071d4279SBram Moolenaar	} else {
21071d4279SBram Moolenaar		#warn "Unknown hyperlink target: $tag\n";
22071d4279SBram Moolenaar		$tag =~ s/\.txt//;
23071d4279SBram Moolenaar		$tag =~ s/</&lt;/g;
24071d4279SBram Moolenaar		$tag =~ s/>/&gt;/g;
25071d4279SBram Moolenaar		return "<code class=\"badlink\">$tag</code>";
26071d4279SBram Moolenaar	}
27071d4279SBram Moolenaar}
28071d4279SBram Moolenaar
29071d4279SBram Moolenaarsub readTagFile
30071d4279SBram Moolenaar{
31071d4279SBram Moolenaar	my($tagfile) = @_;
32071d4279SBram Moolenaar	my( $tag, $file, $name );
33071d4279SBram Moolenaar
34071d4279SBram Moolenaar	open(TAGS,"$tagfile") || die "can't read tags\n";
35071d4279SBram Moolenaar
36071d4279SBram Moolenaar	while( <TAGS> ) {
37071d4279SBram Moolenaar		next unless /^(\S+)\s+(\S+)\s+/;
38071d4279SBram Moolenaar
39071d4279SBram Moolenaar		$tag = $1;
40071d4279SBram Moolenaar		my $label = $tag;
41071d4279SBram Moolenaar		($file= $2) =~ s/.txt$/.html/g;
42071d4279SBram Moolenaar		$label =~ s/\.txt//;
43071d4279SBram Moolenaar
44071d4279SBram Moolenaar		$url{ $tag } = "<a href=\"$file#".escurl($tag)."\">".esctext($label)."</a>";
45071d4279SBram Moolenaar	}
46071d4279SBram Moolenaar	close( TAGS );
47071d4279SBram Moolenaar}
48071d4279SBram Moolenaar
49071d4279SBram Moolenaarsub esctext
50071d4279SBram Moolenaar{
51071d4279SBram Moolenaar	my $text = shift;
52071d4279SBram Moolenaar	$text =~ s/&/&amp;/g;
53071d4279SBram Moolenaar	$text =~ s/</&lt;/g;
54071d4279SBram Moolenaar	$text =~ s/>/&gt;/g;
55071d4279SBram Moolenaar	return $text;
56071d4279SBram Moolenaar}
57071d4279SBram Moolenaar
58071d4279SBram Moolenaarsub escurl
59071d4279SBram Moolenaar{
60071d4279SBram Moolenaar	my $url = shift;
61071d4279SBram Moolenaar	$url =~ s/"/%22/g;
62071d4279SBram Moolenaar	$url =~ s/~/%7E/g;
63071d4279SBram Moolenaar	$url =~ s/</%3C/g;
64071d4279SBram Moolenaar	$url =~ s/>/%3E/g;
65071d4279SBram Moolenaar	$url =~ s/=/%20/g;
66071d4279SBram Moolenaar	$url =~ s/#/%23/g;
67071d4279SBram Moolenaar	$url =~ s/\//%2F/g;
68071d4279SBram Moolenaar
69071d4279SBram Moolenaar	return $url;
70071d4279SBram Moolenaar}
71071d4279SBram Moolenaar
72071d4279SBram Moolenaarsub vim2html
73071d4279SBram Moolenaar{
74071d4279SBram Moolenaar	my( $infile ) = @_;
75071d4279SBram Moolenaar	my( $outfile );
76071d4279SBram Moolenaar
77071d4279SBram Moolenaar	open(IN, "$infile" ) || die "Couldn't read from $infile: $!.\n";
78071d4279SBram Moolenaar
79071d4279SBram Moolenaar	($outfile = $infile) =~ s:.*/::g;
80071d4279SBram Moolenaar	$outfile =~ s/\.txt$//g;
81071d4279SBram Moolenaar
82071d4279SBram Moolenaar	open( OUT, ">$outfile.html" )
83071d4279SBram Moolenaar			|| die "Couldn't write to $outfile.html: $!.\n";
84071d4279SBram Moolenaar	my $head = uc( $outfile );
85071d4279SBram Moolenaar
86071d4279SBram Moolenaar	print OUT<<EOF;
87071d4279SBram Moolenaar<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
88071d4279SBram Moolenaar<html>
89071d4279SBram Moolenaar<head>
90071d4279SBram Moolenaar<title>VIM: $outfile</title>
91071d4279SBram Moolenaar<link rel="stylesheet" href="vim-stylesheet.css" type="text/css">
92071d4279SBram Moolenaar</head>
93071d4279SBram Moolenaar<body>
94071d4279SBram Moolenaar<h2>$head</h2>
95071d4279SBram Moolenaar<pre>
96071d4279SBram MoolenaarEOF
97071d4279SBram Moolenaar
98071d4279SBram Moolenaar	my $inexample = 0;
99071d4279SBram Moolenaar	while( <IN> ) {
100071d4279SBram Moolenaar		chop;
101071d4279SBram Moolenaar		if ( /^\s*[-=]+\s*$/ ) {
102071d4279SBram Moolenaar			print OUT "</pre><hr><pre>";
103071d4279SBram Moolenaar			next;
104071d4279SBram Moolenaar		}
105071d4279SBram Moolenaar
106071d4279SBram Moolenaar		# examples
107071d4279SBram Moolenaar		elsif( /^>$/ || /\s>$/ ) {
108071d4279SBram Moolenaar			$inexample = 1;
109071d4279SBram Moolenaar			chop;
110071d4279SBram Moolenaar		}
111071d4279SBram Moolenaar		elsif ( $inexample && /^([<\S])/ ) {
112071d4279SBram Moolenaar			$inexample = 0;
113071d4279SBram Moolenaar			$_ = $' if $1 eq "<";
114071d4279SBram Moolenaar		}
115071d4279SBram Moolenaar
116071d4279SBram Moolenaar		s/\s+$//g;
117071d4279SBram Moolenaar
118071d4279SBram Moolenaar		# Various vim highlights. note that < and > have already been escaped
119071d4279SBram Moolenaar		# so that HTML doesn't get screwed up.
120071d4279SBram Moolenaar
121071d4279SBram Moolenaar		my @out = ();
122071d4279SBram Moolenaar		#		print "Text: $_\n";
123071d4279SBram Moolenaar		LOOP:
124071d4279SBram Moolenaar		foreach my $token ( split /((?:\|[^\|]+\|)|(?:\*[^\*]+\*))/ ) {
125071d4279SBram Moolenaar			if ( $token =~ /^\|([^\|]+)\|/ ) {
126071d4279SBram Moolenaar				# link
127071d4279SBram Moolenaar				push( @out, "|".maplink( $1 )."|" );
128071d4279SBram Moolenaar				next LOOP;
129071d4279SBram Moolenaar			}
130071d4279SBram Moolenaar			elsif ( $token =~ /^\*([^\*]+)\*/ ) {
131071d4279SBram Moolenaar				# target
132071d4279SBram Moolenaar				push( @out,
133071d4279SBram Moolenaar					"<b class=\"vimtag\">\*<a name=\"".escurl($1)."\">".esctext($1)."<\/a>\*<\/b>");
134071d4279SBram Moolenaar				next LOOP;
135071d4279SBram Moolenaar			}
136071d4279SBram Moolenaar
137071d4279SBram Moolenaar			$_ = esctext($token);
138071d4279SBram Moolenaar			s/CTRL-(\w+)/<code class="keystroke">CTRL-$1<\/code>/g;
139071d4279SBram Moolenaar			# parameter <...>
140071d4279SBram Moolenaar			s/&lt;(.*?)&gt;/<code class="special">&lt;$1&gt;<\/code>/g;
141071d4279SBram Moolenaar
142071d4279SBram Moolenaar			# parameter {...}
143071d4279SBram Moolenaar			s/\{([^}]*)\}/<code class="special">{$1}<\/code>/g;
144071d4279SBram Moolenaar
145071d4279SBram Moolenaar			# parameter [...]
146071d4279SBram Moolenaar			s/\[(range|line|count|offset|cmd|[-+]?num)\]/<code class="special">\[$1\]<\/code>/g;
147071d4279SBram Moolenaar			# note
148071d4279SBram Moolenaar			s/(Note:?)/<code class="note">$1<\/code>/gi;
149071d4279SBram Moolenaar
150071d4279SBram Moolenaar			# local heading
151071d4279SBram Moolenaar			s/^(.*)\~$/<code class="section">$1<\/code>/g;
152071d4279SBram Moolenaar			push( @out, $_ );
153071d4279SBram Moolenaar		}
154071d4279SBram Moolenaar
155071d4279SBram Moolenaar		$_ = join( "", @out );
156071d4279SBram Moolenaar
157071d4279SBram Moolenaar		if( $inexample == 2 ) {
158071d4279SBram Moolenaar			print OUT "<code class=\"example\">$_</code>\n";
159071d4279SBram Moolenaar		} else {
160071d4279SBram Moolenaar			print OUT $_,"\n";
161071d4279SBram Moolenaar		}
162071d4279SBram Moolenaar
163071d4279SBram Moolenaar		$inexample = 2 if $inexample == 1;
164071d4279SBram Moolenaar	}
165071d4279SBram Moolenaar	print OUT<<EOF;
166071d4279SBram Moolenaar</pre>
167071d4279SBram Moolenaar<p><i>Generated by vim2html on $date</i></p>
168071d4279SBram Moolenaar</body>
169071d4279SBram Moolenaar</html>
170071d4279SBram MoolenaarEOF
171071d4279SBram Moolenaar
172071d4279SBram Moolenaar}
173071d4279SBram Moolenaar
174071d4279SBram Moolenaarsub usage
175071d4279SBram Moolenaar{
176071d4279SBram Moolenaardie<<EOF;
177071d4279SBram Moolenaarvim2html.pl: converts vim documentation to HTML.
178071d4279SBram Moolenaarusage:
179071d4279SBram Moolenaar
180071d4279SBram Moolenaar	vim2html.pl <tag file> <text files>
181071d4279SBram MoolenaarEOF
182071d4279SBram Moolenaar}
183071d4279SBram Moolenaar
184071d4279SBram Moolenaar
185071d4279SBram Moolenaarsub writeCSS
186071d4279SBram Moolenaar{
187071d4279SBram Moolenaar	open( CSS, ">vim-stylesheet.css"  ) || die "Couldn't write stylesheet: $!\n";
188071d4279SBram Moolenaar	print CSS<<EOF;
189071d4279SBram Moolenaarbody { background-color: white; color: black;}
190071d4279SBram Moolenaar:link { color: rgb(0,137,139); }
191071d4279SBram Moolenaar:visited { color: rgb(0,100,100);
192071d4279SBram Moolenaar           background-color: white; /* should be inherit */ }
193071d4279SBram Moolenaar:active { color: rgb(0,200,200);
194071d4279SBram Moolenaar          background-color: white; /* should be inherit */ }
195071d4279SBram Moolenaar
196071d4279SBram MoolenaarB.vimtag { color : rgb(250,0,250); }
197071d4279SBram Moolenaar
198071d4279SBram Moolenaarh1, h2 { color: rgb(82,80,82); text-align: center; }
199071d4279SBram Moolenaarh3, h4, h5, h6 { color: rgb(82,80,82); }
200071d4279SBram Moolenaar.headline { color: rgb(0,137,139); }
201071d4279SBram Moolenaar.header { color: rgb(164, 32, 246); }
202071d4279SBram Moolenaar.section { color: rgb(164, 32, 246); }
203071d4279SBram Moolenaar.keystroke { color: rgb(106, 89, 205); }
204071d4279SBram Moolenaar.vim { }
205071d4279SBram Moolenaar.example { color: rgb(0, 0, 255); }
206071d4279SBram Moolenaar.option { }
207071d4279SBram Moolenaar.notvi { }
208071d4279SBram Moolenaar.special { color: rgb(106, 89, 205); }
209071d4279SBram Moolenaar.note { color: blue; background-color: yellow; }
210071d4279SBram Moolenaar.sub {}
211071d4279SBram Moolenaar.badlink { color: rgb(0,37,39); }
212071d4279SBram MoolenaarEOF
213071d4279SBram Moolenaar
214071d4279SBram Moolenaar}
215071d4279SBram Moolenaar
216071d4279SBram Moolenaar# main
217*166af9bbSBram Moolenaarusage() if $#ARGV < 1;
218071d4279SBram Moolenaar
219071d4279SBram Moolenaarprint "Processing tags...\n";
220071d4279SBram MoolenaarreadTagFile( $ARGV[ 0 ] );
221071d4279SBram Moolenaar
222071d4279SBram Moolenaarforeach my $file ( 1..$#ARGV ) {
223071d4279SBram Moolenaar	print "Processing ".$ARGV[ $file ]."...\n";
224071d4279SBram Moolenaar	vim2html( $ARGV[ $file ] );
225071d4279SBram Moolenaar}
226071d4279SBram Moolenaarprint "Writing stylesheet...\n";
227071d4279SBram MoolenaarwriteCSS();
228071d4279SBram Moolenaarprint "done.\n"
229