123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- #!/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 < 1;
- 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"
|