| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | #!/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; | 
					
						
							| 
									
										
										
										
											2023-11-04 08:57:09 +00:00
										 |  |  | use warnings; | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | use vars qw/%url $date/; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | %url = (); | 
					
						
							| 
									
										
										
										
											2023-11-04 08:57:09 +00:00
										 |  |  | # 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 | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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> | 
					
						
							| 
									
										
										
										
											2023-11-04 08:57:09 +00:00
										 |  |  | <p><i>Generated by vim2html on $day.$month.$year</i></p> | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | </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 | 
					
						
							| 
									
										
										
										
											2010-11-16 20:34:40 +01:00
										 |  |  | usage() if $#ARGV < 1; | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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" |