diff options
| author | mstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652> | 2015-10-21 14:19:35 +0000 | 
|---|---|---|
| committer | mstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652> | 2015-10-21 14:19:35 +0000 | 
| commit | cff819e3c64b19873746fdeb4307d3e6f0a66ff2 (patch) | |
| tree | 81fb67b8ae27a69515de4cf07233f743cea8c34c | |
| parent | 3d96d1607efab99a484e73a1b15a71c350fbe7cb (diff) | |
Revert: makediff: cleanup using begingroup/endgroup
This reverts commit
	commit ef519a86f046d1be22f82f32d845653a850c21dd
	Author: mstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652>
	Date:   Thu Jun 26 16:50:13 2014 +0000
	makediff: cleanup using begingroup/endgroup
This seemed like a good idea originally: replace perl hacks with
tex hacks. However adding \begingroup and \endgroup within macros
used by latex-diff breaks its assumption that these are low level
tex and can be used in arbitrary situations, e.g.  cross the
boundaries of environments, use mis-matching begin and end
instructions (DIFaddbegin with DIFaddendFL), etc.
Let's go back to the original work-around:
commit b665b3165b454b98c782617e37a128b53b56c89c
Author: mstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652>
Date:   Thu Jun 26 12:34:38 2014 +0000
    work around xetex bug
    Too many \color directives produce corrupted output
    and this warning:
    WARNING ** Color stack overflow. Just ignore.
    Use script to reduce # of these directives.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
git-svn-id: https://tools.oasis-open.org/version-control/svn/virtio/branches/v1.0@545 0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652
| -rw-r--r-- | diffpreamble.tex | 11 | ||||
| -rw-r--r-- | fixupdiff.pl | 74 | 
2 files changed, 24 insertions, 61 deletions
diff --git a/diffpreamble.tex b/diffpreamble.tex index 9b5b7e5..f7b5cec 100644 --- a/diffpreamble.tex +++ b/diffpreamble.tex @@ -8,10 +8,13 @@  %DIF COLOR PREAMBLE  \RequirePackage{color} -\providecommand{\DIFaddbegin}{\begingroup\color{green}\hypersetup{linkcolor=green,urlcolor=green}} -\providecommand{\DIFaddend}{\hypersetup{linkcolor=blue,urlcolor=blue}\endgroup} -\providecommand{\DIFdelbegin}{\begingroup\color{red}\hypersetup{linkcolor=red,urlcolor=red}} -\providecommand{\DIFdelend}{\hypersetup{linkcolor=blue,urlcolor=blue}\endgroup} +\providecommand{\DIFaddbegin}{\protect\color{green}\hypersetup{linkcolor=green,urlcolor=green}} +\providecommand{\DIFaddend}{\protect\color{black}\hypersetup{linkcolor=blue,urlcolor=blue}} +\providecommand{\DIFdelbegin}{\protect\color{red}\hypersetup{linkcolor=red,urlcolor=red}} +\providecommand{\DIFdelend}{\protect\color{black}\hypersetup{linkcolor=blue,urlcolor=blue}} +\providecommand{\DIFaddtext}[1]{\textcolor{blue}{\sf #1}} +\providecommand{\DIFdeltext}[1]{\textcolor{red}{\footnotesize \sout{#1}}} +  %DIF END COLOR PREAMBLE  \providecommand{\DIFaddtext}[1]{\textcolor{green}{\sf #1}}  \providecommand{\DIFdeltext}[1]{\textcolor{red}{\footnotesize \sout{#1}}} diff --git a/fixupdiff.pl b/fixupdiff.pl index e557e2b..5c82526 100644 --- a/fixupdiff.pl +++ b/fixupdiff.pl @@ -1,6 +1,7 @@ -my $bufferdiff=""; -my $diff=""; -my $buffer=""; +use strict; + +my $lstlisting=0; +  while (<>) {  	my $line = $_;  	if (m/%DIFDELCMD\s+<\s+\\begin{lstlisting}/) { @@ -15,60 +16,19 @@ while (<>) {  		}  		#print "%FIXED BY RULE 1\n";  	} -	#In section headings, replace begin/end with begin/endFL, -	#but be careful in case some tag spills over to the next -	#line -	if (m/\\(section|subsection|subsubsection|paragraph)/ and m/DIF/) { -		my @list = split(/(\\DIF(?:add|del)(?:begin|end)(?:FL)?)/, $line, -1); -		#if there's only one tag, don't touch it: -		#matching one is on the other line -		if ($#list >= 5) { -			#if first tag is end, don't touch it - matching -			#begin is on the previous line -			if ($list[1] =~ m/begin$/) { -				$list[1] .= "FL"; -			} -			#if last tag is begin, don't touch it - matching -			#end is on the next line -			if ($list[$#list - 1] =~ m/end$/) { -				$list[$#list - 1] .= "FL"; -			} -		} -		for (my $i = 3; $i <= $#list - 3; $i += 2) { -			if (not $list[$i] =~ m/FL$/) { -				$list[$i] .= "FL"; -			} -		} -		$line = join("", @list); -		#print "%FIXED BY RULE 2\n"; -	} -	#detect where we have DIFbegin/end cross -	#enumerate/itemize environments and fix up -	if (m/\\DIF(?:add|del)(?:begin|end)/) { -		my @list = split(/(\\DIF(?:add|del)(?:begin|end)(?:FL)?)/, $line, -1); -		$diff = $list[$#list - 1]; -		if ($diff =~ m/begin/) { -			$diff =~ s/begin/end/; -		} else { -			$diff = ""; -		} -	} -	if ($diff ne "" and m/\\(?:begin|end){(?:enumerate|itemize)}$/ and not m/\\DIF/) { -		$buffer = $line; -		$bufferdiff = $diff; -		$line = ""; -		#print "%BUFFERED BY RULE 3: $bufferdiff\n"; -	} -	if ($buffer ne "" and $line ne "") { -		if (m/^(\\DIF(?:add|del)end(?:FL)?)/ and $bufferdiff ne $1) { -			$line =~ s/^(\\DIF(?:add|del)end(?:FL)?)//; -			$buffer =~ s/(\\(?:begin|end){(?:enumerate|itemize)})$/$bufferdiff$1/; -			#print "%FIXED BY RULE 3: $bufferdiff\n"; -		} -		print $buffer; -		$buffer = ""; -		$bufferdiff = ""; -	} + +	# Too many \color directives (generated by DIFdel/addbegin/end) +	# confuse xetex, producing errors: +	# WARNING ** Color stack overflow. Just ignore. +	# and resulting in corrupted color in output. +	# As a work-around, detect cases where it's safe, and replace \color with +	# \textcolor. +	# As a result, number of \color directives goes does sufficiently +	# enough to avoid the overflow error. + +	s/\\DIFdelbegin \\DIFdel{([^}]*)}\\DIFdelend/\\DIFdeltext{$1}/; +	s/\\DIFaddbegin \\DIFadd{([^}]*)}\\DIFaddend/\\DIFaddtext{$1}/; +  	print $line;  	if (m/%DIFDELCMD\s+<\s+\\end{lstlisting}/) {  		print "}\n";  | 
