review 0.6.0 → 0.9.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.
- data/ChangeLog +441 -0
- data/README.rdoc +25 -0
- data/Rakefile +13 -1
- data/VERSION +1 -1
- data/bin/review-check +1 -1
- data/bin/review-compile +19 -10
- data/bin/review-epubmaker +114 -17
- data/bin/review-index +8 -1
- data/bin/review-pdfmaker +378 -0
- data/bin/review-preproc +2 -3
- data/bin/review-vol +1 -2
- data/debian/README.Debian +12 -0
- data/debian/README.source +5 -0
- data/debian/changelog +5 -0
- data/debian/compat +1 -0
- data/debian/control +22 -0
- data/debian/copyright +60 -0
- data/debian/docs +5 -0
- data/debian/manpage.1.ex +59 -0
- data/debian/patches/path.diff +91 -0
- data/debian/patches/series +1 -0
- data/debian/review.install +13 -0
- data/debian/review.links +4 -0
- data/debian/rules +13 -0
- data/debian/source/format +1 -0
- data/doc/format.rdoc +477 -0
- data/doc/format.re +19 -0
- data/doc/format_idg.rdoc +180 -0
- data/doc/ruby-uuid/README +11 -0
- data/doc/ruby-uuid/README.ja +34 -0
- data/doc/sample.css +17 -0
- data/doc/sample.yaml +8 -4
- data/lib/lineinput.rb +1 -1
- data/lib/review/book.rb +43 -36
- data/lib/review/builder.rb +78 -33
- data/lib/review/compiler.rb +45 -48
- data/lib/review/epubbuilder.rb +1 -675
- data/lib/review/exception.rb +1 -1
- data/lib/review/htmlbuilder.rb +627 -49
- data/lib/review/htmlutils.rb +5 -0
- data/lib/review/idgxmlbuilder.rb +239 -250
- data/lib/review/index.rb +84 -7
- data/lib/review/latexbuilder.rb +261 -42
- data/lib/review/latexutils.rb +15 -6
- data/lib/review/preprocessor.rb +40 -6
- data/lib/review/textutils.rb +22 -0
- data/lib/review/topbuilder.rb +4 -1
- data/lib/uuid.rb +312 -0
- data/review.gemspec +44 -12
- data/test/CHAPS +2 -0
- data/test/bib.re +13 -0
- data/test/test.re +43 -0
- data/test/test_book.rb +1191 -0
- data/test/test_builder.rb +147 -0
- data/test/test_htmlbuilder.rb +191 -10
- data/test/test_htmlutils.rb +24 -0
- data/test/test_idgxmlbuilder.rb +310 -0
- data/test/test_index.rb +15 -0
- data/test/test_latexbuilder.rb +217 -6
- data/test/test_lineinput.rb +198 -0
- data/test/test_textutils.rb +68 -0
- data/test/test_uuid.rb +156 -0
- metadata +43 -10
- data/doc/format.txt +0 -434
- data/doc/format_idg.txt +0 -194
- data/doc/format_sjis.txt +0 -313
- data/setup.rb +0 -1587
- data/test/test_epubbuilder.rb +0 -73
data/review.gemspec
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{review}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.9.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["kmuto", "takahashim"]
|
12
|
-
s.date = %q{2010-
|
13
|
-
s.description = %q{ReVIEW is a digital publishing system for books and ebooks. It supports
|
12
|
+
s.date = %q{2010-12-01}
|
13
|
+
s.description = %q{ReVIEW is a digital publishing system for books and ebooks. It supports InDesign, EPUB and LaTeX.}
|
14
14
|
s.email = %q{kmuto@debian.org}
|
15
|
-
s.executables = ["review-check", "review-checkdep", "review-compile", "review-epubmaker", "review-index", "review-preproc", "review-validate", "review-vol"]
|
15
|
+
s.executables = ["review-check", "review-checkdep", "review-compile", "review-epubmaker", "review-index", "review-pdfmaker", "review-preproc", "review-validate", "review-vol"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"ChangeLog",
|
18
18
|
"README.rdoc"
|
@@ -28,13 +28,29 @@ Gem::Specification.new do |s|
|
|
28
28
|
"bin/review-compile",
|
29
29
|
"bin/review-epubmaker",
|
30
30
|
"bin/review-index",
|
31
|
+
"bin/review-pdfmaker",
|
31
32
|
"bin/review-preproc",
|
32
33
|
"bin/review-validate",
|
33
34
|
"bin/review-vol",
|
35
|
+
"debian/README.Debian",
|
36
|
+
"debian/README.source",
|
37
|
+
"debian/changelog",
|
38
|
+
"debian/compat",
|
39
|
+
"debian/control",
|
40
|
+
"debian/copyright",
|
41
|
+
"debian/docs",
|
42
|
+
"debian/manpage.1.ex",
|
43
|
+
"debian/patches/path.diff",
|
44
|
+
"debian/patches/series",
|
45
|
+
"debian/review.install",
|
46
|
+
"debian/review.links",
|
47
|
+
"debian/rules",
|
48
|
+
"debian/source/format",
|
49
|
+
"doc/format.rdoc",
|
34
50
|
"doc/format.re",
|
35
|
-
"doc/
|
36
|
-
"doc/
|
37
|
-
"doc/
|
51
|
+
"doc/format_idg.rdoc",
|
52
|
+
"doc/ruby-uuid/README",
|
53
|
+
"doc/ruby-uuid/README.ja",
|
38
54
|
"doc/sample.css",
|
39
55
|
"doc/sample.yaml",
|
40
56
|
"lib/lineinput.rb",
|
@@ -61,12 +77,21 @@ Gem::Specification.new do |s|
|
|
61
77
|
"lib/review/topbuilder.rb",
|
62
78
|
"lib/review/unfold.rb",
|
63
79
|
"lib/review/volume.rb",
|
80
|
+
"lib/uuid.rb",
|
64
81
|
"review.gemspec",
|
65
|
-
"
|
66
|
-
"test/
|
82
|
+
"test/CHAPS",
|
83
|
+
"test/bib.re",
|
84
|
+
"test/test.re",
|
85
|
+
"test/test_book.rb",
|
86
|
+
"test/test_builder.rb",
|
67
87
|
"test/test_helper.rb",
|
68
88
|
"test/test_htmlbuilder.rb",
|
69
|
-
"test/
|
89
|
+
"test/test_htmlutils.rb",
|
90
|
+
"test/test_idgxmlbuilder.rb",
|
91
|
+
"test/test_latexbuilder.rb",
|
92
|
+
"test/test_lineinput.rb",
|
93
|
+
"test/test_textutils.rb",
|
94
|
+
"test/test_uuid.rb"
|
70
95
|
]
|
71
96
|
s.homepage = %q{http://github.com/kmuto/review}
|
72
97
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -74,10 +99,17 @@ Gem::Specification.new do |s|
|
|
74
99
|
s.rubygems_version = %q{1.3.6}
|
75
100
|
s.summary = %q{ReVIEW: a easy-to-use digital publishing system}
|
76
101
|
s.test_files = [
|
77
|
-
"test/
|
102
|
+
"test/test_book.rb",
|
103
|
+
"test/test_builder.rb",
|
78
104
|
"test/test_helper.rb",
|
79
105
|
"test/test_htmlbuilder.rb",
|
80
|
-
"test/
|
106
|
+
"test/test_htmlutils.rb",
|
107
|
+
"test/test_idgxmlbuilder.rb",
|
108
|
+
"test/test_index.rb",
|
109
|
+
"test/test_latexbuilder.rb",
|
110
|
+
"test/test_lineinput.rb",
|
111
|
+
"test/test_textutils.rb",
|
112
|
+
"test/test_uuid.rb"
|
81
113
|
]
|
82
114
|
|
83
115
|
if s.respond_to? :specification_version then
|
data/test/CHAPS
ADDED
data/test/bib.re
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
//bibpaper[lins][Lins, 1991]{
|
3
|
+
Refael D. Lins. A shared memory architecture for parallel study of
|
4
|
+
algorithums for cyclic reference_counting. Technical Report 92,
|
5
|
+
Computing Laboratory, The University of Kent at Canterbury , August
|
6
|
+
1991
|
7
|
+
//}
|
8
|
+
|
9
|
+
//bibpaper[nari][nari, 1991]{
|
10
|
+
nari paper
|
11
|
+
//}
|
12
|
+
|
13
|
+
//bibpaper[nari][Hogefuge]
|
data/test/test.re
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
= 見出し
|
2
|
+
以下を実行
|
3
|
+
//emlist{
|
4
|
+
./bin/review-compile --inencoding=UTF-8 --outencoding=UTF-8 --hdnumberingmode test.re --target=html
|
5
|
+
}
|
6
|
+
== 節1
|
7
|
+
|
8
|
+
== 節2
|
9
|
+
|
10
|
+
==[column]コラム
|
11
|
+
|
12
|
+
== 節3
|
13
|
+
|
14
|
+
ソースコードの引用
|
15
|
+
|
16
|
+
//source[/hello/world.rb]{
|
17
|
+
puts "hello world!"
|
18
|
+
//}
|
19
|
+
|
20
|
+
■行番号付きキャプションなしリスト
|
21
|
+
//emlistnum{
|
22
|
+
hoge
|
23
|
+
fuge
|
24
|
+
//}
|
25
|
+
|
26
|
+
■行番号付きキャプションありリスト
|
27
|
+
//listnum[hoge][ほげ]{
|
28
|
+
hoge
|
29
|
+
fuge
|
30
|
+
//}
|
31
|
+
|
32
|
+
ほげは@<list>{hoge}でもわかるとおり
|
33
|
+
|
34
|
+
■本文中でのソースコード引用
|
35
|
+
擬似コード内のの@<code>{p = obj.ref_cnt}では…
|
36
|
+
|
37
|
+
■参考文献の参照方法
|
38
|
+
…がしられています( @<bib>{lins} )
|
39
|
+
|
40
|
+
|
41
|
+
//emlist{
|
42
|
+
hoge
|
43
|
+
//}
|
data/test/test_book.rb
ADDED
@@ -0,0 +1,1191 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'review/book'
|
5
|
+
|
6
|
+
require 'stringio'
|
7
|
+
require 'tempfile'
|
8
|
+
require 'tmpdir'
|
9
|
+
|
10
|
+
include ReVIEW
|
11
|
+
|
12
|
+
module BookTestHelper
|
13
|
+
def mktmpbookdir(files = {})
|
14
|
+
created_files = {}
|
15
|
+
Dir.mktmpdir do |dir|
|
16
|
+
files.each_pair do |basename, content|
|
17
|
+
path = File.join(dir, basename)
|
18
|
+
File.open(path, 'w') {|o| o.print content }
|
19
|
+
created_files[basename] = path
|
20
|
+
end
|
21
|
+
book = Book.new(dir)
|
22
|
+
yield(dir, book, created_files)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_instance_variables(obj)
|
27
|
+
obj.instance_variables.inject({}) do |memo, name|
|
28
|
+
value = obj.instance_variable_get(name)
|
29
|
+
if value.instance_variables.empty?
|
30
|
+
memo[name] = value
|
31
|
+
else
|
32
|
+
memo[name] = get_instance_variables(value)
|
33
|
+
end
|
34
|
+
memo
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class BookTest < Test::Unit::TestCase
|
40
|
+
include BookTestHelper
|
41
|
+
|
42
|
+
def assert_same_path(expected, result, *options)
|
43
|
+
require 'pathname'
|
44
|
+
ex_path = Pathname(expected).realpath
|
45
|
+
re_path = Pathname(result).realpath
|
46
|
+
assert_equal ex_path, re_path, *options
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_s_load_default
|
50
|
+
Dir.mktmpdir do |dir|
|
51
|
+
File.open(File.join(dir, 'CHAPS'), 'w') {}
|
52
|
+
Dir.chdir(dir) do
|
53
|
+
assert_same_path dir, File.expand_path(Book.load_default.basedir), "error in dir CHAPS"
|
54
|
+
end
|
55
|
+
|
56
|
+
subdir = File.join(dir, 'sub')
|
57
|
+
Dir.mkdir(subdir)
|
58
|
+
Dir.chdir(subdir) do
|
59
|
+
assert_same_path dir, File.expand_path(Book.load_default.basedir), "error in dir sub"
|
60
|
+
end
|
61
|
+
|
62
|
+
sub2dir = File.join(dir, 'sub', 'sub')
|
63
|
+
Dir.mkdir(sub2dir)
|
64
|
+
Dir.chdir(sub2dir) do
|
65
|
+
assert_same_path dir, File.expand_path(Book.load_default.basedir), "error in dir sub sub"
|
66
|
+
end
|
67
|
+
|
68
|
+
sub3dir = File.join(dir, 'sub', 'sub', 'sub')
|
69
|
+
Dir.mkdir(sub3dir)
|
70
|
+
Dir.chdir(sub3dir) do
|
71
|
+
assert_same_path sub3dir, File.expand_path(Book.load_default.basedir), "error in dir sub sub sub"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# tests for ReVIEW.book
|
76
|
+
default_book = nil
|
77
|
+
Dir.mktmpdir do |dir|
|
78
|
+
Dir.chdir(dir) do
|
79
|
+
default_book = ReVIEW.book
|
80
|
+
assert default_book
|
81
|
+
end
|
82
|
+
end
|
83
|
+
Dir.mktmpdir do |dir|
|
84
|
+
Dir.chdir(dir) do
|
85
|
+
assert_equal default_book, ReVIEW.book, "chdir mktmpdir"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_s_load
|
91
|
+
Dir.mktmpdir do |dir|
|
92
|
+
book = Book.load(dir)
|
93
|
+
defs = get_instance_variables(Parameters.default)
|
94
|
+
pars = get_instance_variables(book.instance_eval { @parameters })
|
95
|
+
assert_equal defs, pars
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_s_update_rubyenv
|
100
|
+
save_load_path = $LOAD_PATH.dup
|
101
|
+
|
102
|
+
Dir.mktmpdir do |dir|
|
103
|
+
Book.update_rubyenv(dir)
|
104
|
+
assert_equal save_load_path, $LOAD_PATH
|
105
|
+
end
|
106
|
+
|
107
|
+
Dir.mktmpdir do |dir|
|
108
|
+
local_lib_path = File.join(dir, 'lib')
|
109
|
+
Dir.mkdir(local_lib_path)
|
110
|
+
Book.update_rubyenv(dir)
|
111
|
+
assert_equal save_load_path, $LOAD_PATH
|
112
|
+
end
|
113
|
+
|
114
|
+
begin
|
115
|
+
Dir.mktmpdir do |dir|
|
116
|
+
local_lib_path = File.join(dir, 'lib')
|
117
|
+
Dir.mkdir(local_lib_path)
|
118
|
+
Dir.mkdir(File.join(local_lib_path, 'review'))
|
119
|
+
Book.update_rubyenv(dir)
|
120
|
+
assert save_load_path != $LOAD_PATH
|
121
|
+
assert $LOAD_PATH.index(local_lib_path)
|
122
|
+
end
|
123
|
+
ensure
|
124
|
+
$LOAD_PATH.replace save_load_path
|
125
|
+
end
|
126
|
+
|
127
|
+
num = rand(99999)
|
128
|
+
test_const = "ReVIEW__BOOK__TEST__#{num}"
|
129
|
+
begin
|
130
|
+
Dir.mktmpdir do |dir|
|
131
|
+
File.open(File.join(dir, 'review-ext.rb'), 'w') do |o|
|
132
|
+
o.puts "#{test_const} = #{num}"
|
133
|
+
end
|
134
|
+
Book.update_rubyenv(dir)
|
135
|
+
assert_equal num, Object.class_eval { const_get(test_const) }
|
136
|
+
end
|
137
|
+
ensure
|
138
|
+
Object.class_eval { remove_const(test_const) }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_ext
|
143
|
+
book = Book.new(File.dirname(__FILE__))
|
144
|
+
assert_equal '.re', book.ext
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_read_CHAPS
|
148
|
+
Dir.mktmpdir do |dir|
|
149
|
+
book = Book.new(dir)
|
150
|
+
assert_equal "", book.read_CHAPS
|
151
|
+
|
152
|
+
chaps_path = File.join(dir, 'CHAPS')
|
153
|
+
re1_path = File.join(dir, "123#{book.ext}")
|
154
|
+
re2_path = File.join(dir, "456#{book.ext}")
|
155
|
+
|
156
|
+
File.open(chaps_path, 'w') {|o| o.print "abc\n" }
|
157
|
+
File.open(re1_path, 'w') {|o| o.print "123\n" }
|
158
|
+
File.open(re2_path, 'w') {|o| o.print "456\n" }
|
159
|
+
|
160
|
+
assert_equal "abc\n", book.read_CHAPS
|
161
|
+
|
162
|
+
File.unlink(chaps_path)
|
163
|
+
assert_equal "#{re1_path}\n#{re2_path}", book.read_CHAPS
|
164
|
+
|
165
|
+
File.unlink(re1_path)
|
166
|
+
assert_equal "#{re2_path}", book.read_CHAPS
|
167
|
+
|
168
|
+
File.unlink(re2_path)
|
169
|
+
assert_equal "", book.read_CHAPS
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_read_PART
|
174
|
+
Dir.mktmpdir do |dir|
|
175
|
+
book = Book.new(dir)
|
176
|
+
assert !book.part_exist?
|
177
|
+
assert_raises Errno::ENOENT do # XXX: OK?
|
178
|
+
book.read_PART
|
179
|
+
end
|
180
|
+
|
181
|
+
chaps_path = File.join(dir, 'CHAPS')
|
182
|
+
chaps_content = "abc\n"
|
183
|
+
File.open(chaps_path, 'w') {|o| o.print chaps_content }
|
184
|
+
|
185
|
+
assert book.part_exist?
|
186
|
+
assert_equal chaps_content, book.read_PART
|
187
|
+
|
188
|
+
File.open(chaps_path, 'w') {|o| o.print "XYZ\n" }
|
189
|
+
assert_equal chaps_content, book.read_PART
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_read_bib
|
194
|
+
Dir.mktmpdir do |dir|
|
195
|
+
book = Book.new(dir)
|
196
|
+
assert !book.bib_exist?
|
197
|
+
assert_raises Errno::ENOENT do # XXX: OK?
|
198
|
+
book.read_bib
|
199
|
+
end
|
200
|
+
|
201
|
+
bib_path = File.join(dir, "bib#{book.ext}")
|
202
|
+
File.open(bib_path, 'w') {|o| o.print "abc\n" }
|
203
|
+
|
204
|
+
assert book.bib_exist?
|
205
|
+
assert_equal "abc\n", book.read_bib
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_setParameter
|
210
|
+
book = Book.new(File.dirname(__FILE__))
|
211
|
+
book.param = :test
|
212
|
+
assert_equal :test, book.instance_eval {@param}
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_parse_chapters
|
216
|
+
mktmpbookdir 'CHAPS' => '' do |dir, book, files|
|
217
|
+
parts = book.instance_eval { parse_chapters }
|
218
|
+
assert_equal 0, parts.size
|
219
|
+
end
|
220
|
+
|
221
|
+
mktmpbookdir 'CHAPS' => "chapter1.re\nchapter2\n" do |dir, book, files|
|
222
|
+
parts = book.instance_eval { parse_chapters }
|
223
|
+
assert_equal 1, parts.size
|
224
|
+
|
225
|
+
assert_equal 1, parts[0].number
|
226
|
+
assert_equal 'chapter1.re', parts[0].name # XXX: OK?
|
227
|
+
assert_equal 2, parts[0].chapters.size
|
228
|
+
chaps = parts[0].chapters.map {|ch| [ch.number, ch.name, ch.path] }
|
229
|
+
expect = [
|
230
|
+
[1, 'chapter1', File.join(dir, 'chapter1.re')],
|
231
|
+
[2, 'chapter2', File.join(dir, 'chapter2')],
|
232
|
+
]
|
233
|
+
assert_equal expect, chaps
|
234
|
+
end
|
235
|
+
|
236
|
+
mktmpbookdir 'CHAPS' => <<EOC do |dir, book, files|
|
237
|
+
part1_chapter1.re
|
238
|
+
part1_chapter2.re
|
239
|
+
|
240
|
+
|
241
|
+
part2_chapter1.re
|
242
|
+
part2_chapter2.re
|
243
|
+
part2_chapter3.re
|
244
|
+
|
245
|
+
part3_chapter1.re
|
246
|
+
EOC
|
247
|
+
parts = book.instance_eval { parse_chapters }
|
248
|
+
assert_equal 3, parts.size
|
249
|
+
|
250
|
+
assert_equal 1, parts[0].number
|
251
|
+
assert_equal 'part1_chapter1.re', parts[0].name
|
252
|
+
assert_equal 2, parts[0].chapters.size
|
253
|
+
chaps = parts[0].chapters.map {|ch| [ch.number, ch.name, ch.path] }
|
254
|
+
expect = [
|
255
|
+
[1, 'part1_chapter1', File.join(dir, 'part1_chapter1.re')],
|
256
|
+
[2, 'part1_chapter2', File.join(dir, 'part1_chapter2.re')],
|
257
|
+
]
|
258
|
+
assert_equal expect, chaps
|
259
|
+
|
260
|
+
assert_equal 2, parts[1].number
|
261
|
+
assert_equal 'part1_chapter2.re', parts[1].name # XXX: OK?
|
262
|
+
assert_equal 3, parts[1].chapters.size
|
263
|
+
chaps = parts[1].chapters.map {|ch| [ch.number, ch.name, ch.path] }
|
264
|
+
expect = [
|
265
|
+
[3, 'part2_chapter1', File.join(dir, 'part2_chapter1.re')],
|
266
|
+
[4, 'part2_chapter2', File.join(dir, 'part2_chapter2.re')],
|
267
|
+
[5, 'part2_chapter3', File.join(dir, 'part2_chapter3.re')],
|
268
|
+
]
|
269
|
+
assert_equal expect, chaps
|
270
|
+
|
271
|
+
assert_equal 3, parts[2].number
|
272
|
+
assert_equal '', parts[2].name # XXX: OK?
|
273
|
+
assert_equal 1, parts[2].chapters.size
|
274
|
+
chaps = parts[2].chapters.map {|ch| [ch.number, ch.name, ch.path] }
|
275
|
+
expect = [
|
276
|
+
[6, 'part3_chapter1', File.join(dir, 'part3_chapter1.re')],
|
277
|
+
]
|
278
|
+
assert_equal expect, chaps
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_parse_chpaters_with_parts_file
|
283
|
+
n_test = 0
|
284
|
+
[
|
285
|
+
[
|
286
|
+
# 期待されるパートの数, :chapter_fileの内容, :part_fileの内容, 期待されるパートタイトルのリスト
|
287
|
+
2,
|
288
|
+
"part1_chapter1.re\n\npart2_chpater1.re\n",
|
289
|
+
"part1\npart2\npart3\n",
|
290
|
+
%w(part1 part2),
|
291
|
+
],
|
292
|
+
[
|
293
|
+
3,
|
294
|
+
"part1_chapter1.re\n\npart2_chapter1.re\n\npart3_chapter1.re",
|
295
|
+
"part1\n",
|
296
|
+
[
|
297
|
+
"part1",
|
298
|
+
nil, # XXX: OK?
|
299
|
+
""
|
300
|
+
],
|
301
|
+
],
|
302
|
+
[
|
303
|
+
1,
|
304
|
+
"part1_chapter1.re\n",
|
305
|
+
"",
|
306
|
+
[
|
307
|
+
nil, # XXX: OK?
|
308
|
+
],
|
309
|
+
],
|
310
|
+
[
|
311
|
+
1,
|
312
|
+
"part1_chapter1.re\n",
|
313
|
+
nil,
|
314
|
+
[
|
315
|
+
"",
|
316
|
+
],
|
317
|
+
],
|
318
|
+
].each do |n_parts, chaps_text, parts_text, part_names|
|
319
|
+
n_test += 1
|
320
|
+
Dir.mktmpdir do |dir|
|
321
|
+
params = Parameters.new(:part_file => 'PARTS')
|
322
|
+
book = Book.new(dir, params)
|
323
|
+
chaps_path = File.join(dir, 'CHAPS')
|
324
|
+
File.open(chaps_path, 'w') {|o| o.print chaps_text }
|
325
|
+
unless parts_text.nil?
|
326
|
+
parts_path = File.join(dir, 'PARTS')
|
327
|
+
File.open(parts_path, 'w') {|o| o.print parts_text }
|
328
|
+
end
|
329
|
+
|
330
|
+
parts = book.instance_eval { parse_chapters }
|
331
|
+
assert_equal n_parts, parts.size, "\##{n_test}"
|
332
|
+
assert_equal part_names, parts.map {|p| p.name }, "\##{n_test}"
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_prefaces
|
338
|
+
mktmpbookdir do |dir, book, files|
|
339
|
+
assert_equal nil, book.prefaces
|
340
|
+
end
|
341
|
+
|
342
|
+
mktmpbookdir 'preface.re' => '' do |dir, book, files|
|
343
|
+
assert_kind_of Part, book.prefaces
|
344
|
+
assert_equal '', book.prefaces.name
|
345
|
+
assert_equal 1, book.prefaces.chapters.size
|
346
|
+
assert_equal "preface", book.prefaces.chapters.first.name
|
347
|
+
assert_equal files['preface.re'], book.prefaces.chapters.first.path
|
348
|
+
assert_equal nil, book.prefaces.chapters.first.number
|
349
|
+
end
|
350
|
+
|
351
|
+
mktmpbookdir 'preface.re' => '',
|
352
|
+
'PREDEF' => '' do |dir, book, files|
|
353
|
+
assert_equal nil, book.prefaces # XXX: OK?
|
354
|
+
end
|
355
|
+
|
356
|
+
mktmpbookdir 'PREDEF' => '' do |dir, book, files|
|
357
|
+
assert_equal nil, book.prefaces
|
358
|
+
end
|
359
|
+
|
360
|
+
mktmpbookdir 'PREDEF' => 'chapter1',
|
361
|
+
'chapter1.re' => '' do |dir, book, files|
|
362
|
+
assert_kind_of Part, book.prefaces
|
363
|
+
assert_equal '', book.prefaces.name
|
364
|
+
assert_equal 1, book.prefaces.chapters.size
|
365
|
+
assert_equal "chapter1", book.prefaces.chapters.first.name
|
366
|
+
assert_equal files['chapter1.re'], book.prefaces.chapters.first.path
|
367
|
+
end
|
368
|
+
|
369
|
+
mktmpbookdir 'PREDEF' => "chapter1\n\nchapter2",
|
370
|
+
'chapter1.re' => '', 'chapter2.re' => '' do |dir, book, files|
|
371
|
+
assert_kind_of Part, book.prefaces
|
372
|
+
assert_equal '', book.prefaces.name
|
373
|
+
assert_equal 2, book.prefaces.chapters.size
|
374
|
+
assert_equal "chapter1", book.prefaces.chapters.first.name
|
375
|
+
assert_equal files['chapter1.re'], book.prefaces.chapters.first.path
|
376
|
+
assert_equal "chapter2", book.prefaces.chapters.last.name
|
377
|
+
assert_equal files['chapter2.re'], book.prefaces.chapters.last.path
|
378
|
+
end
|
379
|
+
|
380
|
+
mktmpbookdir 'PREDEF' => "chapter1 chapter2",
|
381
|
+
'chapter1.re' => '', 'chapter2.re' => '' do |dir, book, files|
|
382
|
+
assert_kind_of Part, book.prefaces
|
383
|
+
assert_equal '', book.prefaces.name
|
384
|
+
assert_equal 2, book.prefaces.chapters.size # XXX: OK?
|
385
|
+
end
|
386
|
+
|
387
|
+
mktmpbookdir 'PREDEF' => 'not_exist' do |dir, book, files|
|
388
|
+
assert_raises FileNotFound do
|
389
|
+
assert_equal nil, book.prefaces
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
mktmpbookdir 'PREDEF' => 'chapter1.re',
|
394
|
+
'chapter1.re' => '' do |dir, book, files|
|
395
|
+
assert_kind_of Part, book.prefaces
|
396
|
+
assert_equal '', book.prefaces.name
|
397
|
+
assert_equal 1, book.prefaces.chapters.size
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
def test_postscripts
|
402
|
+
mktmpbookdir do |dir, book, files|
|
403
|
+
assert_equal nil, book.postscripts
|
404
|
+
end
|
405
|
+
|
406
|
+
mktmpbookdir 'appendix.re' => '' do |dir, book, files|
|
407
|
+
assert_kind_of Part, book.postscripts
|
408
|
+
assert_equal '', book.postscripts.name
|
409
|
+
assert_equal 1, book.postscripts.chapters.size
|
410
|
+
assert_equal "appendix", book.postscripts.chapters.first.name
|
411
|
+
assert_equal files['appendix.re'], book.postscripts.chapters.first.path
|
412
|
+
assert_equal nil, book.postscripts.chapters.first.number
|
413
|
+
end
|
414
|
+
|
415
|
+
mktmpbookdir 'postscript.re' => '' do |dir, book, files|
|
416
|
+
assert_kind_of Part, book.postscripts
|
417
|
+
assert_equal '', book.postscripts.name
|
418
|
+
assert_equal 1, book.postscripts.chapters.size
|
419
|
+
assert_equal "postscript", book.postscripts.chapters.first.name
|
420
|
+
assert_equal files['postscript.re'], book.postscripts.chapters.first.path
|
421
|
+
assert_equal nil, book.postscripts.chapters.first.number
|
422
|
+
end
|
423
|
+
|
424
|
+
mktmpbookdir 'appendix.re' => '',
|
425
|
+
'postscript.re' => '' do |dir, book, files|
|
426
|
+
assert_kind_of Part, book.postscripts
|
427
|
+
assert_equal '', book.postscripts.name
|
428
|
+
assert_equal 2, book.postscripts.chapters.size
|
429
|
+
assert_equal "appendix", book.postscripts.chapters.first.name
|
430
|
+
assert_equal files['appendix.re'], book.postscripts.chapters.first.path
|
431
|
+
assert_equal nil, book.postscripts.chapters.first.number
|
432
|
+
assert_equal "postscript", book.postscripts.chapters.last.name
|
433
|
+
assert_equal files['postscript.re'], book.postscripts.chapters.last.path
|
434
|
+
assert_equal nil, book.postscripts.chapters.last.number
|
435
|
+
end
|
436
|
+
|
437
|
+
mktmpbookdir 'preface.re' => '',
|
438
|
+
'POSTDEF' => '' do |dir, book, files|
|
439
|
+
assert_equal nil, book.postscripts # XXX: OK?
|
440
|
+
end
|
441
|
+
|
442
|
+
mktmpbookdir 'POSTDEF' => '' do |dir, book, files|
|
443
|
+
assert_equal nil, book.postscripts
|
444
|
+
end
|
445
|
+
|
446
|
+
mktmpbookdir 'POSTDEF' => 'chapter1',
|
447
|
+
'chapter1.re' => '' do |dir, book, files|
|
448
|
+
assert_kind_of Part, book.postscripts
|
449
|
+
assert_equal '', book.postscripts.name
|
450
|
+
assert_equal 1, book.postscripts.chapters.size
|
451
|
+
assert_equal "chapter1", book.postscripts.chapters.first.name
|
452
|
+
assert_equal files['chapter1.re'], book.postscripts.chapters.first.path
|
453
|
+
end
|
454
|
+
|
455
|
+
mktmpbookdir 'POSTDEF' => "chapter1\n\nchapter2",
|
456
|
+
'chapter1.re' => '', 'chapter2.re' => '' do |dir, book, files|
|
457
|
+
assert_kind_of Part, book.postscripts
|
458
|
+
assert_equal '', book.postscripts.name
|
459
|
+
assert_equal 2, book.postscripts.chapters.size
|
460
|
+
assert_equal "chapter1", book.postscripts.chapters.first.name
|
461
|
+
assert_equal files['chapter1.re'], book.postscripts.chapters.first.path
|
462
|
+
assert_equal "chapter2", book.postscripts.chapters.last.name
|
463
|
+
assert_equal files['chapter2.re'], book.postscripts.chapters.last.path
|
464
|
+
end
|
465
|
+
|
466
|
+
mktmpbookdir 'POSTDEF' => "chapter1 chapter2",
|
467
|
+
'chapter1.re' => '', 'chapter2.re' => '' do |dir, book, files|
|
468
|
+
assert_kind_of Part, book.postscripts
|
469
|
+
assert_equal '', book.postscripts.name
|
470
|
+
assert_equal 2, book.postscripts.chapters.size # XXX: OK?
|
471
|
+
end
|
472
|
+
|
473
|
+
mktmpbookdir 'POSTDEF' => 'not_exist' do |dir, book, files|
|
474
|
+
assert_raises FileNotFound do
|
475
|
+
assert_equal nil, book.postscripts
|
476
|
+
end
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
def test_parts
|
481
|
+
mktmpbookdir do |dir, book, files|
|
482
|
+
assert book.parts.empty?
|
483
|
+
assert !book.part(0)
|
484
|
+
assert !book.part(1)
|
485
|
+
assert !book.no_part?
|
486
|
+
|
487
|
+
tmp = []
|
488
|
+
book.each_part { tmp << true }
|
489
|
+
assert tmp.empty?
|
490
|
+
end
|
491
|
+
|
492
|
+
mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3" do |dir, book, files|
|
493
|
+
parts = book.parts
|
494
|
+
assert_equal 2, parts.size
|
495
|
+
assert !book.part(0)
|
496
|
+
assert book.part(1)
|
497
|
+
assert book.part(2)
|
498
|
+
assert !book.part(3)
|
499
|
+
assert !book.no_part? # XXX: OK?
|
500
|
+
|
501
|
+
tmp = []
|
502
|
+
book.each_part {|p| tmp << p.number }
|
503
|
+
assert_equal [1, 2], tmp
|
504
|
+
end
|
505
|
+
|
506
|
+
mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3",
|
507
|
+
'preface.re' => '' do |dir, book, files|
|
508
|
+
parts = book.parts
|
509
|
+
assert_equal 3, parts.size
|
510
|
+
assert book.part(1)
|
511
|
+
assert book.part(2)
|
512
|
+
assert !book.part(3)
|
513
|
+
assert book.part(nil) # XXX: OK?
|
514
|
+
assert_equal 'preface', parts.first.chapters.first.name
|
515
|
+
|
516
|
+
tmp = []
|
517
|
+
book.each_part {|p| tmp << p.number }
|
518
|
+
assert_equal [nil, 1, 2], tmp
|
519
|
+
end
|
520
|
+
|
521
|
+
mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3",
|
522
|
+
'postscript.re' => '' do |dir, book, files|
|
523
|
+
parts = book.parts
|
524
|
+
assert_equal 3, parts.size
|
525
|
+
assert book.part(1)
|
526
|
+
assert book.part(2)
|
527
|
+
assert !book.part(3)
|
528
|
+
assert book.part(nil) # XXX: OK?
|
529
|
+
assert_equal 'postscript', parts.last.chapters.last.name
|
530
|
+
|
531
|
+
tmp = []
|
532
|
+
book.each_part {|p| tmp << p.number }
|
533
|
+
assert_equal [1, 2, nil], tmp
|
534
|
+
end
|
535
|
+
|
536
|
+
mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3",
|
537
|
+
'preface.re' => '', 'postscript.re' => '' do |dir, book, files|
|
538
|
+
parts = book.parts
|
539
|
+
assert_equal 4, parts.size
|
540
|
+
assert book.part(1)
|
541
|
+
assert book.part(2)
|
542
|
+
assert !book.part(3)
|
543
|
+
assert !book.part(4)
|
544
|
+
assert book.part(nil) # XXX: OK?
|
545
|
+
assert_equal 'preface', parts.first.chapters.first.name
|
546
|
+
assert_equal 'postscript', parts.last.chapters.last.name
|
547
|
+
|
548
|
+
tmp = []
|
549
|
+
book.each_part {|p| tmp << p.number }
|
550
|
+
assert_equal [nil, 1, 2, nil], tmp
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
554
|
+
def test_chapters
|
555
|
+
mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3",
|
556
|
+
'preface.re' => '', 'postscript.re' => '' do |dir, book, files|
|
557
|
+
chapters = book.chapters
|
558
|
+
assert_equal 5, chapters.size
|
559
|
+
|
560
|
+
ch_names = %w(preface ch1 ch2 ch3 postscript)
|
561
|
+
tmp = []
|
562
|
+
book.each_chapter {|ch| tmp << ch.name }
|
563
|
+
assert_equal ch_names, tmp
|
564
|
+
|
565
|
+
ch_names.each do |name|
|
566
|
+
assert book.chapter(name)
|
567
|
+
assert_equal name, book.chapter(name).name
|
568
|
+
end
|
569
|
+
|
570
|
+
assert_raises IndexError,KeyError do
|
571
|
+
book.chapter('not exist')
|
572
|
+
end
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
def test_volume
|
577
|
+
mktmpbookdir do |dir, book, files|
|
578
|
+
assert book.volume
|
579
|
+
assert_equal 0, book.volume.bytes
|
580
|
+
assert_equal 0, book.volume.chars
|
581
|
+
assert_equal 0, book.volume.lines
|
582
|
+
end
|
583
|
+
|
584
|
+
mktmpbookdir 'CHAPS' => 'chapter1.re', 'chapter1.re' => '12345' do |dir, book, files|
|
585
|
+
assert book.volume
|
586
|
+
assert book.volume.bytes > 0
|
587
|
+
assert book.volume.chars > 0
|
588
|
+
assert book.volume.lines > 0
|
589
|
+
end
|
590
|
+
|
591
|
+
mktmpbookdir 'preface.re' => '12345' do |dir, book, files|
|
592
|
+
assert_raises Errno::ENOENT do # XXX: OK?
|
593
|
+
book.volume
|
594
|
+
end
|
595
|
+
|
596
|
+
Dir.chdir(dir) do
|
597
|
+
book2 = Book.new('.')
|
598
|
+
assert book2.volume
|
599
|
+
assert book2.volume.bytes > 0
|
600
|
+
assert book2.volume.chars > 0
|
601
|
+
assert book2.volume.lines > 0
|
602
|
+
end
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
def test_basedir
|
607
|
+
Dir.mktmpdir do |dir|
|
608
|
+
book = Book.new(dir)
|
609
|
+
assert_equal dir, book.basedir
|
610
|
+
end
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
class ParametersTest < Test::Unit::TestCase
|
615
|
+
def test_s_default
|
616
|
+
assert Parameters.default
|
617
|
+
end
|
618
|
+
|
619
|
+
def test_s_load
|
620
|
+
Tempfile.open('parameters_test') do |io|
|
621
|
+
io.puts 'CHAPS_FILE = "x_CHAPS"'
|
622
|
+
io.puts 'PAPER = "B5"' # XXX: avoid erros of the last line of Parameters.get_page_metric
|
623
|
+
io.close
|
624
|
+
|
625
|
+
params = Parameters.load(io.path)
|
626
|
+
assert_equal '/x_CHAPS', params.chapter_file # XXX: OK? (leading / and uninitialized @basedir)
|
627
|
+
assert_equal '/CHAPS', params.part_file
|
628
|
+
end
|
629
|
+
end
|
630
|
+
|
631
|
+
def test_s_get_page_metric
|
632
|
+
mod = Module.new
|
633
|
+
assert_raises ArgumentError do # XXX: OK?
|
634
|
+
params = Parameters.get_page_metric(mod)
|
635
|
+
assert params
|
636
|
+
end
|
637
|
+
|
638
|
+
mod = Module.new
|
639
|
+
mod.module_eval { const_set(:PAPER, 'A5') }
|
640
|
+
assert_nothing_raised do
|
641
|
+
params = Parameters.get_page_metric(mod)
|
642
|
+
assert params
|
643
|
+
end
|
644
|
+
|
645
|
+
mod = Module.new
|
646
|
+
mod.module_eval { const_set(:PAPER, 'X5') }
|
647
|
+
assert_raises ConfigError do
|
648
|
+
Parameters.get_page_metric(mod)
|
649
|
+
end
|
650
|
+
end
|
651
|
+
end
|
652
|
+
|
653
|
+
class PartTest < Test::Unit::TestCase
|
654
|
+
def test_initialize
|
655
|
+
part = Part.new(nil, nil)
|
656
|
+
assert_equal nil, part.number
|
657
|
+
assert_equal nil, part.chapters
|
658
|
+
assert_equal '', part.name
|
659
|
+
|
660
|
+
part = Part.new(123, [], 'name')
|
661
|
+
assert_equal 123, part.number
|
662
|
+
assert_equal [], part.chapters
|
663
|
+
assert_equal 'name', part.name
|
664
|
+
end
|
665
|
+
|
666
|
+
def test_each_chapter
|
667
|
+
part = Part.new(nil, [1, 2, 3])
|
668
|
+
|
669
|
+
tmp = []
|
670
|
+
part.each_chapter do |ch|
|
671
|
+
tmp << ch
|
672
|
+
end
|
673
|
+
assert_equal [1, 2, 3], tmp
|
674
|
+
end
|
675
|
+
|
676
|
+
def test_volume
|
677
|
+
part = Part.new(nil, [])
|
678
|
+
assert part.volume
|
679
|
+
assert_equal 0, part.volume.bytes
|
680
|
+
assert_equal 0, part.volume.chars
|
681
|
+
assert_equal 0, part.volume.lines
|
682
|
+
|
683
|
+
chs = []
|
684
|
+
Tempfile.open('part_test') do |o|
|
685
|
+
o.print "12345"
|
686
|
+
chs << Chapter.new(nil, nil, nil, o.path)
|
687
|
+
end
|
688
|
+
Tempfile.open('part_test') do |o|
|
689
|
+
o.print "67890"
|
690
|
+
chs << Chapter.new(nil, nil, nil, o.path)
|
691
|
+
end
|
692
|
+
|
693
|
+
part = Part.new(nil, chs)
|
694
|
+
assert part.volume
|
695
|
+
assert part.volume.bytes > 0
|
696
|
+
assert part.volume.chars > 0
|
697
|
+
assert part.volume.lines > 0
|
698
|
+
end
|
699
|
+
end
|
700
|
+
|
701
|
+
class ChapterTest < Test::Unit::TestCase
|
702
|
+
include BookTestHelper
|
703
|
+
|
704
|
+
def setup
|
705
|
+
|
706
|
+
if "".respond_to?(:encode)
|
707
|
+
@utf8_str = "あいうえお"
|
708
|
+
@eucjp_str = "あいうえお".encode("EUC-JP")
|
709
|
+
@sjis_str = "あいうえお".encode("Shift_JIS")
|
710
|
+
@jis_str = "あいうえお".encode("ISO-2022-JP")
|
711
|
+
else
|
712
|
+
@utf8_str = "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a" # "あいうえお"
|
713
|
+
@eucjp_str = "\xa4\xa2\xa4\xa4\xa4\xa6\xa4\xa8\xa4\xaa"
|
714
|
+
@sjis_str = "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8"
|
715
|
+
@jis_str = "\x1b\x24\x42\x24\x22\x24\x24\x24\x26\x24\x28\x24\x2a\x1b\x28\x42"
|
716
|
+
end
|
717
|
+
=begin
|
718
|
+
@utf8_str = "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a" # "あいうえお"
|
719
|
+
@eucjp_str = "\xa4\xa2\xa4\xa4\xa4\xa6\xa4\xa8\xa4\xaa"
|
720
|
+
@sjis_str = "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8"
|
721
|
+
@jis_str = "\x1b\x24\x42\x24\x22\x24\x24\x24\x26\x24\x28\x24\x2a\x1b\x28\x42"
|
722
|
+
=end
|
723
|
+
end
|
724
|
+
|
725
|
+
def test_s_intern_pathes
|
726
|
+
dir1_files = {
|
727
|
+
'CHAPS' => "ch1.re\nch2.re\n",
|
728
|
+
'ch1.re' => 'ch1',
|
729
|
+
'ch2.re' => 'ch2',
|
730
|
+
}
|
731
|
+
dir2_files = {
|
732
|
+
'CHAPS' => "ch1.re\n",
|
733
|
+
'ch1.re' => 'ch1',
|
734
|
+
}
|
735
|
+
mktmpbookdir dir1_files do |dir1, book1, files1|
|
736
|
+
mktmpbookdir dir2_files do |dir2, book2, files2|
|
737
|
+
paths = (files1.values + files2.values).flatten.grep(/\.re\z/)
|
738
|
+
chs = Chapter.intern_pathes(paths)
|
739
|
+
|
740
|
+
assert_equal 3, chs.size
|
741
|
+
assert chs[0].book == chs[1].book
|
742
|
+
assert chs[0].book != chs[2].book
|
743
|
+
assert dir1, chs[0].book.basedir
|
744
|
+
assert dir2, chs[2].book.basedir
|
745
|
+
end
|
746
|
+
end
|
747
|
+
|
748
|
+
dir_files = {
|
749
|
+
'CHAPS' => "ch1.re\n",
|
750
|
+
'ch1.re' => 'ch1',
|
751
|
+
}
|
752
|
+
mktmpbookdir dir_files do |dir, book, files|
|
753
|
+
paths = files.values.grep(/\.re\z/)
|
754
|
+
paths << __FILE__ + ' not exist file.re'
|
755
|
+
assert_raises IndexError,KeyError do # XXX: OK? (KeyError?)
|
756
|
+
Chapter.intern_pathes(paths)
|
757
|
+
end
|
758
|
+
end
|
759
|
+
|
760
|
+
dir_files = {
|
761
|
+
'ch1.re' => 'ch1 not in CHAPS',
|
762
|
+
'ch2.re' => 'ch2 not in CHAPS',
|
763
|
+
}
|
764
|
+
mktmpbookdir dir_files do |dir, book, files|
|
765
|
+
paths = files.values.grep(/\.re\z/)
|
766
|
+
assert_nothing_raised do
|
767
|
+
Chapter.intern_pathes(paths)
|
768
|
+
end
|
769
|
+
end
|
770
|
+
|
771
|
+
dir_files = {
|
772
|
+
'CHAPS' => "ch1.re\n",
|
773
|
+
'ch1.re' => 'ch1',
|
774
|
+
'ch2.re' => 'ch2 not in CHAPS',
|
775
|
+
}
|
776
|
+
mktmpbookdir dir_files do |dir, book, files|
|
777
|
+
paths = files.values.grep(/\.re\z/)
|
778
|
+
assert_raises IndexError,KeyError do # XXX: OK? (should not be raised?)
|
779
|
+
Chapter.intern_pathes(paths)
|
780
|
+
end
|
781
|
+
end
|
782
|
+
|
783
|
+
dir_files = {
|
784
|
+
'CHAPS' => "ch1.re\n",
|
785
|
+
'ch1.re' => 'ch1',
|
786
|
+
'preface.re' => 'preface',
|
787
|
+
}
|
788
|
+
mktmpbookdir dir_files do |dir, book, files|
|
789
|
+
paths = files.values.grep(/\.re\z/)
|
790
|
+
assert_nothing_raised do
|
791
|
+
Chapter.intern_pathes(paths)
|
792
|
+
end
|
793
|
+
end
|
794
|
+
end
|
795
|
+
|
796
|
+
def test_s_for_stdin
|
797
|
+
assert Chapter.for_stdin
|
798
|
+
end
|
799
|
+
|
800
|
+
def test_s_for_path
|
801
|
+
assert Chapter.for_path(1, __FILE__)
|
802
|
+
end
|
803
|
+
|
804
|
+
def test_initialize
|
805
|
+
ch = Chapter.new(:book, :number, :name, '/foo/bar', :io)
|
806
|
+
assert_equal :book, ch.env
|
807
|
+
assert_equal :book, ch.book
|
808
|
+
assert_equal :number, ch.number
|
809
|
+
assert_equal '/foo/bar', ch.path
|
810
|
+
assert_equal "#<ReVIEW::Chapter number /foo/bar>", ch.inspect
|
811
|
+
end
|
812
|
+
|
813
|
+
def test_dirname_and_basename
|
814
|
+
ch = Chapter.new(nil, nil, nil, nil, nil)
|
815
|
+
assert_equal nil, ch.dirname
|
816
|
+
assert_equal nil, ch.basename
|
817
|
+
|
818
|
+
ch = Chapter.new(nil, nil, nil, '/foo/bar', nil)
|
819
|
+
assert_equal '/foo', ch.dirname
|
820
|
+
assert_equal 'bar', ch.basename
|
821
|
+
|
822
|
+
ch = Chapter.new(nil, nil, nil, 'bar', nil)
|
823
|
+
assert_equal '.', ch.dirname
|
824
|
+
assert_equal 'bar', ch.basename
|
825
|
+
end
|
826
|
+
|
827
|
+
def test_name
|
828
|
+
ch = Chapter.new(nil, nil, 'foo', nil)
|
829
|
+
assert_equal 'foo', ch.name
|
830
|
+
|
831
|
+
ch = Chapter.new(nil, nil, 'foo.bar', nil)
|
832
|
+
assert_equal 'foo', ch.name
|
833
|
+
|
834
|
+
ch = Chapter.new(nil, nil, nil, nil)
|
835
|
+
assert_raises(TypeError) { ch.name } # XXX: OK?
|
836
|
+
end
|
837
|
+
|
838
|
+
def test_open
|
839
|
+
ch = Chapter.new(nil, nil, nil, __FILE__, :io)
|
840
|
+
assert_equal :io, ch.open
|
841
|
+
assert_equal [:io], ch.open {|io| [io] }
|
842
|
+
|
843
|
+
ch = Chapter.new(nil, nil, nil, __FILE__)
|
844
|
+
assert_equal __FILE__, ch.open.path
|
845
|
+
assert_equal [__FILE__], ch.open {|io| [io.path] }
|
846
|
+
end
|
847
|
+
|
848
|
+
def test_size
|
849
|
+
ch = Chapter.new(nil, nil, nil, __FILE__, :io)
|
850
|
+
assert_equal File.size(__FILE__), ch.size
|
851
|
+
|
852
|
+
File.open(__FILE__, 'r') do |i|
|
853
|
+
ch = Chapter.new(nil, nil, nil, nil, i)
|
854
|
+
assert_raises(TypeError) do # XXX: OK?
|
855
|
+
ch.size
|
856
|
+
end
|
857
|
+
end
|
858
|
+
end
|
859
|
+
|
860
|
+
def test_title
|
861
|
+
io = StringIO.new
|
862
|
+
ch = Chapter.new(nil, nil, nil, nil, io)
|
863
|
+
assert_equal '', ch.title
|
864
|
+
|
865
|
+
io = StringIO.new("=1\n=2\n")
|
866
|
+
ch = Chapter.new(nil, nil, nil, nil, io)
|
867
|
+
assert_equal '1', ch.title
|
868
|
+
|
869
|
+
|
870
|
+
[
|
871
|
+
['EUC', @eucjp_str],
|
872
|
+
['SJIS', @sjis_str],
|
873
|
+
# ['JIS', @jis_str],
|
874
|
+
['XYZ', @eucjp_str],
|
875
|
+
].each do |enc, instr|
|
876
|
+
io = StringIO.new("= #{instr}\n")
|
877
|
+
ch = Chapter.new(nil, nil, nil, nil, io)
|
878
|
+
ReVIEW.book.param = {'inencoding' => enc}
|
879
|
+
assert_equal @utf8_str, ch.title
|
880
|
+
assert_equal @utf8_str, ch.instance_eval { @title }
|
881
|
+
end
|
882
|
+
end
|
883
|
+
|
884
|
+
def test_content
|
885
|
+
[
|
886
|
+
['EUC', @eucjp_str],
|
887
|
+
['SJIS', @sjis_str],
|
888
|
+
['JIS', @jis_str],
|
889
|
+
['XYZ', @eucjp_str],
|
890
|
+
].each do |enc, instr|
|
891
|
+
tf = Tempfile.new('chapter_test')
|
892
|
+
begin
|
893
|
+
tf.print instr
|
894
|
+
tf.close
|
895
|
+
|
896
|
+
ch = Chapter.new(nil, nil, nil, tf.path)
|
897
|
+
ReVIEW.book.param = {'inencoding' => enc}
|
898
|
+
assert_equal @utf8_str, ch.content
|
899
|
+
assert_equal @utf8_str, ch.instance_eval { @content }
|
900
|
+
ensure
|
901
|
+
tf.close(true)
|
902
|
+
end
|
903
|
+
|
904
|
+
tf1 = Tempfile.new('chapter_test1')
|
905
|
+
tf2 = Tempfile.new('chapter_test2')
|
906
|
+
begin
|
907
|
+
tf1.puts instr
|
908
|
+
tf1.puts instr
|
909
|
+
tf1.close
|
910
|
+
tf2.puts instr
|
911
|
+
tf1.close
|
912
|
+
|
913
|
+
ch = Chapter.new(nil, nil, nil, tf1.path, tf2)
|
914
|
+
ReVIEW.book.param = {'inencoding' => enc}
|
915
|
+
assert_equal "#{@utf8_str}\n#{@utf8_str}\n", ch.content # XXX: OK?
|
916
|
+
ensure
|
917
|
+
tf1.close(true)
|
918
|
+
tf2.close(true)
|
919
|
+
end
|
920
|
+
end
|
921
|
+
end
|
922
|
+
|
923
|
+
def test_lines
|
924
|
+
lines = ["1\n", "2\n", "3"]
|
925
|
+
tf = Tempfile.new('chapter_test')
|
926
|
+
tf.print lines.join('')
|
927
|
+
tf.close
|
928
|
+
|
929
|
+
ch = Chapter.new(nil, nil, nil, tf.path)
|
930
|
+
assert_equal lines, ch.lines
|
931
|
+
|
932
|
+
lines = ["1\n", "2\n", "3"]
|
933
|
+
tf1 = Tempfile.new('chapter_test1')
|
934
|
+
tf1.print lines.join('')
|
935
|
+
tf1.close
|
936
|
+
tf2 = Tempfile.new('chapter_test2')
|
937
|
+
tf2.puts lines.join('')
|
938
|
+
tf2.puts lines.join('')
|
939
|
+
tf2.close
|
940
|
+
|
941
|
+
ch = Chapter.new(nil, nil, nil, tf1.path, tf2.path)
|
942
|
+
assert_equal lines, ch.lines # XXX: OK?
|
943
|
+
end
|
944
|
+
|
945
|
+
def test_volume
|
946
|
+
content = "abc\ndef"
|
947
|
+
tf1 = Tempfile.new('chapter_test1')
|
948
|
+
tf1.print content
|
949
|
+
tf1.close
|
950
|
+
tf2 = Tempfile.new('chapter_test2')
|
951
|
+
tf2.print content
|
952
|
+
tf2.print content
|
953
|
+
tf2.close
|
954
|
+
|
955
|
+
ch = Chapter.new(nil, nil, nil, tf1.path)
|
956
|
+
assert ch.volume
|
957
|
+
assert_equal content.gsub(/\s/, '').size, ch.volume.bytes
|
958
|
+
|
959
|
+
ch = Chapter.new(nil, nil, nil, tf1.path, tf2)
|
960
|
+
assert ch.volume
|
961
|
+
assert_equal content.gsub(/\s/, '').size, ch.volume.bytes # XXX: OK?
|
962
|
+
end
|
963
|
+
|
964
|
+
def test_on_CHAPS?
|
965
|
+
mktmpbookdir 'CHAPS' => "chapter1.re\nchapter2.re",
|
966
|
+
'chapter1.re' => '12345', 'preface.re' => 'abcde' do |dir, book, files|
|
967
|
+
ch1 = Chapter.new(book, 1, 'chapter1', files['chapter1.re'])
|
968
|
+
pre = Chapter.new(book, nil, 'preface', files['preface.re'])
|
969
|
+
|
970
|
+
assert ch1.on_CHAPS?
|
971
|
+
assert !pre.on_CHAPS?
|
972
|
+
|
973
|
+
ch2_path = File.join(dir, 'chapter2.er')
|
974
|
+
File.open(ch2_path, 'w') {}
|
975
|
+
ch2 = Chapter.new(book, 2, 'chapter2', ch2_path)
|
976
|
+
|
977
|
+
ch3_path = File.join(dir, 'chapter3.er')
|
978
|
+
File.open(ch3_path, 'w') {}
|
979
|
+
ch3 = Chapter.new(book, 3, 'chapter3', ch3_path)
|
980
|
+
|
981
|
+
assert ch2.on_CHAPS?
|
982
|
+
assert !ch3.on_CHAPS?
|
983
|
+
end
|
984
|
+
end
|
985
|
+
|
986
|
+
def test_list_index
|
987
|
+
do_test_index(<<E, ListIndex, :list_index, :list)
|
988
|
+
//list
|
989
|
+
//listnum [abc]
|
990
|
+
//list [def]
|
991
|
+
//table [def]
|
992
|
+
//table [others]
|
993
|
+
E
|
994
|
+
end
|
995
|
+
|
996
|
+
def test_table_index
|
997
|
+
do_test_index(<<E, TableIndex, :table_index, :table)
|
998
|
+
//table
|
999
|
+
//table [abc]
|
1000
|
+
//table [def]
|
1001
|
+
//list [def]
|
1002
|
+
//list [others]
|
1003
|
+
E
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
def test_footnote_index
|
1007
|
+
content = <<E
|
1008
|
+
//footnote
|
1009
|
+
//footnote [abc][text...]
|
1010
|
+
//footnote [def][text...]
|
1011
|
+
//footnote [xyz]
|
1012
|
+
//list [def]
|
1013
|
+
//list [others]
|
1014
|
+
E
|
1015
|
+
do_test_index(content, FootnoteIndex, :footnote_index, :footnote) do |ch|
|
1016
|
+
assert_raises IndexError,KeyError do
|
1017
|
+
ch.footnote('xyz')
|
1018
|
+
end
|
1019
|
+
end
|
1020
|
+
end
|
1021
|
+
|
1022
|
+
def test_bibpaper
|
1023
|
+
do_test_index(<<E, BibpaperIndex, :bibpaper_index, :bibpaper, :filename => 'bib.re')
|
1024
|
+
//bibpaper
|
1025
|
+
//bibpaper [abc][text...]
|
1026
|
+
//bibpaper [def][text...]
|
1027
|
+
//bibpaper [xyz]
|
1028
|
+
//list [def]
|
1029
|
+
//list [others]
|
1030
|
+
E
|
1031
|
+
assert_raises FileNotFound do
|
1032
|
+
do_test_index('', BibpaperIndex, :bibpaper_index, :bibpaper, :filename => 'bib')
|
1033
|
+
end
|
1034
|
+
end
|
1035
|
+
|
1036
|
+
def test_headline_index
|
1037
|
+
do_test_index(<<E, HeadlineIndex, :headline_index, :headline, :propagate => false)
|
1038
|
+
==
|
1039
|
+
== abc
|
1040
|
+
== def
|
1041
|
+
=== def
|
1042
|
+
//table others
|
1043
|
+
E
|
1044
|
+
end
|
1045
|
+
|
1046
|
+
def test_image
|
1047
|
+
do_test_index(<<E, ImageIndex, :image_index, :image)
|
1048
|
+
//image
|
1049
|
+
//image [abc]
|
1050
|
+
//image [def]
|
1051
|
+
//list [def]
|
1052
|
+
//list [others]
|
1053
|
+
E
|
1054
|
+
|
1055
|
+
do_test_index(<<E, NumberlessImageIndex, :numberless_image_index, :image, :propagate => false)
|
1056
|
+
//numberlessimage
|
1057
|
+
//numberlessimage [abc]
|
1058
|
+
//numberlessimage [def]
|
1059
|
+
//list [def]
|
1060
|
+
//list [others]
|
1061
|
+
E
|
1062
|
+
|
1063
|
+
do_test_index(<<E, ImageIndex, :image_index, :image)
|
1064
|
+
//image
|
1065
|
+
//numberlessimage [abc]
|
1066
|
+
//image [def]
|
1067
|
+
//list [def]
|
1068
|
+
//list [others]
|
1069
|
+
E
|
1070
|
+
|
1071
|
+
do_test_index(<<E, NumberlessImageIndex, :numberless_image_index, :image, :propagate => false)
|
1072
|
+
//image
|
1073
|
+
//numberlessimage [abc]
|
1074
|
+
//image [def]
|
1075
|
+
//list [def]
|
1076
|
+
//list [others]
|
1077
|
+
E
|
1078
|
+
end
|
1079
|
+
|
1080
|
+
def do_test_index(content, klass, list_method, ref_method, opts = {})
|
1081
|
+
Dir.mktmpdir do |dir|
|
1082
|
+
path = File.join(dir, opts[:filename] || 'chapter.re')
|
1083
|
+
|
1084
|
+
book = Book.new(dir)
|
1085
|
+
|
1086
|
+
ch = nil
|
1087
|
+
File.open(path, 'w') do |o|
|
1088
|
+
o.print content
|
1089
|
+
ch = Chapter.new(book, 1, 'chapter', o.path)
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
assert ch.__send__(ref_method, 'abc')
|
1093
|
+
assert ch.__send__(ref_method, 'def')
|
1094
|
+
assert_raises IndexError,KeyError do
|
1095
|
+
ch.__send__(ref_method, nil)
|
1096
|
+
end
|
1097
|
+
assert_raises IndexError,KeyError do
|
1098
|
+
ch.__send__(ref_method, 'others')
|
1099
|
+
end
|
1100
|
+
assert_raises IndexError,KeyError do
|
1101
|
+
ch.__send__(ref_method, 'not exist id')
|
1102
|
+
end
|
1103
|
+
|
1104
|
+
yield(ch) if block_given?
|
1105
|
+
end
|
1106
|
+
end
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
class ChapterSetTest < Test::Unit::TestCase
|
1110
|
+
include BookTestHelper
|
1111
|
+
|
1112
|
+
def test_s_for_pathes
|
1113
|
+
dir_files = {
|
1114
|
+
'ch1.re' => 'ch1',
|
1115
|
+
'ch2.re' => 'ch2',
|
1116
|
+
}
|
1117
|
+
mktmpbookdir dir_files do |dir, book, files|
|
1118
|
+
paths = files.values.grep(/\.re\z/)
|
1119
|
+
cs = nil
|
1120
|
+
assert_nothing_raised do
|
1121
|
+
cs = ChapterSet.for_pathes(paths)
|
1122
|
+
end
|
1123
|
+
assert_equal 2, cs.chapters.size
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def test_s_for_argv
|
1128
|
+
begin
|
1129
|
+
paths = []
|
1130
|
+
ChapterSet.class_eval { const_set(:ARGV, paths) }
|
1131
|
+
|
1132
|
+
dir_files = {
|
1133
|
+
'ch1.re' => 'ch1',
|
1134
|
+
'ch2.re' => 'ch2',
|
1135
|
+
}
|
1136
|
+
mktmpbookdir dir_files do |dir, book, files|
|
1137
|
+
paths.concat files.values.grep(/\.re\z/)
|
1138
|
+
cs = nil
|
1139
|
+
assert_nothing_raised do
|
1140
|
+
cs = ChapterSet.for_argv
|
1141
|
+
end
|
1142
|
+
assert_equal 2, cs.chapters.size
|
1143
|
+
assert_equal ['ch1', 'ch2'], cs.chapters.map(&:name).sort
|
1144
|
+
end
|
1145
|
+
|
1146
|
+
ensure
|
1147
|
+
ChapterSet.class_eval { remove_const(:ARGV) }
|
1148
|
+
ChapterSet.class_eval { const_set(:ARGV, []) }
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
begin
|
1152
|
+
$stdin = StringIO.new('abc')
|
1153
|
+
cs = nil
|
1154
|
+
assert_nothing_raised do
|
1155
|
+
cs = ChapterSet.for_argv
|
1156
|
+
end
|
1157
|
+
assert_equal 1, cs.chapters.size
|
1158
|
+
assert_equal '-', cs.chapters.first.name
|
1159
|
+
|
1160
|
+
ensure
|
1161
|
+
$stdin = STDIN
|
1162
|
+
end
|
1163
|
+
end
|
1164
|
+
|
1165
|
+
def test_no_part?
|
1166
|
+
cs = ChapterSet.new([])
|
1167
|
+
assert cs.no_part?
|
1168
|
+
|
1169
|
+
ch = Chapter.new(nil, nil, nil, nil, StringIO.new)
|
1170
|
+
cs = ChapterSet.new([ch])
|
1171
|
+
assert cs.no_part?
|
1172
|
+
end
|
1173
|
+
|
1174
|
+
def test_chapters
|
1175
|
+
ch1 = Chapter.new(nil, 123, nil, nil, StringIO.new)
|
1176
|
+
ch2 = Chapter.new(nil, 456, nil, nil, StringIO.new)
|
1177
|
+
cs = ChapterSet.new([ch1, ch2])
|
1178
|
+
assert_equal [123, 456], cs.chapters.map(&:number)
|
1179
|
+
|
1180
|
+
tmp = [ch1, ch2]
|
1181
|
+
cs.each_chapter do |ch|
|
1182
|
+
assert tmp.delete(ch)
|
1183
|
+
end
|
1184
|
+
assert tmp.empty?
|
1185
|
+
end
|
1186
|
+
|
1187
|
+
def test_ext
|
1188
|
+
cs = ChapterSet.new([])
|
1189
|
+
assert_equal '.re', cs.ext
|
1190
|
+
end
|
1191
|
+
end
|