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
@@ -29,7 +29,7 @@ class IDGXMLMakerCmdTest < 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_IDGXMLMAKER} #{option} #{configfile}")
32
- STDERR.puts e unless e.empty?
32
+ assert_equal '', e
33
33
  assert s.success?
34
34
  end
35
35
  assert File.exist?(File.join(@tmpdir1, targetfile))
@@ -1,11 +1,28 @@
1
1
  require 'test_helper'
2
+ require 'review/compiler'
2
3
  require 'review/book'
3
4
  require 'review/book/index'
5
+ require 'review/topbuilder'
6
+ require 'review/i18n'
4
7
 
5
8
  class IndexTest < Test::Unit::TestCase
6
9
  include ReVIEW
10
+
11
+ def setup
12
+ @builder = TOPBuilder.new
13
+ @config = ReVIEW::Configure.create(config: { 'secnolevel' => 2, 'language' => 'ja' })
14
+ @book = Book::Base.new(config: @config)
15
+ @compiler = ReVIEW::Compiler.new(@builder)
16
+ @chapter = Book::Chapter.new(@book, 1, '-', nil, StringIO.new)
17
+ location = Location.new(nil, nil)
18
+ @builder.bind(@compiler, @chapter, location)
19
+
20
+ I18n.setup(@config['language'])
21
+ end
22
+
7
23
  def test_footnote_index
8
- fn = Book::FootnoteIndex.parse(['//footnote[foo][bar]'])
24
+ compile_block("//footnote[foo][bar]\n")
25
+ fn = @chapter.footnote_index
9
26
  items = fn.to_a
10
27
  item = items[0]
11
28
  assert_equal 'foo', item.id
@@ -13,7 +30,8 @@ class IndexTest < Test::Unit::TestCase
13
30
  end
14
31
 
15
32
  def test_footnote_index_with_escape
16
- fn = Book::FootnoteIndex.parse(['//footnote[foo][bar[\]buz]'])
33
+ compile_block('//footnote[foo][bar[\]buz]' + "\n")
34
+ fn = @chapter.footnote_index
17
35
  items = fn.to_a
18
36
  item = items[0]
19
37
  assert_equal 'foo', item.id
@@ -21,7 +39,8 @@ class IndexTest < Test::Unit::TestCase
21
39
  end
22
40
 
23
41
  def test_footnote_index_with_escape2
24
- fn = Book::FootnoteIndex.parse(['//footnote[foo][bar\\a\\$buz]'])
42
+ compile_block('//footnote[foo][bar\\a\\$buz]' + "\n")
43
+ fn = @chapter.footnote_index
25
44
  items = fn.to_a
26
45
  item = items[0]
27
46
  assert_equal 'foo', item.id
@@ -29,7 +48,8 @@ class IndexTest < Test::Unit::TestCase
29
48
  end
30
49
 
31
50
  def test_footnote_index_key?
32
- fn = Book::FootnoteIndex.parse(['//footnote[foo][bar]'])
51
+ compile_block('//footnote[foo][bar]' + "\n")
52
+ fn = @chapter.footnote_index
33
53
  assert_equal true, fn.key?('foo')
34
54
 
35
55
  ## for compatibility
@@ -38,7 +58,7 @@ class IndexTest < Test::Unit::TestCase
38
58
  # rubocop:enable Style/PreferredHashMethods
39
59
  end
40
60
 
41
- def test_headeline_index
61
+ def test_headline_index
42
62
  src = <<-EOB
43
63
  = chap1
44
64
  == sec1-1
@@ -52,14 +72,13 @@ class IndexTest < Test::Unit::TestCase
52
72
  == sec1-3
53
73
  ==== sec1-3-0-1
54
74
  EOB
55
- book = Book::Base.load
56
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
57
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
75
+ compile_block(src)
76
+ index = @chapter.headline_index
58
77
  assert_equal [2, 2], index['sec1-2|sec1-2-2'].number
59
78
  assert_equal '1.2.2', index.number('sec1-2|sec1-2-2')
60
79
  end
61
80
 
62
- def test_headeline_index2
81
+ def test_headline_index2
63
82
  src = <<-EOB
64
83
  = chap1
65
84
  == sec1-1
@@ -69,14 +88,13 @@ class IndexTest < Test::Unit::TestCase
69
88
  == sec1-3
70
89
  === sec1-3-1
71
90
  EOB
72
- book = Book::Base.load
73
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
74
- index = Book::HeadlineIndex.parse(src.lines, chap)
91
+ compile_block(src)
92
+ index = @chapter.headline_index
75
93
  assert_equal [3, 1], index['sec1-3|sec1-3-1'].number
76
94
  assert_equal '1.3.1', index.number('sec1-3|sec1-3-1')
77
95
  end
78
96
 
79
- def test_headeline_index3
97
+ def test_headline_index3
80
98
  src = <<-EOB
81
99
  = chap1
82
100
  == sec1-1
@@ -87,9 +105,8 @@ class IndexTest < Test::Unit::TestCase
87
105
  == sec1-3
88
106
  === sec1-3-1
89
107
  EOB
90
- book = Book::Base.load
91
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
92
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
108
+ compile_block(src)
109
+ index = @chapter.headline_index
93
110
  assert_equal [2, 2], index['sec1-2|sec1-2-2'].number
94
111
  assert_equal '1.2.2', index.number('sec1-2|sec1-2-2')
95
112
 
@@ -97,7 +114,7 @@ class IndexTest < Test::Unit::TestCase
97
114
  assert_equal '1.3.1', index.number('sec1-3|sec1-3-1')
98
115
  end
99
116
 
100
- def test_headeline_index4
117
+ def test_headline_index4
101
118
  src = <<-EOB
102
119
  = chap1
103
120
  ====[column] c1
@@ -106,14 +123,13 @@ class IndexTest < Test::Unit::TestCase
106
123
  === sec1-2-1
107
124
  === sec1-2-2
108
125
  EOB
109
- book = Book::Base.load
110
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
111
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
126
+ compile_block(src)
127
+ index = @chapter.headline_index
112
128
  assert_equal [2, 2], index['sec1-2|sec1-2-2'].number
113
129
  assert_equal '1.2.2', index.number('sec1-2|sec1-2-2')
114
130
  end
115
131
 
116
- def test_headeline_index5
132
+ def test_headline_index5
117
133
  src = <<-EOB
118
134
  = chap1
119
135
  ====[column] c1
@@ -122,14 +138,13 @@ class IndexTest < Test::Unit::TestCase
122
138
  === sec1-2-1
123
139
  === sec1-2-2
124
140
  EOB
125
- book = Book::Base.load
126
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
127
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
141
+ compile_block(src)
142
+ index = @chapter.headline_index
128
143
  assert_equal [2, 2], index['sec1-2-2'].number
129
144
  assert_equal '1.2.2', index.number('sec1-2-2')
130
145
  end
131
146
 
132
- def test_headeline_index6
147
+ def test_headline_index6
133
148
  src = <<-EOB
134
149
  = chap1
135
150
  == sec1
@@ -137,34 +152,33 @@ class IndexTest < Test::Unit::TestCase
137
152
  == sec2
138
153
 
139
154
  EOB
140
- book = Book::Base.load
141
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
142
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
155
+ compile_block(src)
156
+ index = @chapter.headline_index
143
157
  assert_equal [1, 1], index['target'].number
144
158
  assert_equal '1.1.1', index.number('target')
145
159
  end
146
160
 
147
- def test_headeline_index7
161
+ def test_headline_index7
148
162
  src = <<-EOB
149
163
  = chap1
150
164
  == sec1
151
165
  === target
152
166
  ^-- dummy target
167
+
153
168
  == sec2
154
169
  === target
155
170
  ^-- real target but it cannot be detected, because there is another one.
156
171
 
157
172
  EOB
158
- book = Book::Base.load
159
- chap = Book::Chapter.new(book, 1, '-', nil) # dummy
160
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
173
+ compile_block(src)
174
+ index = @chapter.headline_index
161
175
 
162
176
  assert_raise ReVIEW::KeyError do
163
177
  assert_equal [1, 1], index['target'].number
164
178
  end
165
179
  end
166
180
 
167
- def test_headeline_index8
181
+ def test_headline_index8
168
182
  src = <<-EOB
169
183
  = chap1
170
184
  == sec1
@@ -172,13 +186,13 @@ class IndexTest < Test::Unit::TestCase
172
186
  ==== sec1-1-1
173
187
 
174
188
  EOB
175
- book = Book::Base.load
176
- chap = Book::Chapter.new(book, 1, '-', nil)
177
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
189
+ compile_block(src)
190
+ index = @chapter.headline_index
191
+
178
192
  assert_equal '1.1.1', index.number('sec1-1')
179
193
  end
180
194
 
181
- def test_headeline_index9
195
+ def test_headline_index9
182
196
  src = <<-EOB
183
197
  = chap1
184
198
  == sec1
@@ -188,13 +202,12 @@ class IndexTest < Test::Unit::TestCase
188
202
  ==== sec1-1-1
189
203
  === sec1-2
190
204
  EOB
191
- book = Book::Base.load
192
- chap = Book::Chapter.new(book, 1, '-', nil)
193
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
205
+ compile_block(src)
206
+ index = @chapter.headline_index
194
207
  assert_equal [1, 1, 1], index['sec1-1-1'].number
195
208
  end
196
209
 
197
- def test_headeline_index10
210
+ def test_headline_index10
198
211
  src = <<-EOB
199
212
  = chap1
200
213
  == sec1
@@ -203,13 +216,12 @@ class IndexTest < Test::Unit::TestCase
203
216
  ==== sec1-1-1
204
217
  === sec1-2
205
218
  EOB
206
- book = Book::Base.load
207
- chap = Book::Chapter.new(book, 1, '-', nil)
208
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
219
+ compile_block(src)
220
+ index = @chapter.headline_index
209
221
  assert_equal [1, 1, 1], index['sec1-1-1'].number
210
222
  end
211
223
 
212
- def test_headeline_index11
224
+ def test_headline_index11
213
225
  src = <<-EOB
214
226
  = chap1
215
227
  ==[nodisp] sec01
@@ -220,9 +232,8 @@ class IndexTest < Test::Unit::TestCase
220
232
  ==[nonum] sec03
221
233
  == sec04
222
234
  EOB
223
- book = Book::Base.load
224
- chap = Book::Chapter.new(book, 1, '-', nil)
225
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
235
+ compile_block(src)
236
+ index = @chapter.headline_index
226
237
  assert_equal nil, index['sec01'].number
227
238
  assert_equal nil, index['sec02'].number
228
239
  assert_equal [1], index['sec1'].number
@@ -232,7 +243,7 @@ class IndexTest < Test::Unit::TestCase
232
243
  assert_equal [2], index['sec04'].number
233
244
  end
234
245
 
235
- def test_headeline_index12
246
+ def test_headline_index12
236
247
  src = <<-EOB
237
248
  = chap1
238
249
  == A
@@ -240,9 +251,8 @@ class IndexTest < Test::Unit::TestCase
240
251
  ==[nonum] B
241
252
  === B2
242
253
  EOB
243
- book = Book::Base.load
244
- chap = Book::Chapter.new(book, 1, '-', nil)
245
- index = Book::HeadlineIndex.parse(src.lines.to_a, chap)
254
+ compile_block(src)
255
+ index = @chapter.headline_index
246
256
  assert_equal [1], index['A'].number
247
257
  assert_equal [1, 1], index['A2'].number
248
258
  assert_equal nil, index['B'].number
@@ -0,0 +1,52 @@
1
+ require 'test_helper'
2
+ require 'review/builder'
3
+
4
+ require 'review/book'
5
+
6
+ class MockCompiler
7
+ def text(s)
8
+ [:text, s]
9
+ end
10
+ end
11
+
12
+ class IndexBuidlerTest < Test::Unit::TestCase
13
+ include ReVIEW
14
+
15
+ def setup
16
+ @b = IndexBuilder.new
17
+ chap = ReVIEW::Book::Chapter.new(nil, nil, '-', nil)
18
+ @b.bind(MockCompiler.new, chap, nil)
19
+ end
20
+
21
+ def test_initialize
22
+ assert IndexBuilder.new
23
+ end
24
+
25
+ def test_check_id
26
+ io = StringIO.new
27
+ @b.instance_eval{ @logger = ReVIEW::Logger.new(io) }
28
+ @b.check_id('ABC')
29
+ assert_match('', io.string)
30
+
31
+ %w(# % \\ { } [ ] ~ / $ ' " | * ? & < > `).each do |c|
32
+ io = StringIO.new
33
+ @b.instance_eval{ @logger = ReVIEW::Logger.new(io) }
34
+ @b.check_id("id#{c}")
35
+ assert_match(/deprecated ID: `#{Regexp.escape(c)}` in `id#{Regexp.escape(c)}`/, io.string)
36
+ end
37
+ io = StringIO.new
38
+ @b.instance_eval{ @logger = ReVIEW::Logger.new(io) }
39
+ @b.check_id('A B C#')
40
+ assert_match(/deprecated ID: ` ` in `A B C#`/, io.string)
41
+
42
+ io = StringIO.new
43
+ @b.instance_eval{ @logger = ReVIEW::Logger.new(io) }
44
+ @b.check_id("A\tB")
45
+ assert_match(/deprecated ID: `\t` in `A\tB`/, io.string)
46
+
47
+ io = StringIO.new
48
+ @b.instance_eval{ @logger = ReVIEW::Logger.new(io) }
49
+ @b.check_id('.ABC')
50
+ assert_match(/deprecated ID: `.ABC` begins from `.`/, io.string)
51
+ end
52
+ end
@@ -255,6 +255,10 @@ EOS
255
255
 
256
256
  @config['secnolevel'] = 3
257
257
  actual = compile_inline('test @<hd>{chap1|test} test2')
258
+ assert_equal 'test \reviewsecref{「1.1.1 te\\textunderscore{}st」}{sec:1-1-1} test2', actual
259
+
260
+ @config['chapterlink'] = nil
261
+ actual = compile_inline('test @<hd>{chap1|test} test2')
258
262
  assert_equal 'test 「1.1.1 te\\textunderscore{}st」 test2', actual
259
263
  end
260
264
 
@@ -389,9 +393,7 @@ EOS
389
393
  end
390
394
 
391
395
  def test_dt_inline
392
- fn = Book::FootnoteIndex.parse(['//footnote[bar][bar]'])
393
- @chapter.instance_eval { @footnote_index = fn }
394
- actual = compile_block(" : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
396
+ actual = compile_block("//footnote[bar][bar]\n\n : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
395
397
 
396
398
  expected = <<-EOS
397
399
 
@@ -902,9 +904,11 @@ EOS
902
904
  actual = compile_block("//memo[this is @<b>{test}<&>_]{\ntest1\n\ntest@<i>{2}\n//}\n")
903
905
  expected = <<-EOS
904
906
  \\begin{reviewmemo}[this is \\reviewbold{test}\\textless{}\\&\\textgreater{}\\textunderscore{}]
907
+
905
908
  test1
906
909
 
907
910
  test\\reviewit{2}
911
+
908
912
  \\end{reviewmemo}
909
913
  EOS
910
914
  assert_equal expected, actual
@@ -1270,6 +1274,31 @@ EOS
1270
1274
  assert_equal expected, actual
1271
1275
  end
1272
1276
 
1277
+ def test_indepimage_nofile
1278
+ def @chapter.image(_id)
1279
+ item = Book::Index::Item.new('sample_img_nofile_', 1)
1280
+ item.instance_eval do
1281
+ def path
1282
+ nil
1283
+ end
1284
+ end
1285
+ item
1286
+ end
1287
+
1288
+ io = StringIO.new
1289
+ @builder.instance_eval{ @logger = ReVIEW::Logger.new(io) }
1290
+
1291
+ actual = compile_block("//indepimage[sample_img_nofile_][sample photo]\n")
1292
+ expected = <<-EOS
1293
+ \\begin{reviewdummyimage}
1294
+ --[[path = sample\\textunderscore{}img\\textunderscore{}nofile\\textunderscore{} (not exist)]]--
1295
+ \\reviewindepimagecaption{図: sample photo}
1296
+ \\end{reviewdummyimage}
1297
+ EOS
1298
+ assert_equal expected, actual
1299
+ assert_match(/WARN --: :1: image not bound: sample_img_nofile_/, io.string)
1300
+ end
1301
+
1273
1302
  def test_table
1274
1303
  actual = compile_block("//table{\naaa\tbbb\n------------\nccc\tddd<>&\n//}\n")
1275
1304
  expected = <<-EOS
@@ -1312,10 +1341,10 @@ EOS
1312
1341
  end
1313
1342
 
1314
1343
  def test_empty_table
1315
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n//}\n" }
1344
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n//}\n") }
1316
1345
  assert_equal ':2: error: no rows in the table', e.message
1317
1346
 
1318
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n------------\n//}\n" }
1347
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n------------\n//}\n") }
1319
1348
  assert_equal ':3: error: no rows in the table', e.message
1320
1349
  end
1321
1350
 
@@ -1872,12 +1901,16 @@ EOS
1872
1901
  actual = compile_block("//note{\nA\n\nB\n//}\n//note[caption]{\nA\n//}")
1873
1902
  expected = <<-EOS
1874
1903
  \\begin{reviewnote}
1904
+
1875
1905
  A
1876
1906
 
1877
1907
  B
1908
+
1878
1909
  \\end{reviewnote}
1879
1910
  \\begin{reviewnote}[caption]
1911
+
1880
1912
  A
1913
+
1881
1914
  \\end{reviewnote}
1882
1915
  EOS
1883
1916
  assert_equal expected, actual
@@ -1885,12 +1918,16 @@ EOS
1885
1918
  actual = compile_block("//memo{\nA\n\nB\n//}\n//memo[caption]{\nA\n//}")
1886
1919
  expected = <<-EOS
1887
1920
  \\begin{reviewmemo}
1921
+
1888
1922
  A
1889
1923
 
1890
1924
  B
1925
+
1891
1926
  \\end{reviewmemo}
1892
1927
  \\begin{reviewmemo}[caption]
1928
+
1893
1929
  A
1930
+
1894
1931
  \\end{reviewmemo}
1895
1932
  EOS
1896
1933
  assert_equal expected, actual
@@ -1898,12 +1935,16 @@ EOS
1898
1935
  actual = compile_block("//info{\nA\n\nB\n//}\n//info[caption]{\nA\n//}")
1899
1936
  expected = <<-EOS
1900
1937
  \\begin{reviewinfo}
1938
+
1901
1939
  A
1902
1940
 
1903
1941
  B
1942
+
1904
1943
  \\end{reviewinfo}
1905
1944
  \\begin{reviewinfo}[caption]
1945
+
1906
1946
  A
1947
+
1907
1948
  \\end{reviewinfo}
1908
1949
  EOS
1909
1950
  assert_equal expected, actual
@@ -1911,12 +1952,16 @@ EOS
1911
1952
  actual = compile_block("//important{\nA\n\nB\n//}\n//important[caption]{\nA\n//}")
1912
1953
  expected = <<-EOS
1913
1954
  \\begin{reviewimportant}
1955
+
1914
1956
  A
1915
1957
 
1916
1958
  B
1959
+
1917
1960
  \\end{reviewimportant}
1918
1961
  \\begin{reviewimportant}[caption]
1962
+
1919
1963
  A
1964
+
1920
1965
  \\end{reviewimportant}
1921
1966
  EOS
1922
1967
  assert_equal expected, actual
@@ -1924,12 +1969,16 @@ EOS
1924
1969
  actual = compile_block("//caution{\nA\n\nB\n//}\n//caution[caption]{\nA\n//}")
1925
1970
  expected = <<-EOS
1926
1971
  \\begin{reviewcaution}
1972
+
1927
1973
  A
1928
1974
 
1929
1975
  B
1976
+
1930
1977
  \\end{reviewcaution}
1931
1978
  \\begin{reviewcaution}[caption]
1979
+
1932
1980
  A
1981
+
1933
1982
  \\end{reviewcaution}
1934
1983
  EOS
1935
1984
  assert_equal expected, actual
@@ -1937,12 +1986,16 @@ EOS
1937
1986
  actual = compile_block("//notice{\nA\n\nB\n//}\n//notice[caption]{\nA\n//}")
1938
1987
  expected = <<-EOS
1939
1988
  \\begin{reviewnotice}
1989
+
1940
1990
  A
1941
1991
 
1942
1992
  B
1993
+
1943
1994
  \\end{reviewnotice}
1944
1995
  \\begin{reviewnotice}[caption]
1996
+
1945
1997
  A
1998
+
1946
1999
  \\end{reviewnotice}
1947
2000
  EOS
1948
2001
  assert_equal expected, actual
@@ -1950,12 +2003,16 @@ EOS
1950
2003
  actual = compile_block("//warning{\nA\n\nB\n//}\n//warning[caption]{\nA\n//}")
1951
2004
  expected = <<-EOS
1952
2005
  \\begin{reviewwarning}
2006
+
1953
2007
  A
1954
2008
 
1955
2009
  B
2010
+
1956
2011
  \\end{reviewwarning}
1957
2012
  \\begin{reviewwarning}[caption]
2013
+
1958
2014
  A
2015
+
1959
2016
  \\end{reviewwarning}
1960
2017
  EOS
1961
2018
  assert_equal expected, actual
@@ -1963,17 +2020,173 @@ EOS
1963
2020
  actual = compile_block("//tip{\nA\n\nB\n//}\n//tip[caption]{\nA\n//}")
1964
2021
  expected = <<-EOS
1965
2022
  \\begin{reviewtip}
2023
+
1966
2024
  A
1967
2025
 
1968
2026
  B
2027
+
1969
2028
  \\end{reviewtip}
1970
2029
  \\begin{reviewtip}[caption]
2030
+
1971
2031
  A
2032
+
1972
2033
  \\end{reviewtip}
1973
2034
  EOS
1974
2035
  assert_equal expected, actual
1975
2036
  end
1976
2037
 
2038
+ def test_minicolumn_blocks
2039
+ %w[note memo tip info warning important caution notice].each do |type|
2040
+ src = <<-EOS
2041
+ //#{type}[#{type}1]{
2042
+
2043
+ //}
2044
+
2045
+ //#{type}[#{type}2]{
2046
+ //}
2047
+ EOS
2048
+
2049
+ expected = <<-EOS
2050
+ \\begin{review#{type}}[#{type}1]
2051
+ \\end{review#{type}}
2052
+ \\begin{review#{type}}[#{type}2]
2053
+ \\end{review#{type}}
2054
+ EOS
2055
+ assert_equal expected, compile_block(src)
2056
+
2057
+ src = <<-EOS
2058
+ //#{type}[#{type}2]{
2059
+
2060
+ //}
2061
+
2062
+ //#{type}[#{type}3]{
2063
+
2064
+ //}
2065
+
2066
+ //#{type}[#{type}4]{
2067
+
2068
+ //}
2069
+
2070
+ //#{type}[#{type}5]{
2071
+
2072
+ //}
2073
+
2074
+ //#{type}[#{type}6]{
2075
+
2076
+ //}
2077
+ EOS
2078
+
2079
+ expected = <<-EOS
2080
+ \\begin{review#{type}}[#{type}2]
2081
+ \\end{review#{type}}
2082
+ \\begin{review#{type}}[#{type}3]
2083
+ \\end{review#{type}}
2084
+ \\begin{review#{type}}[#{type}4]
2085
+ \\end{review#{type}}
2086
+ \\begin{review#{type}}[#{type}5]
2087
+ \\end{review#{type}}
2088
+ \\begin{review#{type}}[#{type}6]
2089
+ \\end{review#{type}}
2090
+ EOS
2091
+ assert_equal expected, compile_block(src)
2092
+
2093
+ src = <<-EOS
2094
+ //#{type}{
2095
+
2096
+ * A
2097
+
2098
+ 1. B
2099
+
2100
+ //}
2101
+
2102
+ //#{type}[OMITEND1]{
2103
+
2104
+ //emlist{
2105
+ LIST
2106
+ //}
2107
+
2108
+ //}
2109
+ //#{type}[OMITEND2]{
2110
+ //}
2111
+ EOS
2112
+
2113
+ expected = <<-EOS
2114
+ \\begin{review#{type}}
2115
+
2116
+ \\begin{itemize}
2117
+ \\item A
2118
+ \\end{itemize}
2119
+
2120
+ \\begin{enumerate}
2121
+ \\item B
2122
+ \\end{enumerate}
2123
+
2124
+ \\end{review#{type}}
2125
+ \\begin{review#{type}}[OMITEND1]
2126
+
2127
+ \\begin{reviewlistblock}
2128
+ \\begin{reviewemlist}
2129
+ LIST
2130
+ \\end{reviewemlist}
2131
+ \\end{reviewlistblock}
2132
+
2133
+ \\end{review#{type}}
2134
+ \\begin{review#{type}}[OMITEND2]
2135
+ \\end{review#{type}}
2136
+ EOS
2137
+ assert_equal expected, compile_block(src)
2138
+ end
2139
+ end
2140
+
2141
+ def test_minicolumn_blocks_nest_error1
2142
+ %w[note memo tip info warning important caution notice].each do |type|
2143
+ @builder.doc_status.clear
2144
+ src = <<-EOS
2145
+ //#{type}{
2146
+
2147
+ //#{type}{
2148
+ //}
2149
+
2150
+ //}
2151
+ EOS
2152
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2153
+ assert_match(/minicolumn cannot be nested:/, e.message)
2154
+ end
2155
+ end
2156
+
2157
+ def test_minicolumn_blocks_nest_error2
2158
+ %w[note memo tip info warning important caution notice].each do |type|
2159
+ @builder.doc_status.clear
2160
+ src = <<-EOS
2161
+ //#{type}{
2162
+
2163
+ //#{type}{
2164
+
2165
+ //}
2166
+
2167
+ //}
2168
+ EOS
2169
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2170
+ assert_match(/minicolumn cannot be nested:/, e.message)
2171
+ end
2172
+ end
2173
+
2174
+ def test_minicolumn_blocks_nest_error3
2175
+ %w[memo tip info warning important caution notice].each do |type|
2176
+ @builder.doc_status.clear
2177
+ src = <<-EOS
2178
+ //#{type}{
2179
+
2180
+ //note{
2181
+ //}
2182
+
2183
+ //}
2184
+ EOS
2185
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2186
+ assert_match(/minicolumn cannot be nested:/, e.message)
2187
+ end
2188
+ end
2189
+
1977
2190
  def test_inline_raw0
1978
2191
  assert_equal 'normal', compile_inline('@<raw>{normal}')
1979
2192
  end
@@ -2111,18 +2324,18 @@ EOS
2111
2324
  end
2112
2325
 
2113
2326
  def test_inline_unknown
2114
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<img>{n}\n" }
2327
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<img>{n}\n") }
2115
2328
  assert_equal ':1: error: unknown image: n', e.message
2116
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<fn>{n}\n" }
2329
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<fn>{n}\n") }
2117
2330
  assert_equal ':1: error: unknown footnote: n', e.message
2118
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<hd>{n}\n" }
2331
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<hd>{n}\n") }
2119
2332
  assert_equal ':1: error: unknown headline: n', e.message
2120
2333
  %w[list table column].each do |name|
2121
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" }
2334
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
2122
2335
  assert_equal ":1: error: unknown #{name}: n", e.message
2123
2336
  end
2124
2337
  %w[chap chapref title].each do |name|
2125
- e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" }
2338
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
2126
2339
  assert_equal ':1: error: key not found: "n"', e.message
2127
2340
  end
2128
2341
  end
@@ -2266,4 +2479,328 @@ EOS
2266
2479
  actual = compile_block(src)
2267
2480
  assert_equal expected, actual
2268
2481
  end
2482
+
2483
+ def test_nest_error_close1
2484
+ src = <<-EOS
2485
+ //beginchild
2486
+ EOS
2487
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2488
+ assert_equal ":1: error: //beginchild is shown, but previous element isn't ul, ol, or dl", e.message
2489
+ end
2490
+
2491
+ def test_nest_error_close2
2492
+ src = <<-EOS
2493
+ * foo
2494
+
2495
+ //beginchild
2496
+
2497
+ 1. foo
2498
+
2499
+ //beginchild
2500
+
2501
+ : foo
2502
+
2503
+ //beginchild
2504
+ EOS
2505
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2506
+ assert_equal ':12: error: //beginchild of dl,ol,ul misses //endchild', e.message
2507
+ end
2508
+
2509
+ def test_nest_error_close3
2510
+ src = <<-EOS
2511
+ * foo
2512
+
2513
+ //beginchild
2514
+
2515
+ 1. foo
2516
+
2517
+ //beginchild
2518
+
2519
+ : foo
2520
+
2521
+ //beginchild
2522
+
2523
+ //endchild
2524
+ EOS
2525
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2526
+ assert_equal ':14: error: //beginchild of ol,ul misses //endchild', e.message
2527
+ end
2528
+
2529
+ def test_nest_ul
2530
+ src = <<-EOS
2531
+ * UL1
2532
+
2533
+ //beginchild
2534
+
2535
+ 1. UL1-OL1
2536
+ 2. UL1-OL2
2537
+
2538
+ * UL1-UL1
2539
+ * UL1-UL2
2540
+
2541
+ : UL1-DL1
2542
+ UL1-DD1
2543
+ : UL1-DL2
2544
+ UL1-DD2
2545
+
2546
+ //endchild
2547
+
2548
+ * UL2
2549
+
2550
+ //beginchild
2551
+
2552
+ UL2-PARA
2553
+
2554
+ //endchild
2555
+ EOS
2556
+
2557
+ expected = <<-EOS
2558
+
2559
+ \\begin{itemize}
2560
+ \\item UL1
2561
+
2562
+
2563
+ \\begin{enumerate}
2564
+ \\item UL1{-}OL1
2565
+ \\item UL1{-}OL2
2566
+ \\end{enumerate}
2567
+
2568
+ \\begin{itemize}
2569
+ \\item UL1{-}UL1
2570
+ \\item UL1{-}UL2
2571
+ \\end{itemize}
2572
+
2573
+ \\begin{description}
2574
+ \\item[UL1{-}DL1] \\mbox{} \\\\
2575
+ UL1{-}DD1
2576
+ \\item[UL1{-}DL2] \\mbox{} \\\\
2577
+ UL1{-}DD2
2578
+ \\end{description}
2579
+
2580
+
2581
+ \\item UL2
2582
+
2583
+
2584
+ UL2{-}PARA
2585
+
2586
+ \\end{itemize}
2587
+ EOS
2588
+
2589
+ actual = compile_block(src)
2590
+ assert_equal expected, actual
2591
+ end
2592
+
2593
+ def test_nest_ol
2594
+ src = <<-EOS
2595
+ 1. OL1
2596
+
2597
+ //beginchild
2598
+
2599
+ 1. OL1-OL1
2600
+ 2. OL1-OL2
2601
+
2602
+ * OL1-UL1
2603
+ * OL1-UL2
2604
+
2605
+ : OL1-DL1
2606
+ OL1-DD1
2607
+ : OL1-DL2
2608
+ OL1-DD2
2609
+
2610
+ //endchild
2611
+
2612
+ 2. OL2
2613
+
2614
+ //beginchild
2615
+
2616
+ OL2-PARA
2617
+
2618
+ //endchild
2619
+ EOS
2620
+
2621
+ expected = <<-EOS
2622
+
2623
+ \\begin{enumerate}
2624
+ \\item OL1
2625
+
2626
+
2627
+ \\begin{enumerate}
2628
+ \\item OL1{-}OL1
2629
+ \\item OL1{-}OL2
2630
+ \\end{enumerate}
2631
+
2632
+ \\begin{itemize}
2633
+ \\item OL1{-}UL1
2634
+ \\item OL1{-}UL2
2635
+ \\end{itemize}
2636
+
2637
+ \\begin{description}
2638
+ \\item[OL1{-}DL1] \\mbox{} \\\\
2639
+ OL1{-}DD1
2640
+ \\item[OL1{-}DL2] \\mbox{} \\\\
2641
+ OL1{-}DD2
2642
+ \\end{description}
2643
+
2644
+
2645
+ \\item OL2
2646
+
2647
+
2648
+ OL2{-}PARA
2649
+
2650
+ \\end{enumerate}
2651
+ EOS
2652
+
2653
+ actual = compile_block(src)
2654
+ assert_equal expected, actual
2655
+ end
2656
+
2657
+ def test_nest_dl
2658
+ src = <<-EOS
2659
+ : DL1
2660
+
2661
+ //beginchild
2662
+
2663
+ 1. DL1-OL1
2664
+ 2. DL1-OL2
2665
+
2666
+ * DL1-UL1
2667
+ * DL1-UL2
2668
+
2669
+ : DL1-DL1
2670
+ DL1-DD1
2671
+ : DL1-DL2
2672
+ DL1-DD2
2673
+
2674
+ //endchild
2675
+
2676
+ : DL2
2677
+ DD2
2678
+
2679
+ //beginchild
2680
+
2681
+ * DD2-UL1
2682
+ * DD2-UL2
2683
+
2684
+ DD2-PARA
2685
+
2686
+ //endchild
2687
+ EOS
2688
+
2689
+ expected = <<-EOS
2690
+
2691
+ \\begin{description}
2692
+ \\item[DL1] \\mbox{} \\\\
2693
+
2694
+
2695
+
2696
+ \\begin{enumerate}
2697
+ \\item DL1{-}OL1
2698
+ \\item DL1{-}OL2
2699
+ \\end{enumerate}
2700
+
2701
+ \\begin{itemize}
2702
+ \\item DL1{-}UL1
2703
+ \\item DL1{-}UL2
2704
+ \\end{itemize}
2705
+
2706
+ \\begin{description}
2707
+ \\item[DL1{-}DL1] \\mbox{} \\\\
2708
+ DL1{-}DD1
2709
+ \\item[DL1{-}DL2] \\mbox{} \\\\
2710
+ DL1{-}DD2
2711
+ \\end{description}
2712
+
2713
+
2714
+ \\item[DL2] \\mbox{} \\\\
2715
+ DD2
2716
+
2717
+
2718
+ \\begin{itemize}
2719
+ \\item DD2{-}UL1
2720
+ \\item DD2{-}UL2
2721
+ \\end{itemize}
2722
+
2723
+ DD2{-}PARA
2724
+
2725
+ \\end{description}
2726
+ EOS
2727
+
2728
+ actual = compile_block(src)
2729
+ assert_equal expected, actual
2730
+ end
2731
+
2732
+ def test_nest_multi
2733
+ src = <<-EOS
2734
+ 1. OL1
2735
+
2736
+ //beginchild
2737
+
2738
+ 1. OL1-OL1
2739
+
2740
+ //beginchild
2741
+
2742
+ * OL1-OL1-UL1
2743
+
2744
+ OL1-OL1-PARA
2745
+
2746
+ //endchild
2747
+
2748
+ 2. OL1-OL2
2749
+
2750
+ * OL1-UL1
2751
+
2752
+ //beginchild
2753
+
2754
+ : OL1-UL1-DL1
2755
+ OL1-UL1-DD1
2756
+
2757
+ OL1-UL1-PARA
2758
+
2759
+ //endchild
2760
+
2761
+ * OL1-UL2
2762
+
2763
+ //endchild
2764
+ EOS
2765
+ expected = <<-EOS
2766
+
2767
+ \\begin{enumerate}
2768
+ \\item OL1
2769
+
2770
+
2771
+ \\begin{enumerate}
2772
+ \\item OL1{-}OL1
2773
+
2774
+
2775
+ \\begin{itemize}
2776
+ \\item OL1{-}OL1{-}UL1
2777
+ \\end{itemize}
2778
+
2779
+ OL1{-}OL1{-}PARA
2780
+
2781
+
2782
+ \\item OL1{-}OL2
2783
+ \\end{enumerate}
2784
+
2785
+ \\begin{itemize}
2786
+ \\item OL1{-}UL1
2787
+
2788
+
2789
+ \\begin{description}
2790
+ \\item[OL1{-}UL1{-}DL1] \\mbox{} \\\\
2791
+ OL1{-}UL1{-}DD1
2792
+ \\end{description}
2793
+
2794
+ OL1{-}UL1{-}PARA
2795
+
2796
+
2797
+ \\item OL1{-}UL2
2798
+ \\end{itemize}
2799
+
2800
+ \\end{enumerate}
2801
+ EOS
2802
+
2803
+ actual = compile_block(src)
2804
+ assert_equal expected, actual
2805
+ end
2269
2806
  end