review 3.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (225) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +45 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.rubocop.yml +161 -34
  5. data/.travis.yml +16 -15
  6. data/Dockerfile +21 -5
  7. data/NEWS.ja.md +394 -0
  8. data/NEWS.md +395 -1
  9. data/README.md +10 -7
  10. data/appveyor.yml +1 -3
  11. data/bin/review-catalog-converter +5 -5
  12. data/bin/review-check +10 -12
  13. data/bin/review-checkdep +2 -2
  14. data/bin/review-compile +17 -23
  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 +13 -13
  19. data/bin/review-validate +4 -4
  20. data/bin/review-vol +4 -78
  21. data/doc/config.yml.sample +47 -12
  22. data/doc/config.yml.sample-simple +3 -2
  23. data/doc/format.ja.md +120 -17
  24. data/doc/format.md +119 -27
  25. data/doc/makeindex.ja.md +2 -2
  26. data/doc/pdfmaker.ja.md +43 -1
  27. data/doc/pdfmaker.md +42 -1
  28. data/doc/quickstart.ja.md +45 -25
  29. data/doc/quickstart.md +37 -16
  30. data/lib/epubmaker/content.rb +3 -2
  31. data/lib/epubmaker/epubcommon.rb +34 -27
  32. data/lib/epubmaker/epubv2.rb +5 -6
  33. data/lib/epubmaker/epubv3.rb +21 -18
  34. data/lib/epubmaker/producer.rb +2 -1
  35. data/lib/review/book.rb +2 -2
  36. data/lib/review/book/base.rb +91 -96
  37. data/lib/review/book/bib.rb +21 -0
  38. data/lib/review/book/book_unit.rb +155 -0
  39. data/lib/review/book/chapter.rb +48 -29
  40. data/lib/review/book/index.rb +46 -240
  41. data/lib/review/book/index/item.rb +46 -0
  42. data/lib/review/book/page_metric.rb +7 -7
  43. data/lib/review/book/part.rb +45 -10
  44. data/lib/review/book/volume.rb +4 -5
  45. data/lib/review/builder.rb +172 -56
  46. data/lib/review/catalog.rb +14 -17
  47. data/lib/review/compiler.rb +219 -121
  48. data/lib/review/configure.rb +39 -7
  49. data/lib/review/converter.rb +1 -1
  50. data/lib/review/epub2html.rb +43 -5
  51. data/lib/review/epubmaker.rb +69 -27
  52. data/lib/review/extentions/string.rb +0 -4
  53. data/lib/review/htmlbuilder.rb +112 -101
  54. data/lib/review/htmlutils.rb +9 -13
  55. data/lib/review/i18n.rb +3 -3
  56. data/lib/review/idgxmlbuilder.rb +202 -78
  57. data/lib/review/idgxmlmaker.rb +186 -0
  58. data/lib/review/index_builder.rb +653 -0
  59. data/lib/review/init-web/finish.html +10 -0
  60. data/lib/review/init-web/index.html +190 -0
  61. data/lib/review/init-web/review-layout-design.js +691 -0
  62. data/lib/review/init.rb +129 -46
  63. data/lib/review/latexbuilder.rb +255 -92
  64. data/lib/review/lineinput.rb +1 -1
  65. data/lib/review/location.rb +32 -0
  66. data/lib/review/logger.rb +4 -8
  67. data/lib/review/makerhelper.rb +35 -5
  68. data/lib/review/markdownbuilder.rb +50 -38
  69. data/lib/review/md2inaobuilder.rb +3 -5
  70. data/lib/review/pdfmaker.rb +60 -57
  71. data/lib/review/plaintextbuilder.rb +154 -87
  72. data/lib/review/preprocessor.rb +20 -42
  73. data/lib/review/rstbuilder.rb +57 -38
  74. data/lib/review/sec_counter.rb +13 -0
  75. data/lib/review/textmaker.rb +23 -15
  76. data/lib/review/textutils.rb +76 -2
  77. data/lib/review/tocprinter.rb +230 -102
  78. data/lib/review/topbuilder.rb +139 -60
  79. data/lib/review/update.rb +24 -24
  80. data/lib/review/version.rb +1 -1
  81. data/lib/review/volumeprinter.rb +98 -0
  82. data/lib/review/webmaker.rb +20 -24
  83. data/lib/review/webtocprinter.rb +38 -35
  84. data/lib/review/yamlloader.rb +26 -16
  85. data/review.gemspec +6 -4
  86. data/samples/sample-book/README.md +7 -2
  87. data/samples/sample-book/src/.gitignore +154 -0
  88. data/samples/sample-book/src/config-ebook.yml +4 -0
  89. data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
  90. data/samples/sample-book/src/config-jlreq.yml +6 -0
  91. data/samples/sample-book/src/config.yml +2 -2
  92. data/samples/sample-book/src/lib/tasks/review.rake +29 -14
  93. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  94. data/samples/syntax-book/Gemfile +1 -1
  95. data/samples/syntax-book/ch01.re +4 -2
  96. data/samples/syntax-book/ch02.re +8 -16
  97. data/samples/syntax-book/ch03.re +3 -6
  98. data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
  99. data/samples/syntax-book/config-jlreq.yml +5 -0
  100. data/samples/syntax-book/config-print.yml +3 -0
  101. data/samples/syntax-book/config.yml +1 -1
  102. data/samples/syntax-book/lib/tasks/review.rake +30 -15
  103. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  104. data/templates/latex/config.erb +39 -25
  105. data/templates/latex/layout.tex.erb +1 -0
  106. data/templates/latex/review-jlreq/README.md +3 -1
  107. data/templates/latex/review-jlreq/review-base.sty +161 -50
  108. data/templates/latex/review-jlreq/review-jlreq.cls +21 -22
  109. data/templates/latex/review-jlreq/review-style.sty +4 -1
  110. data/templates/latex/review-jsbook/README.md +46 -5
  111. data/templates/latex/review-jsbook/review-base.sty +123 -35
  112. data/templates/latex/review-jsbook/review-jsbook.cls +10 -4
  113. data/templates/latex/review-jsbook/review-style.sty +5 -2
  114. data/templates/opf/epubv3.opf.erb +1 -0
  115. data/templates/web/html/layout-html5.html.erb +3 -3
  116. data/test/assets/test_template.tex +19 -7
  117. data/test/assets/test_template_backmatter.tex +19 -7
  118. data/test/book_test_helper.rb +11 -5
  119. data/test/test_book.rb +124 -79
  120. data/test/test_book_chapter.rb +97 -54
  121. data/test/test_book_part.rb +3 -3
  122. data/test/test_builder.rb +38 -13
  123. data/test/test_catalog.rb +24 -42
  124. data/test/test_catalog_converter_cmd.rb +1 -1
  125. data/test/test_converter.rb +1 -0
  126. data/test/test_epub3maker.rb +2 -2
  127. data/test/test_epubmaker.rb +8 -0
  128. data/test/test_epubmaker_cmd.rb +14 -7
  129. data/test/test_helper.rb +18 -7
  130. data/test/test_htmlbuilder.rb +1491 -205
  131. data/test/test_htmlutils.rb +0 -12
  132. data/test/test_i18n.rb +37 -37
  133. data/test/test_idgxmlbuilder.rb +744 -42
  134. data/test/test_idgxmlmaker_cmd.rb +46 -0
  135. data/test/test_image_finder.rb +52 -70
  136. data/test/test_index.rb +94 -44
  137. data/test/test_indexbuilder.rb +52 -0
  138. data/test/test_latexbuilder.rb +1784 -161
  139. data/test/test_latexbuilder_v2.rb +671 -102
  140. data/test/test_logger.rb +17 -4
  141. data/test/test_makerhelper.rb +2 -14
  142. data/test/test_markdownbuilder.rb +137 -16
  143. data/test/test_md2inaobuilder.rb +32 -9
  144. data/test/test_pdfmaker.rb +30 -12
  145. data/test/test_pdfmaker_cmd.rb +100 -6
  146. data/test/test_plaintextbuilder.rb +791 -30
  147. data/test/test_preprocessor.rb +2 -16
  148. data/test/test_review_ext.rb +2 -1
  149. data/test/test_rstbuilder.rb +274 -27
  150. data/test/test_sec_counter.rb +156 -0
  151. data/test/test_textmaker_cmd.rb +54 -0
  152. data/test/test_textutils.rb +109 -2
  153. data/test/test_topbuilder.rb +724 -34
  154. data/test/test_update.rb +20 -11
  155. data/test/test_webtocprinter.rb +75 -43
  156. data/test/test_yamlloader.rb +13 -0
  157. data/vendor/gentombow/LICENSE +1 -1
  158. data/vendor/gentombow/Makefile +0 -1
  159. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  160. data/vendor/gentombow/bounddvi-en.tex +1 -0
  161. data/vendor/gentombow/bounddvi.pdf +0 -0
  162. data/vendor/gentombow/bounddvi.sty +30 -7
  163. data/vendor/gentombow/bounddvi.tex +1 -0
  164. data/vendor/gentombow/create_archive.sh +1 -0
  165. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  166. data/vendor/gentombow/gentombow-ja.tex +9 -0
  167. data/vendor/gentombow/gentombow.pdf +0 -0
  168. data/vendor/gentombow/gentombow.sty +32 -10
  169. data/vendor/gentombow/gentombow.tex +8 -0
  170. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  171. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  172. data/vendor/jsclasses/LICENSE +1 -1
  173. data/vendor/jsclasses/Makefile +3 -2
  174. data/vendor/jsclasses/create_archive.sh +5 -5
  175. data/vendor/jsclasses/jis/Makefile +3 -2
  176. data/vendor/jsclasses/jis/jsarticle.cls +74 -31
  177. data/vendor/jsclasses/jis/jsbook.cls +74 -31
  178. data/vendor/jsclasses/jis/jsclasses.dtx +176 -36
  179. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  180. data/vendor/jsclasses/jis/jslogo.dtx +4 -4
  181. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  182. data/vendor/jsclasses/jis/jslogo.sty +4 -16
  183. data/vendor/jsclasses/jis/jspf.cls +73 -30
  184. data/vendor/jsclasses/jis/jsreport.cls +74 -31
  185. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  186. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  187. data/vendor/jsclasses/jis/kiyou.cls +74 -31
  188. data/vendor/jsclasses/jis/minijs.sty +65 -22
  189. data/vendor/jsclasses/jis/okumacro.dtx +4 -5
  190. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  191. data/vendor/jsclasses/jis/okumacro.sty +4 -17
  192. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  193. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  194. data/vendor/jsclasses/jis/winjis.sty +23 -19
  195. data/vendor/jsclasses/jsarticle.cls +74 -31
  196. data/vendor/jsclasses/jsbook.cls +74 -31
  197. data/vendor/jsclasses/jsclasses.dtx +176 -36
  198. data/vendor/jsclasses/jsclasses.ins +15 -5
  199. data/vendor/jsclasses/jsclasses.pdf +0 -0
  200. data/vendor/jsclasses/jslogo.dtx +4 -4
  201. data/vendor/jsclasses/jslogo.ins +9 -0
  202. data/vendor/jsclasses/jslogo.pdf +0 -0
  203. data/vendor/jsclasses/jslogo.sty +4 -16
  204. data/vendor/jsclasses/jspf.cls +73 -30
  205. data/vendor/jsclasses/jsreport.cls +74 -31
  206. data/vendor/jsclasses/jsverb.ins +9 -0
  207. data/vendor/jsclasses/jsverb.pdf +0 -0
  208. data/vendor/jsclasses/jsverb.sty +1 -13
  209. data/vendor/jsclasses/kiyou.cls +74 -31
  210. data/vendor/jsclasses/minijs.sty +68 -22
  211. data/vendor/jsclasses/okumacro.dtx +4 -5
  212. data/vendor/jsclasses/okumacro.ins +9 -0
  213. data/vendor/jsclasses/okumacro.pdf +0 -0
  214. data/vendor/jsclasses/okumacro.sty +4 -17
  215. data/vendor/jsclasses/okuverb.ins +9 -0
  216. data/vendor/jsclasses/okuverb.pdf +0 -0
  217. data/vendor/jsclasses/okuverb.sty +1 -13
  218. data/vendor/jsclasses/tests/relfont.tex +10 -0
  219. data/vendor/jsclasses/winjis.sty +23 -19
  220. metadata +65 -12
  221. data/.rubocop_todo.yml +0 -7
  222. data/lib/review/book/compilable.rb +0 -173
  223. data/lib/review/tocparser.rb +0 -271
  224. data/samples/syntax-book/review-ext.rb +0 -14
  225. data/test/test_tocparser.rb +0 -25
@@ -1,271 +0,0 @@
1
- #
2
- # Copyright (c) 2008-2017 Minero Aoki, Kenshi Muto
3
- # 2002-2007 Minero Aoki
4
- #
5
- # This program is free software.
6
- # You can distribute or modify this program under the terms of
7
- # the GNU LGPL, Lesser General Public License version 2.1.
8
- # For details of the GNU LGPL, see the file "COPYING".
9
- #
10
-
11
- require 'review/preprocessor'
12
- require 'review/book'
13
- require 'review/textbuilder'
14
-
15
- module ReVIEW
16
- class TOCParser
17
- def self.parse(chap)
18
- stream = StringIO.new(chap.content, 'r:BOM|utf-8')
19
- new.parse(stream, chap).map do |root|
20
- root.number = chap.number
21
- root
22
- end
23
- end
24
-
25
- def self.chapter_node(chap)
26
- toc = self.parse(chap)
27
- $stderr.puts "warning: chapter #{toc.join} contains more than 1 chapter" unless toc.size == 1
28
- toc.first
29
- end
30
-
31
- def parse(f, chap)
32
- roots = [] # list of chapters
33
- node_stack = []
34
- filename = chap.path
35
- while line = f.gets
36
- case line
37
- when /\A\#@/
38
- # do nothing
39
- next
40
- when /\A\s*\z/
41
- # do nothing
42
- next
43
- when /\A(={2,})[\[\s\{]/
44
- lev = $1.size
45
- if lev > 5
46
- error! filename, f.lineno, "section level too deep: #{lev}"
47
- end
48
- label = get_label(line)
49
- if node_stack.empty?
50
- # missing chapter label
51
- dummy_chapter = Chapter.new(label, chap)
52
- node_stack.push dummy_chapter
53
- roots.push dummy_chapter
54
- end
55
- next if label =~ %r{\A\[/} # ex) "[/column]"
56
- sec = Section.new(lev, label.gsub(/\A\{.*?\}\s?/, ''))
57
- node_stack.pop until node_stack.last.level < sec.level
58
- node_stack.last.add_child sec
59
- node_stack.push sec
60
-
61
- when /\A=[^=]/
62
- label = get_label(line)
63
- node_stack.clear
64
- new_chapter = Chapter.new(label, chap)
65
- node_stack.push new_chapter
66
- roots.push new_chapter
67
-
68
- when %r{\A//\w+(?:\[.*?\])*\{\s*\z}
69
- if node_stack.empty?
70
- error! filename, f.lineno, 'list found before section label'
71
- end
72
- node_stack.last.add_child(list = List.new)
73
- beg = f.lineno
74
- list.add line
75
- while line = f.gets
76
- break if %r{\A//\}} =~ line
77
- list.add line
78
- end
79
- error! filename, beg, 'unterminated list' unless line
80
-
81
- when %r{\A//\w}
82
- # do nothing
83
- next
84
- else
85
- # if node_stack.empty?
86
- # error! filename, f.lineno, 'text found before section label'
87
- # end
88
- next if node_stack.empty?
89
- node_stack.last.add_child(par = Paragraph.new(chap))
90
- par.add line
91
- while line = f.gets
92
- break if /\A\s*\z/ =~ line
93
- par.add line
94
- end
95
- end
96
- end
97
-
98
- roots
99
- end
100
-
101
- def get_label(line)
102
- line = line.strip.sub(/\A=+\s*/, '')
103
- compile_label(line)
104
- end
105
-
106
- def compile_label(line)
107
- b = ReVIEW::TEXTBuilder.new
108
- dummy_book = ReVIEW::Book::Base.load
109
- dummy_chapter = ReVIEW::Book::Chapter.new(dummy_book, 1, '-', nil, StringIO.new)
110
- dummy_loc = Location.new('', StringIO.new)
111
- b.bind(ReVIEW::Compiler.new(b), dummy_chapter, dummy_loc)
112
- b.compile_inline(line)
113
- end
114
-
115
- def error!(filename, lineno, msg)
116
- raise "#{filename}:#{lineno}: #{msg}"
117
- end
118
-
119
- class Node
120
- def initialize(children = [])
121
- @children = children
122
- end
123
-
124
- attr_reader :children
125
-
126
- def add_child(c)
127
- @children.push c
128
- end
129
-
130
- def each_node(&block)
131
- @children.each do |c|
132
- yield c
133
- c.each(&block)
134
- end
135
- end
136
-
137
- def each_child(&block)
138
- @children.each(&block)
139
- end
140
-
141
- def chapter?
142
- false
143
- end
144
-
145
- def each_section(&block)
146
- @children.each { |n| n.yield_section(&block) }
147
- end
148
-
149
- def each_section_with_index
150
- i = 0
151
- each_section do |n|
152
- yield n, i
153
- i += 1
154
- end
155
- end
156
-
157
- def section_size
158
- cnt = 0
159
- @children.each { |n| n.yield_section { cnt += 1 } }
160
- cnt
161
- end
162
- end
163
-
164
- class Section < Node
165
- def initialize(level, label, path = nil)
166
- super()
167
- @level = level
168
- @label = label
169
- @filename = path ? real_filename(path) : nil
170
- end
171
-
172
- def real_filename(path)
173
- if FileTest.symlink?(path)
174
- File.basename(File.readlink(path))
175
- else
176
- File.basename(path)
177
- end
178
- end
179
- private :real_filename
180
-
181
- attr_reader :level
182
- attr_reader :label
183
-
184
- def estimated_lines
185
- @children.inject(0) { |sum, n| sum + n.estimated_lines }
186
- end
187
-
188
- def yield_section
189
- yield self
190
- end
191
-
192
- def inspect
193
- "#<#{self.class} level=#{@level} #{@label}>"
194
- end
195
- end
196
-
197
- class Chapter < Section
198
- def initialize(label, chap)
199
- super 1, label, chap.path
200
- @chapter = chap
201
- @chapter_id = chap.id
202
- @path = chap.path
203
- @page_metric = chap.book.page_metric
204
- @volume = nil
205
- @number = nil
206
- end
207
-
208
- attr_accessor :number
209
-
210
- def chapter?
211
- true
212
- end
213
-
214
- attr_reader :chapter_id
215
-
216
- def volume
217
- return @volume if @volume
218
- @volume = @chapter.volume
219
- @volume.lines = estimated_lines
220
- @volume
221
- end
222
-
223
- def inspect
224
- "#<#{self.class} #{@filename}>"
225
- end
226
- end
227
-
228
- class Paragraph < Node
229
- def initialize(chap)
230
- @bytes = 0
231
- @page_metric = chap.book.page_metric
232
- end
233
-
234
- def inspect
235
- "#<#{self.class}>"
236
- end
237
-
238
- def add(line)
239
- @bytes += line.strip.bytesize
240
- end
241
-
242
- def estimated_lines
243
- (@bytes + 2) / @page_metric.text.n_columns + 1
244
- end
245
-
246
- def yield_section
247
- end
248
- end
249
-
250
- class List < Node
251
- def initialize
252
- @lines = 0
253
- end
254
-
255
- def inspect
256
- "#<#{self.class}>"
257
- end
258
-
259
- def add(_line)
260
- @lines += 1
261
- end
262
-
263
- def estimated_lines
264
- @lines + 2
265
- end
266
-
267
- def yield_section
268
- end
269
- end
270
- end
271
- end
@@ -1,14 +0,0 @@
1
- require 'review'
2
-
3
- module ReVIEW
4
- class HTMLBuilder
5
- def inline_balloon(str)
6
- %Q(<span class="balloon">#{escape_html(str)}</span>)
7
- end
8
- end
9
- class LATEXBuilder
10
- def inline_balloon(str)
11
- %Q(←#{escape(str)})
12
- end
13
- end
14
- end
@@ -1,25 +0,0 @@
1
- require 'test_helper'
2
- require 'review/tocparser'
3
-
4
- class TOCParserTest < Test::Unit::TestCase
5
- include ReVIEW
6
-
7
- def test_tocparser_parse_null
8
- dummy_book = ReVIEW::Book::Base.load
9
- chap = ReVIEW::Book::Chapter.new(dummy_book, 1, '-', nil, StringIO.new)
10
- ret = TOCParser.parse(chap)
11
- assert_equal [], ret
12
- end
13
-
14
- def test_tocparser_parse
15
- dummy_book = ReVIEW::Book::Base.load
16
- io = StringIO.new("= test\n\naaa\n//image[foo][bar]{\n//}\n\n== test2\n\n=== test3\n\n==test21\n\n=test11\n")
17
- chap = ReVIEW::Book::Chapter.new(dummy_book, 1, 'foo', 'bar/foo.re', io)
18
- ret = TOCParser.parse(chap)
19
- assert_equal 2, ret.size ## XXX how to count chapters including multiple L1 headlines ??
20
- chap_node = ret[0]
21
- assert_equal ReVIEW::TOCParser::Chapter, chap_node.class
22
- assert_equal 'foo', chap_node.chapter_id
23
- assert_equal 1, chap_node.number
24
- end
25
- end