summaryrefslogtreecommitdiff
path: root/fixupdiff.pl
diff options
context:
space:
mode:
Diffstat (limited to 'fixupdiff.pl')
-rw-r--r--fixupdiff.pl77
1 files changed, 77 insertions, 0 deletions
diff --git a/fixupdiff.pl b/fixupdiff.pl
new file mode 100644
index 0000000..e557e2b
--- /dev/null
+++ b/fixupdiff.pl
@@ -0,0 +1,77 @@
+my $bufferdiff="";
+my $diff="";
+my $buffer="";
+while (<>) {
+ my $line = $_;
+ if (m/%DIFDELCMD\s+<\s+\\begin{lstlisting}/) {
+ $lstlisting=1;
+ $line =~s/%DIFDELCMD\s+</{\\lstset{escapechar=\\\$} /;
+ }
+ if ($lstlisting) {
+ $line =~ s/%DIFDELCMD\s+< //;
+ if (not $line =~ m/\\(?:begin|end){lstlisting}/) {
+ $line =~ s/([#&{} ])/\\$1/g;
+ $line =~ s/(.*)/\$\\DIFdel{$1}\$/;
+ }
+ #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 = "";
+ }
+ print $line;
+ if (m/%DIFDELCMD\s+<\s+\\end{lstlisting}/) {
+ print "}\n";
+ $lstlisting=0;
+ }
+}