blob: ef418887226431822ded687cac8c817ea0386ac0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#!/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.0.4"
require 'diff/lcs/string'
rescue LoadError
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_el}</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_el}</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_el}</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
|