229 lines
4.4 KiB
Perl
229 lines
4.4 KiB
Perl
|
#!/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"
|