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/</</g; 24071d4279SBram Moolenaar $tag =~ s/>/>/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/&/&/g; 53071d4279SBram Moolenaar $text =~ s/</</g; 54071d4279SBram Moolenaar $text =~ s/>/>/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/<(.*?)>/<code class="special"><$1><\/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