text_diff binds together html_header, create_diff, and html_footer
to create a single document that is the "paragraph diff" of the 2 records.
create_diff creates the actual paragraph diff.
Text::ParagraphDiff - Visual Difference for paragraphed text.
Text::ParagraphDiff finds the difference between two paragraphed text files by word
rather than by line, reflows the text together, and then outputs result as xhtml.
use Text::ParagraphDiff;
print text_diff('old.txt','new.txt'); # old.txt and new.txt are filenames
print text_diff(\@old,\@new); # Or pass array references
print text_diff(["old"], ["new"]); # T-Diff 2 plain strings (a FAQ)
print text_diff($old,$new,{plain=>1}); # Pass options (see below)
# or use the premade script in bin/:
# ./tdiff oldfile newfile
Text::ParagraphDiff is a reimplementation of diff that is meant for
paragraphed text rather than for code. Instead of "diffing" a document by
line, Text::ParagraphDiff expands a document to one word per line, uses
Algorithm::Diff to find the difference, and then reflows the text back
together, highlighting the "add" and "subtract" sections. Writers and editors
might find this useful for sending revisions to each other across the internet;
a single user might use it to keep track of personal work. For example output,
please see diff.html in the distribution, as well as the sources for the
difference, old.txt and new.txt.
The output is in xhtml, for ease of generation, ease of access, and ease of
viewing. Text::ParagraphDiff also takes advantage of two advanced features
of the median: CSS and JavaScript.
CSS is used to cut down on output size and to make the output very pleasing to
the eye. JavaScript is used to implement additional functionality: two buttons
that can toggle the display of the difference. CSS and JavaScript can be
turned off; see the plain option below. (Note: CSS & Javascript tested with
ozilla 1.0 and IE 5.x)
Options are stored in a hashref, $opt. $opt is an optional last argument
to text_diff, passed like this:
text_diff($old, $new, { plain => 1,
escape => 1,
functionality => 1,
style => 'stylesheet_code_here',
header => 'header_markup_here'
});
Options are:
plain will cause a document to be rendered
plainly, with very sparse html that should be valid even through Netscape
Navigator 2.0.
functionality will cause the JavaScript toggle
buttons to not be shown.
style is set, its value will override the default stylesheet. Please
see output_html_header above for the default stylesheet specifications.
header is set, its value will override the default difference header.
Please see output_html_header above for more details.
header is set, its value will override the default difference header.
Please see output_html_header above for more details.
escape is set, then output will not be escaped. Useful if you want to
include your own markup.
sep is set, its value will override the default paragraph
separator. sep should be a reference to an array of 2 elements;
the starting paragraph separator, and the ending separator. The default
value is ['<p',</p>']>.
minus_first is set to a true value, then the order will
be reversed.
text_diff is exported by default.
Additionally, create_diff, html_header, and html_footer are optionally
exported by request (e.g. use Text::ParagraphDiff qw(create_diff)).
create_diff is the actual diff itself; html_header and html_footer
should be obvious.
In some situations, deletion of entire paragraphs in special places might make the surrounding line-breaks become whacky. If you can isolate the case, please send me a bug report, I might be able to fix it. In the mean time, if this happens to you, just fix the output's markup by hand, it shouldn't be too complicated.
Joseph F. Ryan (ryan.311@osu.edu) Tests done by Jonas Liljegren (jonas@liljegren.org)
Algorithm::Diff.