docdiff 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>