mirror of
				https://github.com/vim/vim.git
				synced 2025-10-28 09:27:14 -04:00 
			
		
		
		
	* Makefile for the Vim documentation on Windows * Corrected comments Signed-off-by: Christian Brabandt <cb@256bit.org>
		
			
				
	
	
		
			239 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			4.9 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 warnings;
 | |
| use vars qw/%url $date/;
 | |
| 
 | |
| %url = ();
 | |
| # 30.11.23, Restorer:
 | |
| # This command does not work in OS Windows.
 | |
| # The "date" command in Windows is different from its counterpart in UNIX-like systems.
 | |
| # The closest analog is the "date /t" command, but how it would work in UNIX,
 | |
| # I don't know. I've corrected it as best I can. I don't know Perl.
 | |
| #$date = `date`;
 | |
| #chop $date;
 | |
| my ($year) = 1900 + (localtime())[5];
 | |
| my ($month) = 1 + (localtime())[4];
 | |
| my ($day) = (localtime())[3];
 | |
| #$date = localtime(); # outputs like this Fri Nov 3 00:56:59 2023
 | |
| 
 | |
| 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 $day.$month.$year</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"
 |