review 4.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-tex.yml +35 -0
  3. data/.github/workflows/ruby-win.yml +19 -9
  4. data/.github/workflows/ruby.yml +7 -3
  5. data/.rubocop.yml +138 -34
  6. data/NEWS.ja.md +285 -0
  7. data/NEWS.md +285 -1
  8. data/README.md +7 -6
  9. data/Rakefile +7 -2
  10. data/bin/review +2 -4
  11. data/bin/review-catalog-converter +4 -4
  12. data/bin/review-check +8 -12
  13. data/bin/review-checkdep +2 -5
  14. data/bin/review-compile +18 -34
  15. data/bin/review-epub2html +1 -4
  16. data/bin/review-epubmaker +3 -4
  17. data/bin/review-idgxmlmaker +1 -3
  18. data/bin/review-index +5 -86
  19. data/bin/review-init +1 -4
  20. data/bin/review-pdfmaker +1 -3
  21. data/bin/review-preproc +30 -38
  22. data/bin/review-textmaker +1 -3
  23. data/bin/review-update +1 -4
  24. data/bin/review-validate +4 -4
  25. data/bin/review-vol +5 -82
  26. data/bin/review-webmaker +1 -3
  27. data/doc/config.yml.sample +45 -11
  28. data/doc/config.yml.sample-simple +3 -3
  29. data/doc/format.ja.md +103 -13
  30. data/doc/format.md +104 -16
  31. data/doc/makeindex.ja.md +2 -2
  32. data/doc/pdfmaker.ja.md +42 -0
  33. data/doc/pdfmaker.md +41 -0
  34. data/doc/quickstart.ja.md +19 -6
  35. data/doc/quickstart.md +18 -6
  36. data/doc/writing_vertical.ja.md +6 -0
  37. data/lib/review.rb +1 -1
  38. data/lib/review/book.rb +2 -2
  39. data/lib/review/book/base.rb +67 -29
  40. data/lib/review/book/bib.rb +21 -0
  41. data/lib/review/book/book_unit.rb +158 -0
  42. data/lib/review/book/chapter.rb +33 -26
  43. data/lib/review/book/index.rb +24 -185
  44. data/lib/review/book/index/item.rb +7 -1
  45. data/lib/review/book/page_metric.rb +7 -7
  46. data/lib/review/book/part.rb +26 -11
  47. data/lib/review/book/volume.rb +5 -5
  48. data/lib/review/builder.rb +121 -52
  49. data/lib/review/call_hook.rb +20 -0
  50. data/lib/review/catalog.rb +3 -2
  51. data/lib/review/compiler.rb +230 -111
  52. data/lib/review/configure.rb +91 -7
  53. data/lib/review/converter.rb +1 -1
  54. data/lib/review/epub2html.rb +6 -1
  55. data/lib/review/epubmaker.rb +124 -152
  56. data/lib/review/epubmaker/content.rb +113 -0
  57. data/lib/review/epubmaker/epubcommon.rb +372 -0
  58. data/lib/review/epubmaker/epubv2.rb +178 -0
  59. data/lib/review/epubmaker/epubv3.rb +231 -0
  60. data/lib/review/epubmaker/producer.rb +167 -0
  61. data/lib/review/epubmaker/reviewheaderlistener.rb +12 -2
  62. data/lib/review/epubmaker/zip_exporter.rb +84 -0
  63. data/lib/review/exception.rb +13 -0
  64. data/lib/review/htmlbuilder.rb +176 -89
  65. data/lib/review/htmlutils.rb +8 -11
  66. data/lib/review/i18n.rb +2 -1
  67. data/lib/review/idgxmlbuilder.rb +165 -75
  68. data/lib/review/idgxmlmaker.rb +24 -28
  69. data/lib/review/img_math.rb +238 -0
  70. data/lib/review/index_builder.rb +645 -0
  71. data/lib/review/init.rb +9 -17
  72. data/lib/review/latexbox.rb +58 -0
  73. data/lib/review/latexbuilder.rb +193 -75
  74. data/lib/review/latexutils.rb +9 -1
  75. data/lib/review/lineinput.rb +112 -2
  76. data/lib/review/loggable.rb +27 -0
  77. data/lib/review/logger.rb +90 -3
  78. data/lib/review/makerhelper.rb +17 -188
  79. data/lib/review/markdownbuilder.rb +54 -4
  80. data/lib/review/pdfmaker.rb +76 -84
  81. data/lib/review/plaintextbuilder.rb +106 -22
  82. data/lib/review/preprocessor.rb +107 -303
  83. data/lib/review/preprocessor/directive.rb +35 -0
  84. data/lib/review/preprocessor/line.rb +34 -0
  85. data/lib/review/preprocessor/repository.rb +177 -0
  86. data/lib/review/rstbuilder.rb +27 -8
  87. data/lib/review/sec_counter.rb +14 -0
  88. data/lib/review/template.rb +11 -1
  89. data/lib/review/textmaker.rb +27 -32
  90. data/lib/review/textutils.rb +3 -12
  91. data/lib/review/tocprinter.rb +242 -97
  92. data/lib/review/topbuilder.rb +98 -31
  93. data/lib/review/update.rb +12 -13
  94. data/lib/review/version.rb +1 -1
  95. data/lib/review/volumeprinter.rb +97 -0
  96. data/lib/review/webmaker.rb +40 -47
  97. data/lib/review/webtocprinter.rb +39 -35
  98. data/lib/review/yamlloader.rb +2 -1
  99. data/review.gemspec +5 -3
  100. data/samples/sample-book/src/config-epub2.yml +1 -1
  101. data/samples/sample-book/src/config.yml +3 -3
  102. data/samples/sample-book/src/lib/tasks/review.rake +19 -1
  103. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +2 -1
  104. data/samples/syntax-book/Gemfile +1 -1
  105. data/samples/syntax-book/ch01.re +1 -1
  106. data/samples/syntax-book/ch02.re +21 -6
  107. data/samples/syntax-book/ch03.re +1 -1
  108. data/samples/syntax-book/config.yml +1 -1
  109. data/samples/syntax-book/images/img3-2.png +0 -0
  110. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +2 -1
  111. data/templates/html/_colophon.html.erb +23 -0
  112. data/templates/html/_colophon_history.html.erb +9 -0
  113. data/templates/html/_cover.html.erb +10 -0
  114. data/templates/html/_part_body.html.erb +6 -0
  115. data/templates/html/_titlepage.html.erb +20 -0
  116. data/templates/html/layout-html5.html.erb +6 -0
  117. data/templates/html/layout-xhtml1.html.erb +6 -0
  118. data/templates/latex/config.erb +35 -23
  119. data/templates/latex/review-jlreq/README.md +3 -1
  120. data/templates/latex/review-jlreq/review-base.sty +36 -23
  121. data/templates/latex/review-jlreq/review-jlreq.cls +18 -25
  122. data/templates/latex/review-jlreq/review-style.sty +6 -1
  123. data/templates/latex/review-jlreq/review-tcbox.sty +348 -0
  124. data/templates/latex/review-jlreq/reviewmacro.sty +5 -0
  125. data/templates/latex/review-jsbook/README.md +7 -5
  126. data/templates/latex/review-jsbook/review-base.sty +40 -24
  127. data/templates/latex/review-jsbook/review-jsbook.cls +13 -3
  128. data/templates/latex/review-jsbook/review-style.sty +6 -1
  129. data/templates/latex/review-jsbook/review-tcbox.sty +348 -0
  130. data/templates/latex/review-jsbook/reviewmacro.sty +5 -0
  131. data/templates/opf/epubv2.opf.erb +7 -7
  132. data/templates/opf/epubv3.opf.erb +7 -7
  133. data/templates/opf/opf_manifest_epubv2.opf.erb +10 -0
  134. data/templates/opf/opf_manifest_epubv3.opf.erb +10 -0
  135. data/templates/opf/opf_metainfo_epubv2.opf.erb +17 -0
  136. data/templates/opf/opf_metainfo_epubv3.opf.erb +49 -0
  137. data/templates/opf/opf_tocx_epubv2.opf.erb +9 -0
  138. data/templates/opf/opf_tocx_epubv3.opf.erb +17 -0
  139. data/templates/web/html/layout-html5.html.erb +9 -8
  140. data/templates/web/html/layout-xhtml1.html.erb +6 -0
  141. data/test/assets/header_listener.html +35 -0
  142. data/test/assets/img_math/img1.png +0 -0
  143. data/test/assets/img_math/img2.png +0 -0
  144. data/test/assets/img_math/img3.png +0 -0
  145. data/test/assets/syntax_book_index_detail.txt +58 -0
  146. data/test/assets/test_template.tex +6 -3
  147. data/test/assets/test_template_backmatter.tex +6 -3
  148. data/test/book_test_helper.rb +11 -5
  149. data/test/run_test.rb +1 -1
  150. data/test/test_book.rb +54 -63
  151. data/test/test_book_chapter.rb +95 -54
  152. data/test/test_book_part.rb +3 -3
  153. data/test/test_builder.rb +29 -20
  154. data/test/test_catalog_converter_cmd.rb +1 -1
  155. data/test/test_converter.rb +1 -0
  156. data/test/test_epub3maker.rb +170 -126
  157. data/test/test_epubmaker.rb +254 -129
  158. data/test/test_epubmaker_cmd.rb +15 -4
  159. data/test/test_helper.rb +12 -5
  160. data/test/test_htmlbuilder.rb +926 -76
  161. data/test/test_htmlutils.rb +0 -12
  162. data/test/test_i18n.rb +33 -33
  163. data/test/test_idgxmlbuilder.rb +531 -20
  164. data/test/test_idgxmlmaker_cmd.rb +7 -3
  165. data/test/test_img_math.rb +111 -0
  166. data/test/test_index.rb +62 -52
  167. data/test/test_indexbuilder.rb +52 -0
  168. data/test/test_latexbuilder.rb +891 -20
  169. data/test/test_latexbuilder_v2.rb +56 -10
  170. data/test/test_lineinput.rb +20 -93
  171. data/test/test_logger.rb +7 -7
  172. data/test/test_makerhelper.rb +0 -12
  173. data/test/test_markdownbuilder.rb +32 -0
  174. data/test/test_pdfmaker.rb +100 -11
  175. data/test/test_pdfmaker_cmd.rb +3 -3
  176. data/test/test_plaintextbuilder.rb +546 -32
  177. data/test/test_preprocessor.rb +188 -1
  178. data/test/test_review_ext.rb +2 -1
  179. data/test/test_reviewheaderlistener.rb +49 -0
  180. data/test/test_rstbuilder.rb +25 -1
  181. data/test/test_sec_counter.rb +156 -0
  182. data/test/test_template.rb +12 -2
  183. data/test/test_textmaker_cmd.rb +5 -1
  184. data/test/test_tocprinter.rb +46 -0
  185. data/test/test_topbuilder.rb +324 -20
  186. data/test/test_update.rb +44 -44
  187. data/test/test_webtocprinter.rb +75 -43
  188. data/test/test_zip_exporter.rb +5 -6
  189. data/vendor/gentombow/LICENSE +1 -1
  190. data/vendor/gentombow/Makefile +0 -1
  191. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  192. data/vendor/gentombow/bounddvi-en.tex +1 -0
  193. data/vendor/gentombow/bounddvi.pdf +0 -0
  194. data/vendor/gentombow/bounddvi.sty +30 -7
  195. data/vendor/gentombow/bounddvi.tex +1 -0
  196. data/vendor/gentombow/create_archive.sh +1 -0
  197. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  198. data/vendor/gentombow/gentombow-ja.tex +9 -0
  199. data/vendor/gentombow/gentombow.pdf +0 -0
  200. data/vendor/gentombow/gentombow.sty +32 -10
  201. data/vendor/gentombow/gentombow.tex +8 -0
  202. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  203. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  204. data/vendor/jsclasses/Makefile +3 -2
  205. data/vendor/jsclasses/create_archive.sh +5 -5
  206. data/vendor/jsclasses/jis/Makefile +3 -2
  207. data/vendor/jsclasses/jis/jsarticle.cls +22 -18
  208. data/vendor/jsclasses/jis/jsbook.cls +22 -18
  209. data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
  210. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  211. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  212. data/vendor/jsclasses/jis/jslogo.sty +1 -13
  213. data/vendor/jsclasses/jis/jspf.cls +22 -18
  214. data/vendor/jsclasses/jis/jsreport.cls +22 -18
  215. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  216. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  217. data/vendor/jsclasses/jis/kiyou.cls +22 -18
  218. data/vendor/jsclasses/jis/minijs.sty +65 -22
  219. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  220. data/vendor/jsclasses/jis/okumacro.sty +1 -13
  221. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  222. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  223. data/vendor/jsclasses/jis/winjis.sty +23 -19
  224. data/vendor/jsclasses/jsarticle.cls +22 -18
  225. data/vendor/jsclasses/jsbook.cls +22 -18
  226. data/vendor/jsclasses/jsclasses.dtx +94 -13
  227. data/vendor/jsclasses/jsclasses.ins +15 -5
  228. data/vendor/jsclasses/jsclasses.pdf +0 -0
  229. data/vendor/jsclasses/jslogo.ins +9 -0
  230. data/vendor/jsclasses/jslogo.pdf +0 -0
  231. data/vendor/jsclasses/jslogo.sty +1 -13
  232. data/vendor/jsclasses/jspf.cls +22 -18
  233. data/vendor/jsclasses/jsreport.cls +22 -18
  234. data/vendor/jsclasses/jsverb.ins +9 -0
  235. data/vendor/jsclasses/jsverb.pdf +0 -0
  236. data/vendor/jsclasses/jsverb.sty +1 -13
  237. data/vendor/jsclasses/kiyou.cls +22 -18
  238. data/vendor/jsclasses/minijs.sty +68 -22
  239. data/vendor/jsclasses/okumacro.ins +9 -0
  240. data/vendor/jsclasses/okumacro.pdf +0 -0
  241. data/vendor/jsclasses/okumacro.sty +1 -13
  242. data/vendor/jsclasses/okuverb.ins +9 -0
  243. data/vendor/jsclasses/okuverb.pdf +0 -0
  244. data/vendor/jsclasses/okuverb.sty +1 -13
  245. data/vendor/jsclasses/tests/relfont.tex +10 -0
  246. data/vendor/jsclasses/winjis.sty +23 -19
  247. metadata +106 -22
  248. data/.rubocop_todo.yml +0 -7
  249. data/lib/epubmaker.rb +0 -23
  250. data/lib/epubmaker/content.rb +0 -110
  251. data/lib/epubmaker/epubcommon.rb +0 -441
  252. data/lib/epubmaker/epubv2.rb +0 -143
  253. data/lib/epubmaker/epubv3.rb +0 -233
  254. data/lib/epubmaker/producer.rb +0 -375
  255. data/lib/epubmaker/zip_exporter.rb +0 -81
  256. data/lib/lineinput.rb +0 -155
  257. data/lib/review/book/compilable.rb +0 -178
  258. data/lib/review/tocparser.rb +0 -275
  259. data/test/test_tocparser.rb +0 -25
data/test/test_book.rb CHANGED
@@ -23,8 +23,8 @@ class BookTest < Test::Unit::TestCase
23
23
  test_const = "ReVIEW__BOOK__TEST__#{num}"
24
24
  begin
25
25
  Dir.mktmpdir do |dir|
26
- File.open(File.join(dir, 'review-ext.rb'), 'w') { |o| o.puts "#{test_const} = #{num}" }
27
- Book::Base.load(dir)
26
+ File.write(File.join(dir, 'review-ext.rb'), "#{test_const} = #{num}")
27
+ Book::Base.new(dir)
28
28
  assert_equal num, (Object.class_eval { const_get(test_const) })
29
29
  end
30
30
  ensure
@@ -159,12 +159,12 @@ class BookTest < Test::Unit::TestCase
159
159
  end
160
160
 
161
161
  def test_parse_chapters
162
- mktmpbookdir 'CHAPS' => '' do |_dir, book, _files|
162
+ mktmpbookdir('CHAPS' => '') do |_dir, book, _files|
163
163
  parts = book.instance_eval { parse_chapters }
164
164
  assert_equal 0, parts.size
165
165
  end
166
166
 
167
- mktmpbookdir 'CHAPS' => "chapter1.re\nchapter2\n" do |dir, book, _files|
167
+ mktmpbookdir('CHAPS' => "chapter1.re\nchapter2\n") do |dir, book, _files|
168
168
  parts = book.instance_eval { parse_chapters }
169
169
  assert_equal 1, parts.size
170
170
 
@@ -178,7 +178,7 @@ class BookTest < Test::Unit::TestCase
178
178
  assert_equal expect, chaps
179
179
  end
180
180
 
181
- mktmpbookdir 'CHAPS' => <<EOC do |dir, book, _files|
181
+ mktmpbookdir('CHAPS' => <<EOC) do |dir, book, _files|
182
182
  part1_chapter1.re
183
183
  part1_chapter2.re
184
184
 
@@ -280,22 +280,22 @@ EOC
280
280
  assert_equal nil, book.prefaces
281
281
  end
282
282
 
283
- mktmpbookdir 'PREDEF' => '' do |_dir, book, _files|
283
+ mktmpbookdir('PREDEF' => '') do |_dir, book, _files|
284
284
  assert_equal nil, book.prefaces # XXX: OK?
285
285
  end
286
286
 
287
- mktmpbookdir 'PREDEF' => 'chapter1',
288
- 'chapter1.re' => '' do |_dir, book, files|
289
- assert_kind_of Book::Part, book.prefaces
287
+ mktmpbookdir('PREDEF' => 'chapter1',
288
+ 'chapter1.re' => '') do |_dir, book, files|
289
+ assert_kind_of(Book::Part, book.prefaces)
290
290
  assert_equal '', book.prefaces.name
291
291
  assert_equal 1, book.prefaces.chapters.size
292
292
  assert_equal 'chapter1', book.prefaces.chapters.first.name
293
293
  assert_equal files['chapter1.re'], book.prefaces.chapters.first.path
294
294
  end
295
295
 
296
- mktmpbookdir 'PREDEF' => "chapter1\n\nchapter2",
297
- 'chapter1.re' => '', 'chapter2.re' => '' do |_dir, book, files|
298
- assert_kind_of Book::Part, book.prefaces
296
+ mktmpbookdir('PREDEF' => "chapter1\n\nchapter2",
297
+ 'chapter1.re' => '', 'chapter2.re' => '') do |_dir, book, files|
298
+ assert_kind_of(Book::Part, book.prefaces)
299
299
  assert_equal '', book.prefaces.name
300
300
  assert_equal 2, book.prefaces.chapters.size
301
301
  assert_equal 'chapter1', book.prefaces.chapters.first.name
@@ -304,29 +304,29 @@ EOC
304
304
  assert_equal files['chapter2.re'], book.prefaces.chapters.last.path
305
305
  end
306
306
 
307
- mktmpbookdir 'PREDEF' => 'chapter1 chapter2',
308
- 'chapter1.re' => '', 'chapter2.re' => '' do |_dir, book, _files|
309
- assert_kind_of Book::Part, book.prefaces
307
+ mktmpbookdir('PREDEF' => 'chapter1 chapter2',
308
+ 'chapter1.re' => '', 'chapter2.re' => '') do |_dir, book, _files|
309
+ assert_kind_of(Book::Part, book.prefaces)
310
310
  assert_equal '', book.prefaces.name
311
311
  assert_equal 2, book.prefaces.chapters.size # XXX: OK?
312
312
  end
313
313
 
314
- mktmpbookdir 'PREDEF' => 'not_exist' do |_dir, book, _files|
314
+ mktmpbookdir('PREDEF' => 'not_exist') do |_dir, book, _files|
315
315
  assert_raises FileNotFound do
316
316
  assert_equal nil, book.prefaces
317
317
  end
318
318
  end
319
319
 
320
- mktmpbookdir 'PREDEF' => 'chapter1.re',
321
- 'chapter1.re' => '' do |_dir, book, _files|
322
- assert_kind_of Book::Part, book.prefaces
320
+ mktmpbookdir('PREDEF' => 'chapter1.re',
321
+ 'chapter1.re' => '') do |_dir, book, _files|
322
+ assert_kind_of(Book::Part, book.prefaces)
323
323
  assert_equal '', book.prefaces.name
324
324
  assert_equal 1, book.prefaces.chapters.size
325
325
  end
326
326
 
327
- mktmpbookdir 'PREDEF' => 'chapter1.txt',
328
- 'chapter1.txt' => '' do |_dir, book, _files|
329
- assert_kind_of Book::Part, book.prefaces
327
+ mktmpbookdir('PREDEF' => 'chapter1.txt',
328
+ 'chapter1.txt' => '') do |_dir, book, _files|
329
+ assert_kind_of(Book::Part, book.prefaces)
330
330
  assert_equal '', book.prefaces.name
331
331
  assert_equal 1, book.prefaces.chapters.size
332
332
  end
@@ -337,13 +337,13 @@ EOC
337
337
  assert_equal nil, book.appendix
338
338
  end
339
339
 
340
- mktmpbookdir 'POSTDEF' => '' do |_dir, book, _files|
340
+ mktmpbookdir('POSTDEF' => '') do |_dir, book, _files|
341
341
  assert_equal nil, book.appendix
342
342
  end
343
343
 
344
- mktmpbookdir 'POSTDEF' => 'chapter1',
345
- 'chapter1.re' => '' do |_dir, book, files|
346
- assert_kind_of Book::Part, book.appendix
344
+ mktmpbookdir('POSTDEF' => 'chapter1',
345
+ 'chapter1.re' => '') do |_dir, book, files|
346
+ assert_kind_of(Book::Part, book.appendix)
347
347
  assert_equal '', book.appendix.name
348
348
  assert_equal 1, book.appendix.chapters.size
349
349
  assert_equal 'chapter1', book.appendix.chapters.first.name
@@ -351,9 +351,9 @@ EOC
351
351
  assert_equal 1, book.appendix.chapters.first.number
352
352
  end
353
353
 
354
- mktmpbookdir 'POSTDEF' => "chapter1\n\nchapter2",
355
- 'chapter1.re' => '', 'chapter2.re' => '' do |_dir, book, files|
356
- assert_kind_of Book::Part, book.appendix
354
+ mktmpbookdir('POSTDEF' => "chapter1\n\nchapter2",
355
+ 'chapter1.re' => '', 'chapter2.re' => '') do |_dir, book, files|
356
+ assert_kind_of(Book::Part, book.appendix)
357
357
  assert_equal '', book.appendix.name
358
358
  assert_equal 2, book.appendix.chapters.size
359
359
  assert_equal 'chapter1', book.appendix.chapters.first.name
@@ -364,32 +364,32 @@ EOC
364
364
  assert_equal 2, book.appendix.chapters.last.number
365
365
  end
366
366
 
367
- mktmpbookdir 'POSTDEF' => 'chapter1 chapter2',
368
- 'chapter1.re' => '', 'chapter2.re' => '' do |_dir, book, _files|
369
- assert_kind_of Book::Part, book.appendix
367
+ mktmpbookdir('POSTDEF' => 'chapter1 chapter2',
368
+ 'chapter1.re' => '', 'chapter2.re' => '') do |_dir, book, _files|
369
+ assert_kind_of(Book::Part, book.appendix)
370
370
  assert_equal '', book.appendix.name
371
371
  assert_equal 2, book.appendix.chapters.size # XXX: OK?
372
372
  assert_equal 1, book.appendix.chapters.first.number
373
373
  assert_equal 2, book.appendix.chapters.last.number
374
374
  end
375
375
 
376
- mktmpbookdir 'POSTDEF' => 'not_exist' do |_dir, book, _files|
376
+ mktmpbookdir('POSTDEF' => 'not_exist') do |_dir, book, _files|
377
377
  assert_raises FileNotFound do
378
378
  assert_equal nil, book.appendix
379
379
  end
380
380
  end
381
381
 
382
- mktmpbookdir 'catalog.yml' => "APPENDIX:\n - p01.re",
383
- 'p01.re' => '= appendix' do |_dir, book, _files|
382
+ mktmpbookdir('catalog.yml' => "APPENDIX:\n - p01.re",
383
+ 'p01.re' => '= appendix') do |_dir, book, _files|
384
384
  assert_equal 'appendix', book.appendix.chapters.first.title
385
385
  assert_equal 1, book.appendix.chapters.first.number
386
386
  end
387
387
  end
388
388
 
389
389
  def test_postscripts
390
- mktmpbookdir 'catalog.yml' => "POSTDEF:\n - b01.re",
391
- 'b01.re' => '= back' do |_dir, book, _files|
392
- assert_kind_of Book::Part, book.postscripts
390
+ mktmpbookdir('catalog.yml' => "POSTDEF:\n - b01.re",
391
+ 'b01.re' => '= back') do |_dir, book, _files|
392
+ assert_kind_of(Book::Part, book.postscripts)
393
393
  assert_equal 1, book.postscripts.chapters.size
394
394
  assert_equal 'back', book.postscripts.chapters.first.title
395
395
  assert_equal nil, book.postscripts.chapters.first.number
@@ -407,7 +407,7 @@ EOC
407
407
  assert tmp.empty?
408
408
  end
409
409
 
410
- mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3", 'PART' => "foo\nbar\n" do |_dir, book, _files|
410
+ mktmpbookdir('CHAPS' => "ch1\nch2\n\nch3", 'PART' => "foo\nbar\n") do |_dir, book, _files|
411
411
  parts = book.parts
412
412
  assert_equal 2, parts.size
413
413
  assert !book.part(0)
@@ -432,10 +432,10 @@ EOC
432
432
  assert tmp.empty?
433
433
  end
434
434
 
435
- mktmpbookdir 'CHAPS' => "ch1.re\nch2.re\n\nch3.re\n",
435
+ mktmpbookdir('CHAPS' => "ch1.re\nch2.re\n\nch3.re\n",
436
436
  'PART' => "foo\nbar\n",
437
437
  'ch1.re' => "= ch1\n\n", 'ch2.re' => "= ch2\n\n",
438
- 'ch3.re' => "= ch3\n\n" do |_dir, book, _files|
438
+ 'ch3.re' => "= ch3\n\n") do |_dir, book, _files|
439
439
  parts = book.parts_in_file
440
440
  assert_equal 0, parts.size
441
441
  assert !book.part(0)
@@ -448,11 +448,11 @@ EOC
448
448
  assert_equal [1, 2], tmp
449
449
  end
450
450
 
451
- mktmpbookdir 'CHAPS' => "ch1.re\nch2.re\n\nch3.re\n",
451
+ mktmpbookdir('CHAPS' => "ch1.re\nch2.re\n\nch3.re\n",
452
452
  'PART' => "foo.re\nbar.re\n",
453
453
  'foo.re' => "= part1\n\n", 'bar.re' => "= part2\n\n",
454
454
  'ch1.re' => "= ch1\n\n", 'ch2.re' => "= ch2\n\n",
455
- 'ch3.re' => "= ch3\n\n" do |_dir, book, _files|
455
+ 'ch3.re' => "= ch3\n\n") do |_dir, book, _files|
456
456
  parts = book.parts_in_file
457
457
  assert_equal 2, parts.size
458
458
  assert !book.part(0)
@@ -467,7 +467,7 @@ EOC
467
467
  end
468
468
 
469
469
  def test_chapters
470
- mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3" do |_dir, book, _files|
470
+ mktmpbookdir('CHAPS' => "ch1\nch2\n\nch3") do |_dir, book, _files|
471
471
  chapters = book.chapters
472
472
  assert_equal 3, chapters.size
473
473
 
@@ -486,7 +486,7 @@ EOC
486
486
  end
487
487
  end
488
488
 
489
- mktmpbookdir 'CHAPS' => "ch1.txt\nch2.txt\n\nch3.txt" do |_dir, book, _files|
489
+ mktmpbookdir('CHAPS' => "ch1.txt\nch2.txt\n\nch3.txt") do |_dir, book, _files|
490
490
  chapters = book.chapters
491
491
  assert_equal 3, chapters.size
492
492
 
@@ -507,7 +507,7 @@ EOC
507
507
  end
508
508
 
509
509
  def test_next_chapter
510
- mktmpbookdir 'CHAPS' => "ch1\nch2" do |_dir, book, _files|
510
+ mktmpbookdir('CHAPS' => "ch1\nch2") do |_dir, book, _files|
511
511
  chapter = book.chapter('ch1')
512
512
  assert_equal book.chapter('ch2'), book.next_chapter(chapter)
513
513
 
@@ -517,7 +517,7 @@ EOC
517
517
  end
518
518
 
519
519
  def test_prev_chapter
520
- mktmpbookdir 'CHAPS' => "ch1\nch2" do |_dir, book, _files|
520
+ mktmpbookdir('CHAPS' => "ch1\nch2") do |_dir, book, _files|
521
521
  chapter = book.chapter('ch2')
522
522
  assert_equal book.chapter('ch1'), book.prev_chapter(chapter)
523
523
 
@@ -534,14 +534,14 @@ EOC
534
534
  assert_equal 0, book.volume.lines
535
535
  end
536
536
 
537
- mktmpbookdir 'CHAPS' => 'chapter1.re', 'chapter1.re' => '12345' do |_dir, book, _files|
537
+ mktmpbookdir('CHAPS' => 'chapter1.re', 'chapter1.re' => '12345') do |_dir, book, _files|
538
538
  assert book.volume
539
539
  assert book.volume.bytes > 0
540
540
  assert book.volume.chars > 0
541
541
  assert book.volume.lines > 0
542
542
  end
543
543
 
544
- mktmpbookdir 'preface.re' => '12345' do |dir, _book, _files|
544
+ mktmpbookdir('preface.re' => '12345') do |dir, _book, _files|
545
545
  Dir.chdir(dir) do
546
546
  book2 = Book::Base.new('.')
547
547
  assert book2.volume
@@ -560,12 +560,9 @@ EOC
560
560
  end
561
561
 
562
562
  def test_contentdir
563
- mktmpbookdir('config.yml' => "contentdir: content\n", 'catalog.yml' => "CHAPS:\n - ch01.re\n") do |dir, _book, _files|
564
- Dir.mkdir('content')
565
- File.open('content/ch01.re', 'w') { |f| f.puts "foo\n" }
566
- book = Book::Base.new(dir)
567
- config_file = File.join(dir, 'config.yml')
568
- book.load_config(config_file)
563
+ mktmpbookdir('config.yml' => "contentdir: content\n",
564
+ 'catalog.yml' => "CHAPS:\n - ch01.re\n",
565
+ 'content/ch01.re' => "foo\n") do |_dir, book, _files|
569
566
  assert_equal "foo\n", book.chapters[0].content
570
567
  end
571
568
  end
@@ -578,19 +575,13 @@ EOC
578
575
  end
579
576
 
580
577
  def test_page_metric_config
581
- mktmpbookdir('config.yml' => "bookname: book\npage_metric: B5\n") do |dir, _book, _files|
582
- book = Book::Base.new(dir)
583
- config_file = File.join(dir, 'config.yml')
584
- book.load_config(config_file)
578
+ mktmpbookdir('config.yml' => "bookname: book\npage_metric: B5\n") do |_dir, book, _files|
585
579
  assert_equal ReVIEW::Book::PageMetric::B5, book.page_metric
586
580
  end
587
581
  end
588
582
 
589
583
  def test_page_metric_config_array
590
- mktmpbookdir('config.yml' => "bookname: book\npage_metric: [46, 80, 30, 74, 2]\n") do |dir, _book, _files|
591
- book = Book::Base.new(dir)
592
- config_file = File.join(dir, 'config.yml')
593
- book.load_config(config_file)
584
+ mktmpbookdir('config.yml' => "bookname: book\npage_metric: [50, 40, 36, 40, 1]\n") do |_dir, book, _files|
594
585
  assert_equal ReVIEW::Book::PageMetric::B5, book.page_metric
595
586
  end
596
587
  end
@@ -2,6 +2,10 @@ require 'book_test_helper'
2
2
  class ChapterTest < Test::Unit::TestCase
3
3
  include BookTestHelper
4
4
 
5
+ def setup
6
+ I18n.setup
7
+ end
8
+
5
9
  def test_initialize
6
10
  ch = Book::Chapter.new(:book, :number, :name, '/foo/bar', :io)
7
11
  assert_equal :book, ch.book
@@ -66,6 +70,7 @@ class ChapterTest < Test::Unit::TestCase
66
70
 
67
71
  book = Book::Base.new
68
72
  ch = Book::Chapter.new(book, nil, nil, tf.path)
73
+ ch.generate_indexes
69
74
  assert_equal lines, ch.lines
70
75
 
71
76
  lines = ["1\n", "2\n", '3']
@@ -78,6 +83,7 @@ class ChapterTest < Test::Unit::TestCase
78
83
  tf2.close
79
84
 
80
85
  ch = Book::Chapter.new(book, nil, nil, tf1.path, tf2.path)
86
+ ch.generate_indexes
81
87
  assert_equal lines, ch.lines # XXX: OK?
82
88
  end
83
89
 
@@ -103,20 +109,20 @@ class ChapterTest < Test::Unit::TestCase
103
109
  end
104
110
 
105
111
  def test_on_chaps?
106
- mktmpbookdir 'CHAPS' => "chapter1.re\nchapter2.re",
107
- 'chapter1.re' => '12345', 'preface.re' => 'abcde' do |dir, book, files|
112
+ mktmpbookdir('CHAPS' => "chapter1.re\nchapter2.re",
113
+ 'chapter1.re' => '12345', 'preface.re' => 'abcde') do |dir, book, files|
108
114
  ch1 = Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re'])
109
115
  pre = Book::Chapter.new(book, nil, 'preface', files['preface.re'])
110
116
 
111
117
  assert ch1.on_chaps?
112
118
  assert !pre.on_chaps?
113
119
 
114
- ch2_path = File.join(dir, 'chapter2.er')
115
- File.open(ch2_path, 'w') {}
120
+ ch2_path = File.join(dir, 'chapter2.re')
121
+ FileUtils.touch(ch2_path)
116
122
  ch2 = Book::Chapter.new(book, 2, 'chapter2', ch2_path)
117
123
 
118
- ch3_path = File.join(dir, 'chapter3.er')
119
- File.open(ch3_path, 'w') {}
124
+ ch3_path = File.join(dir, 'chapter3.re')
125
+ FileUtils.touch(ch3_path)
120
126
  ch3 = Book::Chapter.new(book, 3, 'chapter3', ch3_path)
121
127
 
122
128
  assert ch2.on_chaps?
@@ -124,50 +130,70 @@ class ChapterTest < Test::Unit::TestCase
124
130
  end
125
131
  end
126
132
 
133
+ def test_invalid_encoding
134
+ mktmpbookdir('CHAPS' => 'chapter1.re',
135
+ 'chapter1.re' => "= 日本語UTF-8\n") do |_dir, book, files|
136
+ assert Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re'])
137
+ end
138
+
139
+ # UTF-16LE UTF-16BE UTF-32LE UTF-32BE cause error on Windows
140
+ %w[CP932 SHIFT_JIS EUC-JP].each do |enc|
141
+ mktmpbookdir('CHAPS' => 'chapter1.re',
142
+ 'chapter1.re' => "= 日本語UTF-8\n".encode(enc)) do |_dir, book, files|
143
+ e = assert_raises(ReVIEW::CompileError) { Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re']) }
144
+ assert_equal 'chapter1: invalid byte sequence in UTF-8', e.message
145
+ end
146
+ end
147
+ end
148
+
127
149
  def test_list_index
128
150
  do_test_index(<<E, Book::ListIndex, :list_index, :list)
129
- //list
130
- //listnum [abc]
131
- //list [def]
132
- //table [def]
133
- //table [others]
151
+ //listnum[abc][abc-listnum]{
152
+ //}
153
+ //list[def][def-list]{
154
+ //}
155
+ //table[def]{
156
+ //}
157
+ //table[others]{
158
+ //}
134
159
  E
135
160
  end
136
161
 
137
162
  def test_table_index
138
163
  do_test_index(<<E, Book::TableIndex, :table_index, :table)
139
- //table
140
- //table [abc]
141
- //table [def]
142
- //list [def]
143
- //list [others]
164
+ //table[abc]{
165
+ //}
166
+ //table[def]{
167
+ //}
168
+ //list[def][def-list]{
169
+ //}
170
+ //list[others][other-list]{
171
+ //}
144
172
  E
145
173
  end
146
174
 
147
175
  def test_footnote_index
148
176
  content = <<E
149
- //footnote
150
- //footnote [abc][text...]
151
- //footnote [def][text...]
152
- //footnote [xyz]
153
- //list [def]
154
- //list [others]
177
+ //footnote[abc][textabc...]
178
+ //footnote[def][textdef...]
179
+ //footnote[xyz][textxyz...]
180
+ //list[def][def-list]{
181
+ //}
182
+ //list[others][others-list]{
183
+ //}
155
184
  E
156
185
  do_test_index(content, Book::FootnoteIndex, :footnote_index, :footnote) do |ch|
157
186
  assert_raises ReVIEW::KeyError do
158
- ch.footnote('xyz')
187
+ ch.footnote('xyz2')
159
188
  end
160
189
  end
161
190
  end
162
191
 
163
192
  def test_bibpaper
164
193
  do_test_index(<<E, Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib.re')
165
- //bibpaper
166
- //bibpaper [abc][text...]
167
- //bibpaper [def][text...]
168
- //bibpaper [xyz]
169
- //list [def]
170
- //list [others]
194
+ //bibpaper[abc][text...]
195
+ //bibpaper[def][text...]
196
+ //bibpaper[xyz][text...]
171
197
  E
172
198
  assert_raises FileNotFound do
173
199
  do_test_index('', Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib')
@@ -176,11 +202,12 @@ E
176
202
 
177
203
  def test_headline_index
178
204
  do_test_index(<<E, Book::HeadlineIndex, :headline_index, :headline, propagate: false)
179
- ==
205
+ == x
180
206
  == abc
181
207
  == def
182
208
  === def
183
- //table others
209
+ //table[others]{
210
+ //}
184
211
  E
185
212
  end
186
213
 
@@ -204,35 +231,47 @@ E
204
231
 
205
232
  def test_image
206
233
  do_test_index(<<E, Book::ImageIndex, :image_index, :image)
207
- //image
208
- //image [abc]
209
- //image [def]
210
- //list [def]
211
- //list [others]
234
+ //image[abc][abc-image]{
235
+ //}
236
+ //image[def][abc-image]{
237
+ //}
238
+ //list[def][def-list]{
239
+ //}
240
+ //list[others][others-list]{
241
+ //}
212
242
  E
213
243
 
214
244
  do_test_index(<<E, Book::NumberlessImageIndex, :numberless_image_index, :image, propagate: false)
215
- //numberlessimage
216
- //numberlessimage [abc]
217
- //numberlessimage [def]
218
- //list [def]
219
- //list [others]
245
+ //numberlessimage[abc]{
246
+ //}
247
+ //numberlessimage[def]{
248
+ //}
249
+ //list[def][def-list]{
250
+ //}
251
+ //list[others][others-list]{
252
+ //}
220
253
  E
221
254
 
222
255
  do_test_index(<<E, Book::ImageIndex, :image_index, :image)
223
- //image
224
- //numberlessimage [abc]
225
- //image [def]
226
- //list [def]
227
- //list [others]
256
+ //numberlessimage[abc]{
257
+ //}
258
+ //image[def][def-image]{
259
+ //}
260
+ //list[def][def-list]{
261
+ //}
262
+ //list[others][others-list]{
263
+ //}
228
264
  E
229
265
 
230
266
  do_test_index(<<E, Book::NumberlessImageIndex, :numberless_image_index, :image, propagate: false)
231
- //image
232
- //numberlessimage [abc]
233
- //image [def]
234
- //list [def]
235
- //list [others]
267
+ //numberlessimage[abc]{
268
+ //}
269
+ //image[def][def-image]{
270
+ //}
271
+ //list[def][def-list]{
272
+ //}
273
+ //list[others][others-list]{
274
+ //}
236
275
  E
237
276
  end
238
277
 
@@ -240,13 +279,15 @@ E
240
279
  Dir.mktmpdir do |dir|
241
280
  path = File.join(dir, opts[:filename] || 'chapter.re')
242
281
 
243
- book = Book::Base.new(dir)
244
-
245
282
  File.open(path, 'w') do |o|
246
283
  o.print content
247
284
  end
248
- ch = Book::Chapter.new(book, 1, 'chapter', path)
249
285
 
286
+ book = Book::Base.new(dir)
287
+
288
+ ch = Book::Chapter.new(book, 1, 'chapter', path)
289
+ book.generate_indexes
290
+ ch.generate_indexes
250
291
  assert ch.__send__(ref_method, 'abc')
251
292
  assert ch.__send__(ref_method, 'def')
252
293
  assert_raises ReVIEW::KeyError do