docdiff 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +6 -0
  2. data/.travis.yml +7 -0
  3. data/Gemfile +17 -0
  4. data/Guardfile +8 -0
  5. data/Makefile +108 -0
  6. data/Rakefile +17 -0
  7. data/bin/docdiff +179 -0
  8. data/devutil/JIS0208.TXT +6952 -0
  9. data/devutil/char_by_charclass.rb +23 -0
  10. data/devutil/charclass_by_char.rb +21 -0
  11. data/devutil/jis0208.rb +343 -0
  12. data/devutil/testjis0208.rb +38 -0
  13. data/docdiff.conf.example +22 -0
  14. data/docdiff.gemspec +23 -0
  15. data/docdiffwebui.cgi +176 -0
  16. data/docdiffwebui.html +123 -0
  17. data/img/docdiff-screenshot-format-html-digest-firefox.png +0 -0
  18. data/img/docdiff-screenshot-format-html-firefox.png +0 -0
  19. data/img/docdiff-screenshot-format-tty-cmdexe-en.png +0 -0
  20. data/img/docdiff-screenshot-format-tty-cmdexe-ja.png +0 -0
  21. data/img/docdiff-screenshot-format-tty-rxvtunicode-en.png +0 -0
  22. data/img/docdiff-screenshot-format-tty-rxvtunicode-ja.png +0 -0
  23. data/img/docdiff-screenshot-format-tty-xterm-en.png +0 -0
  24. data/img/docdiff-screenshot-format-tty-xterm-ja.png +0 -0
  25. data/img/docdiff-screenshot-resolution-linewordchar-xterm.png +0 -0
  26. data/index.html +181 -0
  27. data/langfilter.rb +14 -0
  28. data/lib/doc_diff.rb +170 -0
  29. data/lib/docdiff.rb +7 -0
  30. data/lib/docdiff/charstring.rb +579 -0
  31. data/lib/docdiff/diff.rb +217 -0
  32. data/lib/docdiff/diff/contours.rb +382 -0
  33. data/lib/docdiff/diff/editscript.rb +148 -0
  34. data/lib/docdiff/diff/rcsdiff.rb +107 -0
  35. data/lib/docdiff/diff/shortestpath.rb +93 -0
  36. data/lib/docdiff/diff/speculative.rb +40 -0
  37. data/lib/docdiff/diff/subsequence.rb +39 -0
  38. data/lib/docdiff/diff/unidiff.rb +124 -0
  39. data/lib/docdiff/difference.rb +92 -0
  40. data/lib/docdiff/document.rb +127 -0
  41. data/lib/docdiff/encoding/en_ascii.rb +97 -0
  42. data/lib/docdiff/encoding/ja_eucjp.rb +269 -0
  43. data/lib/docdiff/encoding/ja_sjis.rb +260 -0
  44. data/lib/docdiff/encoding/ja_utf8.rb +6974 -0
  45. data/lib/docdiff/version.rb +3 -0
  46. data/lib/docdiff/view.rb +476 -0
  47. data/lib/viewdiff.rb +375 -0
  48. data/readme.html +713 -0
  49. data/sample/01.en.ascii.cr +1 -0
  50. data/sample/01.en.ascii.crlf +2 -0
  51. data/sample/01.en.ascii.lf +2 -0
  52. data/sample/01.ja.eucjp.lf +2 -0
  53. data/sample/01.ja.sjis.cr +1 -0
  54. data/sample/01.ja.sjis.crlf +2 -0
  55. data/sample/01.ja.utf8.crlf +2 -0
  56. data/sample/02.en.ascii.cr +1 -0
  57. data/sample/02.en.ascii.crlf +2 -0
  58. data/sample/02.en.ascii.lf +2 -0
  59. data/sample/02.ja.eucjp.lf +2 -0
  60. data/sample/02.ja.sjis.cr +1 -0
  61. data/sample/02.ja.sjis.crlf +2 -0
  62. data/sample/02.ja.utf8.crlf +2 -0
  63. data/sample/humpty_dumpty01.ascii.lf +4 -0
  64. data/sample/humpty_dumpty02.ascii.lf +4 -0
  65. data/test/charstring_test.rb +1008 -0
  66. data/test/diff_test.rb +36 -0
  67. data/test/difference_test.rb +64 -0
  68. data/test/docdiff_test.rb +193 -0
  69. data/test/document_test.rb +626 -0
  70. data/test/test_helper.rb +7 -0
  71. data/test/view_test.rb +570 -0
  72. data/test/viewdiff_test.rb +908 -0
  73. metadata +129 -0
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "docdiff/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "docdiff"
7
+ s.version = Docdiff::VERSION
8
+ s.authors = ["Hisashi Morita"]
9
+ s.email = ["hisashim at users.sourceforge.net"]
10
+ s.homepage = "http://docdiff.sourceforge.net"
11
+ s.summary = %q{Word-by-word diff}
12
+ s.description = %q{DocDiff compares two text files and shows the
13
+ difference. It can compare files word by word,
14
+ character by character, or line by line. It has
15
+ several output formats such as HTML, tty, Manued,
16
+ or user-defined markup.}
17
+ s.rubyforge_project = "docdiff"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/ruby
2
+ # DocDiff Web UI (CGI)
3
+ # 2005-10-08.. Hisashi Morita
4
+ # requirement: Ruby 1.8+ (for timeout.rb)
5
+
6
+ require 'cgi'
7
+ require 'tempfile'
8
+ require 'open3'
9
+ require 'timeout'
10
+
11
+ docdiff = "/usr/bin/docdiff"
12
+
13
+ def errmsg(bndg) # receive binding and return error anatomy
14
+ timeout_second = eval("timeout_second", bndg)
15
+ meth = eval("meth", bndg)
16
+ cgierr = eval("cgierr", bndg)
17
+ cmderr = eval("cmderr", bndg)
18
+ cmdline = eval("cmdline", bndg)
19
+ file1 = eval("file1", bndg)
20
+ file2 = eval("file2", bndg)
21
+ msg = ["<h1>I am so sorry, but something went wrong and an error occured.</h1>",
22
+ "<h2>For users:</h2>",
23
+ "<p>#{cgierr}</p>",
24
+ "<p>#{'You may try again specifying encoding and eol explicitly.' if cmderr.size > 0}</p>",
25
+ "<p>If you are still in trouble after self-help effort, please consult your system administrator (or nearest geek) with the detail below.</p>",
26
+ "<hr />",
27
+ "<h2>For system administrators:</h2>",
28
+ "<p>Technical detail of the error:</p>",
29
+ "<p>",
30
+ "CGI error: #{CGI.escapeHTML(cgierr.inspect)}<br />",
31
+ "Command error: #{CGI.escapeHTML(cmderr.inspect)}<br />",
32
+ "Timeout: #{timeout_second}<br />",
33
+ "Method used: #{meth}<br />",
34
+ "Commandline used: #{CGI.escapeHTML(cmdline.inspect)}<br />",
35
+ "file1: #{CGI.escapeHTML(file1.inspect)}<br />",
36
+ "file1 stat: #{CGI.escapeHTML(File.stat(file1.path).inspect)}<br />",
37
+ "file2: #{CGI.escapeHTML(file2.inspect)}<br />",
38
+ "file2 stat: #{CGI.escapeHTML(File.stat(file2.path).inspect)}<br />",
39
+ # "file1 content: #{`head #{file1.path}`}<br />",
40
+ # "file2 content: #{`head #{file2.path}`}<br />",
41
+ # "#{`#{cmdline}`}",
42
+ "</p><hr />"].join
43
+ return msg
44
+ end
45
+
46
+ class InvalidUsageError < StandardError
47
+ end
48
+ class TimeoutErrorPopen < TimeoutError
49
+ end
50
+ class TimeoutErrorPopen3 < TimeoutError
51
+ end
52
+
53
+ cgi = CGI.new("html4")
54
+ file1 = Tempfile.new("file1-")
55
+ file1.print(cgi.params['file1'][0].read)
56
+ file1.close
57
+ file2 = Tempfile.new("file2-")
58
+ file2.print(cgi.params['file2'][0].read)
59
+ file2.close
60
+
61
+ if resolution = cgi.params['resolution'][0]
62
+ case resolution.read
63
+ when "line" then resolution = "line"
64
+ when "word" then resolution = "word"
65
+ when "char" then resolution = "char"
66
+ else raise "Consult your system administrator. Unsupported resolution."
67
+ end
68
+ else
69
+ raise "param 'resolution' was not available."
70
+ end
71
+
72
+ if format = cgi.params['format'][0]
73
+ case format.read
74
+ when "html" then format = "html"
75
+ when "tty" then format = "tty"
76
+ when "wdiff" then format = "wdiff"
77
+ when "manued" then format = "manued"
78
+ else raise "Consult your system administrator. Unsupported format."
79
+ end
80
+ else
81
+ raise "param 'format' was not available."
82
+ end
83
+
84
+ if encoding = cgi.params['encoding'][0]
85
+ case encoding.read
86
+ when "auto" then encoding = "auto"
87
+ when "ascii" then encoding = "ASCII"
88
+ when "utf8" then encoding = "UTF-8"
89
+ when "eucjp" then encoding = "EUC-JP"
90
+ when "sjis" then encoding = "Shift_JIS"
91
+ else raise "Consult your system administrator. Unsupported encoding."
92
+ end
93
+ else
94
+ raise "param 'encoding' was not available."
95
+ end
96
+
97
+ if eol = cgi.params['eol'][0]
98
+ case eol.read
99
+ when "auto" then eol = "auto"
100
+ when "cr" then eol = "CR"
101
+ when "lf" then eol = "LF"
102
+ when "crlf" then eol = "CRLF"
103
+ else raise "Consult your system administrator. Unsupported eol."
104
+ end
105
+ else
106
+ raise "param 'eol' was not available."
107
+ end
108
+
109
+ digest = cgi.params['digest'][0]
110
+ if digest && digest.read == "digest"
111
+ digest = "--digest"
112
+ else
113
+ digest = ""
114
+ end
115
+
116
+ if timeout_second = cgi.params['timeout_second'][0]
117
+ case timeout_second.read
118
+ when "5" then timeout_second = 5
119
+ when "15" then timeout_second = 15
120
+ when "30" then timeout_second = 30
121
+ when "60" then timeout_second = 60
122
+ else raise "Consult your system administrator. Unsupported timeout period."
123
+ end
124
+ else
125
+ raise "param 'timeout_second' was not available."
126
+ end
127
+
128
+ begin
129
+ cmderr = ""
130
+ cgierr = ""
131
+ output = ""
132
+ cmdline = "#{docdiff} " +
133
+ " --resolution=#{resolution} --format=#{format} " +
134
+ " --encoding=#{encoding} --eol=#{eol} #{digest} " +
135
+ " #{file1.path} #{file2.path} "
136
+ raise InvalidUsageError, "file1 is either empty (size 0) or not specified." if FileTest.zero?(file1.path)
137
+ raise InvalidUsageError, "file2 is either empty (size 0) or not specified." if FileTest.zero?(file2.path)
138
+ raise "file1 is unreadable." unless FileTest.readable?(file1.path)
139
+ raise "file2 is unreadable." unless FileTest.readable?(file2.path)
140
+ meth = "IO.popen"
141
+ timeout(timeout_second, TimeoutErrorPopen){
142
+ output = IO.popen(cmdline, "rb").read
143
+ raise "stdout from docdiff is nil." if output == nil
144
+ raise "stdout from docdiff is not nil, but empty." if output == ""
145
+ }
146
+ rescue InvalidUsageError => cgierr
147
+ output = errmsg(binding())
148
+
149
+ rescue TimeoutErrorPopen => cgierr
150
+ # popen failed, so falling back to open3, though open3 can fail too...
151
+ meth = "Open3.popen3"
152
+
153
+ timeout(timeout_second, TimeoutErrorPopen3){
154
+ stdin, stdout, stderr = Open3.popen3(cmdline)
155
+ raise "stdin to docdiff is nil." unless stdin
156
+ raise "stdout from docdiff is nil." unless stdout
157
+ raise "stderr from docdiff is nil." unless stderr
158
+ cmderr = stderr.read
159
+ raise cmderr if cmderr && cmderr.length > 0
160
+ output = stdout.read
161
+ }
162
+ rescue TimeoutErrorPopen3 => cgierr
163
+ output = errmsg(binding())
164
+ rescue => cgierr
165
+ output = errmsg(binding())
166
+ ensure
167
+ cgi.out {
168
+ if output == nil then
169
+ errmsg(binding())
170
+ elsif output.size == 0 then
171
+ errmsg(binding())
172
+ else
173
+ output
174
+ end
175
+ }
176
+ end
@@ -0,0 +1,123 @@
1
+ <html>
2
+ <head>
3
+ <title>DocDiff Web UI</title>
4
+ <meta http-equiv="Content-Style-Type" content="text/css">
5
+ <style type="text/css">
6
+ body {
7
+ margin: 1em 2em 1em 2em;
8
+ }
9
+ h1 {
10
+ border-left-width: thick;
11
+ border-left-style: solid;
12
+ border-style: solid none solid none;
13
+ }
14
+ .form {
15
+ border-style: outset;
16
+ padding: 0.5em 1em 0.5em 1em;
17
+ width: 100%;
18
+ max-width: 50%;
19
+ min-width: 30em;
20
+ }
21
+ .buttons {
22
+ float: right;
23
+ min-width: 30%;
24
+ }
25
+ .buttons + * {
26
+ clear: both;
27
+ }
28
+ .form .options {
29
+ margin-left: 1em;
30
+ }
31
+ .form .options dt {
32
+ float: left;
33
+ width: 30%;
34
+ max-width: 20em;
35
+ }
36
+ .form .options dd {
37
+ width: 70%;
38
+ }
39
+ </style>
40
+ </head>
41
+ <body>
42
+ <h1>DocDiff Web UI</h1>
43
+ <p><a href="http://www.kt.rim.or.jp/~hisashim/docdiff/">DocDiff</a> is a word/char oriented text file comparison utility.</p>
44
+ <p><strong>Caution: This web ui is totally experimental and insecure! Do not use it on public site.</strong></p>
45
+ <div class="form">
46
+ <form action="cgi-bin/docdiffwebui.cgi" method="post" enctype="multipart/form-data" target="_blank">
47
+ <fieldset>
48
+ <legend>Files to compare</legend>
49
+ <ol>
50
+ <li><input type="file" name="file1" size="72"></li>
51
+ <li><input type="file" name="file2" size="72"></li>
52
+ </ol>
53
+ </fieldset>
54
+ <fieldset>
55
+ <legend>Options</legend>
56
+ <dl class="options">
57
+ <dt>Resolution:</dt>
58
+ <dd>
59
+ <select name="resolution">
60
+ <option value="line">Line</option>
61
+ <option value="word" selected>Word (default)</option>
62
+ <option value="char">Character</option>
63
+ </select><br />
64
+ </dd>
65
+ <dt>Output Format:</dt>
66
+ <dd>
67
+ <select name="format">
68
+ <option value="html" selected>HTML (default)</option>
69
+ <option value="tty">tty</option>
70
+ <option value="wdiff">wdiff</option>
71
+ <option value="manued">Manued</option>
72
+ </select>
73
+ </dd>
74
+ <dt>Encoding:</dt>
75
+ <dd>
76
+ <select name="encoding">
77
+ <option value="auto" selected>Auto (default)</option>
78
+ <option value="ascii">ASCII</option>
79
+ <option value="utf8">UTF-8</option>
80
+ <option value="eucjp">EUC-JP (Japanese Unix)</option>
81
+ <option value="sjis">Shift-JIS (Japanese Windows, Mac)</option>
82
+ </select>
83
+ </dd>
84
+ <dt>End-of-line:</dt>
85
+ <dd>
86
+ <select name="eol">
87
+ <option value="auto" selected>Auto (default)</option>
88
+ <option value="crlf">CRLF (Windows)</option>
89
+ <option value="lf">LF (Unix, Mac OS X)</option>
90
+ <option value="cr">CR (Old Mac)</option>
91
+ </select>
92
+ </dd>
93
+ <dt>Digest?</dt>
94
+ <dd>
95
+ <input type="checkbox" name="digest" value="digest">
96
+ </dd>
97
+ <dt>Timeout:</dt>
98
+ <dd>
99
+ <select name="timeout_second">
100
+ <option value="5" selected>5 sec. (default)</option>
101
+ <option value="15">15 sec.</option>
102
+ <option value="30">30 sec.</option>
103
+ <option value="60">60 sec.</option>
104
+ </select>
105
+ </dd>
106
+ </dl>
107
+ </fieldset>
108
+ <div class="buttons">
109
+ <p>
110
+ <input type="reset">
111
+ <input type="submit">
112
+ </p>
113
+ </div>
114
+ <br />
115
+ </form>
116
+ </div>
117
+ <p>Wait for a while untill you get the result.</p>
118
+ <p>If you get an error, try specifying encoding and eol explicitly. If that does not help, ask your system administrator who installed this software.</p>
119
+
120
+ <hr />
121
+ 2005-10-08.. Hisashi Morita
122
+ </body>
123
+ </html>
@@ -0,0 +1,181 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
7
+ <title>DocDiff</title>
8
+ <style type="text/css">
9
+ body {
10
+ margin-left: 5%;
11
+ }
12
+ h1, h2 {
13
+ margin-left: -5%;
14
+ }
15
+ h1 {
16
+ border: medium outset;
17
+ padding: 0.5em;
18
+ }
19
+ h2 {
20
+ border-top: thin solid;
21
+ border-right: thin solid;
22
+ border-left: thick solid;
23
+ border-bottom: thin solid;
24
+ padding-left: 0.3em;
25
+ }
26
+ h3 {
27
+ border-left: thick solid;
28
+ padding-left: 0.3em;
29
+ }
30
+ .figure {
31
+ padding: 0.5em 0em;
32
+ clear: both;
33
+ }
34
+ .img {
35
+ margin-right: 0.5em;
36
+ }
37
+ .img:first-child {
38
+ float: left;
39
+ }
40
+ .img + .img {
41
+ float: left;
42
+ }
43
+ h1, h2, h3, hr {
44
+ clear: both;
45
+ }
46
+ .img > p {
47
+ margin-top: 0.5em;
48
+ margin-bottom: 0.25em;
49
+ font-size: small;
50
+ }
51
+ </style>
52
+ <style title="en" type="text/css">
53
+ * [lang="ja"] {display: none}
54
+ * [lang="en"] {display: inherit}
55
+ </style>
56
+ <style title="ja" type="text/css">
57
+ * [lang="en"] {display: none}
58
+ * [lang="ja"] {display: inherit}
59
+ </style>
60
+ </head>
61
+ <body>
62
+ <h1>DocDiff</h1>
63
+ <h2 id="toc">
64
+ <span lang="en">Table of Contents</span>
65
+ <span lang="ja">目次</span>
66
+ </h2>
67
+ <ul>
68
+ <li><a href="#summary">Summary</a></li>
69
+ <li><a href="#screenshot">Screenshot</a></li>
70
+ <li><a href="#document">Document</a></li>
71
+ <li><a href="#download">Download</a></li>
72
+ </ul>
73
+ </div>
74
+ <div class="content">
75
+ <h2 id="summary">
76
+ <span lang="en">Summary</span>
77
+ <span lang="ja">概要</span>
78
+ </h2>
79
+ <p>
80
+ <span lang="en">
81
+ <a href="http://www.kt.rim.or.jp/~hisashim/docdiff/">DocDiff</a> compares two text files and shows the difference. It can compare files by word, character, or line. It has several output formats such as HTML, tty, Manued, or user-defined markup.
82
+ </span>
83
+ <span lang="ja">
84
+ <a href="http://www.kt.rim.or.jp/~hisashim/docdiff/">DocDiff</a>は2つのテキストファイルを比較してその違いを表示します。単語ごと、文字ごと、そして行ごとにファイルを比較できます。結果を出力する形式は、HTML, tty(文字 端末向けのエスケープシーケンス), Manued(真鵺道という校正用のマークアップ形式)などが用意されており、ユーザ定義のタグを使うこともできます。
85
+ </span>
86
+ </p>
87
+ <p>
88
+ <span lang="en">
89
+ It supports several encodings and end-of-line characters, including ASCII (and ISO-8859-*), UTF-8, EUC-JP, Shift_JIS, CR, LF, and CRLF.
90
+ </span>
91
+ <span lang="ja">
92
+ 次のエンコーディング(文字コード)と行末コード(改行文字)をサポートしています: ASCII(およびISO-8859-*), UTF-8, EUC-JP, Shift_JIS、そしてCR, LF, CRLF.
93
+ </span>
94
+ </p>
95
+ <hr />
96
+ <h2 id="screenshot">
97
+ <span lang="en">Screenshot</span>
98
+ <span lang="ja">スクリーンショット</span>
99
+ </h2>
100
+ <p>
101
+ <span lang="en">Screenshots as of version 0.3.2. All shots are in the <a href="img/">img</a> directory.</span>
102
+ <span lang="ja">バージョン0.3.2時点のスクリーンショットです。スクリーンショットは<a href="img/">img</a>ディレクトリにあります。</span>
103
+ </p>
104
+ <div class="figure">
105
+ <span class="img">
106
+ <p>HTML output in web browser</p>
107
+ <img src="img/docdiff-screenshot-format-html-firefox.png" alt="screenshot" />
108
+ </span>
109
+ <span class="img">
110
+ <p>HTML output in web browser (digest)</p>
111
+ <img src="img/docdiff-screenshot-format-html-digest-firefox.png" alt="screenshot" />
112
+ </span>
113
+ </div>
114
+ <div class="figure">
115
+ <span class="img">
116
+ <p>tty output in terminal</p>
117
+ <img src="img/docdiff-screenshot-format-tty-rxvtunicode-en.png" alt="screenshot" />
118
+ </span>
119
+ <span class="img">
120
+ <p>tty output in terminal (comparing Japanese text)</p>
121
+ <img src="img/docdiff-screenshot-format-tty-rxvtunicode-ja.png" alt="screenshot" />
122
+ </span>
123
+ </div>
124
+ <div class ="figure">
125
+ <span class="img">
126
+ <p>tty output in terminal</p>
127
+ <img src="img/docdiff-screenshot-format-tty-xterm-en.png" alt="screenshot" />
128
+ </span>
129
+ <span class="img">
130
+ <p>tty output in terminal (comparing Japanese text)</p>
131
+ <img src="img/docdiff-screenshot-format-tty-xterm-ja.png" alt="screenshot" />
132
+ </span>
133
+ </div>
134
+ <div class="figure">
135
+ <span class="img">
136
+ <p>Comparing English text (codepage 437) on Windows (Cygwin)</p>
137
+ <img src="img/docdiff-screenshot-format-tty-cmdexe-en.png" alt="screenshot" />
138
+ </span>
139
+ <span class="img">
140
+ <p>Comparing Japanese text (codepage 932) on Windows (Cygwin)</p>
141
+ <img src="img/docdiff-screenshot-format-tty-cmdexe-ja.png" alt="screenshot" />
142
+ </span>
143
+ </div>
144
+ <div class="figure">
145
+ <span class="img">
146
+ <p>You can compare text files by line, word, or character (format: tty)</p>
147
+ <img src="img/docdiff-screenshot-resolution-linewordchar-xterm.png" alt="screenshot" />
148
+ </span>
149
+ </div>
150
+ <hr />
151
+ <h2 id="document">
152
+ <span lang="en">Document</span>
153
+ <span lang="ja">ドキュメント</span>
154
+ </h2>
155
+ <ul>
156
+ <li><a href="readme.html">readme.html</a> (Multilingual)</li>
157
+ <li><a href="readme.en.html">readme.en.html</a> (English)</li>
158
+ <li><a href="readme.ja.html">readme.ja.html</a> (Japanese)</li>
159
+ </ul>
160
+
161
+ <h2 id="download">
162
+ <span lang="en">Download</span>
163
+ <span lang="ja">ダウンロード</span>
164
+ </h2>
165
+ <p>
166
+ <span lang="en">Please read the readme before you download.</span>
167
+ <span lang="ja">ダウンロードする前にreadmeをお読みください。</span>
168
+ </p>
169
+ <ul>
170
+ <li><a href="http://sourceforge.net/projects/docdiff/files/">
171
+ http://sourceforge.net/projects/docdiff/files/</a></li>
172
+ </ul>
173
+ </div>
174
+ <hr>
175
+ <a href ="../">Up</a>
176
+ <hr>
177
+ 2011-02-23 +0900<br />
178
+ 2001-02-12 +0900<br />
179
+ Copyright (C) 2001-2011 Hisashi MORITA<br />
180
+ </body>
181
+ </html>