diff options
Diffstat (limited to 'bin/htmldiff')
-rw-r--r-- | bin/htmldiff | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/bin/htmldiff b/bin/htmldiff new file mode 100644 index 0000000..509860c --- /dev/null +++ b/bin/htmldiff @@ -0,0 +1,112 @@ +#!/usr/bin/env ruby +#-- +# Copyright 2004 Austin Ziegler <diff-lcs@halostatue.ca> +# adapted from: +# Algorithm::Diff (Perl) by Ned Konz <perl@bike-nomad.com> +# Smalltalk by Mario I. Wolczko <mario@wolczko.com> +# implements McIlroy-Hunt diff algorithm +# +# This program is free software. It may be redistributed and/or modified under +# the terms of the GPL version 2 (or later), the Perl Artistic licence, or the +# Ruby licence. +# +# $Id$ +#++ + +begin + require 'rubygems' + require_gem 'diff-lcs', "1.1.1" + require 'diff/lcs/string' +rescue LoadError + require 'diff/lcs' + require 'diff/lcs/string' +end + +require 'text/format' + +class HTMLDiff #:nodoc: + attr_accessor :output + + def initialize(output) + @output = output + end + + # This will be called with both lines are the same + def match(event) + @output << %Q|<pre class="match">#{event.old_element}</pre>\n| + end + + # This will be called when there is a line in A that isn't in B + def discard_a(event) + @output << %Q|<pre class="only_a">#{event.old_element}</pre>\n| + end + + # This will be called when there is a line in B that isn't in A + def discard_b(event) + @output << %Q|<pre class="only_b">#{event.new_element}</pre>\n| + end +end + +if ARGV.size != 2 + puts "usage: #{File.basename($0)} old new > output.html" + exit 255 +end + +hd = HTMLDiff.new($stdout) +tf = Text::Format.new +tf.tabstop = 4 + +preprocess = lambda { |line| tf.expand(line.chomp) } + +a = IO.readlines(ARGV[0]).map(&preprocess) +b = IO.readlines(ARGV[1]).map(&preprocess) + +$stdout.write <<-START +<html> + <head> + <title>diff #{ARGV[0]} #{ARGV[1]}</title> + <style> + body { margin: 0; } + .diff + { + border: 1px solid black; + margin: 1em 2em; + } + pre + { + padding-left: 1em; + margin: 0; + font-family: Lucida, Courier, monospaced; + white-space: pre; + } + .match { } + .only_a + { + background-color: #fdd; + color: red; + text-decoration: line-through; + } + .only_b + { + background-color: #ddf; + color: blue; + border-left: 3px solid blue + } + h1 { margin-left: 2em; } + </style> + </head> + <body> + <h1>diff + <span class="only_a">#{ARGV[0]}</span> + <span class="only_b">#{ARGV[1]}</span> + </h1> + <div class="diff"> +START + +Diff::LCS.traverse_sequences(a, b, hd) + +$stdout.write <<-END + </div> + </body> +</html> +END |