diff options
Diffstat (limited to 'bin/htmldiff')
-rw-r--r-- | bin/htmldiff | 120 |
1 files changed, 20 insertions, 100 deletions
diff --git a/bin/htmldiff b/bin/htmldiff index 509860c..056564c 100644 --- a/bin/htmldiff +++ b/bin/htmldiff @@ -1,112 +1,32 @@ #!/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$ -#++ + +require 'diff/lcs' +require 'diff/lcs/htmldiff' begin - require 'rubygems' - require_gem 'diff-lcs', "1.1.1" - require 'diff/lcs/string' + require 'text/format' rescue LoadError - require 'diff/lcs' - require 'diff/lcs/string' + Diff::LCS::HTMLDiff.can_expand_tabs = false end -require 'text/format' +if ARGV.size < 2 or ARGV.size > 3 + $stderr.puts "usage: #{File.basename($0)} old new [output.html]" + $stderr.puts " #{File.basename($0)} old new > output.html" + exit 127 +end -class HTMLDiff #:nodoc: - attr_accessor :output +left = IO.read(ARGV[0]).split($/) +right = IO.read(ARGV[1]).split($/) - def initialize(output) - @output = output - end +options = { :title => "diff #{ARGV[0]} #{ARGV[1]}" } - # This will be called with both lines are the same - def match(event) - @output << %Q|<pre class="match">#{event.old_element}</pre>\n| - end +htmldiff = Diff::LCS::HTMLDiff.new(left, right, options) - # 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| +if ARGV[2] + File.open(ARGV[2], "w") do |f| + htmldiff.options[:output] = f + htmldiff.run 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 +else + htmldiff.run 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 |