review 3.0.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +39 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.rubocop.yml +50 -12
  5. data/.travis.yml +17 -8
  6. data/Dockerfile +21 -5
  7. data/NEWS.ja.md +358 -0
  8. data/NEWS.md +358 -1
  9. data/README.md +11 -8
  10. data/appveyor.yml +1 -3
  11. data/bin/review-catalog-converter +4 -4
  12. data/bin/review-check +8 -8
  13. data/bin/review-checkdep +1 -1
  14. data/bin/review-compile +12 -12
  15. data/bin/review-epubmaker +3 -35
  16. data/bin/review-idgxmlmaker +16 -0
  17. data/bin/review-index +2 -89
  18. data/bin/review-preproc +14 -19
  19. data/bin/review-validate +3 -3
  20. data/bin/review-vol +4 -78
  21. data/doc/LICENSE +1 -1
  22. data/doc/config.yml.sample +46 -12
  23. data/doc/config.yml.sample-simple +4 -2
  24. data/doc/format.ja.md +37 -13
  25. data/doc/format.md +35 -20
  26. data/doc/pdfmaker.ja.md +43 -1
  27. data/doc/pdfmaker.md +42 -1
  28. data/doc/quickstart.ja.md +46 -26
  29. data/doc/quickstart.md +38 -17
  30. data/lib/epubmaker/epubcommon.rb +10 -5
  31. data/lib/epubmaker/epubv2.rb +1 -1
  32. data/lib/epubmaker/epubv3.rb +1 -0
  33. data/lib/epubmaker/producer.rb +4 -2
  34. data/lib/review/book.rb +1 -1
  35. data/lib/review/book/base.rb +38 -79
  36. data/lib/review/book/chapter.rb +18 -3
  37. data/lib/review/book/compilable.rb +6 -5
  38. data/lib/review/book/index.rb +69 -101
  39. data/lib/review/book/index/item.rb +40 -0
  40. data/lib/review/book/page_metric.rb +7 -7
  41. data/lib/review/book/part.rb +28 -5
  42. data/lib/review/book/volume.rb +3 -4
  43. data/lib/review/builder.rb +105 -44
  44. data/lib/review/catalog.rb +13 -16
  45. data/lib/review/compiler.rb +84 -72
  46. data/lib/review/configure.rb +19 -8
  47. data/lib/review/epub2html.rb +37 -4
  48. data/lib/review/epubmaker.rb +62 -7
  49. data/lib/review/extentions/string.rb +0 -4
  50. data/lib/review/htmlbuilder.rb +102 -115
  51. data/lib/review/htmlutils.rb +2 -3
  52. data/lib/review/i18n.rb +2 -2
  53. data/lib/review/i18n.yml +9 -0
  54. data/lib/review/idgxmlbuilder.rb +153 -74
  55. data/lib/review/idgxmlmaker.rb +191 -0
  56. data/lib/review/init-web/finish.html +10 -0
  57. data/lib/review/init-web/index.html +190 -0
  58. data/lib/review/init-web/review-layout-design.js +691 -0
  59. data/lib/review/init.rb +125 -34
  60. data/lib/review/latexbuilder.rb +199 -88
  61. data/lib/review/lineinput.rb +1 -1
  62. data/lib/review/location.rb +32 -0
  63. data/lib/review/logger.rb +4 -8
  64. data/lib/review/makerhelper.rb +24 -5
  65. data/lib/review/markdownbuilder.rb +31 -37
  66. data/lib/review/md2inaobuilder.rb +3 -5
  67. data/lib/review/pdfmaker.rb +44 -22
  68. data/lib/review/plaintextbuilder.rb +106 -85
  69. data/lib/review/preprocessor.rb +32 -41
  70. data/lib/review/rstbuilder.rb +33 -33
  71. data/lib/review/textmaker.rb +19 -3
  72. data/lib/review/textutils.rb +76 -2
  73. data/lib/review/tocprinter.rb +231 -102
  74. data/lib/review/topbuilder.rb +114 -61
  75. data/lib/review/update.rb +19 -19
  76. data/lib/review/version.rb +1 -1
  77. data/lib/review/volumeprinter.rb +99 -0
  78. data/lib/review/webmaker.rb +11 -4
  79. data/lib/review/webtocprinter.rb +38 -35
  80. data/lib/review/yamlloader.rb +26 -16
  81. data/review.gemspec +6 -4
  82. data/samples/sample-book/README.md +7 -2
  83. data/samples/sample-book/src/.gitignore +154 -0
  84. data/samples/sample-book/src/config-ebook.yml +4 -0
  85. data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
  86. data/samples/sample-book/src/config-jlreq.yml +6 -0
  87. data/samples/sample-book/src/config.yml +2 -2
  88. data/samples/sample-book/src/lib/tasks/review.rake +29 -14
  89. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  90. data/samples/syntax-book/ch01.re +4 -2
  91. data/samples/syntax-book/ch02.re +8 -16
  92. data/samples/syntax-book/ch03.re +3 -6
  93. data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
  94. data/samples/syntax-book/config-jlreq.yml +5 -0
  95. data/samples/syntax-book/config-print.yml +3 -0
  96. data/samples/syntax-book/config.yml +1 -1
  97. data/samples/syntax-book/lib/tasks/review.rake +30 -15
  98. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  99. data/templates/latex/config.erb +16 -0
  100. data/templates/latex/layout.tex.erb +4 -0
  101. data/templates/latex/review-jlreq/review-base.sty +150 -61
  102. data/templates/latex/review-jlreq/review-jlreq.cls +74 -8
  103. data/templates/latex/review-jlreq/review-style.sty +4 -1
  104. data/templates/latex/review-jsbook/README.md +39 -0
  105. data/templates/latex/review-jsbook/review-base.sty +101 -23
  106. data/templates/latex/review-jsbook/review-jsbook.cls +28 -5
  107. data/templates/latex/review-jsbook/review-style.sty +5 -2
  108. data/templates/opf/epubv3.opf.erb +1 -0
  109. data/templates/web/html/layout-html5.html.erb +2 -2
  110. data/test/assets/test_template.tex +24 -3
  111. data/test/assets/test_template_backmatter.tex +24 -3
  112. data/test/test_book.rb +75 -21
  113. data/test/test_book_chapter.rb +4 -2
  114. data/test/test_book_part.rb +3 -3
  115. data/test/test_builder.rb +16 -0
  116. data/test/test_catalog.rb +24 -42
  117. data/test/test_catalog_converter_cmd.rb +1 -1
  118. data/test/test_epubmaker_cmd.rb +14 -7
  119. data/test/test_helper.rb +15 -7
  120. data/test/test_htmlbuilder.rb +909 -159
  121. data/test/test_i18n.rb +25 -25
  122. data/test/test_idgxmlbuilder.rb +395 -38
  123. data/test/test_idgxmlmaker_cmd.rb +46 -0
  124. data/test/test_image_finder.rb +52 -70
  125. data/test/test_index.rb +50 -10
  126. data/test/test_latexbuilder.rb +1194 -106
  127. data/test/test_latexbuilder_v2.rb +628 -97
  128. data/test/test_logger.rb +14 -1
  129. data/test/test_makerhelper.rb +3 -3
  130. data/test/test_markdownbuilder.rb +134 -16
  131. data/test/test_md2inaobuilder.rb +32 -9
  132. data/test/test_pdfmaker.rb +18 -1
  133. data/test/test_pdfmaker_cmd.rb +100 -6
  134. data/test/test_plaintextbuilder.rb +371 -25
  135. data/test/test_preprocessor.rb +2 -16
  136. data/test/test_rstbuilder.rb +249 -26
  137. data/test/test_textmaker_cmd.rb +54 -0
  138. data/test/test_textutils.rb +109 -2
  139. data/test/test_topbuilder.rb +546 -31
  140. data/test/test_update.rb +17 -8
  141. data/test/test_webtocprinter.rb +66 -34
  142. data/test/test_yamlloader.rb +13 -0
  143. data/vendor/jsclasses/LICENSE +1 -1
  144. data/vendor/jsclasses/jis/jsarticle.cls +53 -14
  145. data/vendor/jsclasses/jis/jsbook.cls +53 -14
  146. data/vendor/jsclasses/jis/jsclasses.dtx +84 -25
  147. data/vendor/jsclasses/jis/jslogo.dtx +4 -4
  148. data/vendor/jsclasses/jis/jslogo.sty +3 -3
  149. data/vendor/jsclasses/jis/jspf.cls +52 -13
  150. data/vendor/jsclasses/jis/jsreport.cls +53 -14
  151. data/vendor/jsclasses/jis/kiyou.cls +53 -14
  152. data/vendor/jsclasses/jis/okumacro.dtx +4 -5
  153. data/vendor/jsclasses/jis/okumacro.sty +3 -4
  154. data/vendor/jsclasses/jsarticle.cls +53 -14
  155. data/vendor/jsclasses/jsbook.cls +53 -14
  156. data/vendor/jsclasses/jsclasses.dtx +84 -25
  157. data/vendor/jsclasses/jsclasses.pdf +0 -0
  158. data/vendor/jsclasses/jslogo.dtx +4 -4
  159. data/vendor/jsclasses/jslogo.pdf +0 -0
  160. data/vendor/jsclasses/jslogo.sty +3 -3
  161. data/vendor/jsclasses/jspf.cls +52 -13
  162. data/vendor/jsclasses/jsreport.cls +53 -14
  163. data/vendor/jsclasses/kiyou.cls +53 -14
  164. data/vendor/jsclasses/okumacro.dtx +4 -5
  165. data/vendor/jsclasses/okumacro.pdf +0 -0
  166. data/vendor/jsclasses/okumacro.sty +3 -4
  167. metadata +55 -10
  168. data/lib/review/tocparser.rb +0 -271
  169. data/samples/syntax-book/review-ext.rb +0 -14
  170. data/test/test_tocparser.rb +0 -25
@@ -1,5 +1,5 @@
1
1
  \NeedsTeXFormat{LaTeX2e}
2
- \ProvidesPackage{review-style}[2018/07/01]
2
+ \ProvidesPackage{review-style}[2019/09/16]
3
3
 
4
4
  \RequirePackage{fancyhdr}
5
5
  \pagestyle{fancy}
@@ -43,4 +43,7 @@
43
43
  \hypersetup{hidelinks}
44
44
 
45
45
  \floatplacement{figure}{H}
46
- \floatplacement{table}{htp}
46
+ \floatplacement{table}{H}
47
+
48
+ % space between English/Japanese characters in list environments (\z@ means 0, no space. You can comment out below line for backward compatibility.)
49
+ \def\reviewlistxkanjiskip{\z@}
@@ -2,6 +2,7 @@
2
2
  <package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="<%= @producer.config['language'] %>"<%= @package_attrs %>>
3
3
  <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
4
4
  <%= @opf_metainfo %>
5
+ <%= @opf_coverimage %>
5
6
  </metadata>
6
7
  <%= @opf_manifest %>
7
8
  <%= @opf_toc %>
@@ -8,8 +8,8 @@
8
8
  <link rel="stylesheet" type="text/css" href="<%=h style %>" />
9
9
  <% end %>
10
10
  <% end%>
11
- <% if @next.present? %><link rel="next" title="<%= h(@next_title)%>" href="<%= h(@next.id.to_s+"."+@book.config['htmlext']) %>"><% end %>
12
- <% if @prev.present? %><link rel="prev" title="<%= h(@prev_title)%>" href="<%= h(@prev.id.to_s+"."+@book.config['htmlext']) %>"><% end %>
11
+ <% if @next.present? %><link rel="next" title="<%= h(@next_title)%>" href="<%= h(@next.id.to_s+"."+@book.config['htmlext']) %>" /><% end %>
12
+ <% if @prev.present? %><link rel="prev" title="<%= h(@prev_title)%>" href="<%= h(@prev.id.to_s+"."+@book.config['htmlext']) %>" /><% end %>
13
13
  <meta name="generator" content="Re:VIEW" />
14
14
  <title><%=h @title %> | <%=h @book.config.name_of("booktitle")%></title>
15
15
  </head>
@@ -1,13 +1,14 @@
1
1
  \documentclass[dvipdfmx]{review-jsbook}
2
2
  \makeatletter
3
- \def\review@reviewversion{3.0.0.preview3}
3
+ \def\review@reviewversion{3.2.0}
4
4
  \def\review@texcompiler{uplatex}
5
5
  \def\review@documentclass{review-jsbook}
6
6
 
7
7
  \def\review@booktitlename{Re:VIEW Sample Book}
8
8
 
9
+ \def\review@autnames{anonymous}
9
10
 
10
- \def\review@titlepageauthors{}
11
+ \def\review@titlepageauthors{anonymous 著}
11
12
  \def\review@date{2011{-}01{-}01}
12
13
 
13
14
  \def\review@bookname{sample}
@@ -34,18 +35,37 @@
34
35
  \def\review@tablename{表}
35
36
  \def\review@appendixname{付録}
36
37
 
38
+ \def\review@usecovernombre{true}
37
39
  \def\review@titlepage{true}
38
40
 
39
41
  \def\review@pubhistories{2011年1月1日 発行}
40
- \def\review@colophonnames{}
42
+ \def\review@colophonnames{著 者 & anonymous \\
43
+ }
41
44
 
42
45
  \def\reviewprefacefiles{}
43
46
  \def\reviewchapterfiles{}
44
47
  \def\reviewappendixfiles{}
45
48
  \def\reviewpostdeffiles{}
46
49
 
50
+ \def\reviewbackcompatibilityhook{
51
+ \ifdefined\reviewimagecaption\else% for 3.0.0 compatibility
52
+ \newcommand{\reviewimagecaption}[1]{\caption{##1}}
53
+ \fi
54
+ \ifdefined\reviewincludegraphics\else% for 3.2.0 compatibility
55
+ \DeclareRobustCommand{\reviewincludegraphics}[2][]{%
56
+ \includegraphics[##1]{##2}}
57
+ \fi
58
+ \ifdefined\covermatter\else% for 4.0.0 compatibility
59
+ \def\covermatter{}
60
+ \fi
61
+ }
62
+
47
63
  \makeatother
48
64
 
65
+ \usepackage{reviewmacro}
66
+
67
+ %% backward compatibility (defined in config.erb)
68
+ \reviewbackcompatibilityhook
49
69
 
50
70
  \begin{document}
51
71
 
@@ -56,6 +76,7 @@
56
76
 
57
77
  %% coverpage
58
78
  \ifdefined\reviewcoverpagecont
79
+ \covermatter
59
80
  \reviewcoverpagecont
60
81
  \fi
61
82
 
@@ -1,13 +1,14 @@
1
1
  \documentclass[dvipdfmx]{review-jsbook}
2
2
  \makeatletter
3
- \def\review@reviewversion{3.0.0.preview3}
3
+ \def\review@reviewversion{3.2.0}
4
4
  \def\review@texcompiler{uplatex}
5
5
  \def\review@documentclass{review-jsbook}
6
6
 
7
7
  \def\review@booktitlename{Re:VIEW Sample Book}
8
8
 
9
+ \def\review@autnames{anonymous}
9
10
 
10
- \def\review@titlepageauthors{}
11
+ \def\review@titlepageauthors{anonymous 著}
11
12
  \def\review@date{2011{-}01{-}01}
12
13
 
13
14
  \def\review@bookname{sample}
@@ -34,6 +35,7 @@
34
35
  \def\review@tablename{表}
35
36
  \def\review@appendixname{付録}
36
37
 
38
+ \def\review@usecovernombre{true}
37
39
  \def\review@titlepage{true}
38
40
  \def\reviewprofilepagecont{\thispagestyle{empty}\chapter*{Profile}
39
41
  some profile
@@ -48,15 +50,33 @@ some ad content
48
50
  \null}
49
51
 
50
52
  \def\review@pubhistories{2011年1月1日 発行}
51
- \def\review@colophonnames{}
53
+ \def\review@colophonnames{著 者 & anonymous \\
54
+ }
52
55
 
53
56
  \def\reviewprefacefiles{}
54
57
  \def\reviewchapterfiles{}
55
58
  \def\reviewappendixfiles{}
56
59
  \def\reviewpostdeffiles{}
57
60
 
61
+ \def\reviewbackcompatibilityhook{
62
+ \ifdefined\reviewimagecaption\else% for 3.0.0 compatibility
63
+ \newcommand{\reviewimagecaption}[1]{\caption{##1}}
64
+ \fi
65
+ \ifdefined\reviewincludegraphics\else% for 3.2.0 compatibility
66
+ \DeclareRobustCommand{\reviewincludegraphics}[2][]{%
67
+ \includegraphics[##1]{##2}}
68
+ \fi
69
+ \ifdefined\covermatter\else% for 4.0.0 compatibility
70
+ \def\covermatter{}
71
+ \fi
72
+ }
73
+
58
74
  \makeatother
59
75
 
76
+ \usepackage{reviewmacro}
77
+
78
+ %% backward compatibility (defined in config.erb)
79
+ \reviewbackcompatibilityhook
60
80
 
61
81
  \begin{document}
62
82
 
@@ -67,6 +87,7 @@ some ad content
67
87
 
68
88
  %% coverpage
69
89
  \ifdefined\reviewcoverpagecont
90
+ \covermatter
70
91
  \reviewcoverpagecont
71
92
  \fi
72
93
 
@@ -1,8 +1,16 @@
1
1
  require 'book_test_helper'
2
+ require 'fileutils'
2
3
 
3
4
  class BookTest < Test::Unit::TestCase
4
5
  include BookTestHelper
5
6
 
7
+ def setup
8
+ if ENV['GITHUB_WORKSPACE']
9
+ ENV['TMPDIR'] = File.join(ENV['GITHUB_WORKSPACE'], 'tmp_review')
10
+ FileUtils.mkdir_p(ENV['TMPDIR'])
11
+ end
12
+ end
13
+
6
14
  def assert_same_path(expected, result, *options)
7
15
  require 'pathname'
8
16
  ex_path = Pathname(expected).realpath
@@ -32,7 +40,7 @@ class BookTest < Test::Unit::TestCase
32
40
  def test_read_chaps
33
41
  Dir.mktmpdir do |dir|
34
42
  book = Book::Base.new(dir)
35
- assert_equal '', book.read_chaps
43
+ assert_equal [], book.read_chaps
36
44
 
37
45
  chaps_path = File.join(dir, 'CHAPS')
38
46
  re1_path = File.join(dir, "123#{book.ext}")
@@ -42,16 +50,16 @@ class BookTest < Test::Unit::TestCase
42
50
  File.open(re1_path, 'w') { |o| o.print "123\n" }
43
51
  File.open(re2_path, 'w') { |o| o.print "456\n" }
44
52
 
45
- assert_equal "abc\n", book.read_chaps
53
+ assert_equal ['abc'], book.read_chaps
46
54
 
47
55
  File.unlink(chaps_path)
48
- assert_equal "#{re1_path}\n#{re2_path}", book.read_chaps
56
+ assert_equal [re1_path, re2_path], book.read_chaps
49
57
 
50
58
  File.unlink(re1_path)
51
- assert_equal re2_path, book.read_chaps
59
+ assert_equal [re2_path], book.read_chaps
52
60
 
53
61
  File.unlink(re2_path)
54
- assert_equal '', book.read_chaps
62
+ assert_equal [], book.read_chaps
55
63
  end
56
64
  end
57
65
 
@@ -68,17 +76,18 @@ class BookTest < Test::Unit::TestCase
68
76
  File.open(chaps_path, 'w') { |o| o.print chaps_content }
69
77
 
70
78
  assert book.part_exist?
71
- assert_equal chaps_content, book.read_part
79
+ assert_equal %w[abc], book.read_part
72
80
 
81
+ ## do not cache PART data
73
82
  File.open(chaps_path, 'w') { |o| o.print "XYZ\n" }
74
- assert_equal chaps_content, book.read_part
83
+ assert_equal %w[XYZ], book.read_part
75
84
  end
76
85
  end
77
86
 
78
87
  def test_read_appendix
79
88
  Dir.mktmpdir do |dir|
80
89
  book = Book::Base.new(dir)
81
- assert_equal '', book.read_appendix
90
+ assert_equal [], book.read_appendix
82
91
 
83
92
  post_path = File.join(dir, 'POSTDEF')
84
93
  re1_path = File.join(dir, "123#{book.ext}")
@@ -88,23 +97,23 @@ class BookTest < Test::Unit::TestCase
88
97
  File.open(re1_path, 'w') { |o| o.print "123\n" }
89
98
  File.open(re2_path, 'w') { |o| o.print "456\n" }
90
99
 
91
- assert_equal "abc\n", book.read_appendix
100
+ assert_equal ['abc'], book.read_appendix
92
101
 
93
102
  File.unlink(post_path)
94
- assert_equal "#{re1_path}\n#{re2_path}", book.read_appendix
103
+ assert_equal [re1_path, re2_path], book.read_appendix
95
104
 
96
105
  File.unlink(re1_path)
97
- assert_equal re2_path, book.read_appendix
106
+ assert_equal [re2_path], book.read_appendix
98
107
 
99
108
  File.unlink(re2_path)
100
- assert_equal '', book.read_appendix
109
+ assert_equal [], book.read_appendix
101
110
  end
102
111
  end
103
112
 
104
113
  def test_read_postdef
105
114
  Dir.mktmpdir do |dir|
106
115
  book = Book::Base.new(dir)
107
- assert_equal '', book.read_postdef
116
+ assert_equal [], book.read_postdef
108
117
 
109
118
  post_path = File.join(dir, 'POSTDEF')
110
119
  re1_path = File.join(dir, "123#{book.ext}")
@@ -114,10 +123,10 @@ class BookTest < Test::Unit::TestCase
114
123
  File.open(re1_path, 'w') { |o| o.print "123\n" }
115
124
  File.open(re2_path, 'w') { |o| o.print "456\n" }
116
125
 
117
- assert_equal '', book.read_postdef
126
+ assert_equal [], book.read_postdef
118
127
 
119
128
  File.unlink(post_path)
120
- assert_equal '', book.read_postdef
129
+ assert_equal [], book.read_postdef
121
130
  end
122
131
  end
123
132
 
@@ -237,7 +246,7 @@ EOC
237
246
  "part1_chapter1.re\n",
238
247
  '',
239
248
  [
240
- '', # XXX: OK?
249
+ '' # XXX: OK?
241
250
  ]
242
251
  ],
243
252
  [
@@ -248,15 +257,15 @@ EOC
248
257
  ''
249
258
  ]
250
259
  ]
251
- ].each do |n_parts, chaps_text, parts_text, part_names|
260
+ ].each do |n_parts, chaps, parts, part_names|
252
261
  n_test += 1
253
262
  Dir.mktmpdir do |dir|
254
263
  book = Book::Base.new(dir)
255
264
  chaps_path = File.join(dir, 'CHAPS')
256
- File.open(chaps_path, 'w') { |o| o.print chaps_text }
257
- if parts_text
265
+ File.open(chaps_path, 'w') { |o| o.print chaps }
266
+ if parts
258
267
  parts_path = File.join(dir, 'PART')
259
- File.open(parts_path, 'w') { |o| o.print parts_text }
268
+ File.open(parts_path, 'w') { |o| o.print parts }
260
269
  end
261
270
 
262
271
  parts = book.instance_eval { parse_chapters }
@@ -412,6 +421,51 @@ EOC
412
421
  end
413
422
  end
414
423
 
424
+ def test_parts_in_file
425
+ mktmpbookdir do |_dir, book, _files|
426
+ assert book.parts_in_file.empty?
427
+ assert !book.part(0)
428
+ assert !book.part(1)
429
+
430
+ tmp = []
431
+ book.each_part { tmp << true }
432
+ assert tmp.empty?
433
+ end
434
+
435
+ mktmpbookdir 'CHAPS' => "ch1.re\nch2.re\n\nch3.re\n",
436
+ 'PART' => "foo\nbar\n",
437
+ 'ch1.re' => "= ch1\n\n", 'ch2.re' => "= ch2\n\n",
438
+ 'ch3.re' => "= ch3\n\n" do |_dir, book, _files|
439
+ parts = book.parts_in_file
440
+ assert_equal 0, parts.size
441
+ assert !book.part(0)
442
+ assert_equal 'foo', book.part(1).name
443
+ assert_equal 'bar', book.part(2).name
444
+ assert !book.part(3)
445
+
446
+ tmp = []
447
+ book.each_part { |p| tmp << p.number }
448
+ assert_equal [1, 2], tmp
449
+ end
450
+
451
+ mktmpbookdir 'CHAPS' => "ch1.re\nch2.re\n\nch3.re\n",
452
+ 'PART' => "foo.re\nbar.re\n",
453
+ 'foo.re' => "= part1\n\n", 'bar.re' => "= part2\n\n",
454
+ 'ch1.re' => "= ch1\n\n", 'ch2.re' => "= ch2\n\n",
455
+ 'ch3.re' => "= ch3\n\n" do |_dir, book, _files|
456
+ parts = book.parts_in_file
457
+ assert_equal 2, parts.size
458
+ assert !book.part(0)
459
+ assert_equal 'foo', book.part(1).name
460
+ assert_equal 'bar', book.part(2).name
461
+ assert !book.part(3)
462
+
463
+ tmp = []
464
+ book.each_part { |p| tmp << p.number }
465
+ assert_equal [1, 2], tmp
466
+ end
467
+ end
468
+
415
469
  def test_chapters
416
470
  mktmpbookdir 'CHAPS' => "ch1\nch2\n\nch3" do |_dir, book, _files|
417
471
  chapters = book.chapters
@@ -533,7 +587,7 @@ EOC
533
587
  end
534
588
 
535
589
  def test_page_metric_config_array
536
- mktmpbookdir('config.yml' => "bookname: book\npage_metric: [46, 80, 30, 74, 2]\n") do |dir, _book, _files|
590
+ mktmpbookdir('config.yml' => "bookname: book\npage_metric: [50, 40, 36, 40, 1]\n") do |dir, _book, _files|
537
591
  book = Book::Base.new(dir)
538
592
  config_file = File.join(dir, 'config.yml')
539
593
  book.load_config(config_file)
@@ -37,11 +37,13 @@ class ChapterTest < Test::Unit::TestCase
37
37
 
38
38
  def test_size
39
39
  ch = Book::Chapter.new(nil, nil, nil, __FILE__, :io)
40
- assert_equal File.size(__FILE__), ch.size
40
+ filesize = IO.read(__FILE__, mode: 'rt:BOM|utf-8').size
41
+ assert_equal filesize, ch.size
41
42
 
42
43
  File.open(__FILE__, 'r') do |i|
43
44
  ch = Book::Chapter.new(nil, nil, nil, nil, i)
44
- assert_equal File.size(__FILE__), ch.size
45
+ filesize = IO.read(__FILE__, mode: 'rt:BOM|utf-8').size
46
+ assert_equal filesize, ch.size
45
47
  end
46
48
  end
47
49
 
@@ -46,8 +46,8 @@ class PartTest < Test::Unit::TestCase
46
46
 
47
47
  part = Book::Part.new(book, nil, chs)
48
48
  assert part.volume
49
- assert part.volume.bytes > 0
50
- assert part.volume.chars > 0
51
- assert part.volume.lines > 0
49
+ assert part.volume.bytes == 0
50
+ assert part.volume.chars == 0
51
+ assert part.volume.lines == 0
52
52
  end
53
53
  end
@@ -80,6 +80,22 @@ class BuidlerTest < Test::Unit::TestCase
80
80
  assert_equal [:text, text], @b.compile_inline(text)
81
81
  end
82
82
 
83
+ def test_inline_missing_ref
84
+ b = Builder.new
85
+ chapter = ReVIEW::Book::Chapter.new(ReVIEW::Book::Base.load, 1, 'chap1', nil, StringIO.new)
86
+ b.bind(nil, chapter, nil)
87
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_list('unknown|list1') }
88
+ assert_equal ': error: unknown list: unknown|list1', e.message
89
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_table('unknown|table1') }
90
+ assert_equal ': error: unknown table: unknown|table1', e.message
91
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_img('unknown|img1') }
92
+ assert_equal ': error: unknown image: unknown|img1', e.message
93
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_column('unknown|column1') }
94
+ assert_equal ': error: unknown column: unknown|column1', e.message
95
+ e = assert_raises(ReVIEW::ApplicationError) { b.inline_fn('unknown|footnote1') }
96
+ assert_equal ': error: unknown footnote: unknown|footnote1', e.message
97
+ end
98
+
83
99
  class XBuilder < Builder
84
100
  def list_header(id, caption)
85
101
  end
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'book_test_helper'
2
3
  require 'review/catalog'
3
4
 
4
5
  class CatalogTest < Test::Unit::TestCase
@@ -7,61 +8,48 @@ class CatalogTest < Test::Unit::TestCase
7
8
 
8
9
  def test_predef
9
10
  sut = Catalog.new(yaml)
10
- exp = <<-EOS
11
- pre01.re
12
- pre02.re
13
- EOS
14
- assert_equal(exp.chomp, sut.predef)
11
+ exp = %w[pre01.re pre02.re]
12
+ assert_equal(exp, sut.predef)
15
13
  end
16
14
 
17
15
  def test_chaps
18
16
  sut = Catalog.new(yaml)
19
- exp = <<-EOS
20
- ch01.re
21
- ch02.re
22
- EOS
23
- assert_equal(exp.chomp, sut.chaps)
17
+ exp = %w[ch01.re ch02.re]
18
+ assert_equal(exp, sut.chaps)
24
19
  end
25
20
 
26
21
  def test_chaps_empty
27
22
  yaml = StringIO.new
28
23
  sut = Catalog.new(yaml)
29
- assert_equal('', sut.chaps)
24
+ assert_equal([], sut.chaps)
30
25
  end
31
26
 
32
27
  def test_appendix
33
28
  sut = Catalog.new(yaml)
34
- exp = <<-EOS
35
- post01.re
36
- post02.re
37
- EOS
38
- assert_equal(exp.chomp, sut.appendix)
29
+ exp = %w[post01.re post02.re]
30
+ assert_equal(exp, sut.appendix)
39
31
  end
40
32
 
41
33
  def test_chaps_with_parts
42
34
  sut = Catalog.new(yaml_with_parts)
43
- exp = <<-EOS
44
- ch01.re
45
- ch02.re
46
- ch03.re
47
- ch04.re
48
- ch05.re
49
- EOS
50
- assert_equal(exp.chomp, sut.chaps)
35
+ exp = %w[ch01.re ch02.re ch03.re ch04.re ch05.re]
36
+ assert_equal(exp, sut.chaps)
51
37
  end
52
38
 
53
39
  def test_parts
54
40
  sut = Catalog.new(yaml_with_parts)
55
- exp = <<-EOS
56
- part1.re
57
- part2.re
58
- EOS
59
- assert_equal(exp.chomp, sut.parts)
41
+ exp = %w[part1.re part2.re]
42
+ assert_equal(exp, sut.parts)
60
43
  end
61
44
 
62
45
  def test_parts_with_empty
63
46
  sut = Catalog.new(yaml)
64
- assert_equal('', sut.parts)
47
+ assert_equal([], sut.parts)
48
+ end
49
+
50
+ def test_empty_parts
51
+ sut = Catalog.new(StringIO.new)
52
+ assert_equal([], sut.parts_with_chaps)
65
53
  end
66
54
 
67
55
  def test_parts2
@@ -75,20 +63,14 @@ part2.re
75
63
 
76
64
  def test_postdef
77
65
  sut = Catalog.new(yaml)
78
- exp = <<-EOS
79
- back01.re
80
- back02.re
81
- EOS
82
- assert_equal(exp.chomp, sut.postdef)
66
+ exp = %w[back01.re back02.re]
67
+ assert_equal(exp, sut.postdef)
83
68
  end
84
69
 
85
70
  def test_from_object
86
71
  sut = Catalog.new(yaml_hash)
87
- exp = <<-EOS
88
- ch01.re
89
- ch02.re
90
- EOS
91
- assert_equal(exp.chomp, sut.chaps)
72
+ exp = %w[ch01.re ch02.re]
73
+ assert_equal(exp, sut.chaps)
92
74
  end
93
75
 
94
76
  def test_validate
@@ -149,7 +131,7 @@ ch02.re
149
131
  private
150
132
 
151
133
  def yaml
152
- StringIO.new <<-EOS
134
+ StringIO.new(<<-EOS)
153
135
 
154
136
  PREDEF:
155
137
  - pre01.re
@@ -177,7 +159,7 @@ POSTDEF:
177
159
  end
178
160
 
179
161
  def yaml_with_parts
180
- StringIO.new <<-EOS
162
+ StringIO.new(<<-EOS)
181
163
  CHAPS:
182
164
  - ch01.re
183
165
  - part1.re: