#!/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 } # mainusage() 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"
#!/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"