diff options
Diffstat (limited to 'runtime/doc/vim2html.pl')
-rw-r--r-- | runtime/doc/vim2html.pl | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/runtime/doc/vim2html.pl b/runtime/doc/vim2html.pl new file mode 100644 index 000000000..ddb1c4623 --- /dev/null +++ b/runtime/doc/vim2html.pl @@ -0,0 +1,229 @@ +#!/usr/bin/env perl + +# converts vim documentation to simple html +# Sirtaj Singh Kang (taj@kde.org) + +# Sun Feb 24 14:49:17 CET 2002 + +use strict; +use vars qw/%url $date/; + +%url = (); +$date = `date`; +chop $date; + +sub maplink +{ + my $tag = shift; + if( exists $url{ $tag } ){ + return $url{ $tag }; + } else { + #warn "Unknown hyperlink target: $tag\n"; + $tag =~ s/\.txt//; + $tag =~ s/</</g; + $tag =~ s/>/>/g; + return "<code class=\"badlink\">$tag</code>"; + } +} + +sub readTagFile +{ + my($tagfile) = @_; + my( $tag, $file, $name ); + + open(TAGS,"$tagfile") || die "can't read tags\n"; + + while( <TAGS> ) { + next unless /^(\S+)\s+(\S+)\s+/; + + $tag = $1; + my $label = $tag; + ($file= $2) =~ s/.txt$/.html/g; + $label =~ s/\.txt//; + + $url{ $tag } = "<a href=\"$file#".escurl($tag)."\">".esctext($label)."</a>"; + } + close( TAGS ); +} + +sub esctext +{ + my $text = shift; + $text =~ s/&/&/g; + $text =~ s/</</g; + $text =~ s/>/>/g; + return $text; +} + +sub escurl +{ + my $url = shift; + $url =~ s/"/%22/g; + $url =~ s/~/%7E/g; + $url =~ s/</%3C/g; + $url =~ s/>/%3E/g; + $url =~ s/=/%20/g; + $url =~ s/#/%23/g; + $url =~ s/\//%2F/g; + + return $url; +} + +sub vim2html +{ + my( $infile ) = @_; + my( $outfile ); + + open(IN, "$infile" ) || die "Couldn't read from $infile: $!.\n"; + + ($outfile = $infile) =~ s:.*/::g; + $outfile =~ s/\.txt$//g; + + open( OUT, ">$outfile.html" ) + || die "Couldn't write to $outfile.html: $!.\n"; + my $head = uc( $outfile ); + + print OUT<<EOF; +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>VIM: $outfile</title> +<link rel="stylesheet" href="vim-stylesheet.css" type="text/css"> +</head> +<body> +<h2>$head</h2> +<pre> +EOF + + my $inexample = 0; + while( <IN> ) { + chop; + if ( /^\s*[-=]+\s*$/ ) { + print OUT "</pre><hr><pre>"; + next; + } + + # examples + elsif( /^>$/ || /\s>$/ ) { + $inexample = 1; + chop; + } + elsif ( $inexample && /^([<\S])/ ) { + $inexample = 0; + $_ = $' if $1 eq "<"; + } + + s/\s+$//g; + + # Various vim highlights. note that < and > have already been escaped + # so that HTML doesn't get screwed up. + + my @out = (); + # print "Text: $_\n"; + LOOP: + foreach my $token ( split /((?:\|[^\|]+\|)|(?:\*[^\*]+\*))/ ) { + if ( $token =~ /^\|([^\|]+)\|/ ) { + # link + push( @out, "|".maplink( $1 )."|" ); + next LOOP; + } + elsif ( $token =~ /^\*([^\*]+)\*/ ) { + # target + push( @out, + "<b class=\"vimtag\">\*<a name=\"".escurl($1)."\">".esctext($1)."<\/a>\*<\/b>"); + next LOOP; + } + + $_ = esctext($token); + s/CTRL-(\w+)/<code class="keystroke">CTRL-$1<\/code>/g; + # parameter <...> + s/<(.*?)>/<code class="special"><$1><\/code>/g; + + # parameter {...} + s/\{([^}]*)\}/<code class="special">{$1}<\/code>/g; + + # parameter [...] + s/\[(range|line|count|offset|cmd|[-+]?num)\]/<code class="special">\[$1\]<\/code>/g; + # note + s/(Note:?)/<code class="note">$1<\/code>/gi; + + # local heading + s/^(.*)\~$/<code class="section">$1<\/code>/g; + push( @out, $_ ); + } + + $_ = join( "", @out ); + + if( $inexample == 2 ) { + print OUT "<code class=\"example\">$_</code>\n"; + } else { + print OUT $_,"\n"; + } + + $inexample = 2 if $inexample == 1; + } + print OUT<<EOF; +</pre> +<p><i>Generated by vim2html on $date</i></p> +</body> +</html> +EOF + +} + +sub usage +{ +die<<EOF; +vim2html.pl: converts vim documentation to HTML. +usage: + + vim2html.pl <tag file> <text files> +EOF +} + + + +sub writeCSS +{ + open( CSS, ">vim-stylesheet.css" ) || die "Couldn't write stylesheet: $!\n"; + print CSS<<EOF; +body { background-color: white; color: black;} +:link { color: rgb(0,137,139); } +:visited { color: rgb(0,100,100); + background-color: white; /* should be inherit */ } +:active { color: rgb(0,200,200); + background-color: white; /* should be inherit */ } + +B.vimtag { color : rgb(250,0,250); } + +h1, h2 { color: rgb(82,80,82); text-align: center; } +h3, h4, h5, h6 { color: rgb(82,80,82); } +.headline { color: rgb(0,137,139); } +.header { color: rgb(164, 32, 246); } +.section { color: rgb(164, 32, 246); } +.keystroke { color: rgb(106, 89, 205); } +.vim { } +.example { color: rgb(0, 0, 255); } +.option { } +.notvi { } +.special { color: rgb(106, 89, 205); } +.note { color: blue; background-color: yellow; } +.sub {} +.badlink { color: rgb(0,37,39); } +EOF + +} + +# main +usage() if $#ARGV < 2; + +print "Processing tags...\n"; +readTagFile( $ARGV[ 0 ] ); + +foreach my $file ( 1..$#ARGV ) { + print "Processing ".$ARGV[ $file ]."...\n"; + vim2html( $ARGV[ $file ] ); +} +print "Writing stylesheet...\n"; +writeCSS(); +print "done.\n" |