review 5.2.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +1 -1
  3. data/.rubocop.yml +3 -0
  4. data/NEWS.ja.md +53 -0
  5. data/NEWS.md +53 -0
  6. data/doc/format.ja.md +29 -3
  7. data/doc/format.md +32 -3
  8. data/lib/review/book/book_unit.rb +12 -2
  9. data/lib/review/book/index.rb +4 -1
  10. data/lib/review/builder.rb +51 -16
  11. data/lib/review/catalog.rb +1 -0
  12. data/lib/review/compiler.rb +4 -1
  13. data/lib/review/epubmaker/epubcommon.rb +4 -4
  14. data/lib/review/epubmaker.rb +3 -1
  15. data/lib/review/htmlbuilder.rb +24 -0
  16. data/lib/review/i18n.yml +6 -0
  17. data/lib/review/idgxmlbuilder.rb +21 -1
  18. data/lib/review/img_math.rb +1 -0
  19. data/lib/review/index_builder.rb +84 -18
  20. data/lib/review/latexbuilder.rb +16 -1
  21. data/lib/review/markdownbuilder.rb +10 -2
  22. data/lib/review/pdfmaker.rb +18 -3
  23. data/lib/review/plaintextbuilder.rb +3 -2
  24. data/lib/review/rstbuilder.rb +11 -2
  25. data/lib/review/textutils.rb +8 -7
  26. data/lib/review/tocprinter.rb +11 -6
  27. data/lib/review/topbuilder.rb +19 -1
  28. data/lib/review/version.rb +1 -1
  29. data/lib/review/volumeprinter.rb +9 -9
  30. data/samples/syntax-book/ch02.re +9 -0
  31. data/templates/latex/config.erb +3 -0
  32. data/templates/latex/review-jlreq/review-base.sty +2 -1
  33. data/templates/latex/review-jlreq/review-jlreq.cls +36 -3
  34. data/templates/latex/review-jsbook/review-base.sty +7 -1
  35. data/templates/latex/review-jsbook/review-jsbook.cls +31 -4
  36. data/test/assets/syntax_book_index_detail.txt +10 -8
  37. data/test/assets/test_template.tex +4 -1
  38. data/test/assets/test_template_backmatter.tex +4 -1
  39. data/test/test_book_chapter.rb +25 -2
  40. data/test/test_builder.rb +5 -3
  41. data/test/test_htmlbuilder.rb +42 -3
  42. data/test/test_idgxmlbuilder.rb +3 -3
  43. data/test/test_index.rb +30 -4
  44. data/test/test_latexbuilder.rb +17 -3
  45. data/test/test_markdownbuilder.rb +13 -0
  46. data/test/test_pdfmaker.rb +19 -0
  47. data/test/test_plaintextbuilder.rb +20 -4
  48. data/test/test_rstbuilder.rb +13 -0
  49. data/test/test_topbuilder.rb +18 -0
  50. metadata +2 -2
@@ -21,7 +21,7 @@
21
21
 
22
22
  \IfFileExists{plautopatch.sty}{\RequirePackage{plautopatch}}{}
23
23
  \NeedsTeXFormat{LaTeX2e}
24
- \ProvidesClass{review-jlreq}[2021/06/28 Re:VIEW 5.2 upLaTeX/LuaLaTeX class modified for jlreq.cls]
24
+ \ProvidesClass{review-jlreq}[2021/09/07 Re:VIEW 5.3 upLaTeX/LuaLaTeX class modified for jlreq.cls]
25
25
 
26
26
  %% hook at end of reviewmacro
27
27
  \let\@endofreviewmacrohook\@empty
@@ -32,12 +32,15 @@
32
32
  \RequirePackage{fix-cm}%%\RequirePackage{fix-cm,exscale}
33
33
  \IfFileExists{latexrelease.sty}{}{\RequirePackage{fixltx2e}}
34
34
 
35
+ %% amsmath: override \@ifstar with \new@ifnextchar in amsgen.sty
36
+ \let\ltx@ifstar\@ifstar%%as \@ifstar of LaTeX kernel
37
+
35
38
  %% graphicx: added nosetpagesize
36
39
  \IfFileExists{platexrelease.sty}{%% is bundled in TL16 or higher release version
37
40
  \PassOptionsToPackage{nosetpagesize}{graphicx}%%for TL16 or higher version
38
41
  }{}
39
42
 
40
- \RequirePackage{xkeyval,everypage}
43
+ \RequirePackage{xkeyval,everypage,ifthen}
41
44
 
42
45
  %% useful helpers
43
46
  \newcommand\recls@get@p@[2]{%
@@ -226,12 +229,29 @@
226
229
  \edef\grnchry@gutter{\evensidemargin}
227
230
  \newcommand*\includefullpagegraphics{%
228
231
  \clearpage
229
- \@ifstar
232
+ \ltx@ifstar
230
233
  {\@includefullpagegraphics}%
231
234
  {\thispagestyle{empty}\@includefullpagegraphics}
232
235
  }
233
236
 
234
237
  \newcommand*\@includefullpagegraphics[2][]{%
238
+ \if@tate
239
+ \vbox to \textheight{%
240
+ \ifodd\c@page
241
+ \vskip-\dimexpr\evensidemargin - \topskip + 1in\relax
242
+ \else
243
+ \vskip-\dimexpr\oddsidemargin - \topskip + 1in\relax
244
+ \fi
245
+ \vbox to \paperwidth{\vss
246
+ \hbox to \textwidth{%
247
+ \hskip-\grnchry@head\relax
248
+ \hbox to \paperheight{\hss
249
+ \rotatebox{90}{\includegraphics[#1]{#2}}%
250
+ \hss}%
251
+ \hss}%
252
+ \vss}%
253
+ \vss}%
254
+ \else
235
255
  \vbox to \textheight{%
236
256
  \vskip-\grnchry@head
237
257
  \vbox to \paperheight{\vss
@@ -247,6 +267,7 @@
247
267
  \hss}%
248
268
  \vss}%
249
269
  \vss}%
270
+ \fi
250
271
  \clearpage
251
272
  }
252
273
 
@@ -342,5 +363,17 @@
342
363
  \def\reviewleftcurlybrace{\{}
343
364
  \def\reviewrightcurlybrace{\}}
344
365
 
366
+ %% 後注を見出しではなくchapter前にし、endnoteカウンタを新規に用意する
367
+ \jlreqsetup{endnote_position=_chapter}
368
+ \newcounter{reclsendnote}
369
+ \setcounter{reclsendnote}{0}
370
+ \if@tate
371
+ \renewcommand*{\thereclsendnote}{\jlreq@open@bracket@before@space\inhibitglue(\tatechuyoko{\@arabic\c@reclsendnote})\inhibitglue}
372
+ \else
373
+ \renewcommand*{\thereclsendnote}{(\arabic{reclsendnote}\hbox{})\inhibitglue}
374
+ \fi
375
+ \def\jlreq@endnotecounter{reclsendnote}
376
+ \ifthenelse{\equal{\jlreq@article@type}{article}}{}{\@addtoreset{reclsendnote}{chapter}}
377
+
345
378
  \listfiles
346
379
  \endinput
@@ -1,4 +1,4 @@
1
- \ProvidesClass{review-base}[2021/06/04]
1
+ \ProvidesClass{review-base}[2021/09/06]
2
2
  \RequirePackage{ifthen}
3
3
  \@ifundefined{Hy@Info}{% for jsbook.cls
4
4
  \RequirePackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true]{hyperref}
@@ -40,6 +40,9 @@
40
40
  \RequirePackage{amsthm}
41
41
  \RequirePackage{bm}
42
42
  \RequirePackage{tabularx}
43
+ \RequirePackage{endnotesj}
44
+
45
+ \def\enoteheading{}% endnotesj.styの後注前見出しおよび空行の出力を抑制
43
46
 
44
47
  %% if you use @<u>{} (underline), use jumoline.sty
45
48
  \IfFileExists{jumoline.sty}{
@@ -65,9 +68,12 @@
65
68
  \rubysetup{J}}{%
66
69
  \rubysetup{g}}
67
70
 
71
+ \DeclareRobustCommand{\reviewtcy}[1]{\PackageError{review-base}{\reviewtcy is not allowed in yoko mode}{}}
72
+
68
73
  \ifthenelse{\equal{\review@documentclass}{utbook} \OR \equal{\review@documentclass}{tbook}}{%
69
74
  \newcommand{\headfont}{\gtfamily\sffamily\bfseries}
70
75
  \RequirePackage{plext}
76
+ \DeclareRobustCommand{\reviewtcy}[1]{\rensuji{#1}}
71
77
  }{%
72
78
  }
73
79
 
@@ -22,7 +22,7 @@
22
22
  \IfFileExists{plautopatch.sty}{\RequirePackage{plautopatch}}{}
23
23
  \NeedsTeXFormat{pLaTeX2e}
24
24
  \ProvidesClass{review-jsbook}
25
- [2021/01/12 v5.1 Re:VIEW pLaTeX class modified for jsbook.cls]
25
+ [2021/08/23 v5.3 Re:VIEW pLaTeX class modified for jsbook.cls]
26
26
 
27
27
  \def\recls@error{\ClassError{review-jsbook}}
28
28
  \def\recls@warning{\ClassWarning{review-jsbook}}
@@ -39,12 +39,18 @@
39
39
  \RequirePackage{fix-cm}%%\RequirePackage{fix-cm,exscale}
40
40
  \IfFileExists{latexrelease.sty}{}{\RequirePackage{fixltx2e}}
41
41
 
42
+ %% amsmath: override \@ifstar with \new@ifnextchar in amsgen.sty
43
+ \let\ltx@ifstar\@ifstar%%as \@ifstar of LaTeX kernel
44
+
42
45
  %% graphicx: added nosetpagesize
43
46
  \IfFileExists{platexrelease.sty}{%% is bundled in TL16 or higher release version
44
47
  \PassOptionsToPackage{nosetpagesize}{graphicx}%%for TL16 or higher version
45
48
  }{}
46
49
 
47
- \RequirePackage{xkeyval,everypage}%%,etoolbox
50
+ \RequirePackage{xkeyval}%%,etoolbox
51
+ \IfFileExists{everypage-1x.sty}{% is bundled in TL20 or higher
52
+ \RequirePackage{everypage-1x}
53
+ }{\RequirePackage{everypage}}
48
54
 
49
55
  %% useful helpers
50
56
  \newcommand\recls@get@p@[2]{%
@@ -149,7 +155,7 @@
149
155
  \xdef#1{\ifx\recls@hiddenfolio\@empty tombo,\fi#1}}
150
156
 
151
157
  %% \recls@set@hiddenfolio{<preset>}
152
- %% <preset>: default, marusho-ink (丸正インキ), nikko-pc (日光企画),
158
+ %% <preset>: default, marusho-ink (丸正インキ), nikko-pc (日光企画),
153
159
  %% shippo (ねこのしっぽ)
154
160
  \def\recls@set@hiddenfolio#1{\ifx#1\@empty\else
155
161
  \@ifundefined{@makehiddenfolio@#1}{%
@@ -284,6 +290,9 @@
284
290
  % \typeout{!!! magscale: \jsc@magscale}
285
291
  % \typeout{!!! mag: \the\mag}%%=> 1000 -> OK
286
292
 
293
+ %% compatibility for jlreq.cls
294
+ \let\if@tate\iftdir
295
+
287
296
  %% override papersize with custom papersize
288
297
  \ifx\recls@paperwidth\@empty\else\ifx\recls@paperheight\@empty\else
289
298
  \setlength{\paperwidth}{\recls@paperwidth}
@@ -398,12 +407,29 @@
398
407
  \let\grnchry@gutter\recls@gutter
399
408
  \newcommand*\includefullpagegraphics{%
400
409
  \clearpage
401
- \@ifstar
410
+ \ltx@ifstar
402
411
  {\@includefullpagegraphics}%
403
412
  {\thispagestyle{empty}\@includefullpagegraphics}
404
413
  }
405
414
 
406
415
  \newcommand*\@includefullpagegraphics[2][]{%
416
+ \if@tate
417
+ \vbox to \textheight{%
418
+ \ifodd\c@page
419
+ \vskip-\dimexpr\evensidemargin - \topskip + 1in\relax
420
+ \else
421
+ \vskip-\dimexpr\oddsidemargin - \topskip + 1in\relax
422
+ \fi
423
+ \vbox to \paperwidth{\vss
424
+ \hbox to \textwidth{%
425
+ \hskip-\grnchry@head\relax
426
+ \hbox to \paperheight{\hss
427
+ \rotatebox{90}{\includegraphics[#1]{#2}}%
428
+ \hss}%
429
+ \hss}%
430
+ \vss}%
431
+ \vss}%
432
+ \else
407
433
  \vbox to \textheight{%
408
434
  \vskip-\grnchry@head
409
435
  \vbox to \paperheight{\vss
@@ -419,6 +445,7 @@
419
445
  \hss}%
420
446
  \vss}%
421
447
  \vss}%
448
+ \fi
422
449
  \clearpage
423
450
  }
424
451
 
@@ -26,7 +26,7 @@
26
26
  -----------------------------
27
27
  169C 2L 0.2P 第II部 部見出し■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
28
28
  =============================
29
- 5652C 175L 10P ch02
29
+ 5796C 180L 11P ch02
30
30
  -----------------------------
31
31
  52C 1L 0.0P 第2章 長い章見出し■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
32
32
  10C 1L 0.0P 2.1 ブロック命令
@@ -34,13 +34,15 @@
34
34
  338C 8L 0.5P 2.1.2 図
35
35
  709C 22L 1.3P 2.1.3 表
36
36
  1154C 56L 2.8P 2.1.4 囲み記事
37
- 523C 14L 0.8P 2.2 LaTeX式
38
- 11C 1L 0.0P 2.3 インライン命令
39
- 967C 17L 1.3P 2.3.1 書体
40
- 74C 1L 0.0P 2.3.2 見出し内 BOLD,ITALIC,TT,STRONG,EM,CODE,TTB,TTI,AMI,BOU,KW,UNDERLINE,INS、
41
- 797C 22L 1.3P 2.3.3 参照
42
- 39C 2L 0.1P 2.3.4 参考文献
43
- 194C 3L 0.3P 2.3.5 索引
37
+ 110C 2L 0.2P 2.2 後注
38
+ 523C 14L 0.8P 2.3 LaTeX式
39
+ 11C 1L 0.0P 2.4 インライン命令
40
+ 967C 17L 1.3P 2.4.1 書体
41
+ 74C 1L 0.0P 2.4.2 見出し内 BOLD,ITALIC,TT,STRONG,EM,CODE,TTB,TTI,AMI,BOU,KW,UNDERLINE,INS、
42
+ 797C 22L 1.3P 2.4.3 参照
43
+ 39C 2L 0.1P 2.4.4 参考文献
44
+ 194C 3L 0.3P 2.4.5 索引
45
+ 34C 3L 0.1P 2.4.5.1 後注
44
46
  =============================
45
47
  2255C 38L 4P ch03
46
48
  -----------------------------
@@ -1,6 +1,6 @@
1
1
  \documentclass[dvipdfmx]{review-jsbook}
2
2
  \makeatletter
3
- \def\review@reviewversion{5.1.0}
3
+ \def\review@reviewversion{5.3.0}
4
4
  \def\review@texcompiler{uplatex}
5
5
  \def\review@documentclass{review-jsbook}
6
6
 
@@ -61,6 +61,9 @@
61
61
  \ifdefined\reviewchapref\else% for 5.1.0 compatibility
62
62
  \newcommand{\reviewchapref}[2]{\hyperref[##2]{##1}}
63
63
  \fi
64
+ \ifdefined\reviewtcy\else% for 5.3.0 compatibility
65
+ \DeclareRobustCommand{\reviewtcy}[1]{\rensuji{##1}}
66
+ \fi
64
67
  }
65
68
 
66
69
  \makeatother
@@ -1,6 +1,6 @@
1
1
  \documentclass[dvipdfmx]{review-jsbook}
2
2
  \makeatletter
3
- \def\review@reviewversion{5.1.0}
3
+ \def\review@reviewversion{5.3.0}
4
4
  \def\review@texcompiler{uplatex}
5
5
  \def\review@documentclass{review-jsbook}
6
6
 
@@ -72,6 +72,9 @@ some ad content
72
72
  \ifdefined\reviewchapref\else% for 5.1.0 compatibility
73
73
  \newcommand{\reviewchapref}[2]{\hyperref[##2]{##1}}
74
74
  \fi
75
+ \ifdefined\reviewtcy\else% for 5.3.0 compatibility
76
+ \DeclareRobustCommand{\reviewtcy}[1]{\rensuji{##1}}
77
+ \fi
75
78
  }
76
79
 
77
80
  \makeatother
@@ -1,4 +1,5 @@
1
1
  require 'book_test_helper'
2
+
2
3
  class ChapterTest < Test::Unit::TestCase
3
4
  include BookTestHelper
4
5
 
@@ -41,12 +42,12 @@ class ChapterTest < Test::Unit::TestCase
41
42
 
42
43
  def test_size
43
44
  ch = Book::Chapter.new(nil, nil, nil, __FILE__, :io)
44
- filesize = IO.read(__FILE__, mode: 'rt:BOM|utf-8').size
45
+ filesize = File.read(__FILE__, mode: 'rt:BOM|utf-8').size
45
46
  assert_equal filesize, ch.size
46
47
 
47
48
  File.open(__FILE__, 'r') do |i|
48
49
  ch = Book::Chapter.new(nil, nil, nil, nil, i)
49
- filesize = IO.read(__FILE__, mode: 'rt:BOM|utf-8').size
50
+ filesize = File.read(__FILE__, mode: 'rt:BOM|utf-8').size
50
51
  assert_equal filesize, ch.size
51
52
  end
52
53
  end
@@ -174,6 +175,7 @@ E
174
175
 
175
176
  def test_footnote_index
176
177
  content = <<E
178
+ @<fn>{abc}@<fn>{def}@<fn>{xyz}
177
179
  //footnote[abc][textabc...]
178
180
  //footnote[def][textdef...]
179
181
  //footnote[xyz][textxyz...]
@@ -189,6 +191,27 @@ E
189
191
  end
190
192
  end
191
193
 
194
+ def test_endnote_index
195
+ content = <<E
196
+ @<fn>{abc}@<fn>{def}@<fn>{xyz}@<endnote>{abc}@<endnote>{def}@<endnote>{xyz}
197
+ //footnote[abc][textabc...]
198
+ //footnote[def][textdef...]
199
+ //footnote[xyz][textxyz...]
200
+ //endnote[abc][textabc...]
201
+ //endnote[def][textdef...]
202
+ //endnote[xyz][textxyz...]
203
+ //list[def][def-list]{
204
+ //}
205
+ //list[others][others-list]{
206
+ //}
207
+ E
208
+ do_test_index(content, Book::EndnoteIndex, :endnote_index, :endnote) do |ch|
209
+ assert_raises ReVIEW::KeyError do
210
+ ch.endnote('xyz2')
211
+ end
212
+ end
213
+ end
214
+
192
215
  def test_bibpaper
193
216
  do_test_index(<<E, Book::BibpaperIndex, :bibpaper_index, :bibpaper, filename: 'bib.re')
194
217
  //bibpaper[abc][text...]
data/test/test_builder.rb CHANGED
@@ -94,6 +94,8 @@ class BuidlerTest < Test::Unit::TestCase
94
94
  assert_equal 'unknown column: unknown|column1', e.message
95
95
  e = assert_raises(ReVIEW::ApplicationError) { b.inline_fn('unknown|footnote1') }
96
96
  assert_equal 'unknown footnote: unknown|footnote1', e.message
97
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_endnote('endnote1') }
98
+ assert_equal 'unknown endnote: endnote1', e.message
97
99
  end
98
100
 
99
101
  def test_nest_error
@@ -102,16 +104,16 @@ class BuidlerTest < Test::Unit::TestCase
102
104
  assert_equal '', b.solve_nest('')
103
105
  b.children = ['dl']
104
106
  e = assert_raises(ReVIEW::ApplicationError) { b.solve_nest('') }
105
- assert_equal '//beginchild of dl misses //endchild', e.message
107
+ assert_equal ': //beginchild of dl misses //endchild', e.message
106
108
  b.children = ['ul', 'dl', 'ol']
107
109
  e = assert_raises(ReVIEW::ApplicationError) { b.solve_nest('') }
108
- assert_equal '//beginchild of ol,dl,ul misses //endchild', e.message
110
+ assert_equal ': //beginchild of ol,dl,ul misses //endchild', e.message
109
111
 
110
112
  assert_equal "\u0001→/ol←\u0001", b.endchild
111
113
  assert_equal "\u0001→/dl←\u0001", b.endchild
112
114
  assert_equal "\u0001→/ul←\u0001", b.endchild
113
115
  e = assert_raises(ReVIEW::ApplicationError) { b.endchild }
114
- assert_equal "//endchild is shown, but any opened //beginchild doesn't exist", e.message
116
+ assert_equal ": //endchild is shown, but any opened //beginchild doesn't exist", e.message
115
117
  end
116
118
 
117
119
  class XBuilder < Builder
@@ -2322,6 +2322,43 @@ EOS
2322
2322
  assert_equal expected, fn
2323
2323
  end
2324
2324
 
2325
+ def test_endnote
2326
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//endnote[foo][bar]\n\n@<endnote>{foo}\n") }
2327
+ assert_equal ':4: //endnote is found but //printendnotes is not found.', e.message
2328
+
2329
+ actual = compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n//printendnotes\n")
2330
+ expected = <<-'EOS'
2331
+ <p><a id="endnoteb-foo" href="#endnote-foo" class="noteref" epub:type="noteref">(1)</a></p>
2332
+ <div class="endnotes">
2333
+ <div class="endnote" id="endnote-foo"><p class="endnote">(1) bar</p></div>
2334
+ </div>
2335
+ EOS
2336
+ assert_equal expected, actual
2337
+
2338
+ @book.config['epubmaker'] ||= {}
2339
+ @book.config['epubmaker']['back_footnote'] = true
2340
+ actual = compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n//printendnotes\n")
2341
+ expected = <<-'EOS'
2342
+ <p><a id="endnoteb-foo" href="#endnote-foo" class="noteref" epub:type="noteref">(1)</a></p>
2343
+ <div class="endnotes">
2344
+ <div class="endnote" id="endnote-foo"><p class="endnote"><a href="#endnoteb-foo">⏎</a>(1) bar</p></div>
2345
+ </div>
2346
+ EOS
2347
+ assert_equal expected, actual
2348
+
2349
+ I18n.set('html_endnote_textmark', '+%s:')
2350
+ I18n.set('html_endnote_refmark', '+%s:')
2351
+ I18n.set('html_footnote_backmark', '←')
2352
+ actual = compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n//printendnotes\n")
2353
+ expected = <<-'EOS'
2354
+ <p><a id="endnoteb-foo" href="#endnote-foo" class="noteref" epub:type="noteref">+1:</a></p>
2355
+ <div class="endnotes">
2356
+ <div class="endnote" id="endnote-foo"><p class="endnote"><a href="#endnoteb-foo">←</a>+1:bar</p></div>
2357
+ </div>
2358
+ EOS
2359
+ assert_equal expected, actual
2360
+ end
2361
+
2325
2362
  def test_inline_hd
2326
2363
  book = ReVIEW::Book::Base.new
2327
2364
  book.catalog = ReVIEW::Catalog.new('CHAPS' => %w[ch1.re ch2.re])
@@ -2868,6 +2905,8 @@ EOB
2868
2905
  assert_match(/unknown image: n/, @log_io.string)
2869
2906
  assert_raises(ReVIEW::ApplicationError) { compile_block("@<fn>{n}\n") }
2870
2907
  assert_match(/unknown footnote: n/, @log_io.string)
2908
+ assert_raises(ReVIEW::ApplicationError) { compile_block("@<endnote>{n}\n") }
2909
+ assert_match(/unknown endnote: n/, @log_io.string)
2871
2910
  assert_raises(ReVIEW::ApplicationError) { compile_block("@<hd>{n}\n") }
2872
2911
  assert_match(/unknown headline: n/, @log_io.string)
2873
2912
  %w[list table column].each do |name|
@@ -2951,7 +2990,7 @@ EOS
2951
2990
  //beginchild
2952
2991
  EOS
2953
2992
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2954
- assert_equal "//beginchild is shown, but previous element isn't ul, ol, or dl", e.message
2993
+ assert_equal ":1: //beginchild is shown, but previous element isn't ul, ol, or dl", e.message
2955
2994
  end
2956
2995
 
2957
2996
  def test_nest_error_close2
@@ -2969,7 +3008,7 @@ EOS
2969
3008
  //beginchild
2970
3009
  EOS
2971
3010
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2972
- assert_equal '//beginchild of dl,ol,ul misses //endchild', e.message
3011
+ assert_equal ':12: //beginchild of dl,ol,ul misses //endchild', e.message
2973
3012
  end
2974
3013
 
2975
3014
  def test_nest_error_close3
@@ -2989,7 +3028,7 @@ EOS
2989
3028
  //endchild
2990
3029
  EOS
2991
3030
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2992
- assert_equal '//beginchild of ol,ul misses //endchild', e.message
3031
+ assert_equal ':14: //beginchild of ol,ul misses //endchild', e.message
2993
3032
  end
2994
3033
 
2995
3034
  def test_nest_ul
@@ -1291,7 +1291,7 @@ EOS
1291
1291
  //beginchild
1292
1292
  EOS
1293
1293
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
1294
- assert_equal "//beginchild is shown, but previous element isn't ul, ol, or dl", e.message
1294
+ assert_equal ":1: //beginchild is shown, but previous element isn't ul, ol, or dl", e.message
1295
1295
  end
1296
1296
 
1297
1297
  def test_nest_error_close2
@@ -1309,7 +1309,7 @@ EOS
1309
1309
  //beginchild
1310
1310
  EOS
1311
1311
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
1312
- assert_equal '//beginchild of dl,ol,ul misses //endchild', e.message
1312
+ assert_equal ':12: //beginchild of dl,ol,ul misses //endchild', e.message
1313
1313
  end
1314
1314
 
1315
1315
  def test_nest_error_close3
@@ -1329,7 +1329,7 @@ EOS
1329
1329
  //endchild
1330
1330
  EOS
1331
1331
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
1332
- assert_equal '//beginchild of ol,ul misses //endchild', e.message
1332
+ assert_equal ':14: //beginchild of ol,ul misses //endchild', e.message
1333
1333
  end
1334
1334
 
1335
1335
  def test_nest_ul
data/test/test_index.rb CHANGED
@@ -12,6 +12,8 @@ class IndexTest < Test::Unit::TestCase
12
12
  @builder = TOPBuilder.new
13
13
  @config = ReVIEW::Configure.create(config: { 'secnolevel' => 2, 'language' => 'ja' })
14
14
  @book = Book::Base.new(config: @config)
15
+ @log_io = StringIO.new
16
+ ReVIEW.logger = ReVIEW::Logger.new(@log_io)
15
17
  @compiler = ReVIEW::Compiler.new(@builder)
16
18
  @chapter = Book::Chapter.new(@book, 1, '-', nil, StringIO.new)
17
19
  location = Location.new(nil, nil)
@@ -21,16 +23,19 @@ class IndexTest < Test::Unit::TestCase
21
23
  end
22
24
 
23
25
  def test_footnote_index
24
- compile_block("//footnote[foo][bar]\n")
26
+ compile_block("@<fn>{foo}\n//footnote[foo][bar]\n")
25
27
  fn = @chapter.footnote_index
26
28
  items = fn.to_a
27
29
  item = items[0]
28
30
  assert_equal 'foo', item.id
29
31
  assert_equal 'bar', item.content
32
+
33
+ compile_block("//footnote[foo][bar]\n")
34
+ assert_match(/ID foo is not referred/, @log_io.string)
30
35
  end
31
36
 
32
37
  def test_footnote_index_with_escape
33
- compile_block('//footnote[foo][bar[\]buz]' + "\n")
38
+ compile_block("@<fn>{foo}\n" + '//footnote[foo][bar[\]buz]' + "\n")
34
39
  fn = @chapter.footnote_index
35
40
  items = fn.to_a
36
41
  item = items[0]
@@ -39,7 +44,7 @@ class IndexTest < Test::Unit::TestCase
39
44
  end
40
45
 
41
46
  def test_footnote_index_with_escape2
42
- compile_block('//footnote[foo][bar\\a\\$buz]' + "\n")
47
+ compile_block("@<fn>{foo}\n" + '//footnote[foo][bar\\a\\$buz]' + "\n")
43
48
  fn = @chapter.footnote_index
44
49
  items = fn.to_a
45
50
  item = items[0]
@@ -48,7 +53,7 @@ class IndexTest < Test::Unit::TestCase
48
53
  end
49
54
 
50
55
  def test_footnote_index_key?
51
- compile_block('//footnote[foo][bar]' + "\n")
56
+ compile_block("@<fn>{foo}\n" + '//footnote[foo][bar]' + "\n")
52
57
  fn = @chapter.footnote_index
53
58
  assert_equal true, fn.key?('foo')
54
59
 
@@ -58,6 +63,27 @@ class IndexTest < Test::Unit::TestCase
58
63
  # rubocop:enable Style/PreferredHashMethods
59
64
  end
60
65
 
66
+ def test_endnote_index
67
+ compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n//printendnotes\n")
68
+ endnote = @chapter.endnote_index
69
+ items = endnote.to_a
70
+ item = items[0]
71
+ assert_equal 'foo', item.id
72
+ assert_equal 'bar', item.content
73
+ assert_equal true, endnote.key?('foo')
74
+ # rubocop:disable Style/PreferredHashMethods
75
+ assert_equal true, endnote.has_key?('foo')
76
+ # rubocop:enable Style/PreferredHashMethods
77
+
78
+ e = assert_raises(ReVIEW::ApplicationError) do
79
+ compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n")
80
+ end
81
+ assert_equal ':3: //endnote is found but //printendnotes is not found.', e.message
82
+
83
+ compile_block("//endnote[foo][bar]\n//printendnotes\n")
84
+ assert_match(/ID foo is not referred/, @log_io.string)
85
+ end
86
+
61
87
  def test_headline_index
62
88
  src = <<-EOB
63
89
  = chap1
@@ -257,6 +257,20 @@ EOS
257
257
  assert_equal 'test \\reviewttb{inline test} test2', actual
258
258
  end
259
259
 
260
+ def test_endnote
261
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//endnote[foo][bar]\n\n@<endnote>{foo}\n") }
262
+ assert_equal ':4: //endnote is found but //printendnotes is not found.', e.message
263
+
264
+ actual = compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n//printendnotes\n")
265
+ expected = <<-'EOS'
266
+
267
+ \endnote{bar}
268
+
269
+ \theendnotes
270
+ EOS
271
+ assert_equal expected, actual
272
+ end
273
+
260
274
  def test_inline_hd_chap
261
275
  def @chapter.headline_index
262
276
  item = Book::Index::Item.new('chap1|test', [1, 1], 'te_st')
@@ -2596,7 +2610,7 @@ EOS
2596
2610
  //beginchild
2597
2611
  EOS
2598
2612
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2599
- assert_equal "//beginchild is shown, but previous element isn't ul, ol, or dl", e.message
2613
+ assert_equal ":1: //beginchild is shown, but previous element isn't ul, ol, or dl", e.message
2600
2614
  end
2601
2615
 
2602
2616
  def test_nest_error_close2
@@ -2614,7 +2628,7 @@ EOS
2614
2628
  //beginchild
2615
2629
  EOS
2616
2630
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2617
- assert_equal '//beginchild of dl,ol,ul misses //endchild', e.message
2631
+ assert_equal ':12: //beginchild of dl,ol,ul misses //endchild', e.message
2618
2632
  end
2619
2633
 
2620
2634
  def test_nest_error_close3
@@ -2634,7 +2648,7 @@ EOS
2634
2648
  //endchild
2635
2649
  EOS
2636
2650
  e = assert_raises(ReVIEW::ApplicationError) { compile_block(src) }
2637
- assert_equal '//beginchild of ol,ul misses //endchild', e.message
2651
+ assert_equal ':14: //beginchild of ol,ul misses //endchild', e.message
2638
2652
  end
2639
2653
 
2640
2654
  def test_nest_ul
@@ -106,6 +106,19 @@ EOS
106
106
  assert_equal %Q(test <span class="red">コメント</span> test2), actual
107
107
  end
108
108
 
109
+ def test_endnote
110
+ e = assert_raises(ReVIEW::ApplicationError) { compile_block("//endnote[foo][bar]\n\n@<endnote>{foo}\n") }
111
+ assert_equal ':4: //endnote is found but //printendnotes is not found.', e.message
112
+
113
+ actual = compile_block("@<endnote>{foo}\n//endnote[foo][bar]\n//printendnotes\n")
114
+ expected = <<-'EOS'
115
+ <sup>(1)</sup>
116
+
117
+ (1) bar
118
+ EOS
119
+ assert_equal expected, actual
120
+ end
121
+
109
122
  def test_inline_hd_chap
110
123
  def @chapter.headline_index
111
124
  item = Book::Index::Item.new('chap1|test', [1, 1], 'te_st')
@@ -167,6 +167,25 @@ class PDFMakerTest < Test::Unit::TestCase
167
167
  end
168
168
  end
169
169
 
170
+ def test_template_content_with_invalid_localconfig
171
+ Dir.mktmpdir do |dir|
172
+ Dir.chdir(dir) do
173
+ Dir.mkdir('layouts')
174
+ File.write(File.join('layouts', 'config-local.tex.erb'), %q(<%= not_existed_method %>\n))
175
+ @maker.basedir = Dir.pwd
176
+ @maker.erb_config
177
+ @maker.instance_eval do
178
+ def error!(msg)
179
+ msg
180
+ end
181
+ end
182
+ error_msg = @maker.template_content
183
+ assert_match(/template or configuration error:/, error_msg)
184
+ assert_match(/undefined local variable or method `not_existed_method'/, error_msg)
185
+ end
186
+ end
187
+ end
188
+
170
189
  def test_gettemplate_with_backmatter
171
190
  @config.merge!(
172
191
  'backcover' => 'backcover.tex',