Mercurial > vim
view runtime/doc/vim2html.pl @ 34257:8a91d18f1789 v9.1.0069
patch 9.1.0069: ScreenLines may not be correctly initialized, causing hang
Commit: https://github.com/vim/vim/commit/fd472655a93fd539c731c8daf3adc4e65ddce341
Author: Olaf Seibert <rhialto@falu.nl>
Date: Thu Feb 1 21:11:16 2024 +0100
patch 9.1.0069: ScreenLines may not be correctly initialized, causing hang
Problem: ScreenLines may not be correctly initialized, causing hang
(Olaf Seibert, after 9.0.0220)
Solution: always initialize ScreneLines when allocating a screen
(Olaf Seibert)
ScreenLines and related structures could be left uninitialized
causing a screen update to run into an infinite loop when using latin1
encoding.
Partly caused because by patch 9.0.0220, which makes mb_ptr2len return
zero for NUL
related: #12671
closes: #13946
Signed-off-by: Olaf Seibert <rhialto@falu.nl>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 01 Feb 2024 21:30:02 +0100 |
parents | e09acb1daea7 |
children |
line wrap: on
line source
#!/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"