review 4.1.0 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (259) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-tex.yml +35 -0
  3. data/.github/workflows/ruby-win.yml +19 -9
  4. data/.github/workflows/ruby.yml +7 -3
  5. data/.rubocop.yml +138 -34
  6. data/NEWS.ja.md +285 -0
  7. data/NEWS.md +285 -1
  8. data/README.md +7 -6
  9. data/Rakefile +7 -2
  10. data/bin/review +2 -4
  11. data/bin/review-catalog-converter +4 -4
  12. data/bin/review-check +8 -12
  13. data/bin/review-checkdep +2 -5
  14. data/bin/review-compile +18 -34
  15. data/bin/review-epub2html +1 -4
  16. data/bin/review-epubmaker +3 -4
  17. data/bin/review-idgxmlmaker +1 -3
  18. data/bin/review-index +5 -86
  19. data/bin/review-init +1 -4
  20. data/bin/review-pdfmaker +1 -3
  21. data/bin/review-preproc +30 -38
  22. data/bin/review-textmaker +1 -3
  23. data/bin/review-update +1 -4
  24. data/bin/review-validate +4 -4
  25. data/bin/review-vol +5 -82
  26. data/bin/review-webmaker +1 -3
  27. data/doc/config.yml.sample +45 -11
  28. data/doc/config.yml.sample-simple +3 -3
  29. data/doc/format.ja.md +103 -13
  30. data/doc/format.md +104 -16
  31. data/doc/makeindex.ja.md +2 -2
  32. data/doc/pdfmaker.ja.md +42 -0
  33. data/doc/pdfmaker.md +41 -0
  34. data/doc/quickstart.ja.md +19 -6
  35. data/doc/quickstart.md +18 -6
  36. data/doc/writing_vertical.ja.md +6 -0
  37. data/lib/review.rb +1 -1
  38. data/lib/review/book.rb +2 -2
  39. data/lib/review/book/base.rb +67 -29
  40. data/lib/review/book/bib.rb +21 -0
  41. data/lib/review/book/book_unit.rb +158 -0
  42. data/lib/review/book/chapter.rb +33 -26
  43. data/lib/review/book/index.rb +24 -185
  44. data/lib/review/book/index/item.rb +7 -1
  45. data/lib/review/book/page_metric.rb +7 -7
  46. data/lib/review/book/part.rb +26 -11
  47. data/lib/review/book/volume.rb +5 -5
  48. data/lib/review/builder.rb +121 -52
  49. data/lib/review/call_hook.rb +20 -0
  50. data/lib/review/catalog.rb +3 -2
  51. data/lib/review/compiler.rb +230 -111
  52. data/lib/review/configure.rb +91 -7
  53. data/lib/review/converter.rb +1 -1
  54. data/lib/review/epub2html.rb +6 -1
  55. data/lib/review/epubmaker.rb +124 -152
  56. data/lib/review/epubmaker/content.rb +113 -0
  57. data/lib/review/epubmaker/epubcommon.rb +372 -0
  58. data/lib/review/epubmaker/epubv2.rb +178 -0
  59. data/lib/review/epubmaker/epubv3.rb +231 -0
  60. data/lib/review/epubmaker/producer.rb +167 -0
  61. data/lib/review/epubmaker/reviewheaderlistener.rb +12 -2
  62. data/lib/review/epubmaker/zip_exporter.rb +84 -0
  63. data/lib/review/exception.rb +13 -0
  64. data/lib/review/htmlbuilder.rb +176 -89
  65. data/lib/review/htmlutils.rb +8 -11
  66. data/lib/review/i18n.rb +2 -1
  67. data/lib/review/idgxmlbuilder.rb +165 -75
  68. data/lib/review/idgxmlmaker.rb +24 -28
  69. data/lib/review/img_math.rb +238 -0
  70. data/lib/review/index_builder.rb +645 -0
  71. data/lib/review/init.rb +9 -17
  72. data/lib/review/latexbox.rb +58 -0
  73. data/lib/review/latexbuilder.rb +193 -75
  74. data/lib/review/latexutils.rb +9 -1
  75. data/lib/review/lineinput.rb +112 -2
  76. data/lib/review/loggable.rb +27 -0
  77. data/lib/review/logger.rb +90 -3
  78. data/lib/review/makerhelper.rb +17 -188
  79. data/lib/review/markdownbuilder.rb +54 -4
  80. data/lib/review/pdfmaker.rb +76 -84
  81. data/lib/review/plaintextbuilder.rb +106 -22
  82. data/lib/review/preprocessor.rb +107 -303
  83. data/lib/review/preprocessor/directive.rb +35 -0
  84. data/lib/review/preprocessor/line.rb +34 -0
  85. data/lib/review/preprocessor/repository.rb +177 -0
  86. data/lib/review/rstbuilder.rb +27 -8
  87. data/lib/review/sec_counter.rb +14 -0
  88. data/lib/review/template.rb +11 -1
  89. data/lib/review/textmaker.rb +27 -32
  90. data/lib/review/textutils.rb +3 -12
  91. data/lib/review/tocprinter.rb +242 -97
  92. data/lib/review/topbuilder.rb +98 -31
  93. data/lib/review/update.rb +12 -13
  94. data/lib/review/version.rb +1 -1
  95. data/lib/review/volumeprinter.rb +97 -0
  96. data/lib/review/webmaker.rb +40 -47
  97. data/lib/review/webtocprinter.rb +39 -35
  98. data/lib/review/yamlloader.rb +2 -1
  99. data/review.gemspec +5 -3
  100. data/samples/sample-book/src/config-epub2.yml +1 -1
  101. data/samples/sample-book/src/config.yml +3 -3
  102. data/samples/sample-book/src/lib/tasks/review.rake +19 -1
  103. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +2 -1
  104. data/samples/syntax-book/Gemfile +1 -1
  105. data/samples/syntax-book/ch01.re +1 -1
  106. data/samples/syntax-book/ch02.re +21 -6
  107. data/samples/syntax-book/ch03.re +1 -1
  108. data/samples/syntax-book/config.yml +1 -1
  109. data/samples/syntax-book/images/img3-2.png +0 -0
  110. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +2 -1
  111. data/templates/html/_colophon.html.erb +23 -0
  112. data/templates/html/_colophon_history.html.erb +9 -0
  113. data/templates/html/_cover.html.erb +10 -0
  114. data/templates/html/_part_body.html.erb +6 -0
  115. data/templates/html/_titlepage.html.erb +20 -0
  116. data/templates/html/layout-html5.html.erb +6 -0
  117. data/templates/html/layout-xhtml1.html.erb +6 -0
  118. data/templates/latex/config.erb +35 -23
  119. data/templates/latex/review-jlreq/README.md +3 -1
  120. data/templates/latex/review-jlreq/review-base.sty +36 -23
  121. data/templates/latex/review-jlreq/review-jlreq.cls +18 -25
  122. data/templates/latex/review-jlreq/review-style.sty +6 -1
  123. data/templates/latex/review-jlreq/review-tcbox.sty +348 -0
  124. data/templates/latex/review-jlreq/reviewmacro.sty +5 -0
  125. data/templates/latex/review-jsbook/README.md +7 -5
  126. data/templates/latex/review-jsbook/review-base.sty +40 -24
  127. data/templates/latex/review-jsbook/review-jsbook.cls +13 -3
  128. data/templates/latex/review-jsbook/review-style.sty +6 -1
  129. data/templates/latex/review-jsbook/review-tcbox.sty +348 -0
  130. data/templates/latex/review-jsbook/reviewmacro.sty +5 -0
  131. data/templates/opf/epubv2.opf.erb +7 -7
  132. data/templates/opf/epubv3.opf.erb +7 -7
  133. data/templates/opf/opf_manifest_epubv2.opf.erb +10 -0
  134. data/templates/opf/opf_manifest_epubv3.opf.erb +10 -0
  135. data/templates/opf/opf_metainfo_epubv2.opf.erb +17 -0
  136. data/templates/opf/opf_metainfo_epubv3.opf.erb +49 -0
  137. data/templates/opf/opf_tocx_epubv2.opf.erb +9 -0
  138. data/templates/opf/opf_tocx_epubv3.opf.erb +17 -0
  139. data/templates/web/html/layout-html5.html.erb +9 -8
  140. data/templates/web/html/layout-xhtml1.html.erb +6 -0
  141. data/test/assets/header_listener.html +35 -0
  142. data/test/assets/img_math/img1.png +0 -0
  143. data/test/assets/img_math/img2.png +0 -0
  144. data/test/assets/img_math/img3.png +0 -0
  145. data/test/assets/syntax_book_index_detail.txt +58 -0
  146. data/test/assets/test_template.tex +6 -3
  147. data/test/assets/test_template_backmatter.tex +6 -3
  148. data/test/book_test_helper.rb +11 -5
  149. data/test/run_test.rb +1 -1
  150. data/test/test_book.rb +54 -63
  151. data/test/test_book_chapter.rb +95 -54
  152. data/test/test_book_part.rb +3 -3
  153. data/test/test_builder.rb +29 -20
  154. data/test/test_catalog_converter_cmd.rb +1 -1
  155. data/test/test_converter.rb +1 -0
  156. data/test/test_epub3maker.rb +170 -126
  157. data/test/test_epubmaker.rb +254 -129
  158. data/test/test_epubmaker_cmd.rb +15 -4
  159. data/test/test_helper.rb +12 -5
  160. data/test/test_htmlbuilder.rb +926 -76
  161. data/test/test_htmlutils.rb +0 -12
  162. data/test/test_i18n.rb +33 -33
  163. data/test/test_idgxmlbuilder.rb +531 -20
  164. data/test/test_idgxmlmaker_cmd.rb +7 -3
  165. data/test/test_img_math.rb +111 -0
  166. data/test/test_index.rb +62 -52
  167. data/test/test_indexbuilder.rb +52 -0
  168. data/test/test_latexbuilder.rb +891 -20
  169. data/test/test_latexbuilder_v2.rb +56 -10
  170. data/test/test_lineinput.rb +20 -93
  171. data/test/test_logger.rb +7 -7
  172. data/test/test_makerhelper.rb +0 -12
  173. data/test/test_markdownbuilder.rb +32 -0
  174. data/test/test_pdfmaker.rb +100 -11
  175. data/test/test_pdfmaker_cmd.rb +3 -3
  176. data/test/test_plaintextbuilder.rb +546 -32
  177. data/test/test_preprocessor.rb +188 -1
  178. data/test/test_review_ext.rb +2 -1
  179. data/test/test_reviewheaderlistener.rb +49 -0
  180. data/test/test_rstbuilder.rb +25 -1
  181. data/test/test_sec_counter.rb +156 -0
  182. data/test/test_template.rb +12 -2
  183. data/test/test_textmaker_cmd.rb +5 -1
  184. data/test/test_tocprinter.rb +46 -0
  185. data/test/test_topbuilder.rb +324 -20
  186. data/test/test_update.rb +44 -44
  187. data/test/test_webtocprinter.rb +75 -43
  188. data/test/test_zip_exporter.rb +5 -6
  189. data/vendor/gentombow/LICENSE +1 -1
  190. data/vendor/gentombow/Makefile +0 -1
  191. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  192. data/vendor/gentombow/bounddvi-en.tex +1 -0
  193. data/vendor/gentombow/bounddvi.pdf +0 -0
  194. data/vendor/gentombow/bounddvi.sty +30 -7
  195. data/vendor/gentombow/bounddvi.tex +1 -0
  196. data/vendor/gentombow/create_archive.sh +1 -0
  197. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  198. data/vendor/gentombow/gentombow-ja.tex +9 -0
  199. data/vendor/gentombow/gentombow.pdf +0 -0
  200. data/vendor/gentombow/gentombow.sty +32 -10
  201. data/vendor/gentombow/gentombow.tex +8 -0
  202. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  203. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  204. data/vendor/jsclasses/Makefile +3 -2
  205. data/vendor/jsclasses/create_archive.sh +5 -5
  206. data/vendor/jsclasses/jis/Makefile +3 -2
  207. data/vendor/jsclasses/jis/jsarticle.cls +22 -18
  208. data/vendor/jsclasses/jis/jsbook.cls +22 -18
  209. data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
  210. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  211. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  212. data/vendor/jsclasses/jis/jslogo.sty +1 -13
  213. data/vendor/jsclasses/jis/jspf.cls +22 -18
  214. data/vendor/jsclasses/jis/jsreport.cls +22 -18
  215. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  216. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  217. data/vendor/jsclasses/jis/kiyou.cls +22 -18
  218. data/vendor/jsclasses/jis/minijs.sty +65 -22
  219. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  220. data/vendor/jsclasses/jis/okumacro.sty +1 -13
  221. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  222. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  223. data/vendor/jsclasses/jis/winjis.sty +23 -19
  224. data/vendor/jsclasses/jsarticle.cls +22 -18
  225. data/vendor/jsclasses/jsbook.cls +22 -18
  226. data/vendor/jsclasses/jsclasses.dtx +94 -13
  227. data/vendor/jsclasses/jsclasses.ins +15 -5
  228. data/vendor/jsclasses/jsclasses.pdf +0 -0
  229. data/vendor/jsclasses/jslogo.ins +9 -0
  230. data/vendor/jsclasses/jslogo.pdf +0 -0
  231. data/vendor/jsclasses/jslogo.sty +1 -13
  232. data/vendor/jsclasses/jspf.cls +22 -18
  233. data/vendor/jsclasses/jsreport.cls +22 -18
  234. data/vendor/jsclasses/jsverb.ins +9 -0
  235. data/vendor/jsclasses/jsverb.pdf +0 -0
  236. data/vendor/jsclasses/jsverb.sty +1 -13
  237. data/vendor/jsclasses/kiyou.cls +22 -18
  238. data/vendor/jsclasses/minijs.sty +68 -22
  239. data/vendor/jsclasses/okumacro.ins +9 -0
  240. data/vendor/jsclasses/okumacro.pdf +0 -0
  241. data/vendor/jsclasses/okumacro.sty +1 -13
  242. data/vendor/jsclasses/okuverb.ins +9 -0
  243. data/vendor/jsclasses/okuverb.pdf +0 -0
  244. data/vendor/jsclasses/okuverb.sty +1 -13
  245. data/vendor/jsclasses/tests/relfont.tex +10 -0
  246. data/vendor/jsclasses/winjis.sty +23 -19
  247. metadata +106 -22
  248. data/.rubocop_todo.yml +0 -7
  249. data/lib/epubmaker.rb +0 -23
  250. data/lib/epubmaker/content.rb +0 -110
  251. data/lib/epubmaker/epubcommon.rb +0 -441
  252. data/lib/epubmaker/epubv2.rb +0 -143
  253. data/lib/epubmaker/epubv3.rb +0 -233
  254. data/lib/epubmaker/producer.rb +0 -375
  255. data/lib/epubmaker/zip_exporter.rb +0 -81
  256. data/lib/lineinput.rb +0 -155
  257. data/lib/review/book/compilable.rb +0 -178
  258. data/lib/review/tocparser.rb +0 -275
  259. data/test/test_tocparser.rb +0 -25
@@ -1,81 +0,0 @@
1
- # Copyright (c) 2010-2017 Kenshi Muto and Masayoshi Takahashi
2
- #
3
- # This program is free software.
4
- # You can distribute or modify this program under the terms of
5
- # the GNU LGPL, Lesser General Public License version 2.1.
6
- # For details of the GNU LGPL, see the file "COPYING".
7
- #
8
-
9
- require 'pathname'
10
- begin
11
- require 'zip'
12
- rescue LoadError
13
- ## I cannot find rubyzip library, so I use external zip command.
14
- warn 'rubyzip not found, so use external zip command'
15
- end
16
-
17
- module EPUBMaker
18
- ##
19
- # Export into zip file for EPUB producer.
20
- #
21
- class ZipExporter
22
- attr_reader :tmpdir
23
-
24
- def initialize(tmpdir, config)
25
- @tmpdir = tmpdir
26
- @config = config
27
- end
28
-
29
- def export_zip(epubfile)
30
- if defined?(Zip)
31
- export_zip_rubyzip(epubfile)
32
- else
33
- export_zip_extcmd(epubfile)
34
- end
35
- end
36
-
37
- def export_zip_extcmd(epubfile)
38
- stage1 = @config['epubmaker']['zip_stage1'].to_s.split
39
- path1 = stage1[0] || 'zip'
40
- opt1 = stage1[1] || '-0Xq'
41
- stage2 = @config['epubmaker']['zip_stage2'].to_s.split
42
- path2 = stage2[0] || 'zip'
43
- opt2 = stage2[1] || '-Xr9Dq'
44
-
45
- Dir.chdir(tmpdir) do
46
- system(path1, opt1, epubfile, 'mimetype')
47
- addpath = @config['epubmaker']['zip_addpath']
48
- if addpath
49
- system(path2, opt2, epubfile, 'META-INF', 'OEBPS', addpath)
50
- else
51
- system(path2, opt2, epubfile, 'META-INF', 'OEBPS')
52
- end
53
- end
54
- end
55
-
56
- def export_zip_rubyzip(epubfile)
57
- Dir.chdir(tmpdir) do
58
- Zip::OutputStream.open(epubfile) do |epub|
59
- root_pathname = Pathname.new(tmpdir)
60
- epub.put_next_entry('mimetype', nil, nil, Zip::Entry::STORED)
61
- epub << 'application/epub+zip'
62
-
63
- export_zip_rubyzip_addpath(epub, File.join(tmpdir, 'META-INF'), root_pathname)
64
- export_zip_rubyzip_addpath(epub, File.join(tmpdir, 'OEBPS'), root_pathname)
65
- if @config['zip_addpath'].present?
66
- export_zip_rubyzip_addpath(epub, File.join(tmpdir, @config['zip_addpath']), root_pathname)
67
- end
68
- end
69
- end
70
- end
71
-
72
- def export_zip_rubyzip_addpath(epub, dirname, rootdir)
73
- Dir[File.join(dirname, '**', '**')].each do |path|
74
- next if File.directory?(path)
75
- relpath = Pathname.new(path).relative_path_from(rootdir)
76
- epub.put_next_entry(relpath)
77
- epub << File.binread(path)
78
- end
79
- end
80
- end
81
- end
data/lib/lineinput.rb DELETED
@@ -1,155 +0,0 @@
1
- #
2
- # $Id: lineinput.rb 2226 2006-04-15 03:05:09Z aamine $
3
- #
4
- # Copyright (c) 2002-2005 Minero Aoki
5
- #
6
- # This program is free software.
7
- # You can distribute/modify this program under the terms of
8
- # the GNU LGPL, Lesser General Public License version 2.1.
9
- #
10
-
11
- class LineInput
12
-
13
- def initialize(f)
14
- @input = f
15
- @buf = []
16
- @lineno = 0
17
- @eof_p = false
18
- end
19
-
20
- def inspect
21
- "\#<#{self.class} file=#{@input.inspect} line=#{lineno()}>"
22
- end
23
-
24
- def eof?
25
- @eof_p
26
- end
27
-
28
- def lineno
29
- @lineno
30
- end
31
-
32
- def gets
33
- unless @buf.empty?
34
- @lineno += 1
35
- return @buf.pop
36
- end
37
- return nil if @eof_p # to avoid ARGF blocking.
38
- line = @input.gets
39
- @eof_p = true unless line
40
- @lineno += 1
41
- line
42
- end
43
-
44
- def ungets(line)
45
- return unless line
46
- @lineno -= 1
47
- @buf.push line
48
- line
49
- end
50
-
51
- def peek
52
- line = gets()
53
- ungets line if line
54
- line
55
- end
56
-
57
- def next?
58
- peek() ? true : false
59
- end
60
-
61
- def skip_blank_lines
62
- n = 0
63
- while line = gets()
64
- unless line.strip.empty?
65
- ungets line
66
- return n
67
- end
68
- n += 1
69
- end
70
- n
71
- end
72
-
73
- def gets_if(re)
74
- line = gets()
75
- if not line or not (re =~ line)
76
- ungets line
77
- return nil
78
- end
79
- line
80
- end
81
-
82
- def gets_unless(re)
83
- line = gets()
84
- if not line or re =~ line
85
- ungets line
86
- return nil
87
- end
88
- line
89
- end
90
-
91
- def each
92
- while line = gets()
93
- yield line
94
- end
95
- end
96
-
97
- def while_match(re)
98
- while line = gets()
99
- unless re =~ line
100
- ungets line
101
- return
102
- end
103
- yield line
104
- end
105
- nil
106
- end
107
-
108
- def getlines_while(re)
109
- buf = []
110
- while_match(re) do |line|
111
- buf.push line
112
- end
113
- buf
114
- end
115
-
116
- alias_method :span, :getlines_while # from Haskell
117
-
118
- def until_match(re)
119
- while line = gets()
120
- if re =~ line
121
- ungets line
122
- return
123
- end
124
- yield line
125
- end
126
- nil
127
- end
128
-
129
- def getlines_until(re)
130
- buf = []
131
- until_match(re) do |line|
132
- buf.push line
133
- end
134
- buf
135
- end
136
-
137
- alias_method :break, :getlines_until # from Haskell
138
-
139
- def until_terminator(re)
140
- while line = gets()
141
- return if re =~ line # discard terminal line
142
- yield line
143
- end
144
- nil
145
- end
146
-
147
- def getblock(term_re)
148
- buf = []
149
- until_terminator(term_re) do |line|
150
- buf.push line
151
- end
152
- buf
153
- end
154
-
155
- end
@@ -1,178 +0,0 @@
1
- # Copyright (c) 2009-2017 Minero Aoki, Kenshi Muto
2
- # 2002-2008 Minero Aoki
3
- #
4
- # This program is free software.
5
- # You can distribute or modify this program under the terms of
6
- # the GNU LGPL, Lesser General Public License version 2.1.
7
- # For details of the GNU LGPL, see the file "COPYING".
8
- #
9
- require 'review/textutils'
10
-
11
- module ReVIEW
12
- module Book
13
- module Compilable
14
- include TextUtils
15
- attr_reader :book
16
- attr_reader :path
17
- attr_accessor :content
18
-
19
- def dirname
20
- return nil unless @path
21
- File.dirname(@path)
22
- end
23
-
24
- def basename
25
- return nil unless @path
26
- File.basename(@path)
27
- end
28
-
29
- def name
30
- return nil unless @name
31
- File.basename(@name, '.*')
32
- end
33
-
34
- alias_method :id, :name
35
-
36
- def title
37
- return @title if @title
38
-
39
- @title = ''
40
- return @title unless content
41
- content.each_line do |line|
42
- if line =~ /\A=+/
43
- @title = line.sub(/\A=+(\[.+?\])?(\{.+?\})?/, '').strip
44
- break
45
- end
46
- end
47
- @title
48
- end
49
-
50
- def size
51
- content.size
52
- end
53
-
54
- def volume
55
- unless @volume
56
- @volume = Volume.count_file(path)
57
- @volume.page_per_kbyte = @book.page_metric.page_per_kbyte
58
- end
59
- @volume
60
- end
61
-
62
- def lines
63
- # FIXME: we cannot duplicate Enumerator on ruby 1.9 HEAD
64
- (@lines ||= content.lines.to_a).dup
65
- end
66
-
67
- def list(id)
68
- list_index[id]
69
- end
70
-
71
- def list_index
72
- @list_index ||= ListIndex.parse(lines)
73
- @list_index
74
- end
75
-
76
- def table(id)
77
- table_index[id]
78
- end
79
-
80
- def table_index
81
- @table_index ||= TableIndex.parse(lines)
82
- @table_index
83
- end
84
-
85
- def equation(id)
86
- equation_index[id]
87
- end
88
-
89
- def equation_index
90
- @equation_index ||= EquationIndex.parse(lines)
91
- @equation_index
92
- end
93
-
94
- def footnote(id)
95
- footnote_index[id]
96
- end
97
-
98
- def footnote_index
99
- @footnote_index ||= FootnoteIndex.parse(lines)
100
- @footnote_index
101
- end
102
-
103
- def image(id)
104
- return image_index[id] if image_index.key?(id)
105
- return icon_index[id] if icon_index.key?(id)
106
- return numberless_image_index[id] if numberless_image_index.key?(id)
107
- indepimage_index[id]
108
- end
109
-
110
- def numberless_image_index
111
- @numberless_image_index ||=
112
- NumberlessImageIndex.parse(lines, id,
113
- @book.imagedir,
114
- @book.image_types, @book.config['builder'])
115
- end
116
-
117
- def image_index
118
- @image_index ||= ImageIndex.parse(lines, id,
119
- @book.imagedir,
120
- @book.image_types, @book.config['builder'])
121
- @image_index
122
- end
123
-
124
- def icon_index
125
- @icon_index ||= IconIndex.parse(lines, id,
126
- @book.imagedir,
127
- @book.image_types, @book.config['builder'])
128
- @icon_index
129
- end
130
-
131
- def indepimage_index
132
- @indepimage_index ||=
133
- IndepImageIndex.parse(lines, id,
134
- @book.imagedir,
135
- @book.image_types, @book.config['builder'])
136
- end
137
-
138
- def bibpaper(id)
139
- bibpaper_index[id]
140
- end
141
-
142
- def bibpaper_index
143
- raise FileNotFound, "no such bib file: #{@book.bib_file}" unless @book.bib_exist?
144
- @bibpaper_index ||= BibpaperIndex.parse(@book.read_bib.lines.to_a)
145
- @bibpaper_index
146
- end
147
-
148
- def headline(caption)
149
- headline_index[caption]
150
- end
151
-
152
- def headline_index
153
- @headline_index ||= HeadlineIndex.parse(lines, self)
154
- end
155
-
156
- def column(id)
157
- column_index[id]
158
- end
159
-
160
- def column_index
161
- @column_index ||= ColumnIndex.parse(lines)
162
- end
163
-
164
- def next_chapter
165
- book.next_chapter(self)
166
- end
167
-
168
- def prev_chapter
169
- book.prev_chapter(self)
170
- end
171
-
172
- def image_bound?(item_id)
173
- item = self.image(item_id)
174
- item.path
175
- end
176
- end
177
- end
178
- end
@@ -1,275 +0,0 @@
1
- #
2
- # Copyright (c) 2008-2019 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, 'rt: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
- @chap = chap
35
- filename = chap.path
36
- while line = f.gets
37
- case line
38
- when /\A\#@/
39
- # do nothing
40
- next
41
- when /\A\s*\z/
42
- # do nothing
43
- next
44
- when /\A(={2,})[\[\s\{]/
45
- lev = $1.size
46
- if lev > 5
47
- error!(filename, f.lineno, "section level too deep: #{lev}")
48
- end
49
- label = get_label(line)
50
- if node_stack.empty?
51
- # missing chapter label
52
- dummy_chapter = Chapter.new(label, chap)
53
- node_stack.push(dummy_chapter)
54
- roots.push(dummy_chapter)
55
- end
56
- next if label.start_with?('[/') # ex) "[/column]"
57
- sec = Section.new(lev, label.gsub(/\A\{.*?\}\s?/, ''))
58
- node_stack.pop until node_stack.last.level < sec.level
59
- node_stack.last.add_child(sec)
60
- node_stack.push(sec)
61
-
62
- when /\A=[^=]/
63
- label = get_label(line)
64
- node_stack.clear
65
- new_chapter = Chapter.new(label, chap)
66
- node_stack.push(new_chapter)
67
- roots.push(new_chapter)
68
-
69
- when %r{\A//\w+(?:\[.*?\])*\{\s*\z}
70
- if node_stack.empty?
71
- error!(filename, f.lineno, 'list found before section label')
72
- end
73
- node_stack.last.add_child(list = List.new)
74
- beg = f.lineno
75
- list.add(line)
76
- while line = f.gets
77
- break if line.start_with?('//}')
78
- list.add(line)
79
- end
80
- error!(filename, beg, 'unterminated list') unless line
81
-
82
- when %r{\A//\w}
83
- # do nothing
84
- next
85
- else
86
- # if node_stack.empty?
87
- # error! filename, f.lineno, 'text found before section label'
88
- # end
89
- next if node_stack.empty?
90
- node_stack.last.add_child(par = Paragraph.new(chap))
91
- par.add(line)
92
- while line = f.gets
93
- break if /\A\s*\z/ =~ line
94
- par.add(line)
95
- end
96
- end
97
- end
98
-
99
- roots
100
- end
101
-
102
- def get_label(line)
103
- line = line.strip.sub(/\A=+\s*/, '')
104
- compile_label(line)
105
- end
106
-
107
- def compile_label(line)
108
- b = ReVIEW::TEXTBuilder.new
109
- dummy_book = ReVIEW::Book::Base.load
110
- dummy_chapter = ReVIEW::Book::Chapter.new(dummy_book, 1, '-', nil, StringIO.new)
111
- if @chap
112
- dummy_chapter = @chap
113
- end
114
- dummy_loc = Location.new('', StringIO.new)
115
- b.bind(ReVIEW::Compiler.new(b), dummy_chapter, dummy_loc)
116
- b.compile_inline(line)
117
- end
118
-
119
- def error!(filename, lineno, msg)
120
- raise "#{filename}:#{lineno}: #{msg}"
121
- end
122
-
123
- class Node
124
- def initialize(children = [])
125
- @children = children
126
- end
127
-
128
- attr_reader :children
129
-
130
- def add_child(c)
131
- @children.push(c)
132
- end
133
-
134
- def each_node(&block)
135
- @children.each do |c|
136
- yield c
137
- c.each(&block)
138
- end
139
- end
140
-
141
- def each_child(&block)
142
- @children.each(&block)
143
- end
144
-
145
- def chapter?
146
- false
147
- end
148
-
149
- def each_section(&block)
150
- @children.each { |n| n.yield_section(&block) }
151
- end
152
-
153
- def each_section_with_index
154
- i = 0
155
- each_section do |n|
156
- yield n, i
157
- i += 1
158
- end
159
- end
160
-
161
- def section_size
162
- cnt = 0
163
- @children.each { |n| n.yield_section { cnt += 1 } }
164
- cnt
165
- end
166
- end
167
-
168
- class Section < Node
169
- def initialize(level, label, path = nil)
170
- super()
171
- @level = level
172
- @label = label
173
- @filename = path ? real_filename(path) : nil
174
- end
175
-
176
- def real_filename(path)
177
- if FileTest.symlink?(path)
178
- File.basename(File.readlink(path))
179
- else
180
- File.basename(path)
181
- end
182
- end
183
- private :real_filename
184
-
185
- attr_reader :level
186
- attr_reader :label
187
-
188
- def estimated_lines
189
- @children.inject(0) { |sum, n| sum + n.estimated_lines }
190
- end
191
-
192
- def yield_section
193
- yield self
194
- end
195
-
196
- def inspect
197
- "#<#{self.class} level=#{@level} #{@label}>"
198
- end
199
- end
200
-
201
- class Chapter < Section
202
- def initialize(label, chap)
203
- super(1, label, chap.path)
204
- @chapter = chap
205
- @chapter_id = chap.id
206
- @path = chap.path
207
- @page_metric = chap.book.page_metric
208
- @volume = nil
209
- @number = nil
210
- end
211
-
212
- attr_accessor :number
213
-
214
- def chapter?
215
- true
216
- end
217
-
218
- attr_reader :chapter_id
219
-
220
- def volume
221
- return @volume if @volume
222
- @volume = @chapter.volume
223
- @volume.lines = estimated_lines
224
- @volume
225
- end
226
-
227
- def inspect
228
- "#<#{self.class} #{@filename}>"
229
- end
230
- end
231
-
232
- class Paragraph < Node
233
- def initialize(chap)
234
- @bytes = 0
235
- @page_metric = chap.book.page_metric
236
- end
237
-
238
- def inspect
239
- "#<#{self.class}>"
240
- end
241
-
242
- def add(line)
243
- @bytes += line.strip.bytesize
244
- end
245
-
246
- def estimated_lines
247
- (@bytes + 2) / @page_metric.text.n_columns + 1
248
- end
249
-
250
- def yield_section
251
- end
252
- end
253
-
254
- class List < Node
255
- def initialize
256
- @lines = 0
257
- end
258
-
259
- def inspect
260
- "#<#{self.class}>"
261
- end
262
-
263
- def add(_line)
264
- @lines += 1
265
- end
266
-
267
- def estimated_lines
268
- @lines + 2
269
- end
270
-
271
- def yield_section
272
- end
273
- end
274
- end
275
- end