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,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