review 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +36 -0
  3. data/.rubocop.yml +1 -0
  4. data/ChangeLog +102 -0
  5. data/README.rdoc +2 -2
  6. data/bin/review-check +18 -16
  7. data/bin/review-compile +49 -42
  8. data/bin/review-epubmaker +23 -993
  9. data/bin/review-epubmaker-legacy +1024 -0
  10. data/bin/review-index +17 -15
  11. data/bin/review-init +39 -9
  12. data/bin/review-pdfmaker +124 -89
  13. data/bin/review-preproc +16 -14
  14. data/bin/review-vol +17 -15
  15. data/debian/docs +1 -1
  16. data/doc/catalog.rdoc +34 -0
  17. data/doc/format.rdoc +16 -2
  18. data/doc/libepubmaker/{config.yaml → config.yml} +63 -19
  19. data/doc/quickstart.rdoc +1 -1
  20. data/doc/{sample.yaml → sample.yml} +0 -0
  21. data/lib/epubmaker.rb +1 -1
  22. data/lib/epubmaker/content.rb +9 -1
  23. data/lib/epubmaker/epubv2.rb +59 -7
  24. data/lib/epubmaker/epubv3.rb +14 -9
  25. data/lib/epubmaker/producer.rb +68 -27
  26. data/lib/epubmaker/resource.rb +3 -1
  27. data/lib/lineinput.rb +2 -2
  28. data/lib/review/book/base.rb +125 -24
  29. data/lib/review/book/chapter.rb +42 -0
  30. data/lib/review/book/compilable.rb +23 -4
  31. data/lib/review/book/image_finder.rb +64 -0
  32. data/lib/review/book/index.rb +64 -50
  33. data/lib/review/book/page_metric.rb +1 -1
  34. data/lib/review/builder.rb +19 -12
  35. data/lib/review/catalog.rb +47 -0
  36. data/lib/review/compiler.rb +3 -2
  37. data/lib/review/configure.rb +5 -3
  38. data/lib/review/epubmaker.rb +130 -46
  39. data/lib/review/ewbbuilder.rb +27 -31
  40. data/lib/review/extentions/string.rb +4 -4
  41. data/lib/review/htmlbuilder.rb +140 -79
  42. data/lib/review/htmllayout.rb +26 -4
  43. data/lib/review/htmlutils.rb +20 -1
  44. data/lib/review/i18n.rb +5 -2
  45. data/lib/review/{i18n.yaml → i18n.yml} +4 -2
  46. data/lib/review/idgxmlbuilder.rb +65 -39
  47. data/lib/review/latexbuilder.rb +72 -24
  48. data/lib/review/latexutils.rb +3 -1
  49. data/lib/review/makerhelper.rb +8 -2
  50. data/lib/review/preprocessor.rb +20 -20
  51. data/lib/review/review.tex.erb +4 -0
  52. data/lib/review/sec_counter.rb +9 -11
  53. data/lib/review/tocparser.rb +2 -2
  54. data/lib/review/tocprinter.rb +12 -12
  55. data/lib/review/topbuilder.rb +15 -15
  56. data/lib/review/version.rb +1 -1
  57. data/lib/uuid.rb +7 -7
  58. data/review.gemspec +2 -2
  59. data/rubocop-todo.yml +443 -0
  60. data/test/sample-book/src/config.yml +2 -2
  61. data/test/sample-book/src/{main.css → style.css} +0 -0
  62. data/test/test_book.rb +46 -48
  63. data/test/test_book_chapter.rb +25 -13
  64. data/test/test_builder.rb +3 -3
  65. data/test/test_catalog.rb +107 -0
  66. data/test/test_epubmaker.rb +6 -6
  67. data/test/test_htmlbuilder.rb +160 -39
  68. data/test/test_htmlutils.rb +22 -0
  69. data/test/test_i18n.rb +2 -2
  70. data/test/test_idgxmlbuilder.rb +33 -47
  71. data/test/test_image_finder.rb +82 -0
  72. data/test/test_inaobuilder.rb +1 -1
  73. data/test/test_latexbuilder.rb +35 -39
  74. data/test/test_lineinput.rb +2 -2
  75. data/test/test_markdownbuilder.rb +2 -2
  76. data/test/test_topbuilder.rb +39 -23
  77. metadata +23 -14
  78. data/bin/review-epubmaker-ng +0 -23
@@ -398,7 +398,7 @@ EOT
398
398
  <head>
399
399
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
400
400
  <meta http-equiv="Content-Style-Type" content="text/css"/>
401
- <meta name="generator" content="EPUBMaker::Producer"/>
401
+ <meta name="generator" content="Re:VIEW"/>
402
402
  <title>Table of Contents</title>
403
403
  </head>
404
404
  <body>
@@ -430,7 +430,7 @@ EOT
430
430
  <head>
431
431
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
432
432
  <meta http-equiv="Content-Style-Type" content="text/css"/>
433
- <meta name="generator" content="EPUBMaker::Producer"/>
433
+ <meta name="generator" content="Re:VIEW"/>
434
434
  <title>Table of Contents</title>
435
435
  </head>
436
436
  <body>
@@ -460,7 +460,7 @@ EOT
460
460
  <head>
461
461
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
462
462
  <meta http-equiv="Content-Style-Type" content="text/css"/>
463
- <meta name="generator" content="EPUBMaker::Producer"/>
463
+ <meta name="generator" content="Re:VIEW"/>
464
464
  <title>Sample Book</title>
465
465
  </head>
466
466
  <body>
@@ -482,7 +482,7 @@ EOT
482
482
  <head>
483
483
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
484
484
  <meta http-equiv="Content-Style-Type" content="text/css"/>
485
- <meta name="generator" content="EPUBMaker::Producer"/>
485
+ <meta name="generator" content="Re:VIEW"/>
486
486
  <title>Sample Book</title>
487
487
  </head>
488
488
  <body>
@@ -506,7 +506,7 @@ EOT
506
506
  <head>
507
507
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
508
508
  <meta http-equiv="Content-Style-Type" content="text/css"/>
509
- <meta name="generator" content="EPUBMaker::Producer"/>
509
+ <meta name="generator" content="Re:VIEW"/>
510
510
  <title>Colophon</title>
511
511
  </head>
512
512
  <body>
@@ -538,7 +538,7 @@ EOT
538
538
  <head>
539
539
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
540
540
  <meta http-equiv="Content-Style-Type" content="text/css"/>
541
- <meta name="generator" content="EPUBMaker::Producer"/>
541
+ <meta name="generator" content="Re:VIEW"/>
542
542
  <title>Colophon</title>
543
543
  </head>
544
544
  <body>
@@ -11,13 +11,14 @@ class HTMLBuidlerTest < Test::Unit::TestCase
11
11
 
12
12
  def setup
13
13
  @builder = HTMLBuilder.new()
14
- @param = {
14
+ @config = ReVIEW::Configure.values
15
+ @config.merge!({
15
16
  "secnolevel" => 2, # for IDGXMLBuilder, HTMLBuilder
16
17
  "inencoding" => "UTF-8",
17
18
  "outencoding" => "UTF-8",
18
19
  "stylesheet" => nil, # for HTMLBuilder
19
- }
20
- ReVIEW.book.param = @param
20
+ })
21
+ ReVIEW.book.config = @config
21
22
  @compiler = ReVIEW::Compiler.new(@builder)
22
23
  @chapter = Book::Chapter.new(Book::Base.new(nil), 1, '-', nil, StringIO.new)
23
24
  location = Location.new(nil, nil)
@@ -25,7 +26,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
25
26
  end
26
27
 
27
28
  def test_xmlns_ops_prefix_epub3
28
- ReVIEW.book.param["epubversion"] = 3
29
+ ReVIEW.book.config["epubversion"] = 3
29
30
  assert_equal "epub", @builder.xmlns_ops_prefix
30
31
  end
31
32
 
@@ -38,12 +39,81 @@ class HTMLBuidlerTest < Test::Unit::TestCase
38
39
  assert_equal %Q|<h1 id="test"><a id="h1"></a>第1章 this is test.</h1>\n|, @builder.raw_result
39
40
  end
40
41
 
42
+ def test_headline_level1_postdef
43
+ @chapter.instance_eval do
44
+ def on_POSTDEF?
45
+ true
46
+ end
47
+ end
48
+ @builder.headline(1,"test","this is test.")
49
+ assert_equal %Q|<h1 id="test"><a id="h1"></a>付録1 this is test.</h1>\n|, @builder.raw_result
50
+ end
51
+
52
+ def test_headline_level2_postdef
53
+ @chapter.instance_eval do
54
+ def on_POSTDEF?
55
+ true
56
+ end
57
+ end
58
+ @builder.headline(2,"test","this is test.")
59
+ assert_equal %Q|\n<h2 id="test"><a id="h1-1"></a>1.1 this is test.</h2>\n|, @builder.raw_result
60
+ end
61
+
62
+ def test_headline_level1_postdef_roman
63
+ @chapter.book.config["appendix_format"] = "roman"
64
+ @chapter.instance_eval do
65
+ def on_POSTDEF?
66
+ true
67
+ end
68
+ end
69
+ @builder.headline(1,"test","this is test.")
70
+ assert_equal %Q|<h1 id="test"><a id="h1"></a>付録I this is test.</h1>\n|, @builder.raw_result
71
+ end
72
+
73
+ def test_headline_level2_postdef_roman
74
+ @chapter.book.config["appendix_format"] = "roman"
75
+ @chapter.instance_eval do
76
+ def on_POSTDEF?
77
+ true
78
+ end
79
+ end
80
+ @builder.headline(2,"test","this is test.")
81
+ assert_equal %Q|\n<h2 id="test"><a id="h1-1"></a>I.1 this is test.</h2>\n|, @builder.raw_result
82
+ end
83
+
84
+ def test_headline_level1_postdef_alpha
85
+ @chapter.book.config["appendix_format"] = "alpha"
86
+ @chapter.instance_eval do
87
+ def on_POSTDEF?
88
+ true
89
+ end
90
+ end
91
+ @builder.headline(1,"test","this is test.")
92
+ assert_equal %Q|<h1 id="test"><a id="h1"></a>付録A this is test.</h1>\n|, @builder.raw_result
93
+ end
94
+
95
+ def test_headline_level2_postdef_alpha
96
+ @chapter.book.config["appendix_format"] = "alpha"
97
+ @chapter.instance_eval do
98
+ def on_POSTDEF?
99
+ true
100
+ end
101
+ end
102
+ @builder.headline(2,"test","this is test.")
103
+ assert_equal %Q|\n<h2 id="test"><a id="h1-1"></a>A.1 this is test.</h2>\n|, @builder.raw_result
104
+ end
105
+
41
106
  def test_headline_level1_without_secno
42
- ReVIEW.book.param["secnolevel"] = 0
107
+ ReVIEW.book.config["secnolevel"] = 0
43
108
  @builder.headline(1,"test","this is test.")
44
109
  assert_equal %Q|<h1 id="test"><a id="h1"></a>this is test.</h1>\n|, @builder.raw_result
45
110
  end
46
111
 
112
+ def test_headline_level1_with_tricky_id
113
+ @builder.headline(1,"123 あ_;","this is test.")
114
+ assert_equal %Q|<h1 id="id_123-_E3_81_82___3B"><a id="h1"></a>第1章 this is test.</h1>\n|, @builder.raw_result
115
+ end
116
+
47
117
  def test_headline_level1_with_inlinetag
48
118
  @builder.headline(1,"test","this @<b>{is} test.<&\">")
49
119
  assert_equal %Q|<h1 id="test"><a id="h1"></a>第1章 this <b>is</b> test.&lt;&amp;&quot;&gt;</h1>\n|, @builder.raw_result
@@ -60,7 +130,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
60
130
  end
61
131
 
62
132
  def test_headline_level3_with_secno
63
- ReVIEW.book.param["secnolevel"] = 3
133
+ ReVIEW.book.config["secnolevel"] = 3
64
134
  @builder.headline(3,"test","this is test.")
65
135
  assert_equal %Q|\n<h3 id="test"><a id="h1-0-1"></a>1.0.1 this is test.</h3>\n|, @builder.raw_result
66
136
  end
@@ -70,6 +140,11 @@ class HTMLBuidlerTest < Test::Unit::TestCase
70
140
  assert_equal %Q|<a id="label_test"></a>\n|, @builder.raw_result
71
141
  end
72
142
 
143
+ def test_label_with_tricky_id
144
+ @builder.label("123 あ_;")
145
+ assert_equal %Q|<a id="id_123-_E3_81_82___3B"></a>\n|, @builder.raw_result
146
+ end
147
+
73
148
  def test_href
74
149
  ret = @builder.compile_href("http://github.com", "GitHub")
75
150
  assert_equal %Q|<a href="http://github.com" class="link">GitHub</a>|, ret
@@ -146,11 +221,11 @@ class HTMLBuidlerTest < Test::Unit::TestCase
146
221
  Book::HeadlineIndex.new(items, self)
147
222
  end
148
223
 
149
- @param["secnolevel"] = 2
224
+ @config["secnolevel"] = 2
150
225
  ret = @builder.compile_inline("test @<hd>{chap1|test} test2")
151
226
  assert_equal %Q|test 「te_st」 test2|, ret
152
227
 
153
- @param["secnolevel"] = 3
228
+ @config["secnolevel"] = 3
154
229
  ret = @builder.compile_inline("test @<hd>{chap1|test} test2")
155
230
  assert_equal %Q|test 「1.1.1 te_st」 test2|, ret
156
231
  end
@@ -175,6 +250,19 @@ class HTMLBuidlerTest < Test::Unit::TestCase
175
250
  assert_equal %Q|<a target='外部参照&lt;&gt;&amp;'>「●● 外部参照&lt;&gt;&amp;」</a>|, ret
176
251
  end
177
252
 
253
+ def test_inline_mathml
254
+ begin
255
+ require 'math_ml'
256
+ require "math_ml/symbol/character_reference"
257
+ rescue LoadError
258
+ return true
259
+ end
260
+ @config["mathml"] = true
261
+ ret = @builder.compile_inline("@<m>{\\frac{-b \\pm \\sqrt{b^2 - 4ac\\}\\}{2a\\}}")
262
+ @config["mathml"] = nil
263
+ assert_equal "<span class=\"equation\"><math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mfrac><mrow><mo stretchy='false'>-</mo><mi>b</mi><mo stretchy='false'>&#xb1;</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo stretchy='false'>-</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></math></span>", ret
264
+ end
265
+
178
266
  def test_quote
179
267
  lines = ["foo", "bar", "","buz"]
180
268
  @builder.quote(lines)
@@ -206,39 +294,50 @@ class HTMLBuidlerTest < Test::Unit::TestCase
206
294
  def test_image
207
295
  def @chapter.image(id)
208
296
  item = Book::ImageIndex::Item.new("sampleimg",1)
209
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
297
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
210
298
  item
211
299
  end
212
300
 
213
301
  @builder.image_image("sampleimg","sample photo",nil)
214
- assert_equal %Q|<div class="image">\n<img src="images/chap1-sampleimg.png" alt="sample photo" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
302
+ assert_equal %Q|<div id="sampleimg" class="image">\n<img src="images/chap1-sampleimg.png" alt="sample photo" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
215
303
  end
216
304
 
217
305
  def test_image_with_metric
218
306
  def @chapter.image(id)
219
307
  item = Book::ImageIndex::Item.new("sampleimg",1)
220
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
308
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
221
309
  item
222
310
  end
223
311
 
224
312
  @builder.image_image("sampleimg","sample photo","scale=1.2")
225
- assert_equal %Q|<div class="image">\n<img src="images/chap1-sampleimg.png" alt="sample photo" width="120%" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
313
+ assert_equal %Q|<div id="sampleimg" class="image">\n<img src="images/chap1-sampleimg.png" alt="sample photo" width="120%" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
226
314
  end
227
315
 
228
316
  def test_image_with_metric2
229
317
  def @chapter.image(id)
230
318
  item = Book::ImageIndex::Item.new("sampleimg",1)
231
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
319
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
232
320
  item
233
321
  end
234
322
  @builder.image_image("sampleimg","sample photo","scale=1.2,html::class=sample,latex::ignore=params")
235
- assert_equal %Q|<div class="image">\n<img src="images/chap1-sampleimg.png" alt="sample photo" width="120%" class="sample" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
323
+ assert_equal %Q|<div id="sampleimg" class="image">\n<img src="images/chap1-sampleimg.png" alt="sample photo" width="120%" class="sample" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
324
+ end
325
+
326
+ def test_image_with_tricky_id
327
+ def @chapter.image(id)
328
+ item = Book::ImageIndex::Item.new("123 あ_;",1)
329
+ item.instance_eval{@path="./images/chap1-123 あ_;.png"}
330
+ item
331
+ end
332
+
333
+ @builder.image_image("123 あ_;","sample photo",nil)
334
+ assert_equal %Q|<div id="id_123-_E3_81_82___3B" class="image">\n<img src="images/chap1-123 あ_;.png" alt="sample photo" />\n<p class="caption">\n図1.1: sample photo\n</p>\n</div>\n|, @builder.raw_result
236
335
  end
237
336
 
238
337
  def test_indepimage
239
338
  def @chapter.image(id)
240
339
  item = Book::ImageIndex::Item.new("sampleimg",1)
241
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
340
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
242
341
  item
243
342
  end
244
343
 
@@ -249,7 +348,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
249
348
  def test_indepimage_without_caption
250
349
  def @chapter.image(id)
251
350
  item = Book::ImageIndex::Item.new("sampleimg",1)
252
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
351
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
253
352
  item
254
353
  end
255
354
 
@@ -260,7 +359,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
260
359
  def test_indepimage_with_metric
261
360
  def @chapter.image(id)
262
361
  item = Book::ImageIndex::Item.new("sampleimg",1)
263
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
362
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
264
363
  item
265
364
  end
266
365
 
@@ -271,7 +370,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
271
370
  def test_indepimage_with_metric2
272
371
  def @chapter.image(id)
273
372
  item = Book::ImageIndex::Item.new("sampleimg",1)
274
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
373
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
275
374
  item
276
375
  end
277
376
 
@@ -282,7 +381,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
282
381
  def test_indepimage_without_caption_but_with_metric
283
382
  def @chapter.image(id)
284
383
  item = Book::ImageIndex::Item.new("sampleimg",1)
285
- item.instance_eval{@pathes=["./images/chap1-sampleimg.png"]}
384
+ item.instance_eval{@path="./images/chap1-sampleimg.png"}
286
385
  item
287
386
  end
288
387
 
@@ -308,7 +407,7 @@ class HTMLBuidlerTest < Test::Unit::TestCase
308
407
  rescue LoadError
309
408
  return true
310
409
  end
311
- ReVIEW.book.param["pygments"] = true
410
+ ReVIEW.book.config["pygments"] = true
312
411
  @builder.list(["test1", "test1.5", "", "test<i>2</i>"], "samplelist", "this is @<b>{test}<&>_")
313
412
 
314
413
  assert_equal %Q|<div class="caption-code">\n<p class="caption">リスト1.1: this is <b>test</b>&lt;&amp;&gt;_</p>\n<pre class="list">test1\ntest1.5\n\ntest<span style="color: #008000; font-weight: bold">&lt;i&gt;</span>2<span style="color: #008000; font-weight: bold">&lt;/i&gt;</span>\n</pre>\n</div>\n|, @builder.raw_result
@@ -438,6 +537,31 @@ EOS
438
537
  end
439
538
  end
440
539
 
540
+ def test_column_ref
541
+ review =<<-EOS
542
+ ===[column]{foo} test
543
+
544
+ inside column
545
+
546
+ === next level
547
+
548
+ this is @<column>{foo}.
549
+ EOS
550
+ expect =<<-EOS
551
+ <div class="column">
552
+
553
+ <h3 id="foo"><a id="column-1"></a>test</h3>
554
+ <p>inside column</p>
555
+ </div>
556
+
557
+ <h3><a id="h1-0-1"></a>next level</h3>
558
+ <p>this is test.</p>
559
+ EOS
560
+
561
+ assert_equal expect, column_helper(review)
562
+ end
563
+
564
+
441
565
  def test_ul
442
566
  src =<<-EOS
443
567
  * AAA
@@ -620,44 +744,31 @@ EOS
620
744
 
621
745
  def test_block_raw0
622
746
  @builder.raw("<>!\"\\n& ")
623
- expect =<<-EOS
624
- <>!"
625
- &
626
- EOS
747
+ expect = %Q(<>!\"\n& )
627
748
  assert_equal expect.chomp, @builder.raw_result
628
749
  end
629
750
 
630
751
  def test_block_raw1
631
752
  @builder.raw("|html|<>!\"\\n& ")
632
- expect =<<-EOS
633
- <>!"
634
- &
635
- EOS
753
+ expect = %Q(<>!\"\n& )
636
754
  assert_equal expect.chomp, @builder.raw_result
637
755
  end
638
756
 
639
757
  def test_block_raw2
640
758
  @builder.raw("|html, latex|<>!\"\\n& ")
641
- expect =<<-EOS
642
- <>!\"
643
- &
644
- EOS
759
+ expect = %Q(<>!\"\n& )
645
760
  assert_equal expect.chomp, @builder.raw_result
646
761
  end
647
762
 
648
763
  def test_block_raw3
649
764
  @builder.raw("|latex, idgxml|<>!\"\\n& ")
650
- expect =<<-EOS
651
- EOS
765
+ expect = ''
652
766
  assert_equal expect.chomp, @builder.raw_result
653
767
  end
654
768
 
655
769
  def test_block_raw4
656
770
  @builder.raw("|html <>!\"\\n& ")
657
- expect =<<-EOS
658
- |html <>!\"
659
- &
660
- EOS
771
+ expect = %Q(|html <>!\"\n& )
661
772
  assert_equal expect.chomp, @builder.raw_result
662
773
  end
663
774
 
@@ -666,7 +777,17 @@ EOS
666
777
  @chapter.instance_eval{@footnote_index=fn}
667
778
  @builder.footnote("foo",'bar\\a\\$buz')
668
779
  expect =<<-'EOS'
669
- <div class="footnote"><p class="footnote">[<a id="fn-foo">*1</a>] bar\a\$buz</p></div>
780
+ <div class="footnote" id="fn-foo"><p class="footnote">[<a href="#fnb-foo">*1</a>] bar\a\$buz</p></div>
781
+ EOS
782
+ assert_equal expect, @builder.raw_result
783
+ end
784
+
785
+ def test_inline_fn_with_tricky_id
786
+ fn = Book::FootnoteIndex.parse(['//footnote[123 あ_;][bar\\a\\$buz]'])
787
+ @chapter.instance_eval{@footnote_index=fn}
788
+ @builder.footnote("123 あ_;",'bar\\a\\$buz')
789
+ expect =<<-'EOS'
790
+ <div class="footnote" id="fn-id_123-_E3_81_82___3B"><p class="footnote">[<a href="#fnb-id_123-_E3_81_82___3B">*1</a>] bar\a\$buz</p></div>
670
791
  EOS
671
792
  assert_equal expect, @builder.raw_result
672
793
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'test_helper'
2
3
  require 'review/htmlutils'
3
4
 
@@ -25,4 +26,25 @@ class HTMLUtilsTest < Test::Unit::TestCase
25
26
  def test_strip_html
26
27
  assert_equal 'thisistest.', strip_html('<h3>this<b>is</b>test</h3>.')
27
28
  end
29
+
30
+ def test_escape_comment
31
+ assert_equal '<', escape_comment('<')
32
+ assert_equal '>', escape_comment('>')
33
+ assert_equal '&', escape_comment('&')
34
+ assert_equal '&#45;', escape_comment('-')
35
+ assert_equal '&#45;&#45;', escape_comment('--')
36
+ end
37
+
38
+ def test_normalize_id
39
+ assert_equal 'abcxyz', normalize_id('abcxyz')
40
+ assert_equal 'ABCXYZ', normalize_id('ABCXYZ')
41
+ assert_equal 'abc0123', normalize_id('abc0123')
42
+ assert_equal 'a-b-c_x.y.z', normalize_id('a-b-c_x.y.z')
43
+ assert_equal 'id_a_3Ab_3Ac', normalize_id('a:b:c')
44
+ assert_equal 'id_0123a-b-c_x.y.z', normalize_id('0123a-b-c_x.y.z')
45
+ assert_equal 'id_.', normalize_id('.')
46
+ assert_equal 'id__E3_81_82', normalize_id('あ')
47
+ assert_equal 'id_-___3B', normalize_id(' _;')
48
+ end
49
+
28
50
  end
@@ -49,13 +49,13 @@ class I18nTest < Test::Unit::TestCase
49
49
  def _setup_htmlbuilder
50
50
  I18n.i18n "en"
51
51
  @builder = HTMLBuilder.new()
52
- @param = {
52
+ @config = {
53
53
  "secnolevel" => 2, # for IDGXMLBuilder, HTMLBuilder
54
54
  "inencoding" => "UTF-8",
55
55
  "outencoding" => "UTF-8",
56
56
  "stylesheet" => nil, # for HTMLBuilder
57
57
  }
58
- ReVIEW.book.param = @param
58
+ ReVIEW.book.config = @config
59
59
  @compiler = ReVIEW::Compiler.new(@builder)
60
60
  @chapter = Book::Chapter.new(Book::Base.new(nil), 1, '-', nil, StringIO.new)
61
61
  location = Location.new(nil, nil)