#!/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: htmldiff,v 1.6 2004/10/17 19:33:21 austin Exp $
#++

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&nbsp;
        <span class="only_a">#{ARGV[0]}</span>&nbsp;
        <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
