review 4.2.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-win.yml +11 -5
- data/.rubocop.yml +113 -24
- data/NEWS.ja.md +94 -0
- data/NEWS.md +94 -0
- data/bin/review-catalog-converter +1 -1
- data/bin/review-check +2 -4
- data/bin/review-checkdep +1 -1
- data/bin/review-compile +8 -14
- data/bin/review-validate +1 -1
- data/doc/config.yml.sample +4 -1
- data/doc/config.yml.sample-simple +1 -1
- data/doc/format.ja.md +83 -4
- data/doc/format.md +84 -7
- data/doc/makeindex.ja.md +2 -2
- data/doc/quickstart.ja.md +3 -3
- data/doc/quickstart.md +2 -2
- data/lib/epubmaker/content.rb +3 -2
- data/lib/epubmaker/epubcommon.rb +33 -25
- data/lib/epubmaker/epubv2.rb +5 -6
- data/lib/epubmaker/epubv3.rb +20 -18
- data/lib/review/book.rb +2 -2
- data/lib/review/book/base.rb +61 -25
- data/lib/review/book/bib.rb +21 -0
- data/lib/review/book/book_unit.rb +155 -0
- data/lib/review/book/chapter.rb +30 -26
- data/lib/review/book/index.rb +23 -185
- data/lib/review/book/index/item.rb +7 -1
- data/lib/review/book/part.rb +21 -9
- data/lib/review/book/volume.rb +1 -1
- data/lib/review/builder.rb +68 -13
- data/lib/review/catalog.rb +2 -2
- data/lib/review/compiler.rb +159 -73
- data/lib/review/configure.rb +22 -1
- data/lib/review/converter.rb +1 -1
- data/lib/review/epub2html.rb +6 -1
- data/lib/review/epubmaker.rb +12 -23
- data/lib/review/htmlbuilder.rb +36 -7
- data/lib/review/htmlutils.rb +7 -10
- data/lib/review/i18n.rb +1 -1
- data/lib/review/idgxmlbuilder.rb +51 -6
- data/lib/review/idgxmlmaker.rb +9 -14
- data/lib/review/index_builder.rb +653 -0
- data/lib/review/init.rb +5 -13
- data/lib/review/latexbuilder.rb +65 -4
- data/lib/review/logger.rb +2 -2
- data/lib/review/makerhelper.rb +11 -0
- data/lib/review/markdownbuilder.rb +19 -1
- data/lib/review/pdfmaker.rb +17 -36
- data/lib/review/plaintextbuilder.rb +48 -2
- data/lib/review/preprocessor.rb +5 -5
- data/lib/review/rstbuilder.rb +25 -6
- data/lib/review/sec_counter.rb +13 -0
- data/lib/review/textmaker.rb +4 -12
- data/lib/review/tocprinter.rb +2 -3
- data/lib/review/topbuilder.rb +26 -0
- data/lib/review/update.rb +7 -7
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +2 -3
- data/lib/review/webmaker.rb +9 -20
- data/review.gemspec +2 -2
- data/samples/sample-book/src/config.yml +1 -1
- data/samples/syntax-book/Gemfile +1 -1
- data/samples/syntax-book/config.yml +1 -1
- data/templates/latex/config.erb +27 -23
- data/templates/latex/review-jlreq/README.md +3 -1
- data/templates/latex/review-jlreq/review-base.sty +31 -15
- data/templates/latex/review-jlreq/review-jlreq.cls +8 -24
- data/templates/latex/review-jsbook/README.md +7 -5
- data/templates/latex/review-jsbook/review-base.sty +34 -16
- data/templates/latex/review-jsbook/review-jsbook.cls +4 -2
- data/templates/web/html/layout-html5.html.erb +1 -1
- data/test/assets/test_template.tex +3 -3
- data/test/assets/test_template_backmatter.tex +3 -3
- data/test/book_test_helper.rb +11 -5
- data/test/test_book.rb +54 -63
- data/test/test_book_chapter.rb +93 -52
- data/test/test_builder.rb +24 -15
- data/test/test_converter.rb +1 -0
- data/test/test_epub3maker.rb +2 -2
- data/test/test_epubmaker.rb +8 -0
- data/test/test_helper.rb +4 -1
- data/test/test_htmlbuilder.rb +627 -56
- data/test/test_htmlutils.rb +0 -12
- data/test/test_i18n.rb +33 -33
- data/test/test_idgxmlbuilder.rb +358 -11
- data/test/test_idgxmlmaker_cmd.rb +1 -1
- data/test/test_index.rb +62 -52
- data/test/test_indexbuilder.rb +52 -0
- data/test/test_latexbuilder.rb +547 -10
- data/test/test_latexbuilder_v2.rb +43 -5
- data/test/test_logger.rb +7 -7
- data/test/test_makerhelper.rb +0 -12
- data/test/test_markdownbuilder.rb +3 -0
- data/test/test_pdfmaker.rb +13 -12
- data/test/test_pdfmaker_cmd.rb +1 -1
- data/test/test_plaintextbuilder.rb +422 -7
- data/test/test_review_ext.rb +2 -1
- data/test/test_rstbuilder.rb +25 -1
- data/test/test_sec_counter.rb +156 -0
- data/test/test_textmaker_cmd.rb +1 -1
- data/test/test_topbuilder.rb +187 -10
- data/test/test_update.rb +10 -10
- data/test/test_webtocprinter.rb +12 -12
- data/vendor/gentombow/LICENSE +1 -1
- data/vendor/gentombow/Makefile +0 -1
- data/vendor/gentombow/bounddvi-en.pdf +0 -0
- data/vendor/gentombow/bounddvi-en.tex +1 -0
- data/vendor/gentombow/bounddvi.pdf +0 -0
- data/vendor/gentombow/bounddvi.sty +30 -7
- data/vendor/gentombow/bounddvi.tex +1 -0
- data/vendor/gentombow/create_archive.sh +1 -0
- data/vendor/gentombow/gentombow-ja.pdf +0 -0
- data/vendor/gentombow/gentombow-ja.tex +9 -0
- data/vendor/gentombow/gentombow.pdf +0 -0
- data/vendor/gentombow/gentombow.sty +32 -10
- data/vendor/gentombow/gentombow.tex +8 -0
- data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
- data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
- data/vendor/jsclasses/Makefile +3 -2
- data/vendor/jsclasses/create_archive.sh +5 -5
- data/vendor/jsclasses/jis/Makefile +3 -2
- data/vendor/jsclasses/jis/jsarticle.cls +22 -18
- data/vendor/jsclasses/jis/jsbook.cls +22 -18
- data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jis/jsclasses.ins +15 -5
- data/vendor/jsclasses/jis/jslogo.ins +9 -0
- data/vendor/jsclasses/jis/jslogo.sty +1 -13
- data/vendor/jsclasses/jis/jspf.cls +22 -18
- data/vendor/jsclasses/jis/jsreport.cls +22 -18
- data/vendor/jsclasses/jis/jsverb.ins +9 -0
- data/vendor/jsclasses/jis/jsverb.sty +1 -13
- data/vendor/jsclasses/jis/kiyou.cls +22 -18
- data/vendor/jsclasses/jis/minijs.sty +65 -22
- data/vendor/jsclasses/jis/okumacro.ins +9 -0
- data/vendor/jsclasses/jis/okumacro.sty +1 -13
- data/vendor/jsclasses/jis/okuverb.ins +9 -0
- data/vendor/jsclasses/jis/okuverb.sty +1 -13
- data/vendor/jsclasses/jis/winjis.sty +23 -19
- data/vendor/jsclasses/jsarticle.cls +22 -18
- data/vendor/jsclasses/jsbook.cls +22 -18
- data/vendor/jsclasses/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jsclasses.ins +15 -5
- data/vendor/jsclasses/jsclasses.pdf +0 -0
- data/vendor/jsclasses/jslogo.ins +9 -0
- data/vendor/jsclasses/jslogo.pdf +0 -0
- data/vendor/jsclasses/jslogo.sty +1 -13
- data/vendor/jsclasses/jspf.cls +22 -18
- data/vendor/jsclasses/jsreport.cls +22 -18
- data/vendor/jsclasses/jsverb.ins +9 -0
- data/vendor/jsclasses/jsverb.pdf +0 -0
- data/vendor/jsclasses/jsverb.sty +1 -13
- data/vendor/jsclasses/kiyou.cls +22 -18
- data/vendor/jsclasses/minijs.sty +68 -22
- data/vendor/jsclasses/okumacro.ins +9 -0
- data/vendor/jsclasses/okumacro.pdf +0 -0
- data/vendor/jsclasses/okumacro.sty +1 -13
- data/vendor/jsclasses/okuverb.ins +9 -0
- data/vendor/jsclasses/okuverb.pdf +0 -0
- data/vendor/jsclasses/okuverb.sty +1 -13
- data/vendor/jsclasses/tests/relfont.tex +10 -0
- data/vendor/jsclasses/winjis.sty +23 -19
- metadata +14 -6
- data/.rubocop_todo.yml +0 -7
- data/lib/review/book/compilable.rb +0 -174
data/test/test_book_chapter.rb
CHANGED
@@ -2,6 +2,10 @@ require 'book_test_helper'
|
|
2
2
|
class ChapterTest < Test::Unit::TestCase
|
3
3
|
include BookTestHelper
|
4
4
|
|
5
|
+
def setup
|
6
|
+
I18n.setup
|
7
|
+
end
|
8
|
+
|
5
9
|
def test_initialize
|
6
10
|
ch = Book::Chapter.new(:book, :number, :name, '/foo/bar', :io)
|
7
11
|
assert_equal :book, ch.book
|
@@ -66,6 +70,7 @@ class ChapterTest < Test::Unit::TestCase
|
|
66
70
|
|
67
71
|
book = Book::Base.new
|
68
72
|
ch = Book::Chapter.new(book, nil, nil, tf.path)
|
73
|
+
ch.generate_indexes
|
69
74
|
assert_equal lines, ch.lines
|
70
75
|
|
71
76
|
lines = ["1\n", "2\n", '3']
|
@@ -78,6 +83,7 @@ class ChapterTest < Test::Unit::TestCase
|
|
78
83
|
tf2.close
|
79
84
|
|
80
85
|
ch = Book::Chapter.new(book, nil, nil, tf1.path, tf2.path)
|
86
|
+
ch.generate_indexes
|
81
87
|
assert_equal lines, ch.lines # XXX: OK?
|
82
88
|
end
|
83
89
|
|
@@ -103,19 +109,19 @@ class ChapterTest < Test::Unit::TestCase
|
|
103
109
|
end
|
104
110
|
|
105
111
|
def test_on_chaps?
|
106
|
-
mktmpbookdir
|
107
|
-
'chapter1.re' => '12345', 'preface.re' => 'abcde' do |dir, book, files|
|
112
|
+
mktmpbookdir('CHAPS' => "chapter1.re\nchapter2.re",
|
113
|
+
'chapter1.re' => '12345', 'preface.re' => 'abcde') do |dir, book, files|
|
108
114
|
ch1 = Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re'])
|
109
115
|
pre = Book::Chapter.new(book, nil, 'preface', files['preface.re'])
|
110
116
|
|
111
117
|
assert ch1.on_chaps?
|
112
118
|
assert !pre.on_chaps?
|
113
119
|
|
114
|
-
ch2_path = File.join(dir, 'chapter2.
|
120
|
+
ch2_path = File.join(dir, 'chapter2.re')
|
115
121
|
File.open(ch2_path, 'w') {}
|
116
122
|
ch2 = Book::Chapter.new(book, 2, 'chapter2', ch2_path)
|
117
123
|
|
118
|
-
ch3_path = File.join(dir, 'chapter3.
|
124
|
+
ch3_path = File.join(dir, 'chapter3.re')
|
119
125
|
File.open(ch3_path, 'w') {}
|
120
126
|
ch3 = Book::Chapter.new(book, 3, 'chapter3', ch3_path)
|
121
127
|
|
@@ -124,50 +130,70 @@ class ChapterTest < Test::Unit::TestCase
|
|
124
130
|
end
|
125
131
|
end
|
126
132
|
|
133
|
+
def test_invalid_encoding
|
134
|
+
mktmpbookdir('CHAPS' => 'chapter1.re',
|
135
|
+
'chapter1.re' => "= 日本語UTF-8\n") do |_dir, book, files|
|
136
|
+
assert Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re'])
|
137
|
+
end
|
138
|
+
|
139
|
+
# UTF-16LE UTF-16BE UTF-32LE UTF-32BE cause error on Windows
|
140
|
+
%w[CP932 SHIFT_JIS EUC-JP].each do |enc|
|
141
|
+
mktmpbookdir('CHAPS' => 'chapter1.re',
|
142
|
+
'chapter1.re' => "= 日本語UTF-8\n".encode(enc)) do |_dir, book, files|
|
143
|
+
e = assert_raises(ReVIEW::CompileError) { Book::Chapter.new(book, 1, 'chapter1', files['chapter1.re']) }
|
144
|
+
assert_equal 'chapter1: invalid byte sequence in UTF-8', e.message
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
127
149
|
def test_list_index
|
128
150
|
do_test_index(<<E, Book::ListIndex, :list_index, :list)
|
129
|
-
//
|
130
|
-
//
|
131
|
-
//list
|
132
|
-
//
|
133
|
-
//table
|
151
|
+
//listnum[abc][abc-listnum]{
|
152
|
+
//}
|
153
|
+
//list[def][def-list]{
|
154
|
+
//}
|
155
|
+
//table[def]{
|
156
|
+
//}
|
157
|
+
//table[others]{
|
158
|
+
//}
|
134
159
|
E
|
135
160
|
end
|
136
161
|
|
137
162
|
def test_table_index
|
138
163
|
do_test_index(<<E, Book::TableIndex, :table_index, :table)
|
139
|
-
//table
|
140
|
-
//
|
141
|
-
//table
|
142
|
-
//
|
143
|
-
//list
|
164
|
+
//table[abc]{
|
165
|
+
//}
|
166
|
+
//table[def]{
|
167
|
+
//}
|
168
|
+
//list[def][def-list]{
|
169
|
+
//}
|
170
|
+
//list[others][other-list]{
|
171
|
+
//}
|
144
172
|
E
|
145
173
|
end
|
146
174
|
|
147
175
|
def test_footnote_index
|
148
176
|
content = <<E
|
149
|
-
//footnote
|
150
|
-
//footnote
|
151
|
-
//footnote
|
152
|
-
//
|
153
|
-
//
|
154
|
-
//list
|
177
|
+
//footnote[abc][textabc...]
|
178
|
+
//footnote[def][textdef...]
|
179
|
+
//footnote[xyz][textxyz...]
|
180
|
+
//list[def][def-list]{
|
181
|
+
//}
|
182
|
+
//list[others][others-list]{
|
183
|
+
//}
|
155
184
|
E
|
156
185
|
do_test_index(content, Book::FootnoteIndex, :footnote_index, :footnote) do |ch|
|
157
186
|
assert_raises ReVIEW::KeyError do
|
158
|
-
ch.footnote('
|
187
|
+
ch.footnote('xyz2')
|
159
188
|
end
|
160
189
|
end
|
161
190
|
end
|
162
191
|
|
163
192
|
def test_bibpaper
|
164
193
|
do_test_index(<<E, Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib.re')
|
165
|
-
//bibpaper
|
166
|
-
//bibpaper
|
167
|
-
//bibpaper
|
168
|
-
//bibpaper [xyz]
|
169
|
-
//list [def]
|
170
|
-
//list [others]
|
194
|
+
//bibpaper[abc][text...]
|
195
|
+
//bibpaper[def][text...]
|
196
|
+
//bibpaper[xyz][text...]
|
171
197
|
E
|
172
198
|
assert_raises FileNotFound do
|
173
199
|
do_test_index('', Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib')
|
@@ -176,11 +202,12 @@ E
|
|
176
202
|
|
177
203
|
def test_headline_index
|
178
204
|
do_test_index(<<E, Book::HeadlineIndex, :headline_index, :headline, propagate: false)
|
179
|
-
==
|
205
|
+
== x
|
180
206
|
== abc
|
181
207
|
== def
|
182
208
|
=== def
|
183
|
-
//table
|
209
|
+
//table[others]{
|
210
|
+
//}
|
184
211
|
E
|
185
212
|
end
|
186
213
|
|
@@ -204,35 +231,47 @@ E
|
|
204
231
|
|
205
232
|
def test_image
|
206
233
|
do_test_index(<<E, Book::ImageIndex, :image_index, :image)
|
207
|
-
//image
|
208
|
-
//
|
209
|
-
//image
|
210
|
-
//
|
211
|
-
//list
|
234
|
+
//image[abc][abc-image]{
|
235
|
+
//}
|
236
|
+
//image[def][abc-image]{
|
237
|
+
//}
|
238
|
+
//list[def][def-list]{
|
239
|
+
//}
|
240
|
+
//list[others][others-list]{
|
241
|
+
//}
|
212
242
|
E
|
213
243
|
|
214
244
|
do_test_index(<<E, Book::NumberlessImageIndex, :numberless_image_index, :image, propagate: false)
|
215
|
-
//numberlessimage
|
216
|
-
//
|
217
|
-
//numberlessimage
|
218
|
-
//
|
219
|
-
//list
|
245
|
+
//numberlessimage[abc]{
|
246
|
+
//}
|
247
|
+
//numberlessimage[def]{
|
248
|
+
//}
|
249
|
+
//list[def][def-list]{
|
250
|
+
//}
|
251
|
+
//list[others][others-list]{
|
252
|
+
//}
|
220
253
|
E
|
221
254
|
|
222
255
|
do_test_index(<<E, Book::ImageIndex, :image_index, :image)
|
223
|
-
//
|
224
|
-
//
|
225
|
-
//image
|
226
|
-
//
|
227
|
-
//list
|
256
|
+
//numberlessimage[abc]{
|
257
|
+
//}
|
258
|
+
//image[def][def-image]{
|
259
|
+
//}
|
260
|
+
//list[def][def-list]{
|
261
|
+
//}
|
262
|
+
//list[others][others-list]{
|
263
|
+
//}
|
228
264
|
E
|
229
265
|
|
230
266
|
do_test_index(<<E, Book::NumberlessImageIndex, :numberless_image_index, :image, propagate: false)
|
231
|
-
//
|
232
|
-
//
|
233
|
-
//image
|
234
|
-
//
|
235
|
-
//list
|
267
|
+
//numberlessimage[abc]{
|
268
|
+
//}
|
269
|
+
//image[def][def-image]{
|
270
|
+
//}
|
271
|
+
//list[def][def-list]{
|
272
|
+
//}
|
273
|
+
//list[others][others-list]{
|
274
|
+
//}
|
236
275
|
E
|
237
276
|
end
|
238
277
|
|
@@ -240,13 +279,15 @@ E
|
|
240
279
|
Dir.mktmpdir do |dir|
|
241
280
|
path = File.join(dir, opts[:filename] || 'chapter.re')
|
242
281
|
|
243
|
-
book = Book::Base.new(dir)
|
244
|
-
|
245
282
|
File.open(path, 'w') do |o|
|
246
283
|
o.print content
|
247
284
|
end
|
248
|
-
ch = Book::Chapter.new(book, 1, 'chapter', path)
|
249
285
|
|
286
|
+
book = Book::Base.new(dir)
|
287
|
+
|
288
|
+
ch = Book::Chapter.new(book, 1, 'chapter', path)
|
289
|
+
book.generate_indexes
|
290
|
+
ch.generate_indexes
|
250
291
|
assert ch.__send__(ref_method, 'abc')
|
251
292
|
assert ch.__send__(ref_method, 'def')
|
252
293
|
assert_raises ReVIEW::KeyError do
|
data/test/test_builder.rb
CHANGED
@@ -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.
|
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.
|
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
|
@@ -82,7 +82,7 @@ class BuidlerTest < Test::Unit::TestCase
|
|
82
82
|
|
83
83
|
def test_inline_missing_ref
|
84
84
|
b = Builder.new
|
85
|
-
chapter = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.
|
85
|
+
chapter = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.new, 1, 'chap1', nil, StringIO.new)
|
86
86
|
b.bind(nil, chapter, nil)
|
87
87
|
e = assert_raises(ReVIEW::ApplicationError) { b.inline_list('unknown|list1') }
|
88
88
|
assert_equal ': error: unknown list: unknown|list1', e.message
|
@@ -96,20 +96,29 @@ class BuidlerTest < Test::Unit::TestCase
|
|
96
96
|
assert_equal ': error: unknown footnote: unknown|footnote1', e.message
|
97
97
|
end
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
108
116
|
|
109
|
-
|
110
|
-
|
117
|
+
class XBuilder < Builder
|
118
|
+
attr_accessor :children
|
111
119
|
|
112
|
-
def
|
120
|
+
def puts(s)
|
121
|
+
s
|
113
122
|
end
|
114
123
|
end
|
115
124
|
end
|
data/test/test_converter.rb
CHANGED
data/test/test_epub3maker.rb
CHANGED
@@ -631,7 +631,7 @@ EOT
|
|
631
631
|
</body>
|
632
632
|
</html>
|
633
633
|
EOT
|
634
|
-
File.
|
634
|
+
File.write(path, html)
|
635
635
|
assert_equal ['mathml'], epubmaker.detect_properties(path)
|
636
636
|
end
|
637
637
|
end
|
@@ -656,7 +656,7 @@ EOT
|
|
656
656
|
</body>
|
657
657
|
</html>
|
658
658
|
EOT
|
659
|
-
File.
|
659
|
+
File.write(path, html)
|
660
660
|
assert_equal ['mathml'], epubmaker.detect_properties(path)
|
661
661
|
end
|
662
662
|
end
|
data/test/test_epubmaker.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'epubmaker'
|
3
|
+
require 'review/epubmaker'
|
3
4
|
|
4
5
|
class EPUBMakerTest < Test::Unit::TestCase
|
5
6
|
include EPUBMaker
|
@@ -818,4 +819,11 @@ EOT
|
|
818
819
|
EOT
|
819
820
|
assert_equal expect, @output.string
|
820
821
|
end
|
822
|
+
|
823
|
+
def test_epub_unsafe_id
|
824
|
+
content = Content.new({ 'file' => 'sample.png' })
|
825
|
+
assert_equal 'sample-png', content.id
|
826
|
+
content = Content.new({ 'file' => 'sample-&()-=+@:,漢字.png' })
|
827
|
+
assert_equal 'sample-_25_26_25_28_25_29-_25_3D_25_2B_25_40_25_3A_25_2C_25_E6_25_BC_25_A2_25_E5_25_AD_25_97-png', content.id
|
828
|
+
end
|
821
829
|
end
|
data/test/test_helper.rb
CHANGED
@@ -16,7 +16,7 @@ def prepare_samplebook(srcdir, bookdir, latextemplatedir, configfile)
|
|
16
16
|
samplebook_dir = File.expand_path("../samples/#{bookdir}/", File.dirname(__FILE__))
|
17
17
|
files = Dir.glob(File.join(samplebook_dir, '*'))
|
18
18
|
# ignore temporary built files
|
19
|
-
files.delete_if { |file| file =~
|
19
|
+
files.delete_if { |file| file =~ /.*-(pdf|epub|text)/ || file == 'webroot' }
|
20
20
|
FileUtils.cp_r(files, srcdir)
|
21
21
|
if latextemplatedir
|
22
22
|
# copy from review-jsbook or review-jlreq
|
@@ -39,11 +39,13 @@ end
|
|
39
39
|
|
40
40
|
def compile_block_default(text)
|
41
41
|
@chapter.content = text
|
42
|
+
@chapter.execute_indexer(force: true)
|
42
43
|
@compiler.compile(@chapter)
|
43
44
|
end
|
44
45
|
|
45
46
|
def compile_block_html(text)
|
46
47
|
@chapter.content = text
|
48
|
+
@chapter.execute_indexer(force: true)
|
47
49
|
matched = @compiler.compile(@chapter).match(Regexp.new(%Q(<body>\n(.+)</body>), Regexp::MULTILINE))
|
48
50
|
if matched && matched.size > 1
|
49
51
|
matched[1]
|
@@ -54,5 +56,6 @@ end
|
|
54
56
|
|
55
57
|
def compile_block_idgxml(text)
|
56
58
|
@chapter.content = text
|
59
|
+
@chapter.execute_indexer(force: true)
|
57
60
|
@compiler.compile(@chapter).gsub(Regexp.new(%Q(.*<doc xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">), Regexp::MULTILINE), '').gsub("</doc>\n", '')
|
58
61
|
end
|
data/test/test_htmlbuilder.rb
CHANGED
@@ -61,7 +61,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
|
|
61
61
|
Dir.mktmpdir do |dir|
|
62
62
|
Dir.chdir(dir) do
|
63
63
|
file = File.join(dir, 'locale.yml')
|
64
|
-
File.
|
64
|
+
File.write(file, "locale: ja\nappendix: 付録%pR")
|
65
65
|
I18n.setup('ja')
|
66
66
|
@chapter.instance_eval do
|
67
67
|
def on_appendix?
|
@@ -82,7 +82,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
|
|
82
82
|
Dir.mktmpdir do |dir|
|
83
83
|
Dir.chdir(dir) do
|
84
84
|
file = File.join(dir, 'locale.yml')
|
85
|
-
File.
|
85
|
+
File.write(file, "locale: ja\nappendix: 付録%pA")
|
86
86
|
I18n.setup('ja')
|
87
87
|
@chapter.instance_eval do
|
88
88
|
def on_appendix?
|
@@ -106,8 +106,8 @@ class HTMLBuidlerTest < Test::Unit::TestCase
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def test_headline_level1_with_tricky_id
|
109
|
-
actual = compile_block("={123
|
110
|
-
assert_equal %Q(<h1 id="
|
109
|
+
actual = compile_block("={123あ_} this is test.\n")
|
110
|
+
assert_equal %Q(<h1 id="id_123_E3_81_82__"><a id="h1"></a><span class="secno">第1章 </span>this is test.</h1>\n), actual
|
111
111
|
end
|
112
112
|
|
113
113
|
def test_headline_level1_with_inlinetag
|
@@ -137,8 +137,8 @@ class HTMLBuidlerTest < Test::Unit::TestCase
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def test_label_with_tricky_id
|
140
|
-
actual = compile_block("//label[123
|
141
|
-
assert_equal %Q(<a id="
|
140
|
+
actual = compile_block("//label[123あ_]\n")
|
141
|
+
assert_equal %Q(<a id="id_123_E3_81_82__"></a>\n), actual
|
142
142
|
end
|
143
143
|
|
144
144
|
def test_href
|
@@ -250,6 +250,15 @@ EOS
|
|
250
250
|
idx
|
251
251
|
end
|
252
252
|
|
253
|
+
@config['secnolevel'] = 2
|
254
|
+
actual = compile_inline('test @<hd>{chap1|test} test2')
|
255
|
+
assert_equal 'test <a href="-.html#h1-1-1">「te_st」</a> test2', actual
|
256
|
+
|
257
|
+
@config['secnolevel'] = 3
|
258
|
+
actual = compile_inline('test @<hd>{chap1|test} test2')
|
259
|
+
assert_equal 'test <a href="-.html#h1-1-1">「1.1.1 te_st」</a> test2', actual
|
260
|
+
|
261
|
+
@config['chapterlink'] = nil
|
253
262
|
@config['secnolevel'] = 2
|
254
263
|
actual = compile_inline('test @<hd>{chap1|test} test2')
|
255
264
|
assert_equal 'test 「te_st」 test2', actual
|
@@ -263,7 +272,7 @@ EOS
|
|
263
272
|
Dir.mktmpdir do |dir|
|
264
273
|
Dir.chdir(dir) do
|
265
274
|
file = File.join(dir, 'locale.yml')
|
266
|
-
File.
|
275
|
+
File.write(file, "locale: ja\nappendix: 付録%pR")
|
267
276
|
I18n.setup('ja')
|
268
277
|
@chapter.instance_eval do
|
269
278
|
def on_appendix?
|
@@ -278,6 +287,10 @@ EOS
|
|
278
287
|
idx
|
279
288
|
end
|
280
289
|
|
290
|
+
actual = compile_inline('test @<hd>{test} test2')
|
291
|
+
assert_equal 'test <a href="-.html#hI-1">「I.1 te_st」</a> test2', actual
|
292
|
+
|
293
|
+
@config['chapterlink'] = nil
|
281
294
|
actual = compile_inline('test @<hd>{test} test2')
|
282
295
|
assert_equal 'test 「I.1 te_st」 test2', actual
|
283
296
|
end
|
@@ -288,7 +301,7 @@ EOS
|
|
288
301
|
Dir.mktmpdir do |dir|
|
289
302
|
Dir.chdir(dir) do
|
290
303
|
file = File.join(dir, 'locale.yml')
|
291
|
-
File.
|
304
|
+
File.write(file, "locale: ja\nappendix: 付録%pA")
|
292
305
|
I18n.setup('ja')
|
293
306
|
@chapter.instance_eval do
|
294
307
|
def on_appendix?
|
@@ -303,6 +316,10 @@ EOS
|
|
303
316
|
idx
|
304
317
|
end
|
305
318
|
|
319
|
+
actual = compile_inline('test @<hd>{test} test2')
|
320
|
+
assert_equal 'test <a href="-.html#hA-1">「A.1 te_st」</a> test2', actual
|
321
|
+
|
322
|
+
@config['chapterlink'] = nil
|
306
323
|
actual = compile_inline('test @<hd>{test} test2')
|
307
324
|
assert_equal 'test 「A.1 te_st」 test2', actual
|
308
325
|
end
|
@@ -354,6 +371,11 @@ EOS
|
|
354
371
|
item
|
355
372
|
end
|
356
373
|
|
374
|
+
actual = compile_block("@<img>{sampleimg}\n")
|
375
|
+
expected = %Q(<p><span class="imgref"><a href="./-.html#sampleimg">図1.1</a></span></p>\n)
|
376
|
+
assert_equal expected, actual
|
377
|
+
|
378
|
+
@config['chapterlink'] = nil
|
357
379
|
actual = compile_block("@<img>{sampleimg}\n")
|
358
380
|
expected = %Q(<p><span class="imgref">図1.1</span></p>\n)
|
359
381
|
assert_equal expected, actual
|
@@ -366,6 +388,11 @@ EOS
|
|
366
388
|
item
|
367
389
|
end
|
368
390
|
|
391
|
+
actual = compile_block("@<imgref>{sampleimg}\n")
|
392
|
+
expected = %Q(<p><span class="imgref"><a href="./-.html#sampleimg">図1.1</a></span>「sample photo」</p>\n)
|
393
|
+
assert_equal expected, actual
|
394
|
+
|
395
|
+
@config['chapterlink'] = nil
|
369
396
|
actual = compile_block("@<imgref>{sampleimg}\n")
|
370
397
|
expected = %Q(<p><span class="imgref">図1.1</span>「sample photo」</p>\n)
|
371
398
|
assert_equal expected, actual
|
@@ -378,6 +405,11 @@ EOS
|
|
378
405
|
item
|
379
406
|
end
|
380
407
|
|
408
|
+
actual = compile_block("@<imgref>{sampleimg}\n")
|
409
|
+
expected = %Q(<p><span class="imgref"><a href="./-.html#sampleimg">図1.1</a></span></p>\n)
|
410
|
+
assert_equal expected, actual
|
411
|
+
|
412
|
+
@config['chapterlink'] = nil
|
381
413
|
actual = compile_block("@<imgref>{sampleimg}\n")
|
382
414
|
expected = %Q(<p><span class="imgref">図1.1</span></p>\n)
|
383
415
|
assert_equal expected, actual
|
@@ -389,20 +421,24 @@ EOS
|
|
389
421
|
file1 = File.join(dir, 'images', 'img1.png')
|
390
422
|
filet1 = File.join(dir, 'images', 'tbl1.png')
|
391
423
|
file2 = File.join(dir, 'images', 'img2.png')
|
424
|
+
file3 = File.join(dir, 'images', 'icon3.png')
|
392
425
|
re1 = File.join(dir, 'sample1.re')
|
393
426
|
cat = File.join(dir, 'catalog.yml')
|
394
427
|
FileUtils.mkdir_p(File.join(dir, 'images'))
|
395
|
-
File.
|
396
|
-
File.
|
397
|
-
File.
|
398
|
-
File.
|
399
|
-
File.
|
428
|
+
File.write(file1, '')
|
429
|
+
File.write(filet1, '')
|
430
|
+
File.write(file2, '')
|
431
|
+
File.write(file3, '')
|
432
|
+
File.write(cat, "CHAPS:\n - sample1.re\n")
|
433
|
+
File.write(re1, <<-EOF)
|
400
434
|
= test
|
401
435
|
|
402
436
|
tbl1 is @<table>{tbl1}.
|
403
437
|
|
404
438
|
img2 is @<img>{img2}.
|
405
439
|
|
440
|
+
icon3 is @<icon>{icon3}.
|
441
|
+
|
406
442
|
//image[img1][image 1]{
|
407
443
|
//}
|
408
444
|
|
@@ -417,8 +453,37 @@ EOF
|
|
417
453
|
|
418
454
|
expected = <<-EOS
|
419
455
|
<h1><a id="h1"></a><span class="secno">第1章 </span>test</h1>
|
456
|
+
<p>tbl1 is <span class="tableref"><a href="./-.html#tbl1">表1.1</a></span>.</p>
|
457
|
+
<p>img2 is <span class="imgref"><a href="./-.html#img2">図1.2</a></span>.</p>
|
458
|
+
<p>icon3 is <img src="images/icon3.png" alt="[icon3]" />.</p>
|
459
|
+
<div id="img1" class="image">
|
460
|
+
<img src="images/img1.png" alt="image 1" />
|
461
|
+
<p class="caption">
|
462
|
+
図1.1: image 1
|
463
|
+
</p>
|
464
|
+
</div>
|
465
|
+
<div id="tbl1" class="imgtable image">
|
466
|
+
<p class="caption">表1.1: table 1</p>
|
467
|
+
<img src="images/tbl1.png" alt="table 1" />
|
468
|
+
</div>
|
469
|
+
<div id="img2" class="image">
|
470
|
+
<img src="images/img2.png" alt="image 2" />
|
471
|
+
<p class="caption">
|
472
|
+
図1.2: image 2
|
473
|
+
</p>
|
474
|
+
</div>
|
475
|
+
EOS
|
476
|
+
|
477
|
+
assert_equal expected, actual
|
478
|
+
|
479
|
+
@config['chapterlink'] = nil
|
480
|
+
actual = compile_block(content)
|
481
|
+
|
482
|
+
expected = <<-EOS
|
483
|
+
<h1><a id="h1"></a><span class="secno">第1章 </span>test</h1>
|
420
484
|
<p>tbl1 is <span class="tableref">表1.1</span>.</p>
|
421
485
|
<p>img2 is <span class="imgref">図1.2</span>.</p>
|
486
|
+
<p>icon3 is <img src="images/icon3.png" alt="[icon3]" />.</p>
|
422
487
|
<div id="img1" class="image">
|
423
488
|
<img src="images/img1.png" alt="image 1" />
|
424
489
|
<p class="caption">
|
@@ -600,21 +665,22 @@ EOS
|
|
600
665
|
assert_equal expected, actual
|
601
666
|
end
|
602
667
|
|
603
|
-
def
|
668
|
+
def test_image_with_tricky_id_kana
|
604
669
|
def @chapter.image(_id)
|
605
|
-
item = Book::Index::Item.new('123
|
606
|
-
item.instance_eval { @path = './images/
|
670
|
+
item = Book::Index::Item.new('123あいう', 1)
|
671
|
+
item.instance_eval { @path = './images/123あいう.png' }
|
607
672
|
item
|
608
673
|
end
|
609
|
-
|
610
|
-
actual = compile_block("//image[123
|
674
|
+
@chapter.instance_eval { @name = 'ch01' }
|
675
|
+
actual = compile_block("//image[123あいう][sample photo]{\n//}\nimg: @<img>{123あいう}\n")
|
611
676
|
expected = <<-EOS
|
612
|
-
<div id="
|
613
|
-
<img src="images/
|
677
|
+
<div id="id_123_E3_81_82_E3_81_84_E3_81_86" class="image">
|
678
|
+
<img src="images/123あいう.png" alt="sample photo" />
|
614
679
|
<p class="caption">
|
615
680
|
図1.1: sample photo
|
616
681
|
</p>
|
617
682
|
</div>
|
683
|
+
<p>img: <span class="imgref"><a href="./ch01.html#id_123_E3_81_82_E3_81_84_E3_81_86">図1.1</a></span></p>
|
618
684
|
EOS
|
619
685
|
assert_equal expected, actual
|
620
686
|
end
|
@@ -803,11 +869,10 @@ EOS
|
|
803
869
|
end
|
804
870
|
|
805
871
|
def test_dt_inline
|
806
|
-
|
807
|
-
@chapter.instance_eval { @footnote_index = fn }
|
808
|
-
actual = compile_block(" : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
|
872
|
+
actual = compile_block("//footnote[bar][bar]\n\n : foo@<fn>{bar}[]<>&@<m>$\\alpha[]$\n")
|
809
873
|
|
810
874
|
expected = <<-EOS
|
875
|
+
<div class="footnote" epub:type="footnote" id="fn-bar"><p class="footnote">[*1] bar</p></div>
|
811
876
|
<dl>
|
812
877
|
<dt>foo<a id="fnb-bar" href="#fn-bar" class="noteref" epub:type="noteref">*1</a>[]<>&<span class="equation">\\alpha[]</span></dt>
|
813
878
|
<dd></dd>
|
@@ -852,22 +917,28 @@ EOS
|
|
852
917
|
def @chapter.list(_id)
|
853
918
|
Book::Index::Item.new('samplelist', 1)
|
854
919
|
end
|
855
|
-
actual = compile_block("@<list>{
|
920
|
+
actual = compile_block("@<list>{samplelist}\n")
|
921
|
+
assert_equal %Q(<p><span class="listref"><a href="./-.html#samplelist">リスト1.1</a></span></p>\n), actual
|
922
|
+
|
923
|
+
@config['chapterlink'] = nil
|
924
|
+
actual = compile_block("@<list>{samplelist}\n")
|
856
925
|
assert_equal %Q(<p><span class="listref">リスト1.1</span></p>\n), actual
|
857
926
|
end
|
858
927
|
|
859
928
|
def test_inline_list_href
|
860
|
-
book = ReVIEW::Book::Base.
|
929
|
+
book = ReVIEW::Book::Base.new
|
861
930
|
book.config['chapterlink'] = true
|
862
931
|
book.catalog = ReVIEW::Catalog.new('CHAPS' => %w[ch1.re ch2.re])
|
863
|
-
io1 = StringIO.new("//list[sampletest]{\nfoo\n//}\n")
|
932
|
+
io1 = StringIO.new("//list[sampletest][a]{\nfoo\n//}\n")
|
864
933
|
io2 = StringIO.new("= BAR\n")
|
865
934
|
chap1 = ReVIEW::Book::Chapter.new(book, 1, 'ch1', 'ch1.re', io1)
|
866
935
|
chap2 = ReVIEW::Book::Chapter.new(book, 2, 'ch2', 'ch2.re', io2)
|
867
|
-
book.parts = [ReVIEW::Book::Part.new(
|
936
|
+
book.parts = [ReVIEW::Book::Part.new(book, nil, [chap1, chap2])]
|
868
937
|
builder = ReVIEW::HTMLBuilder.new
|
869
938
|
comp = ReVIEW::Compiler.new(builder)
|
870
939
|
builder.bind(comp, chap2, nil)
|
940
|
+
|
941
|
+
chap1.generate_indexes
|
871
942
|
actual = builder.inline_list('ch1|sampletest')
|
872
943
|
assert_equal %Q(<span class="listref"><a href="./ch1.html#sampletest">リスト1.1</a></span>), actual
|
873
944
|
end
|
@@ -1771,6 +1842,20 @@ EOS
|
|
1771
1842
|
<p>inside column</p>
|
1772
1843
|
</div>
|
1773
1844
|
|
1845
|
+
<h3><a id="h1-0-1"></a>next level</h3>
|
1846
|
+
<p>this is <a href="-.html#column-1" class="columnref">コラム「test」</a>.</p>
|
1847
|
+
EOS
|
1848
|
+
|
1849
|
+
assert_equal expected, column_helper(review)
|
1850
|
+
|
1851
|
+
@config['chapterlink'] = nil
|
1852
|
+
expected = <<-EOS
|
1853
|
+
<div class="column">
|
1854
|
+
|
1855
|
+
<h3 id="foo"><a id="column-1"></a>test</h3>
|
1856
|
+
<p>inside column</p>
|
1857
|
+
</div>
|
1858
|
+
|
1774
1859
|
<h3><a id="h1-0-1"></a>next level</h3>
|
1775
1860
|
<p>this is コラム「test」.</p>
|
1776
1861
|
EOS
|
@@ -1786,6 +1871,11 @@ EOS
|
|
1786
1871
|
idx
|
1787
1872
|
end
|
1788
1873
|
|
1874
|
+
actual = compile_inline('test @<column>{chap1|column} test2')
|
1875
|
+
expected = 'test <a href="-.html#column-1" class="columnref">コラム「column_cap」</a> test2'
|
1876
|
+
assert_equal expected, actual
|
1877
|
+
|
1878
|
+
@config['chapterlink'] = nil
|
1789
1879
|
actual = compile_inline('test @<column>{chap1|column} test2')
|
1790
1880
|
expected = 'test コラム「column_cap」 test2'
|
1791
1881
|
assert_equal expected, actual
|
@@ -2083,8 +2173,6 @@ EOS
|
|
2083
2173
|
end
|
2084
2174
|
|
2085
2175
|
def test_footnote
|
2086
|
-
fn = Book::FootnoteIndex.parse(['//footnote[foo][bar\\a\\$buz]'])
|
2087
|
-
@chapter.instance_eval { @footnote_index = fn }
|
2088
2176
|
actual = compile_block("//footnote[foo][bar\\a\\$buz]\n")
|
2089
2177
|
expected = <<-'EOS'
|
2090
2178
|
<div class="footnote" epub:type="footnote" id="fn-foo"><p class="footnote">[*1] bar\a\$buz</p></div>
|
@@ -2109,58 +2197,69 @@ EOS
|
|
2109
2197
|
end
|
2110
2198
|
|
2111
2199
|
def test_footnote_with_tricky_id
|
2112
|
-
|
2113
|
-
@chapter.instance_eval { @footnote_index = fn }
|
2114
|
-
actual = compile_block("//footnote[123 あ_;][bar\\a\\$buz]\n")
|
2200
|
+
actual = compile_block("//footnote[123あ_;][bar\\a\\$buz]\n")
|
2115
2201
|
expected = <<-'EOS'
|
2116
|
-
<div class="footnote" epub:type="footnote" id="fn-
|
2202
|
+
<div class="footnote" epub:type="footnote" id="fn-id_123_E3_81_82___3B"><p class="footnote">[*1] bar\a\$buz</p></div>
|
2117
2203
|
EOS
|
2118
2204
|
assert_equal expected, actual
|
2119
2205
|
end
|
2120
2206
|
|
2121
2207
|
def test_inline_fn
|
2122
|
-
|
2123
|
-
|
2124
|
-
|
2125
|
-
|
2126
|
-
|
2127
|
-
|
2128
|
-
comp = ReVIEW::Compiler.new(builder)
|
2129
|
-
builder.bind(comp, chap1, nil)
|
2130
|
-
fn = builder.inline_fn('foo')
|
2131
|
-
assert_equal '<a id="fnb-foo" href="#fn-foo" class="noteref" epub:type="noteref">*1</a>', fn
|
2208
|
+
fn = compile_block("//footnote[foo][bar]\n\n@<fn>{foo}\n")
|
2209
|
+
expected = <<-EOS
|
2210
|
+
<div class=\"footnote\" epub:type=\"footnote\" id=\"fn-foo\"><p class=\"footnote\">[*1] bar</p></div>
|
2211
|
+
<p><a id="fnb-foo" href="#fn-foo" class="noteref" epub:type="noteref">*1</a></p>
|
2212
|
+
EOS
|
2213
|
+
assert_equal expected, fn
|
2132
2214
|
I18n.set('html_footnote_refmark', '+%s')
|
2133
|
-
fn =
|
2134
|
-
|
2215
|
+
fn = compile_block("//footnote[foo][bar]\n\n@<fn>{foo}\n")
|
2216
|
+
expected = <<-EOS
|
2217
|
+
<div class=\"footnote\" epub:type=\"footnote\" id=\"fn-foo\"><p class=\"footnote\">[*1] bar</p></div>
|
2218
|
+
<p><a id="fnb-foo" href="#fn-foo" class="noteref" epub:type="noteref">+1</a></p>
|
2219
|
+
EOS
|
2220
|
+
assert_equal expected, fn
|
2135
2221
|
end
|
2136
2222
|
|
2137
2223
|
def test_inline_hd
|
2138
|
-
book = ReVIEW::Book::Base.
|
2224
|
+
book = ReVIEW::Book::Base.new
|
2139
2225
|
book.catalog = ReVIEW::Catalog.new('CHAPS' => %w[ch1.re ch2.re])
|
2140
2226
|
io1 = StringIO.new("= test1\n\nfoo\n\n== test1-1\n\nbar\n\n== test1-2\n\nbar\n\n")
|
2141
2227
|
io2 = StringIO.new("= test2\n\nfoo\n\n== test2-1\n\nbar\n\n== test2-2\n\nbar\n\n")
|
2142
2228
|
chap1 = ReVIEW::Book::Chapter.new(book, 1, 'ch1', 'ch1.re', io1)
|
2143
2229
|
chap2 = ReVIEW::Book::Chapter.new(book, 2, 'ch2', 'ch2.re', io2)
|
2144
|
-
book.parts = [ReVIEW::Book::Part.new(
|
2230
|
+
book.parts = [ReVIEW::Book::Part.new(book, nil, [chap1, chap2])]
|
2145
2231
|
builder = ReVIEW::HTMLBuilder.new
|
2146
2232
|
comp = ReVIEW::Compiler.new(builder)
|
2147
2233
|
builder.bind(comp, chap2, nil)
|
2234
|
+
|
2235
|
+
chap1.generate_indexes
|
2236
|
+
chap2.generate_indexes
|
2237
|
+
hd = builder.inline_hd('ch1|test1-1')
|
2238
|
+
assert_equal '<a href="ch1.html#h1-1">「1.1 test1-1」</a>', hd
|
2239
|
+
|
2240
|
+
builder.instance_eval { @book.config['chapterlink'] = nil }
|
2148
2241
|
hd = builder.inline_hd('ch1|test1-1')
|
2149
2242
|
assert_equal '「1.1 test1-1」', hd
|
2150
2243
|
end
|
2151
2244
|
|
2152
2245
|
def test_inline_hd_for_part
|
2153
|
-
book = ReVIEW::Book::Base.
|
2246
|
+
book = ReVIEW::Book::Base.new
|
2154
2247
|
book.catalog = ReVIEW::Catalog.new('CHAPS' => %w[ch1.re ch2.re])
|
2155
2248
|
io1 = StringIO.new("= test1\n\nfoo\n\n== test1-1\n\nbar\n\n== test1-2\n\nbar\n\n")
|
2156
2249
|
io2 = StringIO.new("= test2\n\nfoo\n\n== test2-1\n\nbar\n\n== test2-2\n\nbar\n\n")
|
2157
2250
|
io_p1 = StringIO.new("= part1\n\nfoo\n\n== part1-1\n\nbar\n\n== part1-2\n\nbar\n\n")
|
2158
2251
|
chap1 = ReVIEW::Book::Chapter.new(book, 1, 'ch1', 'ch1.re', io1)
|
2159
2252
|
chap2 = ReVIEW::Book::Chapter.new(book, 2, 'ch2', 'ch2.re', io2)
|
2160
|
-
book.parts = [ReVIEW::Book::Part.new(
|
2253
|
+
book.parts = [ReVIEW::Book::Part.new(book, 1, [chap1, chap2], 'part1.re', io_p1)]
|
2161
2254
|
builder = ReVIEW::HTMLBuilder.new
|
2162
2255
|
comp = ReVIEW::Compiler.new(builder)
|
2163
2256
|
builder.bind(comp, chap2, nil)
|
2257
|
+
book.generate_indexes
|
2258
|
+
|
2259
|
+
hd = builder.inline_hd('part1|part1-1')
|
2260
|
+
assert_equal '<a href="part1.html#h1-1">「1.1 part1-1」</a>', hd
|
2261
|
+
|
2262
|
+
builder.instance_eval { @book.config['chapterlink'] = nil }
|
2164
2263
|
hd = builder.inline_hd('part1|part1-1')
|
2165
2264
|
assert_equal '「1.1 part1-1」', hd
|
2166
2265
|
end
|
@@ -2171,7 +2270,12 @@ EOS
|
|
2171
2270
|
location = Location.new(nil, nil)
|
2172
2271
|
@builder.bind(@compiler, chap1, location)
|
2173
2272
|
hd = @builder.inline_hd('foo')
|
2273
|
+
assert_equal '<a href="-.html#h1-1">「1.1 foo」</a>', hd
|
2274
|
+
|
2275
|
+
@config['chapterlink'] = nil
|
2276
|
+
hd = @builder.inline_hd('foo')
|
2174
2277
|
assert_equal '「1.1 foo」', hd
|
2278
|
+
|
2175
2279
|
hd = @builder.inline_hd('bar')
|
2176
2280
|
assert_equal '「1.2 bar」', hd
|
2177
2281
|
end
|
@@ -2215,10 +2319,10 @@ EOS
|
|
2215
2319
|
end
|
2216
2320
|
|
2217
2321
|
def test_empty_table
|
2218
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2322
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n//}\n") }
|
2219
2323
|
assert_equal ':2: error: no rows in the table', e.message
|
2220
2324
|
|
2221
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2325
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("//table{\n------------\n//}\n") }
|
2222
2326
|
assert_equal ':3: error: no rows in the table', e.message
|
2223
2327
|
end
|
2224
2328
|
|
@@ -2227,6 +2331,10 @@ EOS
|
|
2227
2331
|
Book::Index::Item.new('sampletable', 1)
|
2228
2332
|
end
|
2229
2333
|
actual = compile_block("@<table>{sampletest}\n")
|
2334
|
+
assert_equal %Q(<p><span class="tableref"><a href="./-.html#sampletest">表1.1</a></span></p>\n), actual
|
2335
|
+
|
2336
|
+
@config['chapterlink'] = nil
|
2337
|
+
actual = compile_block("@<table>{sampletest}\n")
|
2230
2338
|
assert_equal %Q(<p><span class="tableref">表1.1</span></p>\n), actual
|
2231
2339
|
end
|
2232
2340
|
|
@@ -2452,6 +2560,163 @@ EOS
|
|
2452
2560
|
assert_equal expected, actual
|
2453
2561
|
end
|
2454
2562
|
|
2563
|
+
def test_minicolumn_blocks
|
2564
|
+
%w[note memo tip info warning important caution notice].each do |type|
|
2565
|
+
src = <<-EOS
|
2566
|
+
//#{type}[#{type}1]{
|
2567
|
+
|
2568
|
+
//}
|
2569
|
+
|
2570
|
+
//#{type}[#{type}2]{
|
2571
|
+
//}
|
2572
|
+
EOS
|
2573
|
+
|
2574
|
+
expected = <<-EOS
|
2575
|
+
<div class="#{type}">
|
2576
|
+
<p class="caption">#{type}1</p>
|
2577
|
+
</div>
|
2578
|
+
<div class="#{type}">
|
2579
|
+
<p class="caption">#{type}2</p>
|
2580
|
+
</div>
|
2581
|
+
EOS
|
2582
|
+
assert_equal expected, compile_block(src)
|
2583
|
+
|
2584
|
+
src = <<-EOS
|
2585
|
+
//#{type}[#{type}2]{
|
2586
|
+
|
2587
|
+
//}
|
2588
|
+
|
2589
|
+
//#{type}[#{type}3]{
|
2590
|
+
|
2591
|
+
//}
|
2592
|
+
|
2593
|
+
//#{type}[#{type}4]{
|
2594
|
+
|
2595
|
+
//}
|
2596
|
+
|
2597
|
+
//#{type}[#{type}5]{
|
2598
|
+
|
2599
|
+
//}
|
2600
|
+
|
2601
|
+
//#{type}[#{type}6]{
|
2602
|
+
|
2603
|
+
//}
|
2604
|
+
EOS
|
2605
|
+
|
2606
|
+
expected = <<-EOS
|
2607
|
+
<div class="#{type}">
|
2608
|
+
<p class="caption">#{type}2</p>
|
2609
|
+
</div>
|
2610
|
+
<div class="#{type}">
|
2611
|
+
<p class="caption">#{type}3</p>
|
2612
|
+
</div>
|
2613
|
+
<div class="#{type}">
|
2614
|
+
<p class="caption">#{type}4</p>
|
2615
|
+
</div>
|
2616
|
+
<div class="#{type}">
|
2617
|
+
<p class="caption">#{type}5</p>
|
2618
|
+
</div>
|
2619
|
+
<div class="#{type}">
|
2620
|
+
<p class="caption">#{type}6</p>
|
2621
|
+
</div>
|
2622
|
+
EOS
|
2623
|
+
assert_equal expected, compile_block(src)
|
2624
|
+
|
2625
|
+
src = <<-EOS
|
2626
|
+
//#{type}{
|
2627
|
+
|
2628
|
+
* A
|
2629
|
+
|
2630
|
+
1. B
|
2631
|
+
|
2632
|
+
//}
|
2633
|
+
|
2634
|
+
//#{type}[OMITEND1]{
|
2635
|
+
|
2636
|
+
//emlist{
|
2637
|
+
LIST
|
2638
|
+
//}
|
2639
|
+
|
2640
|
+
//}
|
2641
|
+
|
2642
|
+
//#{type}[OMITEND2]{
|
2643
|
+
//}
|
2644
|
+
EOS
|
2645
|
+
|
2646
|
+
expected = <<-EOS
|
2647
|
+
<div class="#{type}">
|
2648
|
+
<ul>
|
2649
|
+
<li>A</li>
|
2650
|
+
</ul>
|
2651
|
+
<ol>
|
2652
|
+
<li>B</li>
|
2653
|
+
</ol>
|
2654
|
+
</div>
|
2655
|
+
<div class="#{type}">
|
2656
|
+
<p class="caption">OMITEND1</p>
|
2657
|
+
<div class="emlist-code">
|
2658
|
+
<pre class="emlist">LIST
|
2659
|
+
</pre>
|
2660
|
+
</div>
|
2661
|
+
</div>
|
2662
|
+
<div class="#{type}">
|
2663
|
+
<p class="caption">OMITEND2</p>
|
2664
|
+
</div>
|
2665
|
+
EOS
|
2666
|
+
assert_equal expected, compile_block(src)
|
2667
|
+
end
|
2668
|
+
end
|
2669
|
+
|
2670
|
+
def test_minicolumn_blocks_nest_error1
|
2671
|
+
%w[note memo tip info warning important caution notice].each do |type|
|
2672
|
+
@builder.doc_status.clear
|
2673
|
+
src = <<-EOS
|
2674
|
+
//#{type}{
|
2675
|
+
|
2676
|
+
//#{type}{
|
2677
|
+
//}
|
2678
|
+
|
2679
|
+
//}
|
2680
|
+
EOS
|
2681
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
|
2682
|
+
assert_match(/minicolumn cannot be nested:/, e.message)
|
2683
|
+
end
|
2684
|
+
end
|
2685
|
+
|
2686
|
+
def test_minicolumn_blocks_nest_error2
|
2687
|
+
%w[note memo tip info warning important caution notice].each do |type|
|
2688
|
+
@builder.doc_status.clear
|
2689
|
+
src = <<-EOS
|
2690
|
+
//#{type}{
|
2691
|
+
|
2692
|
+
//#{type}{
|
2693
|
+
|
2694
|
+
//}
|
2695
|
+
|
2696
|
+
//}
|
2697
|
+
EOS
|
2698
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
|
2699
|
+
assert_match(/minicolumn cannot be nested:/, e.message)
|
2700
|
+
end
|
2701
|
+
end
|
2702
|
+
|
2703
|
+
def test_minicolumn_blocks_nest_error3
|
2704
|
+
%w[memo tip info warning important caution notice].each do |type|
|
2705
|
+
@builder.doc_status.clear
|
2706
|
+
src = <<-EOS
|
2707
|
+
//#{type}{
|
2708
|
+
|
2709
|
+
//note{
|
2710
|
+
|
2711
|
+
//}
|
2712
|
+
|
2713
|
+
//}
|
2714
|
+
EOS
|
2715
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
|
2716
|
+
assert_match(/minicolumn cannot be nested:/, e.message)
|
2717
|
+
end
|
2718
|
+
end
|
2719
|
+
|
2455
2720
|
def test_comment
|
2456
2721
|
actual = compile_block('//comment[コメント]')
|
2457
2722
|
assert_equal '', actual
|
@@ -2499,18 +2764,18 @@ EOB
|
|
2499
2764
|
end
|
2500
2765
|
|
2501
2766
|
def test_inline_unknown
|
2502
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2767
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<img>{n}\n") }
|
2503
2768
|
assert_equal ':1: error: unknown image: n', e.message
|
2504
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2769
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<fn>{n}\n") }
|
2505
2770
|
assert_equal ':1: error: unknown footnote: n', e.message
|
2506
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2771
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<hd>{n}\n") }
|
2507
2772
|
assert_equal ':1: error: unknown headline: n', e.message
|
2508
2773
|
%w[list table column].each do |name|
|
2509
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2774
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
|
2510
2775
|
assert_equal ":1: error: unknown #{name}: n", e.message
|
2511
2776
|
end
|
2512
2777
|
%w[chap chapref title].each do |name|
|
2513
|
-
e = assert_raises(ReVIEW::ApplicationError) { compile_block
|
2778
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block("@<#{name}>{n}\n") }
|
2514
2779
|
assert_equal ':1: error: key not found: "n"', e.message
|
2515
2780
|
end
|
2516
2781
|
end
|
@@ -2540,6 +2805,20 @@ e=mc^2
|
|
2540
2805
|
//}
|
2541
2806
|
EOS
|
2542
2807
|
expected = <<-EOS
|
2808
|
+
<p><span class="eqref"><a href="./-.html#emc2">式1.1</a></span></p>
|
2809
|
+
<div id="emc2" class="caption-equation">
|
2810
|
+
<p class="caption">式1.1: The Equivalence of Mass <i>and</i> Energy</p>
|
2811
|
+
<div class="equation">
|
2812
|
+
<pre>e=mc^2
|
2813
|
+
</pre>
|
2814
|
+
</div>
|
2815
|
+
</div>
|
2816
|
+
EOS
|
2817
|
+
actual = compile_block(src)
|
2818
|
+
assert_equal expected, actual
|
2819
|
+
|
2820
|
+
@config['chapterlink'] = nil
|
2821
|
+
expected = <<-EOS
|
2543
2822
|
<p><span class="eqref">式1.1</span></p>
|
2544
2823
|
<div id="emc2" class="caption-equation">
|
2545
2824
|
<p class="caption">式1.1: The Equivalence of Mass <i>and</i> Energy</p>
|
@@ -2566,4 +2845,296 @@ EOS
|
|
2566
2845
|
actual = compile_block(src)
|
2567
2846
|
assert_equal expected, actual
|
2568
2847
|
end
|
2848
|
+
|
2849
|
+
def test_nest_error_close1
|
2850
|
+
src = <<-EOS
|
2851
|
+
//beginchild
|
2852
|
+
EOS
|
2853
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
|
2854
|
+
assert_equal ":1: error: //beginchild is shown, but previous element isn't ul, ol, or dl", e.message
|
2855
|
+
end
|
2856
|
+
|
2857
|
+
def test_nest_error_close2
|
2858
|
+
src = <<-EOS
|
2859
|
+
* foo
|
2860
|
+
|
2861
|
+
//beginchild
|
2862
|
+
|
2863
|
+
1. foo
|
2864
|
+
|
2865
|
+
//beginchild
|
2866
|
+
|
2867
|
+
: foo
|
2868
|
+
|
2869
|
+
//beginchild
|
2870
|
+
EOS
|
2871
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
|
2872
|
+
assert_equal ':12: error: //beginchild of dl,ol,ul misses //endchild', e.message
|
2873
|
+
end
|
2874
|
+
|
2875
|
+
def test_nest_error_close3
|
2876
|
+
src = <<-EOS
|
2877
|
+
* foo
|
2878
|
+
|
2879
|
+
//beginchild
|
2880
|
+
|
2881
|
+
1. foo
|
2882
|
+
|
2883
|
+
//beginchild
|
2884
|
+
|
2885
|
+
: foo
|
2886
|
+
|
2887
|
+
//beginchild
|
2888
|
+
|
2889
|
+
//endchild
|
2890
|
+
EOS
|
2891
|
+
e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
|
2892
|
+
assert_equal ':14: error: //beginchild of ol,ul misses //endchild', e.message
|
2893
|
+
end
|
2894
|
+
|
2895
|
+
def test_nest_ul
|
2896
|
+
src = <<-EOS
|
2897
|
+
* UL1
|
2898
|
+
|
2899
|
+
//beginchild
|
2900
|
+
|
2901
|
+
1. UL1-OL1
|
2902
|
+
2. UL1-OL2
|
2903
|
+
|
2904
|
+
* UL1-UL1
|
2905
|
+
* UL1-UL2
|
2906
|
+
|
2907
|
+
: UL1-DL1
|
2908
|
+
UL1-DD1
|
2909
|
+
: UL1-DL2
|
2910
|
+
UL1-DD2
|
2911
|
+
|
2912
|
+
//endchild
|
2913
|
+
|
2914
|
+
* UL2
|
2915
|
+
|
2916
|
+
//beginchild
|
2917
|
+
|
2918
|
+
UL2-PARA
|
2919
|
+
|
2920
|
+
//endchild
|
2921
|
+
EOS
|
2922
|
+
|
2923
|
+
expected = <<-EOS
|
2924
|
+
<ul>
|
2925
|
+
<li>UL1
|
2926
|
+
<ol>
|
2927
|
+
<li>UL1-OL1</li>
|
2928
|
+
<li>UL1-OL2</li>
|
2929
|
+
</ol>
|
2930
|
+
<ul>
|
2931
|
+
<li>UL1-UL1</li>
|
2932
|
+
<li>UL1-UL2</li>
|
2933
|
+
</ul>
|
2934
|
+
<dl>
|
2935
|
+
<dt>UL1-DL1</dt>
|
2936
|
+
<dd>UL1-DD1</dd>
|
2937
|
+
<dt>UL1-DL2</dt>
|
2938
|
+
<dd>UL1-DD2</dd>
|
2939
|
+
</dl>
|
2940
|
+
</li>
|
2941
|
+
|
2942
|
+
<li>UL2
|
2943
|
+
<p>UL2-PARA</p>
|
2944
|
+
</li>
|
2945
|
+
</ul>
|
2946
|
+
EOS
|
2947
|
+
|
2948
|
+
actual = compile_block(src)
|
2949
|
+
assert_equal expected, actual
|
2950
|
+
end
|
2951
|
+
|
2952
|
+
def test_nest_ol
|
2953
|
+
src = <<-EOS
|
2954
|
+
1. OL1
|
2955
|
+
|
2956
|
+
//beginchild
|
2957
|
+
|
2958
|
+
1. OL1-OL1
|
2959
|
+
2. OL1-OL2
|
2960
|
+
|
2961
|
+
* OL1-UL1
|
2962
|
+
* OL1-UL2
|
2963
|
+
|
2964
|
+
: OL1-DL1
|
2965
|
+
OL1-DD1
|
2966
|
+
: OL1-DL2
|
2967
|
+
OL1-DD2
|
2968
|
+
|
2969
|
+
//endchild
|
2970
|
+
|
2971
|
+
2. OL2
|
2972
|
+
|
2973
|
+
//beginchild
|
2974
|
+
|
2975
|
+
OL2-PARA
|
2976
|
+
|
2977
|
+
//endchild
|
2978
|
+
EOS
|
2979
|
+
|
2980
|
+
expected = <<-EOS
|
2981
|
+
<ol>
|
2982
|
+
<li>OL1
|
2983
|
+
<ol>
|
2984
|
+
<li>OL1-OL1</li>
|
2985
|
+
<li>OL1-OL2</li>
|
2986
|
+
</ol>
|
2987
|
+
<ul>
|
2988
|
+
<li>OL1-UL1</li>
|
2989
|
+
<li>OL1-UL2</li>
|
2990
|
+
</ul>
|
2991
|
+
<dl>
|
2992
|
+
<dt>OL1-DL1</dt>
|
2993
|
+
<dd>OL1-DD1</dd>
|
2994
|
+
<dt>OL1-DL2</dt>
|
2995
|
+
<dd>OL1-DD2</dd>
|
2996
|
+
</dl>
|
2997
|
+
</li>
|
2998
|
+
|
2999
|
+
<li>OL2
|
3000
|
+
<p>OL2-PARA</p>
|
3001
|
+
</li>
|
3002
|
+
</ol>
|
3003
|
+
EOS
|
3004
|
+
|
3005
|
+
actual = compile_block(src)
|
3006
|
+
assert_equal expected, actual
|
3007
|
+
end
|
3008
|
+
|
3009
|
+
def test_nest_dl
|
3010
|
+
src = <<-EOS
|
3011
|
+
: DL1
|
3012
|
+
|
3013
|
+
//beginchild
|
3014
|
+
|
3015
|
+
1. DL1-OL1
|
3016
|
+
2. DL1-OL2
|
3017
|
+
|
3018
|
+
* DL1-UL1
|
3019
|
+
* DL1-UL2
|
3020
|
+
|
3021
|
+
: DL1-DL1
|
3022
|
+
DL1-DD1
|
3023
|
+
: DL1-DL2
|
3024
|
+
DL1-DD2
|
3025
|
+
|
3026
|
+
//endchild
|
3027
|
+
|
3028
|
+
: DL2
|
3029
|
+
DD2
|
3030
|
+
|
3031
|
+
//beginchild
|
3032
|
+
|
3033
|
+
* DD2-UL1
|
3034
|
+
* DD2-UL2
|
3035
|
+
|
3036
|
+
DD2-PARA
|
3037
|
+
|
3038
|
+
//endchild
|
3039
|
+
EOS
|
3040
|
+
|
3041
|
+
expected = <<-EOS
|
3042
|
+
<dl>
|
3043
|
+
<dt>DL1</dt>
|
3044
|
+
<dd>
|
3045
|
+
<ol>
|
3046
|
+
<li>DL1-OL1</li>
|
3047
|
+
<li>DL1-OL2</li>
|
3048
|
+
</ol>
|
3049
|
+
<ul>
|
3050
|
+
<li>DL1-UL1</li>
|
3051
|
+
<li>DL1-UL2</li>
|
3052
|
+
</ul>
|
3053
|
+
<dl>
|
3054
|
+
<dt>DL1-DL1</dt>
|
3055
|
+
<dd>DL1-DD1</dd>
|
3056
|
+
<dt>DL1-DL2</dt>
|
3057
|
+
<dd>DL1-DD2</dd>
|
3058
|
+
</dl>
|
3059
|
+
</dd>
|
3060
|
+
|
3061
|
+
<dt>DL2</dt>
|
3062
|
+
<dd>DD2
|
3063
|
+
<ul>
|
3064
|
+
<li>DD2-UL1</li>
|
3065
|
+
<li>DD2-UL2</li>
|
3066
|
+
</ul>
|
3067
|
+
<p>DD2-PARA</p>
|
3068
|
+
</dd>
|
3069
|
+
</dl>
|
3070
|
+
EOS
|
3071
|
+
|
3072
|
+
actual = compile_block(src)
|
3073
|
+
assert_equal expected, actual
|
3074
|
+
end
|
3075
|
+
|
3076
|
+
def test_nest_multi
|
3077
|
+
src = <<-EOS
|
3078
|
+
1. OL1
|
3079
|
+
|
3080
|
+
//beginchild
|
3081
|
+
|
3082
|
+
1. OL1-OL1
|
3083
|
+
|
3084
|
+
//beginchild
|
3085
|
+
|
3086
|
+
* OL1-OL1-UL1
|
3087
|
+
|
3088
|
+
OL1-OL1-PARA
|
3089
|
+
|
3090
|
+
//endchild
|
3091
|
+
|
3092
|
+
2. OL1-OL2
|
3093
|
+
|
3094
|
+
* OL1-UL1
|
3095
|
+
|
3096
|
+
//beginchild
|
3097
|
+
|
3098
|
+
: OL1-UL1-DL1
|
3099
|
+
OL1-UL1-DD1
|
3100
|
+
|
3101
|
+
OL1-UL1-PARA
|
3102
|
+
|
3103
|
+
//endchild
|
3104
|
+
|
3105
|
+
* OL1-UL2
|
3106
|
+
|
3107
|
+
//endchild
|
3108
|
+
EOS
|
3109
|
+
expected = <<-EOS
|
3110
|
+
<ol>
|
3111
|
+
<li>OL1
|
3112
|
+
<ol>
|
3113
|
+
<li>OL1-OL1
|
3114
|
+
<ul>
|
3115
|
+
<li>OL1-OL1-UL1</li>
|
3116
|
+
</ul>
|
3117
|
+
<p>OL1-OL1-PARA</p>
|
3118
|
+
</li>
|
3119
|
+
|
3120
|
+
<li>OL1-OL2</li>
|
3121
|
+
</ol>
|
3122
|
+
<ul>
|
3123
|
+
<li>OL1-UL1
|
3124
|
+
<dl>
|
3125
|
+
<dt>OL1-UL1-DL1</dt>
|
3126
|
+
<dd>OL1-UL1-DD1</dd>
|
3127
|
+
</dl>
|
3128
|
+
<p>OL1-UL1-PARA</p>
|
3129
|
+
</li>
|
3130
|
+
|
3131
|
+
<li>OL1-UL2</li>
|
3132
|
+
</ul>
|
3133
|
+
</li>
|
3134
|
+
</ol>
|
3135
|
+
EOS
|
3136
|
+
|
3137
|
+
actual = compile_block(src)
|
3138
|
+
assert_equal expected, actual
|
3139
|
+
end
|
2569
3140
|
end
|