review 3.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (225) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +45 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.rubocop.yml +161 -34
  5. data/.travis.yml +16 -15
  6. data/Dockerfile +21 -5
  7. data/NEWS.ja.md +394 -0
  8. data/NEWS.md +395 -1
  9. data/README.md +10 -7
  10. data/appveyor.yml +1 -3
  11. data/bin/review-catalog-converter +5 -5
  12. data/bin/review-check +10 -12
  13. data/bin/review-checkdep +2 -2
  14. data/bin/review-compile +17 -23
  15. data/bin/review-epubmaker +3 -35
  16. data/bin/review-idgxmlmaker +16 -0
  17. data/bin/review-index +2 -89
  18. data/bin/review-preproc +13 -13
  19. data/bin/review-validate +4 -4
  20. data/bin/review-vol +4 -78
  21. data/doc/config.yml.sample +47 -12
  22. data/doc/config.yml.sample-simple +3 -2
  23. data/doc/format.ja.md +120 -17
  24. data/doc/format.md +119 -27
  25. data/doc/makeindex.ja.md +2 -2
  26. data/doc/pdfmaker.ja.md +43 -1
  27. data/doc/pdfmaker.md +42 -1
  28. data/doc/quickstart.ja.md +45 -25
  29. data/doc/quickstart.md +37 -16
  30. data/lib/epubmaker/content.rb +3 -2
  31. data/lib/epubmaker/epubcommon.rb +34 -27
  32. data/lib/epubmaker/epubv2.rb +5 -6
  33. data/lib/epubmaker/epubv3.rb +21 -18
  34. data/lib/epubmaker/producer.rb +2 -1
  35. data/lib/review/book.rb +2 -2
  36. data/lib/review/book/base.rb +91 -96
  37. data/lib/review/book/bib.rb +21 -0
  38. data/lib/review/book/book_unit.rb +155 -0
  39. data/lib/review/book/chapter.rb +48 -29
  40. data/lib/review/book/index.rb +46 -240
  41. data/lib/review/book/index/item.rb +46 -0
  42. data/lib/review/book/page_metric.rb +7 -7
  43. data/lib/review/book/part.rb +45 -10
  44. data/lib/review/book/volume.rb +4 -5
  45. data/lib/review/builder.rb +172 -56
  46. data/lib/review/catalog.rb +14 -17
  47. data/lib/review/compiler.rb +219 -121
  48. data/lib/review/configure.rb +39 -7
  49. data/lib/review/converter.rb +1 -1
  50. data/lib/review/epub2html.rb +43 -5
  51. data/lib/review/epubmaker.rb +69 -27
  52. data/lib/review/extentions/string.rb +0 -4
  53. data/lib/review/htmlbuilder.rb +112 -101
  54. data/lib/review/htmlutils.rb +9 -13
  55. data/lib/review/i18n.rb +3 -3
  56. data/lib/review/idgxmlbuilder.rb +202 -78
  57. data/lib/review/idgxmlmaker.rb +186 -0
  58. data/lib/review/index_builder.rb +653 -0
  59. data/lib/review/init-web/finish.html +10 -0
  60. data/lib/review/init-web/index.html +190 -0
  61. data/lib/review/init-web/review-layout-design.js +691 -0
  62. data/lib/review/init.rb +129 -46
  63. data/lib/review/latexbuilder.rb +255 -92
  64. data/lib/review/lineinput.rb +1 -1
  65. data/lib/review/location.rb +32 -0
  66. data/lib/review/logger.rb +4 -8
  67. data/lib/review/makerhelper.rb +35 -5
  68. data/lib/review/markdownbuilder.rb +50 -38
  69. data/lib/review/md2inaobuilder.rb +3 -5
  70. data/lib/review/pdfmaker.rb +60 -57
  71. data/lib/review/plaintextbuilder.rb +154 -87
  72. data/lib/review/preprocessor.rb +20 -42
  73. data/lib/review/rstbuilder.rb +57 -38
  74. data/lib/review/sec_counter.rb +13 -0
  75. data/lib/review/textmaker.rb +23 -15
  76. data/lib/review/textutils.rb +76 -2
  77. data/lib/review/tocprinter.rb +230 -102
  78. data/lib/review/topbuilder.rb +139 -60
  79. data/lib/review/update.rb +24 -24
  80. data/lib/review/version.rb +1 -1
  81. data/lib/review/volumeprinter.rb +98 -0
  82. data/lib/review/webmaker.rb +20 -24
  83. data/lib/review/webtocprinter.rb +38 -35
  84. data/lib/review/yamlloader.rb +26 -16
  85. data/review.gemspec +6 -4
  86. data/samples/sample-book/README.md +7 -2
  87. data/samples/sample-book/src/.gitignore +154 -0
  88. data/samples/sample-book/src/config-ebook.yml +4 -0
  89. data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
  90. data/samples/sample-book/src/config-jlreq.yml +6 -0
  91. data/samples/sample-book/src/config.yml +2 -2
  92. data/samples/sample-book/src/lib/tasks/review.rake +29 -14
  93. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  94. data/samples/syntax-book/Gemfile +1 -1
  95. data/samples/syntax-book/ch01.re +4 -2
  96. data/samples/syntax-book/ch02.re +8 -16
  97. data/samples/syntax-book/ch03.re +3 -6
  98. data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
  99. data/samples/syntax-book/config-jlreq.yml +5 -0
  100. data/samples/syntax-book/config-print.yml +3 -0
  101. data/samples/syntax-book/config.yml +1 -1
  102. data/samples/syntax-book/lib/tasks/review.rake +30 -15
  103. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  104. data/templates/latex/config.erb +39 -25
  105. data/templates/latex/layout.tex.erb +1 -0
  106. data/templates/latex/review-jlreq/README.md +3 -1
  107. data/templates/latex/review-jlreq/review-base.sty +161 -50
  108. data/templates/latex/review-jlreq/review-jlreq.cls +21 -22
  109. data/templates/latex/review-jlreq/review-style.sty +4 -1
  110. data/templates/latex/review-jsbook/README.md +46 -5
  111. data/templates/latex/review-jsbook/review-base.sty +123 -35
  112. data/templates/latex/review-jsbook/review-jsbook.cls +10 -4
  113. data/templates/latex/review-jsbook/review-style.sty +5 -2
  114. data/templates/opf/epubv3.opf.erb +1 -0
  115. data/templates/web/html/layout-html5.html.erb +3 -3
  116. data/test/assets/test_template.tex +19 -7
  117. data/test/assets/test_template_backmatter.tex +19 -7
  118. data/test/book_test_helper.rb +11 -5
  119. data/test/test_book.rb +124 -79
  120. data/test/test_book_chapter.rb +97 -54
  121. data/test/test_book_part.rb +3 -3
  122. data/test/test_builder.rb +38 -13
  123. data/test/test_catalog.rb +24 -42
  124. data/test/test_catalog_converter_cmd.rb +1 -1
  125. data/test/test_converter.rb +1 -0
  126. data/test/test_epub3maker.rb +2 -2
  127. data/test/test_epubmaker.rb +8 -0
  128. data/test/test_epubmaker_cmd.rb +14 -7
  129. data/test/test_helper.rb +18 -7
  130. data/test/test_htmlbuilder.rb +1491 -205
  131. data/test/test_htmlutils.rb +0 -12
  132. data/test/test_i18n.rb +37 -37
  133. data/test/test_idgxmlbuilder.rb +744 -42
  134. data/test/test_idgxmlmaker_cmd.rb +46 -0
  135. data/test/test_image_finder.rb +52 -70
  136. data/test/test_index.rb +94 -44
  137. data/test/test_indexbuilder.rb +52 -0
  138. data/test/test_latexbuilder.rb +1784 -161
  139. data/test/test_latexbuilder_v2.rb +671 -102
  140. data/test/test_logger.rb +17 -4
  141. data/test/test_makerhelper.rb +2 -14
  142. data/test/test_markdownbuilder.rb +137 -16
  143. data/test/test_md2inaobuilder.rb +32 -9
  144. data/test/test_pdfmaker.rb +30 -12
  145. data/test/test_pdfmaker_cmd.rb +100 -6
  146. data/test/test_plaintextbuilder.rb +791 -30
  147. data/test/test_preprocessor.rb +2 -16
  148. data/test/test_review_ext.rb +2 -1
  149. data/test/test_rstbuilder.rb +274 -27
  150. data/test/test_sec_counter.rb +156 -0
  151. data/test/test_textmaker_cmd.rb +54 -0
  152. data/test/test_textutils.rb +109 -2
  153. data/test/test_topbuilder.rb +724 -34
  154. data/test/test_update.rb +20 -11
  155. data/test/test_webtocprinter.rb +75 -43
  156. data/test/test_yamlloader.rb +13 -0
  157. data/vendor/gentombow/LICENSE +1 -1
  158. data/vendor/gentombow/Makefile +0 -1
  159. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  160. data/vendor/gentombow/bounddvi-en.tex +1 -0
  161. data/vendor/gentombow/bounddvi.pdf +0 -0
  162. data/vendor/gentombow/bounddvi.sty +30 -7
  163. data/vendor/gentombow/bounddvi.tex +1 -0
  164. data/vendor/gentombow/create_archive.sh +1 -0
  165. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  166. data/vendor/gentombow/gentombow-ja.tex +9 -0
  167. data/vendor/gentombow/gentombow.pdf +0 -0
  168. data/vendor/gentombow/gentombow.sty +32 -10
  169. data/vendor/gentombow/gentombow.tex +8 -0
  170. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  171. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  172. data/vendor/jsclasses/LICENSE +1 -1
  173. data/vendor/jsclasses/Makefile +3 -2
  174. data/vendor/jsclasses/create_archive.sh +5 -5
  175. data/vendor/jsclasses/jis/Makefile +3 -2
  176. data/vendor/jsclasses/jis/jsarticle.cls +74 -31
  177. data/vendor/jsclasses/jis/jsbook.cls +74 -31
  178. data/vendor/jsclasses/jis/jsclasses.dtx +176 -36
  179. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  180. data/vendor/jsclasses/jis/jslogo.dtx +4 -4
  181. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  182. data/vendor/jsclasses/jis/jslogo.sty +4 -16
  183. data/vendor/jsclasses/jis/jspf.cls +73 -30
  184. data/vendor/jsclasses/jis/jsreport.cls +74 -31
  185. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  186. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  187. data/vendor/jsclasses/jis/kiyou.cls +74 -31
  188. data/vendor/jsclasses/jis/minijs.sty +65 -22
  189. data/vendor/jsclasses/jis/okumacro.dtx +4 -5
  190. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  191. data/vendor/jsclasses/jis/okumacro.sty +4 -17
  192. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  193. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  194. data/vendor/jsclasses/jis/winjis.sty +23 -19
  195. data/vendor/jsclasses/jsarticle.cls +74 -31
  196. data/vendor/jsclasses/jsbook.cls +74 -31
  197. data/vendor/jsclasses/jsclasses.dtx +176 -36
  198. data/vendor/jsclasses/jsclasses.ins +15 -5
  199. data/vendor/jsclasses/jsclasses.pdf +0 -0
  200. data/vendor/jsclasses/jslogo.dtx +4 -4
  201. data/vendor/jsclasses/jslogo.ins +9 -0
  202. data/vendor/jsclasses/jslogo.pdf +0 -0
  203. data/vendor/jsclasses/jslogo.sty +4 -16
  204. data/vendor/jsclasses/jspf.cls +73 -30
  205. data/vendor/jsclasses/jsreport.cls +74 -31
  206. data/vendor/jsclasses/jsverb.ins +9 -0
  207. data/vendor/jsclasses/jsverb.pdf +0 -0
  208. data/vendor/jsclasses/jsverb.sty +1 -13
  209. data/vendor/jsclasses/kiyou.cls +74 -31
  210. data/vendor/jsclasses/minijs.sty +68 -22
  211. data/vendor/jsclasses/okumacro.dtx +4 -5
  212. data/vendor/jsclasses/okumacro.ins +9 -0
  213. data/vendor/jsclasses/okumacro.pdf +0 -0
  214. data/vendor/jsclasses/okumacro.sty +4 -17
  215. data/vendor/jsclasses/okuverb.ins +9 -0
  216. data/vendor/jsclasses/okuverb.pdf +0 -0
  217. data/vendor/jsclasses/okuverb.sty +1 -13
  218. data/vendor/jsclasses/tests/relfont.tex +10 -0
  219. data/vendor/jsclasses/winjis.sty +23 -19
  220. metadata +65 -12
  221. data/.rubocop_todo.yml +0 -7
  222. data/lib/review/book/compilable.rb +0 -173
  223. data/lib/review/tocparser.rb +0 -271
  224. data/samples/syntax-book/review-ext.rb +0 -14
  225. data/test/test_tocparser.rb +0 -25
@@ -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
@@ -37,11 +41,13 @@ class ChapterTest < Test::Unit::TestCase
37
41
 
38
42
  def test_size
39
43
  ch = Book::Chapter.new(nil, nil, nil, __FILE__, :io)
40
- assert_equal File.size(__FILE__), ch.size
44
+ filesize = IO.read(__FILE__, mode: 'rt:BOM|utf-8').size
45
+ assert_equal filesize, ch.size
41
46
 
42
47
  File.open(__FILE__, 'r') do |i|
43
48
  ch = Book::Chapter.new(nil, nil, nil, nil, i)
44
- assert_equal File.size(__FILE__), ch.size
49
+ filesize = IO.read(__FILE__, mode: 'rt:BOM|utf-8').size
50
+ assert_equal filesize, ch.size
45
51
  end
46
52
  end
47
53
 
@@ -64,6 +70,7 @@ class ChapterTest < Test::Unit::TestCase
64
70
 
65
71
  book = Book::Base.new
66
72
  ch = Book::Chapter.new(book, nil, nil, tf.path)
73
+ ch.generate_indexes
67
74
  assert_equal lines, ch.lines
68
75
 
69
76
  lines = ["1\n", "2\n", '3']
@@ -76,6 +83,7 @@ class ChapterTest < Test::Unit::TestCase
76
83
  tf2.close
77
84
 
78
85
  ch = Book::Chapter.new(book, nil, nil, tf1.path, tf2.path)
86
+ ch.generate_indexes
79
87
  assert_equal lines, ch.lines # XXX: OK?
80
88
  end
81
89
 
@@ -101,19 +109,19 @@ class ChapterTest < Test::Unit::TestCase
101
109
  end
102
110
 
103
111
  def test_on_chaps?
104
- mktmpbookdir 'CHAPS' => "chapter1.re\nchapter2.re",
105
- '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|
106
114
  ch1 = Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re'])
107
115
  pre = Book::Chapter.new(book, nil, 'preface', files['preface.re'])
108
116
 
109
117
  assert ch1.on_chaps?
110
118
  assert !pre.on_chaps?
111
119
 
112
- ch2_path = File.join(dir, 'chapter2.er')
120
+ ch2_path = File.join(dir, 'chapter2.re')
113
121
  File.open(ch2_path, 'w') {}
114
122
  ch2 = Book::Chapter.new(book, 2, 'chapter2', ch2_path)
115
123
 
116
- ch3_path = File.join(dir, 'chapter3.er')
124
+ ch3_path = File.join(dir, 'chapter3.re')
117
125
  File.open(ch3_path, 'w') {}
118
126
  ch3 = Book::Chapter.new(book, 3, 'chapter3', ch3_path)
119
127
 
@@ -122,50 +130,70 @@ class ChapterTest < Test::Unit::TestCase
122
130
  end
123
131
  end
124
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
+
125
149
  def test_list_index
126
150
  do_test_index(<<E, Book::ListIndex, :list_index, :list)
127
- //list
128
- //listnum [abc]
129
- //list [def]
130
- //table [def]
131
- //table [others]
151
+ //listnum[abc][abc-listnum]{
152
+ //}
153
+ //list[def][def-list]{
154
+ //}
155
+ //table[def]{
156
+ //}
157
+ //table[others]{
158
+ //}
132
159
  E
133
160
  end
134
161
 
135
162
  def test_table_index
136
163
  do_test_index(<<E, Book::TableIndex, :table_index, :table)
137
- //table
138
- //table [abc]
139
- //table [def]
140
- //list [def]
141
- //list [others]
164
+ //table[abc]{
165
+ //}
166
+ //table[def]{
167
+ //}
168
+ //list[def][def-list]{
169
+ //}
170
+ //list[others][other-list]{
171
+ //}
142
172
  E
143
173
  end
144
174
 
145
175
  def test_footnote_index
146
176
  content = <<E
147
- //footnote
148
- //footnote [abc][text...]
149
- //footnote [def][text...]
150
- //footnote [xyz]
151
- //list [def]
152
- //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
+ //}
153
184
  E
154
185
  do_test_index(content, Book::FootnoteIndex, :footnote_index, :footnote) do |ch|
155
186
  assert_raises ReVIEW::KeyError do
156
- ch.footnote('xyz')
187
+ ch.footnote('xyz2')
157
188
  end
158
189
  end
159
190
  end
160
191
 
161
192
  def test_bibpaper
162
193
  do_test_index(<<E, Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib.re')
163
- //bibpaper
164
- //bibpaper [abc][text...]
165
- //bibpaper [def][text...]
166
- //bibpaper [xyz]
167
- //list [def]
168
- //list [others]
194
+ //bibpaper[abc][text...]
195
+ //bibpaper[def][text...]
196
+ //bibpaper[xyz][text...]
169
197
  E
170
198
  assert_raises FileNotFound do
171
199
  do_test_index('', Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib')
@@ -174,11 +202,12 @@ E
174
202
 
175
203
  def test_headline_index
176
204
  do_test_index(<<E, Book::HeadlineIndex, :headline_index, :headline, propagate: false)
177
- ==
205
+ == x
178
206
  == abc
179
207
  == def
180
208
  === def
181
- //table others
209
+ //table[others]{
210
+ //}
182
211
  E
183
212
  end
184
213
 
@@ -202,35 +231,47 @@ E
202
231
 
203
232
  def test_image
204
233
  do_test_index(<<E, Book::ImageIndex, :image_index, :image)
205
- //image
206
- //image [abc]
207
- //image [def]
208
- //list [def]
209
- //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
+ //}
210
242
  E
211
243
 
212
244
  do_test_index(<<E, Book::NumberlessImageIndex, :numberless_image_index, :image, propagate: false)
213
- //numberlessimage
214
- //numberlessimage [abc]
215
- //numberlessimage [def]
216
- //list [def]
217
- //list [others]
245
+ //numberlessimage[abc]{
246
+ //}
247
+ //numberlessimage[def]{
248
+ //}
249
+ //list[def][def-list]{
250
+ //}
251
+ //list[others][others-list]{
252
+ //}
218
253
  E
219
254
 
220
255
  do_test_index(<<E, Book::ImageIndex, :image_index, :image)
221
- //image
222
- //numberlessimage [abc]
223
- //image [def]
224
- //list [def]
225
- //list [others]
256
+ //numberlessimage[abc]{
257
+ //}
258
+ //image[def][def-image]{
259
+ //}
260
+ //list[def][def-list]{
261
+ //}
262
+ //list[others][others-list]{
263
+ //}
226
264
  E
227
265
 
228
266
  do_test_index(<<E, Book::NumberlessImageIndex, :numberless_image_index, :image, propagate: false)
229
- //image
230
- //numberlessimage [abc]
231
- //image [def]
232
- //list [def]
233
- //list [others]
267
+ //numberlessimage[abc]{
268
+ //}
269
+ //image[def][def-image]{
270
+ //}
271
+ //list[def][def-list]{
272
+ //}
273
+ //list[others][others-list]{
274
+ //}
234
275
  E
235
276
  end
236
277
 
@@ -238,13 +279,15 @@ E
238
279
  Dir.mktmpdir do |dir|
239
280
  path = File.join(dir, opts[:filename] || 'chapter.re')
240
281
 
241
- book = Book::Base.new(dir)
242
-
243
282
  File.open(path, 'w') do |o|
244
283
  o.print content
245
284
  end
246
- ch = Book::Chapter.new(book, 1, 'chapter', path)
247
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
248
291
  assert ch.__send__(ref_method, 'abc')
249
292
  assert ch.__send__(ref_method, 'def')
250
293
  assert_raises ReVIEW::KeyError do
@@ -46,8 +46,8 @@ class PartTest < Test::Unit::TestCase
46
46
 
47
47
  part = Book::Part.new(book, nil, chs)
48
48
  assert part.volume
49
- assert part.volume.bytes > 0
50
- assert part.volume.chars > 0
51
- assert part.volume.lines > 0
49
+ assert part.volume.bytes == 0
50
+ assert part.volume.chars == 0
51
+ assert part.volume.lines == 0
52
52
  end
53
53
  end
@@ -24,7 +24,7 @@ class BuidlerTest < Test::Unit::TestCase
24
24
 
25
25
  def test_bind
26
26
  b = Builder.new
27
- chap = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.load, nil, '-', nil)
27
+ chap = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.new, nil, '-', nil)
28
28
  assert_nothing_raised do
29
29
  b.bind(nil, chap, nil)
30
30
  end
@@ -37,7 +37,7 @@ class BuidlerTest < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  b = Builder.new
40
- chapter = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.load, nil, '-', nil)
40
+ chapter = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.new, nil, '-', nil)
41
41
  b.bind(nil, chapter, nil)
42
42
  assert_equal '', b.result
43
43
  end
@@ -80,20 +80,45 @@ class BuidlerTest < Test::Unit::TestCase
80
80
  assert_equal [:text, text], @b.compile_inline(text)
81
81
  end
82
82
 
83
- class XBuilder < Builder
84
- def list_header(id, caption)
85
- end
86
-
87
- def list_body(lines)
88
- end
83
+ def test_inline_missing_ref
84
+ b = Builder.new
85
+ chapter = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.new, 1, 'chap1', nil, StringIO.new)
86
+ b.bind(nil, chapter, nil)
87
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_list('unknown|list1') }
88
+ assert_equal ': error: unknown list: unknown|list1', e.message
89
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_table('unknown|table1') }
90
+ assert_equal ': error: unknown table: unknown|table1', e.message
91
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_img('unknown|img1') }
92
+ assert_equal ': error: unknown image: unknown|img1', e.message
93
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_column('unknown|column1') }
94
+ assert_equal ': error: unknown column: unknown|column1', e.message
95
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_fn('unknown|footnote1') }
96
+ assert_equal ': error: unknown footnote: unknown|footnote1', e.message
97
+ end
89
98
 
90
- def listnum_body(lines)
91
- end
99
+ def test_nest_error
100
+ b = XBuilder.new
101
+ b.children = nil
102
+ assert_equal '', b.solve_nest('')
103
+ b.children = ['dl']
104
+ e = assert_raises(ReVIEW::ApplicationError) { b.solve_nest('') }
105
+ assert_equal ': error: //beginchild of dl misses //endchild', e.message
106
+ b.children = ['ul', 'dl', 'ol']
107
+ e = assert_raises(ReVIEW::ApplicationError) { b.solve_nest('') }
108
+ assert_equal ': error: //beginchild of ol,dl,ul misses //endchild', e.message
109
+
110
+ assert_equal "\u0001→/ol←\u0001", b.endchild
111
+ assert_equal "\u0001→/dl←\u0001", b.endchild
112
+ assert_equal "\u0001→/ul←\u0001", b.endchild
113
+ e = assert_raises(ReVIEW::ApplicationError) { b.endchild }
114
+ assert_equal ": error: //endchild is shown, but any opened //beginchild doesn't exist", e.message
115
+ end
92
116
 
93
- def source_header(caption)
94
- end
117
+ class XBuilder < Builder
118
+ attr_accessor :children
95
119
 
96
- def source_body(lines)
120
+ def puts(s)
121
+ s
97
122
  end
98
123
  end
99
124
  end
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'book_test_helper'
2
3
  require 'review/catalog'
3
4
 
4
5
  class CatalogTest < Test::Unit::TestCase
@@ -7,61 +8,48 @@ class CatalogTest < Test::Unit::TestCase
7
8
 
8
9
  def test_predef
9
10
  sut = Catalog.new(yaml)
10
- exp = <<-EOS
11
- pre01.re
12
- pre02.re
13
- EOS
14
- assert_equal(exp.chomp, sut.predef)
11
+ exp = %w[pre01.re pre02.re]
12
+ assert_equal(exp, sut.predef)
15
13
  end
16
14
 
17
15
  def test_chaps
18
16
  sut = Catalog.new(yaml)
19
- exp = <<-EOS
20
- ch01.re
21
- ch02.re
22
- EOS
23
- assert_equal(exp.chomp, sut.chaps)
17
+ exp = %w[ch01.re ch02.re]
18
+ assert_equal(exp, sut.chaps)
24
19
  end
25
20
 
26
21
  def test_chaps_empty
27
22
  yaml = StringIO.new
28
23
  sut = Catalog.new(yaml)
29
- assert_equal('', sut.chaps)
24
+ assert_equal([], sut.chaps)
30
25
  end
31
26
 
32
27
  def test_appendix
33
28
  sut = Catalog.new(yaml)
34
- exp = <<-EOS
35
- post01.re
36
- post02.re
37
- EOS
38
- assert_equal(exp.chomp, sut.appendix)
29
+ exp = %w[post01.re post02.re]
30
+ assert_equal(exp, sut.appendix)
39
31
  end
40
32
 
41
33
  def test_chaps_with_parts
42
34
  sut = Catalog.new(yaml_with_parts)
43
- exp = <<-EOS
44
- ch01.re
45
- ch02.re
46
- ch03.re
47
- ch04.re
48
- ch05.re
49
- EOS
50
- assert_equal(exp.chomp, sut.chaps)
35
+ exp = %w[ch01.re ch02.re ch03.re ch04.re ch05.re]
36
+ assert_equal(exp, sut.chaps)
51
37
  end
52
38
 
53
39
  def test_parts
54
40
  sut = Catalog.new(yaml_with_parts)
55
- exp = <<-EOS
56
- part1.re
57
- part2.re
58
- EOS
59
- assert_equal(exp.chomp, sut.parts)
41
+ exp = %w[part1.re part2.re]
42
+ assert_equal(exp, sut.parts)
60
43
  end
61
44
 
62
45
  def test_parts_with_empty
63
46
  sut = Catalog.new(yaml)
64
- assert_equal('', sut.parts)
47
+ assert_equal([], sut.parts)
48
+ end
49
+
50
+ def test_empty_parts
51
+ sut = Catalog.new(StringIO.new)
52
+ assert_equal([], sut.parts_with_chaps)
65
53
  end
66
54
 
67
55
  def test_parts2
@@ -75,20 +63,14 @@ part2.re
75
63
 
76
64
  def test_postdef
77
65
  sut = Catalog.new(yaml)
78
- exp = <<-EOS
79
- back01.re
80
- back02.re
81
- EOS
82
- assert_equal(exp.chomp, sut.postdef)
66
+ exp = %w[back01.re back02.re]
67
+ assert_equal(exp, sut.postdef)
83
68
  end
84
69
 
85
70
  def test_from_object
86
71
  sut = Catalog.new(yaml_hash)
87
- exp = <<-EOS
88
- ch01.re
89
- ch02.re
90
- EOS
91
- assert_equal(exp.chomp, sut.chaps)
72
+ exp = %w[ch01.re ch02.re]
73
+ assert_equal(exp, sut.chaps)
92
74
  end
93
75
 
94
76
  def test_validate
@@ -149,7 +131,7 @@ ch02.re
149
131
  private
150
132
 
151
133
  def yaml
152
- StringIO.new <<-EOS
134
+ StringIO.new(<<-EOS)
153
135
 
154
136
  PREDEF:
155
137
  - pre01.re
@@ -177,7 +159,7 @@ POSTDEF:
177
159
  end
178
160
 
179
161
  def yaml_with_parts
180
- StringIO.new <<-EOS
162
+ StringIO.new(<<-EOS)
181
163
  CHAPS:
182
164
  - ch01.re
183
165
  - part1.re: