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
@@ -9,15 +9,25 @@ class TemplateTest < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_load
12
- tmplfile = File.expand_path('./assets/test.xml.erb', File.dirname(__FILE__))
12
+ tmplfile = File.expand_path('./assets/test.xml.erb', __dir__)
13
13
  tmpl = ReVIEW::Template.load(tmplfile)
14
14
  assert_equal("<test>\n<name></name>\n</test>\n", tmpl.result(binding))
15
15
  end
16
16
 
17
17
  def test_open_with_value
18
- tmplfile = File.expand_path('./assets/test.xml.erb', File.dirname(__FILE__))
18
+ tmplfile = File.expand_path('./assets/test.xml.erb', __dir__)
19
19
  tmpl = ReVIEW::Template.load(tmplfile)
20
20
  @name = 'test'
21
21
  assert_equal("<test>\n<name>test</name>\n</test>\n", tmpl.result(binding))
22
22
  end
23
+
24
+ def test_generate
25
+ result = ReVIEW::Template.generate(path: './assets/test.xml.erb', binding: binding, template_dir: __dir__)
26
+ assert_equal("<test>\n<name></name>\n</test>\n", result)
27
+ end
28
+
29
+ def test_generate_without_template_dir
30
+ result = ReVIEW::Template.generate(path: '../test/assets/test.xml.erb', binding: binding)
31
+ assert_equal("<test>\n<name></name>\n</test>\n", result)
32
+ end
23
33
  end
@@ -29,7 +29,11 @@ class TEXTMakerCmdTest < Test::Unit::TestCase
29
29
  ruby_cmd = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) + RbConfig::CONFIG['EXEEXT']
30
30
  Dir.chdir(@tmpdir1) do
31
31
  _o, e, s = Open3.capture3("#{ruby_cmd} -S #{REVIEW_TEXTMAKER} #{option} #{configfile}")
32
- STDERR.puts e unless e.empty?
32
+ if defined?(ReVIEW::TTYLogger)
33
+ assert_match(/SUCCESS/, e)
34
+ else
35
+ assert_equal '', e
36
+ end
33
37
  assert s.success?
34
38
  end
35
39
  assert File.exist?(File.join(@tmpdir1, targetfile))
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+ require 'review/tocprinter'
3
+ require 'unicode/eaw'
4
+
5
+ class TOCPrinterTest < Test::Unit::TestCase
6
+ def setup
7
+ @toc_printer = ReVIEW::TOCPrinter.new
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+ def test_calc_linesize
14
+ @toc_printer.calc_char_width = nil
15
+ size = @toc_printer.calc_linesize('あ いうえおABCD')
16
+ assert_equal 10, size
17
+ size = @toc_printer.calc_linesize("あ い\nうえ\nおAB\nCD\n")
18
+ assert_equal 14, size
19
+ end
20
+
21
+ def test_calc_linesize_with_char_width
22
+ @toc_printer.calc_char_width = true
23
+ size = @toc_printer.calc_linesize('あ いうえおABCD')
24
+ assert_equal 7.5, size
25
+ size = @toc_printer.calc_linesize("あ い\nうえ\nおAB\nCD\n")
26
+ assert_equal 9.5, size
27
+ end
28
+
29
+ def test_execute_syntax_book_detail
30
+ Dir.chdir('./samples/syntax-book') do
31
+ stdout = $stdout
32
+ tmp_io = StringIO.new
33
+ $stdout = tmp_io
34
+ begin
35
+ @toc_printer.execute('-d')
36
+ tmp_io.rewind
37
+ result = tmp_io.read
38
+ path = File.join(assets_dir, 'syntax_book_index_detail.txt')
39
+ expected = File.read(path)
40
+ assert_equal expected, result
41
+ ensure
42
+ $stdout = stdout
43
+ end
44
+ end
45
+ end
46
+ end
@@ -14,6 +14,8 @@ class TOPBuidlerTest < Test::Unit::TestCase
14
14
  @config['language'] = 'ja'
15
15
  @book = Book::Base.new
16
16
  @book.config = @config
17
+ @log_io = StringIO.new
18
+ ReVIEW.logger = ReVIEW::Logger.new(@log_io)
17
19
  @compiler = ReVIEW::Compiler.new(@builder)
18
20
  @chapter = Book::Chapter.new(@book, 1, '-', nil, StringIO.new)
19
21
  location = Location.new(nil, nil)
@@ -119,6 +121,11 @@ class TOPBuidlerTest < Test::Unit::TestCase
119
121
  assert_equal 'test ★inline test☆◆→等幅フォント太字←◆ test2', actual
120
122
  end
121
123
 
124
+ def test_inline_tcy
125
+ actual = compile_inline('test @<tcy>{A} test2')
126
+ assert_equal 'test ◆→開始:回転←◆A◆→終了:縦回転←◆ test2', actual
127
+ end
128
+
122
129
  def test_inline_uchar
123
130
  actual = compile_inline('test @<uchar>{2460} test2')
124
131
  assert_equal 'test ① test2', actual
@@ -175,11 +182,11 @@ EOS
175
182
  end
176
183
 
177
184
  def test_dt_inline
178
- fn = Book::FootnoteIndex.parse(['//footnote[bar][bar]'])
179
- @chapter.instance_eval { @footnote_index = fn }
180
- actual = compile_block(" : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
185
+ actual = compile_block("//footnote[bar][bar]\n\n : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
181
186
 
182
187
  expected = <<-EOS
188
+ 【注1】bar
189
+
183
190
  ★foo【注1】[]<>&◆→TeX式ここから←◆\\alpha[]◆→TeX式ここまで←◆☆
184
191
 
185
192
 
@@ -295,6 +302,19 @@ EOS
295
302
  2: bar
296
303
  ◆→終了:リスト←◆
297
304
 
305
+ EOS
306
+ assert_equal expected, actual
307
+
308
+ @config['caption_position']['list'] = 'bottom'
309
+ actual = compile_block("//listnum[test][this is @<b>{test}<&>_]{\nfoo\nbar\n//}\n")
310
+ expected = <<-EOS
311
+ ◆→開始:リスト←◆
312
+ 1: foo
313
+ 2: bar
314
+
315
+ リスト1.1 this is ★test☆<&>_
316
+ ◆→終了:リスト←◆
317
+
298
318
  EOS
299
319
  assert_equal expected, actual
300
320
  end
@@ -310,6 +330,20 @@ bar
310
330
  buz
311
331
  ◆→終了:ソースコードリスト←◆
312
332
 
333
+ EOS
334
+ assert_equal expected, actual
335
+
336
+ @config['caption_position']['list'] = 'bottom'
337
+ actual = compile_block("//source[foo/bar/test.rb]{\nfoo\nbar\n\nbuz\n//}\n")
338
+ expected = <<-EOS
339
+ ◆→開始:ソースコードリスト←◆
340
+ foo
341
+ bar
342
+
343
+ buz
344
+ ■foo/bar/test.rb
345
+ ◆→終了:ソースコードリスト←◆
346
+
313
347
  EOS
314
348
  assert_equal expected, actual
315
349
  end
@@ -347,6 +381,18 @@ foo
347
381
  bar
348
382
  ◆→終了:書式←◆
349
383
 
384
+ EOS
385
+ assert_equal expected, actual
386
+
387
+ @config['caption_position']['list'] = 'bottom'
388
+ actual = compile_block("//box[FOO]{\nfoo\nbar\n//}\n")
389
+ expected = <<-EOS
390
+ ◆→開始:書式←◆
391
+ foo
392
+ bar
393
+ ■FOO
394
+ ◆→終了:書式←◆
395
+
350
396
  EOS
351
397
  assert_equal expected, actual
352
398
  end
@@ -370,6 +416,18 @@ lineA
370
416
  lineB
371
417
  ◆→終了:コマンド←◆
372
418
 
419
+ EOS
420
+ assert_equal expected, actual
421
+
422
+ @config['caption_position']['list'] = 'bottom'
423
+ actual = compile_block("//cmd[cap1]{\nlineA\nlineB\n//}\n")
424
+ expected = <<-EOS
425
+ ◆→開始:コマンド←◆
426
+ lineA
427
+ lineB
428
+ ■cap1
429
+ ◆→終了:コマンド←◆
430
+
373
431
  EOS
374
432
  assert_equal expected, actual
375
433
  end
@@ -395,6 +453,18 @@ lineA
395
453
  lineB
396
454
  ◆→終了:インラインリスト←◆
397
455
 
456
+ EOS
457
+ assert_equal expected, actual
458
+
459
+ @config['caption_position']['list'] = 'bottom'
460
+ actual = compile_block("//emlist[cap1]{\nlineA\nlineB\n//}\n")
461
+ expected = <<-EOS
462
+ ◆→開始:インラインリスト←◆
463
+ lineA
464
+ lineB
465
+ ■cap1
466
+ ◆→終了:インラインリスト←◆
467
+
398
468
  EOS
399
469
  assert_equal expected, actual
400
470
  end
@@ -408,6 +478,18 @@ EOS
408
478
  2: bar
409
479
  ◆→終了:インラインリスト←◆
410
480
 
481
+ EOS
482
+ assert_equal expected, actual
483
+
484
+ @config['caption_position']['list'] = 'bottom'
485
+ actual = compile_block("//emlistnum[this is @<b>{test}<&>_]{\nfoo\nbar\n//}\n")
486
+ expected = <<-EOS
487
+ ◆→開始:インラインリスト←◆
488
+ 1: foo
489
+ 2: bar
490
+ ■this is ★test☆<&>_
491
+ ◆→終了:インラインリスト←◆
492
+
411
493
  EOS
412
494
  assert_equal expected, actual
413
495
  end
@@ -440,16 +522,29 @@ EOS
440
522
  ccc\tddd<>&
441
523
  ◆→終了:表←◆
442
524
 
525
+ EOS
526
+ assert_equal expected, actual
527
+
528
+ @config['caption_position']['table'] = 'bottom'
529
+ actual = compile_block("//table[foo][FOO]{\naaa\tbbb\n------------\nccc\tddd<>&\n//}\n")
530
+ expected = <<-EOS
531
+ ◆→開始:表←◆
532
+ ★aaa☆\t★bbb☆
533
+ ccc\tddd<>&
534
+
535
+ 表1.1 FOO
536
+ ◆→終了:表←◆
537
+
443
538
  EOS
444
539
  assert_equal expected, actual
445
540
  end
446
541
 
447
542
  def test_empty_table
448
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n//}\n" }
449
- assert_equal ':2: error: no rows in the table', e.message
543
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n//}\n") }
544
+ assert_equal 'no rows in the table', e.message
450
545
 
451
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n------------\n//}\n" }
452
- assert_equal ':3: error: no rows in the table', e.message
546
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n------------\n//}\n") }
547
+ assert_equal 'no rows in the table', e.message
453
548
  end
454
549
 
455
550
  def test_inline_table
@@ -647,6 +742,183 @@ EOS
647
742
  assert_equal expected, actual
648
743
  end
649
744
 
745
+ def test_minicolumn_blocks
746
+ titles = {
747
+ 'note' => 'ノート',
748
+ 'memo' => 'メモ',
749
+ 'important' => '重要',
750
+ 'info' => '情報',
751
+ 'notice' => '注意',
752
+ 'caution' => '警告',
753
+ 'warning' => '危険',
754
+ 'tip' => 'TIP'
755
+ }
756
+
757
+ %w[note memo tip info warning important caution notice].each do |type|
758
+ @builder.doc_status.clear
759
+ src = <<-EOS
760
+ //#{type}[#{type}1]{
761
+
762
+ //}
763
+
764
+ //#{type}[#{type}2]{
765
+ //}
766
+ EOS
767
+
768
+ expected = <<-EOS
769
+ ◆→開始:#{titles[type]}←◆
770
+ ■#{type}1
771
+ ◆→終了:#{titles[type]}←◆
772
+
773
+ ◆→開始:#{titles[type]}←◆
774
+ ■#{type}2
775
+ ◆→終了:#{titles[type]}←◆
776
+
777
+ EOS
778
+ assert_equal expected, compile_block(src)
779
+
780
+ src = <<-EOS
781
+ //#{type}[#{type}2]{
782
+
783
+ //}
784
+
785
+ //#{type}[#{type}3]{
786
+
787
+ //}
788
+
789
+ //#{type}[#{type}4]{
790
+
791
+ //}
792
+
793
+ //#{type}[#{type}5]{
794
+
795
+ //}
796
+
797
+ //#{type}[#{type}6]{
798
+
799
+ //}
800
+ EOS
801
+
802
+ expected = <<-EOS
803
+ ◆→開始:#{titles[type]}←◆
804
+ ■#{type}2
805
+ ◆→終了:#{titles[type]}←◆
806
+
807
+ ◆→開始:#{titles[type]}←◆
808
+ ■#{type}3
809
+ ◆→終了:#{titles[type]}←◆
810
+
811
+ ◆→開始:#{titles[type]}←◆
812
+ ■#{type}4
813
+ ◆→終了:#{titles[type]}←◆
814
+
815
+ ◆→開始:#{titles[type]}←◆
816
+ ■#{type}5
817
+ ◆→終了:#{titles[type]}←◆
818
+
819
+ ◆→開始:#{titles[type]}←◆
820
+ ■#{type}6
821
+ ◆→終了:#{titles[type]}←◆
822
+
823
+ EOS
824
+ assert_equal expected, compile_block(src)
825
+
826
+ src = <<-EOS
827
+ //#{type}{
828
+
829
+ * A
830
+
831
+ 1. B
832
+
833
+ //}
834
+
835
+ //#{type}[OMITEND1]{
836
+
837
+ //emlist{
838
+ LIST
839
+ //}
840
+
841
+ //}
842
+ //#{type}[OMITEND2]{
843
+ //}
844
+ EOS
845
+
846
+ expected = <<-EOS
847
+ ◆→開始:#{titles[type]}←◆
848
+
849
+ ● A
850
+
851
+ 1 B
852
+
853
+ ◆→終了:#{titles[type]}←◆
854
+
855
+ ◆→開始:#{titles[type]}←◆
856
+ ■OMITEND1
857
+
858
+ ◆→開始:インラインリスト←◆
859
+ LIST
860
+ ◆→終了:インラインリスト←◆
861
+
862
+ ◆→終了:#{titles[type]}←◆
863
+
864
+ ◆→開始:#{titles[type]}←◆
865
+ ■OMITEND2
866
+ ◆→終了:#{titles[type]}←◆
867
+
868
+ EOS
869
+ assert_equal expected, compile_block(src)
870
+ end
871
+ end
872
+
873
+ def test_minicolumn_blocks_nest_error1
874
+ %w[note memo tip info warning important caution notice].each do |type|
875
+ @builder.doc_status.clear
876
+ src = <<-EOS
877
+ //#{type}{
878
+
879
+ //#{type}{
880
+ //}
881
+
882
+ //}
883
+ EOS
884
+ assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
885
+ assert_match(/minicolumn cannot be nested:/, @log_io.string)
886
+ end
887
+ end
888
+
889
+ def test_minicolumn_blocks_nest_error2
890
+ %w[note memo tip info warning important caution notice].each do |type|
891
+ @builder.doc_status.clear
892
+ src = <<-EOS
893
+ //#{type}{
894
+
895
+ //#{type}{
896
+
897
+ //}
898
+
899
+ //}
900
+ EOS
901
+ assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
902
+ assert_match(/minicolumn cannot be nested:/, @log_io.string)
903
+ end
904
+ end
905
+
906
+ def test_minicolumn_blocks_nest_error3
907
+ %w[memo tip info warning important caution notice].each do |type|
908
+ @builder.doc_status.clear
909
+ src = <<-EOS
910
+ //#{type}{
911
+
912
+ //note{
913
+ //}
914
+
915
+ //}
916
+ EOS
917
+ assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
918
+ assert_match(/minicolumn cannot be nested:/, @log_io.string)
919
+ end
920
+ end
921
+
650
922
  def test_image
651
923
  def @chapter.image(_id)
652
924
  item = Book::Index::Item.new('sampleimg', 1)
@@ -657,6 +929,18 @@ EOS
657
929
  actual = compile_block("//image[sampleimg][sample photo]{\nfoo\n//}\n")
658
930
  expected = <<-EOS
659
931
  ◆→開始:図←◆
932
+ ◆→./images/chap1-sampleimg.png←◆
933
+
934
+ 図1.1 sample photo
935
+ ◆→終了:図←◆
936
+
937
+ EOS
938
+ assert_equal expected, actual
939
+
940
+ @config['caption_position']['image'] = 'top'
941
+ actual = compile_block("//image[sampleimg][sample photo]{\nfoo\n//}\n")
942
+ expected = <<-EOS
943
+ ◆→開始:図←◆
660
944
  図1.1 sample photo
661
945
 
662
946
  ◆→./images/chap1-sampleimg.png←◆
@@ -676,9 +960,9 @@ EOS
676
960
  actual = compile_block("//image[sampleimg][sample photo][scale=1.2]{\nfoo\n//}\n")
677
961
  expected = <<-EOS
678
962
  ◆→開始:図←◆
679
- 図1.1 sample photo
680
-
681
963
  ◆→./images/chap1-sampleimg.png scale=1.2←◆
964
+
965
+ 図1.1 sample photo
682
966
  ◆→終了:図←◆
683
967
 
684
968
  EOS
@@ -708,7 +992,7 @@ EOB
708
992
  @book.config['words_file'] = File.join(dir, 'words.csv')
709
993
 
710
994
  io = StringIO.new
711
- @builder.instance_eval{ @logger = ReVIEW::Logger.new(io) }
995
+ @builder.instance_eval { @logger = ReVIEW::Logger.new(io) }
712
996
  actual = compile_block('@<w>{F} @<w>{B} @<wb>{B} @<w>{N}')
713
997
  assert_equal %Q(foo bar"\\<>_@<b>{BAZ} ★bar"\\<>_@<b>{BAZ}☆ [missing word: N]\n), actual
714
998
  assert_match(/WARN --: :1: word not bound: N/, io.string)
@@ -716,19 +1000,25 @@ EOB
716
1000
  end
717
1001
 
718
1002
  def test_inline_unknown
719
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<img>{n}\n" }
720
- assert_equal ':1: error: unknown image: n', e.message
721
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<fn>{n}\n" }
722
- assert_equal ':1: error: unknown footnote: n', e.message
723
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<hd>{n}\n" }
724
- assert_equal ':1: error: unknown headline: n', e.message
1003
+ assert_raises(ReVIEW::ApplicationError) { compile_block("@<img>{n}\n") }
1004
+ assert_match(/unknown image: n/, @log_io.string)
1005
+
1006
+ @log_io.string = ''
1007
+ assert_raises(ReVIEW::ApplicationError) { compile_block("@<fn>{n}\n") }
1008
+ assert_match(/unknown footnote: n/, @log_io.string)
1009
+
1010
+ @log_io.string = ''
1011
+ assert_raises(ReVIEW::ApplicationError) { compile_block("@<hd>{n}\n") }
1012
+ assert_match(/unknown headline: n/, @log_io.string)
725
1013
  %w[list table column].each do |name|
726
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" }
727
- assert_equal ":1: error: unknown #{name}: n", e.message
1014
+ @log_io.string = ''
1015
+ assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
1016
+ assert_match(/unknown #{name}: n/, @log_io.string)
728
1017
  end
729
1018
  %w[chap chapref title].each do |name|
730
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" }
731
- assert_equal ':1: error: key not found: "n"', e.message
1019
+ @log_io.string = ''
1020
+ assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
1021
+ assert_match(/key not found: "n"/, @log_io.string)
732
1022
  end
733
1023
  end
734
1024
 
@@ -829,6 +1119,20 @@ EOS
829
1119
  e=mc^2
830
1120
  ◆→終了:TeX式←◆
831
1121
 
1122
+ EOS
1123
+ actual = compile_block(src)
1124
+ assert_equal expected, actual
1125
+
1126
+ @config['caption_position']['equation'] = 'bottom'
1127
+
1128
+ expected = <<-EOS
1129
+ 式1.1
1130
+
1131
+ ◆→開始:TeX式←◆
1132
+ e=mc^2
1133
+ 式1.1 The Equivalence of Mass ▲and☆ Energy
1134
+ ◆→終了:TeX式←◆
1135
+
832
1136
  EOS
833
1137
  actual = compile_block(src)
834
1138
  assert_equal expected, actual