review 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +11 -5
  3. data/.rubocop.yml +113 -24
  4. data/NEWS.ja.md +94 -0
  5. data/NEWS.md +94 -0
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +2 -4
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +8 -14
  10. data/bin/review-validate +1 -1
  11. data/doc/config.yml.sample +4 -1
  12. data/doc/config.yml.sample-simple +1 -1
  13. data/doc/format.ja.md +83 -4
  14. data/doc/format.md +84 -7
  15. data/doc/makeindex.ja.md +2 -2
  16. data/doc/quickstart.ja.md +3 -3
  17. data/doc/quickstart.md +2 -2
  18. data/lib/epubmaker/content.rb +3 -2
  19. data/lib/epubmaker/epubcommon.rb +33 -25
  20. data/lib/epubmaker/epubv2.rb +5 -6
  21. data/lib/epubmaker/epubv3.rb +20 -18
  22. data/lib/review/book.rb +2 -2
  23. data/lib/review/book/base.rb +61 -25
  24. data/lib/review/book/bib.rb +21 -0
  25. data/lib/review/book/book_unit.rb +155 -0
  26. data/lib/review/book/chapter.rb +30 -26
  27. data/lib/review/book/index.rb +23 -185
  28. data/lib/review/book/index/item.rb +7 -1
  29. data/lib/review/book/part.rb +21 -9
  30. data/lib/review/book/volume.rb +1 -1
  31. data/lib/review/builder.rb +68 -13
  32. data/lib/review/catalog.rb +2 -2
  33. data/lib/review/compiler.rb +159 -73
  34. data/lib/review/configure.rb +22 -1
  35. data/lib/review/converter.rb +1 -1
  36. data/lib/review/epub2html.rb +6 -1
  37. data/lib/review/epubmaker.rb +12 -23
  38. data/lib/review/htmlbuilder.rb +36 -7
  39. data/lib/review/htmlutils.rb +7 -10
  40. data/lib/review/i18n.rb +1 -1
  41. data/lib/review/idgxmlbuilder.rb +51 -6
  42. data/lib/review/idgxmlmaker.rb +9 -14
  43. data/lib/review/index_builder.rb +653 -0
  44. data/lib/review/init.rb +5 -13
  45. data/lib/review/latexbuilder.rb +65 -4
  46. data/lib/review/logger.rb +2 -2
  47. data/lib/review/makerhelper.rb +11 -0
  48. data/lib/review/markdownbuilder.rb +19 -1
  49. data/lib/review/pdfmaker.rb +17 -36
  50. data/lib/review/plaintextbuilder.rb +48 -2
  51. data/lib/review/preprocessor.rb +5 -5
  52. data/lib/review/rstbuilder.rb +25 -6
  53. data/lib/review/sec_counter.rb +13 -0
  54. data/lib/review/textmaker.rb +4 -12
  55. data/lib/review/tocprinter.rb +2 -3
  56. data/lib/review/topbuilder.rb +26 -0
  57. data/lib/review/update.rb +7 -7
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/volumeprinter.rb +2 -3
  60. data/lib/review/webmaker.rb +9 -20
  61. data/review.gemspec +2 -2
  62. data/samples/sample-book/src/config.yml +1 -1
  63. data/samples/syntax-book/Gemfile +1 -1
  64. data/samples/syntax-book/config.yml +1 -1
  65. data/templates/latex/config.erb +27 -23
  66. data/templates/latex/review-jlreq/README.md +3 -1
  67. data/templates/latex/review-jlreq/review-base.sty +31 -15
  68. data/templates/latex/review-jlreq/review-jlreq.cls +8 -24
  69. data/templates/latex/review-jsbook/README.md +7 -5
  70. data/templates/latex/review-jsbook/review-base.sty +34 -16
  71. data/templates/latex/review-jsbook/review-jsbook.cls +4 -2
  72. data/templates/web/html/layout-html5.html.erb +1 -1
  73. data/test/assets/test_template.tex +3 -3
  74. data/test/assets/test_template_backmatter.tex +3 -3
  75. data/test/book_test_helper.rb +11 -5
  76. data/test/test_book.rb +54 -63
  77. data/test/test_book_chapter.rb +93 -52
  78. data/test/test_builder.rb +24 -15
  79. data/test/test_converter.rb +1 -0
  80. data/test/test_epub3maker.rb +2 -2
  81. data/test/test_epubmaker.rb +8 -0
  82. data/test/test_helper.rb +4 -1
  83. data/test/test_htmlbuilder.rb +627 -56
  84. data/test/test_htmlutils.rb +0 -12
  85. data/test/test_i18n.rb +33 -33
  86. data/test/test_idgxmlbuilder.rb +358 -11
  87. data/test/test_idgxmlmaker_cmd.rb +1 -1
  88. data/test/test_index.rb +62 -52
  89. data/test/test_indexbuilder.rb +52 -0
  90. data/test/test_latexbuilder.rb +547 -10
  91. data/test/test_latexbuilder_v2.rb +43 -5
  92. data/test/test_logger.rb +7 -7
  93. data/test/test_makerhelper.rb +0 -12
  94. data/test/test_markdownbuilder.rb +3 -0
  95. data/test/test_pdfmaker.rb +13 -12
  96. data/test/test_pdfmaker_cmd.rb +1 -1
  97. data/test/test_plaintextbuilder.rb +422 -7
  98. data/test/test_review_ext.rb +2 -1
  99. data/test/test_rstbuilder.rb +25 -1
  100. data/test/test_sec_counter.rb +156 -0
  101. data/test/test_textmaker_cmd.rb +1 -1
  102. data/test/test_topbuilder.rb +187 -10
  103. data/test/test_update.rb +10 -10
  104. data/test/test_webtocprinter.rb +12 -12
  105. data/vendor/gentombow/LICENSE +1 -1
  106. data/vendor/gentombow/Makefile +0 -1
  107. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  108. data/vendor/gentombow/bounddvi-en.tex +1 -0
  109. data/vendor/gentombow/bounddvi.pdf +0 -0
  110. data/vendor/gentombow/bounddvi.sty +30 -7
  111. data/vendor/gentombow/bounddvi.tex +1 -0
  112. data/vendor/gentombow/create_archive.sh +1 -0
  113. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  114. data/vendor/gentombow/gentombow-ja.tex +9 -0
  115. data/vendor/gentombow/gentombow.pdf +0 -0
  116. data/vendor/gentombow/gentombow.sty +32 -10
  117. data/vendor/gentombow/gentombow.tex +8 -0
  118. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  119. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  120. data/vendor/jsclasses/Makefile +3 -2
  121. data/vendor/jsclasses/create_archive.sh +5 -5
  122. data/vendor/jsclasses/jis/Makefile +3 -2
  123. data/vendor/jsclasses/jis/jsarticle.cls +22 -18
  124. data/vendor/jsclasses/jis/jsbook.cls +22 -18
  125. data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
  126. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  127. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  128. data/vendor/jsclasses/jis/jslogo.sty +1 -13
  129. data/vendor/jsclasses/jis/jspf.cls +22 -18
  130. data/vendor/jsclasses/jis/jsreport.cls +22 -18
  131. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  132. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  133. data/vendor/jsclasses/jis/kiyou.cls +22 -18
  134. data/vendor/jsclasses/jis/minijs.sty +65 -22
  135. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  136. data/vendor/jsclasses/jis/okumacro.sty +1 -13
  137. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  138. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  139. data/vendor/jsclasses/jis/winjis.sty +23 -19
  140. data/vendor/jsclasses/jsarticle.cls +22 -18
  141. data/vendor/jsclasses/jsbook.cls +22 -18
  142. data/vendor/jsclasses/jsclasses.dtx +94 -13
  143. data/vendor/jsclasses/jsclasses.ins +15 -5
  144. data/vendor/jsclasses/jsclasses.pdf +0 -0
  145. data/vendor/jsclasses/jslogo.ins +9 -0
  146. data/vendor/jsclasses/jslogo.pdf +0 -0
  147. data/vendor/jsclasses/jslogo.sty +1 -13
  148. data/vendor/jsclasses/jspf.cls +22 -18
  149. data/vendor/jsclasses/jsreport.cls +22 -18
  150. data/vendor/jsclasses/jsverb.ins +9 -0
  151. data/vendor/jsclasses/jsverb.pdf +0 -0
  152. data/vendor/jsclasses/jsverb.sty +1 -13
  153. data/vendor/jsclasses/kiyou.cls +22 -18
  154. data/vendor/jsclasses/minijs.sty +68 -22
  155. data/vendor/jsclasses/okumacro.ins +9 -0
  156. data/vendor/jsclasses/okumacro.pdf +0 -0
  157. data/vendor/jsclasses/okumacro.sty +1 -13
  158. data/vendor/jsclasses/okuverb.ins +9 -0
  159. data/vendor/jsclasses/okuverb.pdf +0 -0
  160. data/vendor/jsclasses/okuverb.sty +1 -13
  161. data/vendor/jsclasses/tests/relfont.tex +10 -0
  162. data/vendor/jsclasses/winjis.sty +23 -19
  163. metadata +14 -6
  164. data/.rubocop_todo.yml +0 -7
  165. data/lib/review/book/compilable.rb +0 -174
@@ -17,18 +17,6 @@ class HTMLUtilsTest < Test::Unit::TestCase
17
17
  assert_equal '&amp;', unescape('&amp;amp;')
18
18
  end
19
19
 
20
- def test_escape_html_ex
21
- keys = ESC.keys
22
- ESC['.'] = 'X'
23
- ESC.each_pair do |ch, ref|
24
- if keys.include?(ch)
25
- assert_equal ref, escape(ch)
26
- else
27
- assert_equal ch, escape(ch)
28
- end
29
- end
30
- end
31
-
32
20
  def test_strip_html
33
21
  assert_equal 'thisistest.', strip_html('<h3>this<b>is</b>test</h3>.')
34
22
  end
@@ -9,7 +9,7 @@ class I18nTest < Test::Unit::TestCase
9
9
  Dir.mktmpdir do |dir|
10
10
  Dir.chdir(dir) do
11
11
  file = File.join(dir, 'locale.yml')
12
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nfoo: "bar"\n) }
12
+ File.write(file, %Q(locale: ja\nfoo: "bar"\n))
13
13
  I18n.setup
14
14
  assert_equal 'bar', I18n.t('foo')
15
15
  end
@@ -20,7 +20,7 @@ class I18nTest < Test::Unit::TestCase
20
20
  Dir.mktmpdir do |dir|
21
21
  Dir.chdir(dir) do
22
22
  file = File.join(dir, 'locale.yaml')
23
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nfoo: "bar"\n) }
23
+ File.write(file, %Q(locale: ja\nfoo: "bar"\n))
24
24
  assert_raise ReVIEW::ConfigError do
25
25
  I18n.setup
26
26
  end
@@ -32,7 +32,7 @@ class I18nTest < Test::Unit::TestCase
32
32
  Dir.mktmpdir do |dir|
33
33
  Dir.chdir(dir) do
34
34
  file = File.join(dir, 'foo.yml')
35
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nfoo: "bar"\n) }
35
+ File.write(file, %Q(locale: ja\nfoo: "bar"\n))
36
36
  I18n.setup('ja', 'foo.yml')
37
37
  assert_equal 'bar', I18n.t('foo')
38
38
  end
@@ -43,7 +43,7 @@ class I18nTest < Test::Unit::TestCase
43
43
  Dir.mktmpdir do |dir|
44
44
  Dir.chdir(dir) do
45
45
  file = File.join(dir, 'foo.yml')
46
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nfoo: "bar"\n) }
46
+ File.write(file, %Q(locale: ja\nfoo: "bar"\n))
47
47
  i18n = ReVIEW::I18n.new('ja')
48
48
  i18n.update_localefile(File.join(Dir.pwd, 'foo.yml'))
49
49
  assert_equal 'bar', i18n.t('foo')
@@ -55,7 +55,7 @@ class I18nTest < Test::Unit::TestCase
55
55
  Dir.mktmpdir do |dir|
56
56
  Dir.chdir(dir) do
57
57
  file = File.join(dir, 'foo.yml')
58
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nfoo: "bar"\n) }
58
+ File.write(file, %Q(locale: ja\nfoo: "bar"\n))
59
59
  I18n.setup('ja', 'foo.yml')
60
60
  assert_equal 'bar', I18n.t('foo')
61
61
  end
@@ -66,7 +66,7 @@ class I18nTest < Test::Unit::TestCase
66
66
  Dir.mktmpdir do |dir|
67
67
  Dir.chdir(dir) do
68
68
  file = File.join(dir, 'locale.yml')
69
- File.open(file, 'w') { |f| f.write %Q(ja:\n foo: "bar"\nen:\n foo: "buz"\n) }
69
+ File.write(file, %Q(ja:\n foo: "bar"\nen:\n foo: "buz"\n))
70
70
  I18n.setup
71
71
  assert_equal 'bar', I18n.t('foo')
72
72
  assert_equal '図', I18n.t('image')
@@ -81,7 +81,7 @@ class I18nTest < Test::Unit::TestCase
81
81
  Dir.mktmpdir do |dir|
82
82
  Dir.chdir(dir) do
83
83
  file = File.join(dir, 'locale.yml')
84
- File.open(file, 'w') { |f| f.write %Q(local: ja\nfoo: "bar"\n) }
84
+ File.write(file, %Q(local: ja\nfoo: "bar"\n))
85
85
  assert_raises(ReVIEW::KeyError) do
86
86
  I18n.setup
87
87
  end
@@ -93,59 +93,59 @@ class I18nTest < Test::Unit::TestCase
93
93
  Dir.mktmpdir do |dir|
94
94
  Dir.chdir(dir) do
95
95
  file = File.join(dir, 'locale.yml')
96
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pa章" }
96
+ File.write(file, "locale: ja\nchapter: 第%pa章")
97
97
  I18n.setup('ja')
98
98
  assert_equal '第a章', I18n.t('chapter', 1)
99
99
 
100
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pA章" }
100
+ File.write(file, "locale: ja\nchapter: 第%pA章")
101
101
  I18n.setup('ja')
102
102
  assert_equal '第B章', I18n.t('chapter', 2)
103
103
 
104
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pAW章" }
104
+ File.write(file, "locale: ja\nchapter: 第%pAW章")
105
105
  I18n.setup('ja')
106
106
  assert_equal '第B章', I18n.t('chapter', 2)
107
107
 
108
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%paW章" }
108
+ File.write(file, "locale: ja\nchapter: 第%paW章")
109
109
  I18n.setup('ja')
110
110
  assert_equal '第b章', I18n.t('chapter', 2)
111
111
 
112
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pR章" }
112
+ File.write(file, "locale: ja\nchapter: 第%pR章")
113
113
  I18n.setup('ja')
114
114
  assert_equal '第I章', I18n.t('chapter', 1)
115
115
 
116
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pr章" }
116
+ File.write(file, "locale: ja\nchapter: 第%pr章")
117
117
  I18n.setup('ja')
118
118
  assert_equal '第ii章', I18n.t('chapter', 2)
119
119
 
120
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pRW章" }
120
+ File.write(file, "locale: ja\nchapter: 第%pRW章")
121
121
  I18n.setup('ja')
122
122
  assert_equal '第Ⅻ章', I18n.t('chapter', 12)
123
123
 
124
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pJ章" }
124
+ File.write(file, "locale: ja\nchapter: 第%pJ章")
125
125
  I18n.setup('ja')
126
126
  assert_equal '第二十七章', I18n.t('chapter', 27)
127
127
 
128
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pdW章" }
128
+ File.write(file, "locale: ja\nchapter: 第%pdW章")
129
129
  I18n.setup('ja')
130
130
  assert_equal '第1章', I18n.t('chapter', 1)
131
131
 
132
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pdW章" }
132
+ File.write(file, "locale: ja\nchapter: 第%pdW章")
133
133
  I18n.setup('ja')
134
134
  assert_equal '第27章', I18n.t('chapter', 27)
135
135
 
136
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pDW章" }
136
+ File.write(file, "locale: ja\nchapter: 第%pDW章")
137
137
  I18n.setup('ja')
138
138
  assert_equal '第1章', I18n.t('chapter', 1)
139
139
 
140
- File.open(file, 'w') { |f| f.write "locale: ja\nchapter: 第%pDW章" }
140
+ File.write(file, "locale: ja\nchapter: 第%pDW章")
141
141
  I18n.setup('ja')
142
142
  assert_equal '第27章', I18n.t('chapter', 27)
143
143
 
144
- File.open(file, 'w') { |f| f.write "locale: ja\npart: Part %pRW" }
144
+ File.write(file, "locale: ja\npart: Part %pRW")
145
145
  I18n.setup('ja')
146
146
  assert_equal 'Part 0', I18n.t('part', 0)
147
147
 
148
- File.open(file, 'w') { |f| f.write "locale: ja\npart: 第%pJ部" }
148
+ File.write(file, "locale: ja\npart: 第%pJ部")
149
149
  I18n.setup('ja')
150
150
  assert_equal '第一部', I18n.t('part', 1)
151
151
  end
@@ -157,23 +157,23 @@ class I18nTest < Test::Unit::TestCase
157
157
  Dir.chdir(dir) do
158
158
  file = File.join(dir, 'locale.yml')
159
159
 
160
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%s-%pA:") }
160
+ File.write(file, %Q(locale: ja\nformat_number_header: "%s-%pA:"))
161
161
  I18n.setup('ja')
162
162
  assert_equal '1-B:', I18n.t('format_number_header', [1, 2])
163
163
 
164
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%s.%pa:") }
164
+ File.write(file, %Q(locale: ja\nformat_number_header: "%s.%pa:"))
165
165
  I18n.setup('ja')
166
166
  assert_equal '2.c:', I18n.t('format_number_header', [2, 3])
167
167
 
168
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%pA,%pAW:") }
168
+ File.write(file, %Q(locale: ja\nformat_number_header: "%pA,%pAW:"))
169
169
  I18n.setup('ja')
170
170
  assert_equal 'C,D:', I18n.t('format_number_header', [3, 4])
171
171
 
172
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%pJ・%pJ:") }
172
+ File.write(file, %Q(locale: ja\nformat_number_header: "%pJ・%pJ:"))
173
173
  I18n.setup('ja')
174
174
  assert_equal '十二・二十六:', I18n.t('format_number_header', [12, 26])
175
175
 
176
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%pdW―%pdW:") }
176
+ File.write(file, %Q(locale: ja\nformat_number_header: "%pdW―%pdW:"))
177
177
  I18n.setup('ja')
178
178
  assert_equal '3―12:', I18n.t('format_number_header', [3, 12])
179
179
  end
@@ -185,11 +185,11 @@ class I18nTest < Test::Unit::TestCase
185
185
  Dir.chdir(dir) do
186
186
  file = File.join(dir, 'locale.yml')
187
187
 
188
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%2$d") }
188
+ File.write(file, %Q(locale: ja\nformat_number_header: "%2$d"))
189
189
  I18n.setup('ja')
190
190
  assert_equal '10', I18n.t('format_number_header', [1, 10])
191
191
 
192
- File.open(file, 'w') { |f| f.write %Q(locale: ja\nformat_number_header: "%2$d-%1$d") }
192
+ File.write(file, %Q(locale: ja\nformat_number_header: "%2$d-%1$d"))
193
193
  I18n.setup('ja')
194
194
  # ERROR: returns raw format
195
195
  assert_equal '%2$d-%1$d', I18n.t('format_number_header', [1])
@@ -238,11 +238,11 @@ class I18nTest < Test::Unit::TestCase
238
238
  def _setup_htmlbuilder
239
239
  I18n.setup('en')
240
240
  @builder = HTMLBuilder.new
241
- @config = ReVIEW::Configure[
242
- 'secnolevel' => 2, # for IDGXMLBuilder, HTMLBuilder
243
- 'stylesheet' => nil, # for HTMLBuilder
244
- 'ext' => '.re'
245
- ]
241
+ @config = ReVIEW::Configure.values.merge(
242
+ { 'secnolevel' => 2, # for IDGXMLBuilder, HTMLBuilder
243
+ 'stylesheet' => nil, # for HTMLBuilder
244
+ 'ext' => '.re' }
245
+ )
246
246
  @book = Book::Base.new('.')
247
247
  @book.config = @config
248
248
  @compiler = ReVIEW::Compiler.new(@builder)
@@ -155,10 +155,10 @@ EOS
155
155
  end
156
156
 
157
157
  def test_empty_table
158
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n//}\n" }
158
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n//}\n") }
159
159
  assert_equal ':2: error: no rows in the table', e.message
160
160
 
161
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n------------\n//}\n" }
161
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n------------\n//}\n") }
162
162
  assert_equal ':3: error: no rows in the table', e.message
163
163
  end
164
164
 
@@ -252,9 +252,7 @@ EOS
252
252
  end
253
253
 
254
254
  def test_dt_inline
255
- fn = Book::FootnoteIndex.parse(['//footnote[bar][bar]'])
256
- @chapter.instance_eval { @footnote_index = fn }
257
- actual = compile_block(" : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
255
+ actual = compile_block("//footnote[bar][bar]\n\n : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
258
256
 
259
257
  expected = <<-EOS.chomp
260
258
  <dl><dt>foo<footnote>bar</footnote>[]&lt;&gt;&amp;<replace idref="texinline-1"><pre>\\alpha[]</pre></replace></dt><dd></dd></dl>
@@ -324,6 +322,145 @@ EOS
324
322
  assert_equal expected, actual
325
323
  end
326
324
 
325
+ def test_minicolumn_blocks
326
+ %w[note memo tip info warning important caution notice].each do |type|
327
+ src = <<-EOS
328
+ //#{type}[#{type}1]{
329
+
330
+ //}
331
+
332
+ //#{type}[#{type}2]{
333
+ //}
334
+ EOS
335
+
336
+ if type == 'notice' # exception pattern
337
+ expected = <<-EOS.chomp
338
+ <#{type}-t><title aid:pstyle='#{type}-title'>#{type}1</title></#{type}-t><#{type}-t><title aid:pstyle='#{type}-title'>#{type}2</title></#{type}-t>
339
+ EOS
340
+ else
341
+ expected = <<-EOS.chomp
342
+ <#{type}><title aid:pstyle='#{type}-title'>#{type}1</title></#{type}><#{type}><title aid:pstyle='#{type}-title'>#{type}2</title></#{type}>
343
+ EOS
344
+ end
345
+ assert_equal expected, compile_block(src)
346
+
347
+ src = <<-EOS
348
+ //#{type}[#{type}2]{
349
+
350
+ //}
351
+
352
+ //#{type}[#{type}3]{
353
+
354
+ //}
355
+
356
+ //#{type}[#{type}4]{
357
+
358
+ //}
359
+
360
+ //#{type}[#{type}5]{
361
+
362
+ //}
363
+
364
+ //#{type}[#{type}6]{
365
+
366
+ //}
367
+ EOS
368
+
369
+ if type == 'notice' # exception pattern
370
+ expected = <<-EOS.chomp
371
+ <#{type}-t><title aid:pstyle='#{type}-title'>#{type}2</title></#{type}-t><#{type}-t><title aid:pstyle='#{type}-title'>#{type}3</title></#{type}-t><#{type}-t><title aid:pstyle='#{type}-title'>#{type}4</title></#{type}-t><#{type}-t><title aid:pstyle='#{type}-title'>#{type}5</title></#{type}-t><#{type}-t><title aid:pstyle='#{type}-title'>#{type}6</title></#{type}-t>
372
+ EOS
373
+ else
374
+ expected = <<-EOS.chomp
375
+ <#{type}><title aid:pstyle='#{type}-title'>#{type}2</title></#{type}><#{type}><title aid:pstyle='#{type}-title'>#{type}3</title></#{type}><#{type}><title aid:pstyle='#{type}-title'>#{type}4</title></#{type}><#{type}><title aid:pstyle='#{type}-title'>#{type}5</title></#{type}><#{type}><title aid:pstyle='#{type}-title'>#{type}6</title></#{type}>
376
+ EOS
377
+ end
378
+ assert_equal expected, compile_block(src)
379
+
380
+ src = <<-EOS
381
+ //#{type}{
382
+
383
+ * A
384
+
385
+ 1. B
386
+
387
+ //}
388
+
389
+ //#{type}[OMITEND1]{
390
+
391
+ //emlist{
392
+ LIST
393
+ //}
394
+
395
+ //}
396
+ //#{type}[OMITEND2]{
397
+ //}
398
+ EOS
399
+
400
+ if type == 'notice' # exception pattern
401
+ expected = <<-EOS.chomp
402
+ <#{type}><ul><li aid:pstyle="ul-item">A</li></ul><ol><li aid:pstyle="ol-item" olnum="1" num="1">B</li></ol></#{type}><#{type}-t><title aid:pstyle='#{type}-title'>OMITEND1</title><list type='emlist'><pre>LIST
403
+ </pre></list></#{type}-t><#{type}-t><title aid:pstyle='#{type}-title'>OMITEND2</title></#{type}-t>
404
+ EOS
405
+ else
406
+ expected = <<-EOS.chomp
407
+ <#{type}><ul><li aid:pstyle="ul-item">A</li></ul><ol><li aid:pstyle="ol-item" olnum="1" num="1">B</li></ol></#{type}><#{type}><title aid:pstyle='#{type}-title'>OMITEND1</title><list type='emlist'><pre>LIST
408
+ </pre></list></#{type}><#{type}><title aid:pstyle='#{type}-title'>OMITEND2</title></#{type}>
409
+ EOS
410
+ end
411
+ assert_equal expected, compile_block(src)
412
+ end
413
+ end
414
+
415
+ def test_minicolumn_blocks_nest_error1
416
+ %w[note memo tip info warning important caution notice].each do |type|
417
+ @builder.doc_status.clear
418
+ src = <<-EOS
419
+ //#{type}{
420
+
421
+ //#{type}{
422
+ //}
423
+
424
+ //}
425
+ EOS
426
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
427
+ assert_match(/minicolumn cannot be nested:/, e.message)
428
+ end
429
+ end
430
+
431
+ def test_minicolumn_blocks_nest_error2
432
+ %w[note memo tip info warning important caution notice].each do |type|
433
+ @builder.doc_status.clear
434
+ src = <<-EOS
435
+ //#{type}{
436
+
437
+ //#{type}{
438
+
439
+ //}
440
+
441
+ //}
442
+ EOS
443
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
444
+ assert_match(/minicolumn cannot be nested:/, e.message)
445
+ end
446
+ end
447
+
448
+ def test_minicolumn_blocks_nest_error3
449
+ %w[memo tip info warning important caution notice].each do |type|
450
+ @builder.doc_status.clear
451
+ src = <<-EOS
452
+ //#{type}{
453
+
454
+ //note{
455
+ //}
456
+
457
+ //}
458
+ EOS
459
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
460
+ assert_match(/minicolumn cannot be nested:/, e.message)
461
+ end
462
+ end
463
+
327
464
  def test_term
328
465
  actual = compile_block("//term{\ntest1\ntest1.5\n\ntest@<i>{2}\n//}\n")
329
466
  assert_equal '<term><p>test1test1.5</p><p>test<i>2</i></p></term>', actual
@@ -847,10 +984,16 @@ inside column
847
984
  this is @<column>{foo}.
848
985
  EOS
849
986
  expected = <<-EOS.chomp
850
- <column id="column-1"><title aid:pstyle="column-title">test</title><?dtp level="9" section="test"?><p>inside column</p></column><title aid:pstyle="h3">next level</title><?dtp level="3" section="next level"?><p>this is コラム「test」.</p>
987
+ <column id="column-1"><title aid:pstyle="column-title">test</title><?dtp level="9" section="test"?><p>inside column</p></column><title aid:pstyle="h3">next level</title><?dtp level="3" section="next level"?><p>this is <link href="column-1">コラム「test」</link>.</p>
851
988
  EOS
852
989
 
853
990
  assert_equal expected, column_helper(review)
991
+
992
+ @config['chapterlink'] = nil
993
+ expected = <<-EOS.chomp
994
+ <column id="column-1"><title aid:pstyle="column-title">test</title><?dtp level="9" section="test"?><p>inside column</p></column><title aid:pstyle="h3">next level</title><?dtp level="3" section="next level"?><p>this is コラム「test」.</p>
995
+ EOS
996
+ assert_equal expected, column_helper(review)
854
997
  end
855
998
 
856
999
  def test_column_in_aother_chapter_ref
@@ -861,6 +1004,11 @@ EOS
861
1004
  idx
862
1005
  end
863
1006
 
1007
+ actual = compile_inline('test @<column>{chap1|column} test2')
1008
+ expected = 'test <link href="column-1">コラム「column_cap」</link> test2'
1009
+ assert_equal expected, actual
1010
+
1011
+ @config['chapterlink'] = nil
864
1012
  actual = compile_inline('test @<column>{chap1|column} test2')
865
1013
  expected = 'test コラム「column_cap」 test2'
866
1014
  assert_equal expected, actual
@@ -970,18 +1118,18 @@ EOS
970
1118
  end
971
1119
 
972
1120
  def test_inline_unknown
973
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<img>{n}\n" }
1121
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<img>{n}\n") }
974
1122
  assert_equal ':1: error: unknown image: n', e.message
975
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<fn>{n}\n" }
1123
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<fn>{n}\n") }
976
1124
  assert_equal ':1: error: unknown footnote: n', e.message
977
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<hd>{n}\n" }
1125
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<hd>{n}\n") }
978
1126
  assert_equal ':1: error: unknown headline: n', e.message
979
1127
  %w[list table column].each do |name|
980
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" }
1128
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
981
1129
  assert_equal ":1: error: unknown #{name}: n", e.message
982
1130
  end
983
1131
  %w[chap chapref title].each do |name|
984
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" }
1132
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
985
1133
  assert_equal ':1: error: key not found: "n"', e.message
986
1134
  end
987
1135
  end
@@ -1116,4 +1264,203 @@ EOS
1116
1264
  actual = compile_block(src)
1117
1265
  assert_equal expected, actual
1118
1266
  end
1267
+
1268
+ def test_nest_error_close1
1269
+ src = <<-EOS
1270
+ //beginchild
1271
+ EOS
1272
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
1273
+ assert_equal ":1: error: //beginchild is shown, but previous element isn't ul, ol, or dl", e.message
1274
+ end
1275
+
1276
+ def test_nest_error_close2
1277
+ src = <<-EOS
1278
+ * foo
1279
+
1280
+ //beginchild
1281
+
1282
+ 1. foo
1283
+
1284
+ //beginchild
1285
+
1286
+ : foo
1287
+
1288
+ //beginchild
1289
+ EOS
1290
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
1291
+ assert_equal ':12: error: //beginchild of dl,ol,ul misses //endchild', e.message
1292
+ end
1293
+
1294
+ def test_nest_error_close3
1295
+ src = <<-EOS
1296
+ * foo
1297
+
1298
+ //beginchild
1299
+
1300
+ 1. foo
1301
+
1302
+ //beginchild
1303
+
1304
+ : foo
1305
+
1306
+ //beginchild
1307
+
1308
+ //endchild
1309
+ EOS
1310
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
1311
+ assert_equal ':14: error: //beginchild of ol,ul misses //endchild', e.message
1312
+ end
1313
+
1314
+ def test_nest_ul
1315
+ src = <<-EOS
1316
+ * UL1
1317
+
1318
+ //beginchild
1319
+
1320
+ 1. UL1-OL1
1321
+ 2. UL1-OL2
1322
+
1323
+ * UL1-UL1
1324
+ * UL1-UL2
1325
+
1326
+ : UL1-DL1
1327
+ UL1-DD1
1328
+ : UL1-DL2
1329
+ UL1-DD2
1330
+
1331
+ //endchild
1332
+
1333
+ * UL2
1334
+
1335
+ //beginchild
1336
+
1337
+ UL2-PARA
1338
+
1339
+ //endchild
1340
+ EOS
1341
+
1342
+ expected = <<-EOS.chomp
1343
+ <ul><li aid:pstyle="ul-item">UL1<ol><li aid:pstyle="ol-item" olnum="1" num="1">UL1-OL1</li><li aid:pstyle="ol-item" olnum="2" num="2">UL1-OL2</li></ol><ul><li aid:pstyle="ul-item">UL1-UL1</li><li aid:pstyle="ul-item">UL1-UL2</li></ul><dl><dt>UL1-DL1</dt><dd>UL1-DD1</dd><dt>UL1-DL2</dt><dd>UL1-DD2</dd></dl></li><li aid:pstyle="ul-item">UL2<p>UL2-PARA</p></li></ul>
1344
+ EOS
1345
+
1346
+ actual = compile_block(src)
1347
+ assert_equal expected, actual
1348
+ end
1349
+
1350
+ def test_nest_ol
1351
+ src = <<-EOS
1352
+ 1. OL1
1353
+
1354
+ //beginchild
1355
+
1356
+ 1. OL1-OL1
1357
+ 2. OL1-OL2
1358
+
1359
+ * OL1-UL1
1360
+ * OL1-UL2
1361
+
1362
+ : OL1-DL1
1363
+ OL1-DD1
1364
+ : OL1-DL2
1365
+ OL1-DD2
1366
+
1367
+ //endchild
1368
+
1369
+ 2. OL2
1370
+
1371
+ //beginchild
1372
+
1373
+ OL2-PARA
1374
+
1375
+ //endchild
1376
+ EOS
1377
+
1378
+ expected = <<-EOS.chomp
1379
+ <ol><li aid:pstyle="ol-item" olnum="1" num="1">OL1<ol><li aid:pstyle="ol-item" olnum="1" num="1">OL1-OL1</li><li aid:pstyle="ol-item" olnum="2" num="2">OL1-OL2</li></ol><ul><li aid:pstyle="ul-item">OL1-UL1</li><li aid:pstyle="ul-item">OL1-UL2</li></ul><dl><dt>OL1-DL1</dt><dd>OL1-DD1</dd><dt>OL1-DL2</dt><dd>OL1-DD2</dd></dl></li><li aid:pstyle="ol-item" olnum="1" num="2">OL2<p>OL2-PARA</p></li></ol>
1380
+ EOS
1381
+
1382
+ actual = compile_block(src)
1383
+ assert_equal expected, actual
1384
+ end
1385
+
1386
+ def test_nest_dl
1387
+ src = <<-EOS
1388
+ : DL1
1389
+
1390
+ //beginchild
1391
+
1392
+ 1. DL1-OL1
1393
+ 2. DL1-OL2
1394
+
1395
+ * DL1-UL1
1396
+ * DL1-UL2
1397
+
1398
+ : DL1-DL1
1399
+ DL1-DD1
1400
+ : DL1-DL2
1401
+ DL1-DD2
1402
+
1403
+ //endchild
1404
+
1405
+ : DL2
1406
+ DD2
1407
+
1408
+ //beginchild
1409
+
1410
+ * DD2-UL1
1411
+ * DD2-UL2
1412
+
1413
+ DD2-PARA
1414
+
1415
+ //endchild
1416
+ EOS
1417
+
1418
+ expected = <<-EOS.chomp
1419
+ <dl><dt>DL1</dt><dd><ol><li aid:pstyle="ol-item" olnum="1" num="1">DL1-OL1</li><li aid:pstyle="ol-item" olnum="2" num="2">DL1-OL2</li></ol><ul><li aid:pstyle="ul-item">DL1-UL1</li><li aid:pstyle="ul-item">DL1-UL2</li></ul><dl><dt>DL1-DL1</dt><dd>DL1-DD1</dd><dt>DL1-DL2</dt><dd>DL1-DD2</dd></dl></dd><dt>DL2</dt><dd>DD2<ul><li aid:pstyle="ul-item">DD2-UL1</li><li aid:pstyle="ul-item">DD2-UL2</li></ul><p>DD2-PARA</p></dd></dl>
1420
+ EOS
1421
+
1422
+ actual = compile_block(src)
1423
+ assert_equal expected, actual
1424
+ end
1425
+
1426
+ def test_nest_multi
1427
+ src = <<-EOS
1428
+ 1. OL1
1429
+
1430
+ //beginchild
1431
+
1432
+ 1. OL1-OL1
1433
+
1434
+ //beginchild
1435
+
1436
+ * OL1-OL1-UL1
1437
+
1438
+ OL1-OL1-PARA
1439
+
1440
+ //endchild
1441
+
1442
+ 2. OL1-OL2
1443
+
1444
+ * OL1-UL1
1445
+
1446
+ //beginchild
1447
+
1448
+ : OL1-UL1-DL1
1449
+ OL1-UL1-DD1
1450
+
1451
+ OL1-UL1-PARA
1452
+
1453
+ //endchild
1454
+
1455
+ * OL1-UL2
1456
+
1457
+ //endchild
1458
+ EOS
1459
+ expected = <<-EOS.chomp
1460
+ <ol><li aid:pstyle="ol-item" olnum="1" num="1">OL1<ol><li aid:pstyle="ol-item" olnum="1" num="1">OL1-OL1<ul><li aid:pstyle="ul-item">OL1-OL1-UL1</li></ul><p>OL1-OL1-PARA</p></li><li aid:pstyle="ol-item" olnum="1" num="2">OL1-OL2</li></ol><ul><li aid:pstyle="ul-item">OL1-UL1<dl><dt>OL1-UL1-DL1</dt><dd>OL1-UL1-DD1</dd></dl><p>OL1-UL1-PARA</p></li><li aid:pstyle="ul-item">OL1-UL2</li></ul></li></ol>
1461
+ EOS
1462
+
1463
+ actual = compile_block(src)
1464
+ assert_equal expected, actual
1465
+ end
1119
1466
  end