review 3.2.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-tex.yml +31 -0
  3. data/.github/workflows/ruby-win.yml +45 -0
  4. data/.github/workflows/ruby.yml +27 -0
  5. data/.rubocop.yml +167 -42
  6. data/.travis.yml +1 -1
  7. data/Dockerfile +21 -5
  8. data/NEWS.ja.md +428 -1
  9. data/NEWS.md +429 -2
  10. data/README.md +11 -7
  11. data/Rakefile +7 -2
  12. data/appveyor.yml +0 -20
  13. data/bin/review +2 -4
  14. data/bin/review-catalog-converter +5 -5
  15. data/bin/review-check +13 -17
  16. data/bin/review-checkdep +3 -6
  17. data/bin/review-compile +13 -22
  18. data/bin/review-epub2html +1 -4
  19. data/bin/review-epubmaker +3 -4
  20. data/bin/review-idgxmlmaker +14 -0
  21. data/bin/review-index +5 -86
  22. data/bin/review-init +1 -4
  23. data/bin/review-pdfmaker +1 -3
  24. data/bin/review-preproc +11 -13
  25. data/bin/review-textmaker +1 -3
  26. data/bin/review-update +1 -4
  27. data/bin/review-validate +7 -7
  28. data/bin/review-vol +5 -82
  29. data/bin/review-webmaker +1 -3
  30. data/doc/config.yml.sample +67 -16
  31. data/doc/config.yml.sample-simple +4 -3
  32. data/doc/format.ja.md +133 -21
  33. data/doc/format.md +135 -34
  34. data/doc/makeindex.ja.md +2 -2
  35. data/doc/pdfmaker.ja.md +43 -1
  36. data/doc/pdfmaker.md +42 -1
  37. data/doc/quickstart.ja.md +55 -25
  38. data/doc/quickstart.md +47 -17
  39. data/lib/review.rb +1 -1
  40. data/lib/review/book.rb +2 -2
  41. data/lib/review/book/base.rb +89 -90
  42. data/lib/review/book/bib.rb +21 -0
  43. data/lib/review/book/book_unit.rb +158 -0
  44. data/lib/review/book/chapter.rb +51 -29
  45. data/lib/review/book/index.rb +42 -248
  46. data/lib/review/book/index/item.rb +46 -0
  47. data/lib/review/book/page_metric.rb +7 -7
  48. data/lib/review/book/part.rb +45 -10
  49. data/lib/review/book/volume.rb +5 -5
  50. data/lib/review/builder.rb +171 -54
  51. data/lib/review/call_hook.rb +20 -0
  52. data/lib/review/catalog.rb +15 -17
  53. data/lib/review/compiler.rb +240 -102
  54. data/lib/review/configure.rb +101 -12
  55. data/lib/review/converter.rb +1 -1
  56. data/lib/review/epub2html.rb +6 -1
  57. data/lib/review/epubmaker.rb +120 -118
  58. data/lib/review/epubmaker/content.rb +113 -0
  59. data/lib/review/epubmaker/epubcommon.rb +372 -0
  60. data/lib/review/epubmaker/epubv2.rb +178 -0
  61. data/lib/review/epubmaker/epubv3.rb +231 -0
  62. data/lib/review/epubmaker/producer.rb +168 -0
  63. data/lib/review/epubmaker/reviewheaderlistener.rb +12 -2
  64. data/lib/review/epubmaker/zip_exporter.rb +84 -0
  65. data/lib/review/exception.rb +6 -0
  66. data/lib/review/extentions/string.rb +0 -4
  67. data/lib/review/htmlbuilder.rb +147 -149
  68. data/lib/review/htmlutils.rb +10 -14
  69. data/lib/review/i18n.rb +4 -3
  70. data/lib/review/idgxmlbuilder.rb +229 -103
  71. data/lib/review/idgxmlmaker.rb +188 -0
  72. data/lib/review/img_math.rb +245 -0
  73. data/lib/review/index_builder.rb +654 -0
  74. data/lib/review/init-web/finish.html +10 -0
  75. data/lib/review/init-web/index.html +190 -0
  76. data/lib/review/init-web/review-layout-design.js +691 -0
  77. data/lib/review/init.rb +124 -41
  78. data/lib/review/latexbox.rb +58 -0
  79. data/lib/review/latexbuilder.rb +249 -97
  80. data/lib/review/latexutils.rb +9 -1
  81. data/lib/review/lineinput.rb +113 -3
  82. data/lib/review/logger.rb +43 -8
  83. data/lib/review/makerhelper.rb +13 -186
  84. data/lib/review/markdownbuilder.rb +75 -39
  85. data/lib/review/md2inaobuilder.rb +3 -5
  86. data/lib/review/pdfmaker.rb +88 -83
  87. data/lib/review/plaintextbuilder.rb +158 -83
  88. data/lib/review/preprocessor.rb +30 -24
  89. data/lib/review/rstbuilder.rb +58 -39
  90. data/lib/review/sec_counter.rb +14 -0
  91. data/lib/review/template.rb +6 -0
  92. data/lib/review/textmaker.rb +29 -17
  93. data/lib/review/textutils.rb +68 -2
  94. data/lib/review/tocprinter.rb +242 -97
  95. data/lib/review/topbuilder.rb +147 -61
  96. data/lib/review/update.rb +27 -28
  97. data/lib/review/version.rb +1 -1
  98. data/lib/review/volumeprinter.rb +97 -0
  99. data/lib/review/webmaker.rb +36 -35
  100. data/lib/review/webtocprinter.rb +39 -35
  101. data/lib/review/yamlloader.rb +4 -0
  102. data/review.gemspec +8 -5
  103. data/samples/sample-book/README.md +7 -2
  104. data/samples/sample-book/src/.gitignore +154 -0
  105. data/samples/sample-book/src/config-ebook.yml +4 -0
  106. data/samples/sample-book/src/config-epub2.yml +1 -1
  107. data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
  108. data/samples/sample-book/src/config-jlreq.yml +6 -0
  109. data/samples/sample-book/src/config.yml +3 -3
  110. data/samples/sample-book/src/lib/tasks/review.rake +45 -14
  111. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  112. data/samples/syntax-book/Gemfile +1 -1
  113. data/samples/syntax-book/ch01.re +3 -1
  114. data/samples/syntax-book/ch02.re +28 -21
  115. data/samples/syntax-book/ch03.re +4 -7
  116. data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
  117. data/samples/syntax-book/config-jlreq.yml +5 -0
  118. data/samples/syntax-book/config-print.yml +3 -0
  119. data/samples/syntax-book/config.yml +1 -1
  120. data/samples/syntax-book/images/img3-2.png +0 -0
  121. data/samples/syntax-book/lib/tasks/review.rake +30 -15
  122. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  123. data/templates/html/_colophon.html.erb +23 -0
  124. data/templates/html/_colophon_history.html.erb +9 -0
  125. data/templates/html/_cover.html.erb +10 -0
  126. data/templates/html/_part_body.html.erb +6 -0
  127. data/templates/html/_titlepage.html.erb +20 -0
  128. data/templates/html/layout-html5.html.erb +6 -0
  129. data/templates/html/layout-xhtml1.html.erb +6 -0
  130. data/templates/latex/config.erb +45 -27
  131. data/templates/latex/layout.tex.erb +1 -0
  132. data/templates/latex/review-jlreq/README.md +3 -1
  133. data/templates/latex/review-jlreq/review-base.sty +124 -37
  134. data/templates/latex/review-jlreq/review-jlreq.cls +29 -22
  135. data/templates/latex/review-jlreq/review-style.sty +9 -1
  136. data/templates/latex/review-jlreq/review-tcbox.sty +348 -0
  137. data/templates/latex/review-jlreq/reviewmacro.sty +5 -0
  138. data/templates/latex/review-jsbook/README.md +46 -5
  139. data/templates/latex/review-jsbook/review-base.sty +111 -30
  140. data/templates/latex/review-jsbook/review-jsbook.cls +16 -2
  141. data/templates/latex/review-jsbook/review-style.sty +10 -2
  142. data/templates/latex/review-jsbook/review-tcbox.sty +348 -0
  143. data/templates/latex/review-jsbook/reviewmacro.sty +5 -0
  144. data/templates/opf/epubv2.opf.erb +7 -7
  145. data/templates/opf/epubv3.opf.erb +7 -7
  146. data/templates/opf/opf_manifest_epubv2.opf.erb +10 -0
  147. data/templates/opf/opf_manifest_epubv3.opf.erb +10 -0
  148. data/templates/opf/opf_metainfo_epubv2.opf.erb +17 -0
  149. data/templates/opf/opf_metainfo_epubv3.opf.erb +49 -0
  150. data/templates/opf/opf_tocx_epubv2.opf.erb +9 -0
  151. data/templates/opf/opf_tocx_epubv3.opf.erb +17 -0
  152. data/templates/web/html/layout-html5.html.erb +9 -8
  153. data/templates/web/html/layout-xhtml1.html.erb +6 -0
  154. data/test/assets/header_listener.html +35 -0
  155. data/test/assets/img_math/img1.png +0 -0
  156. data/test/assets/img_math/img2.png +0 -0
  157. data/test/assets/img_math/img3.png +0 -0
  158. data/test/assets/syntax_book_index_detail.txt +58 -0
  159. data/test/assets/test_template.tex +20 -9
  160. data/test/assets/test_template_backmatter.tex +20 -9
  161. data/test/book_test_helper.rb +11 -5
  162. data/test/run_test.rb +1 -1
  163. data/test/test_book.rb +123 -78
  164. data/test/test_book_chapter.rb +99 -56
  165. data/test/test_book_part.rb +3 -3
  166. data/test/test_builder.rb +24 -15
  167. data/test/test_catalog.rb +19 -42
  168. data/test/test_catalog_converter_cmd.rb +1 -1
  169. data/test/test_converter.rb +1 -0
  170. data/test/test_epub3maker.rb +170 -126
  171. data/test/test_epubmaker.rb +249 -129
  172. data/test/test_epubmaker_cmd.rb +16 -9
  173. data/test/test_helper.rb +23 -11
  174. data/test/test_htmlbuilder.rb +1083 -114
  175. data/test/test_htmlutils.rb +0 -12
  176. data/test/test_i18n.rb +37 -37
  177. data/test/test_idgxmlbuilder.rb +627 -27
  178. data/test/test_idgxmlmaker_cmd.rb +50 -0
  179. data/test/test_image_finder.rb +52 -70
  180. data/test/test_img_math.rb +111 -0
  181. data/test/test_index.rb +62 -52
  182. data/test/test_indexbuilder.rb +52 -0
  183. data/test/test_latexbuilder.rb +1189 -59
  184. data/test/test_latexbuilder_v2.rb +74 -34
  185. data/test/test_lineinput.rb +20 -93
  186. data/test/test_logger.rb +17 -4
  187. data/test/test_makerhelper.rb +2 -14
  188. data/test/test_markdownbuilder.rb +77 -4
  189. data/test/test_md2inaobuilder.rb +12 -2
  190. data/test/test_pdfmaker.rb +101 -12
  191. data/test/test_pdfmaker_cmd.rb +102 -8
  192. data/test/test_plaintextbuilder.rb +562 -31
  193. data/test/test_review_ext.rb +2 -1
  194. data/test/test_reviewheaderlistener.rb +49 -0
  195. data/test/test_rstbuilder.rb +58 -5
  196. data/test/test_sec_counter.rb +156 -0
  197. data/test/test_template.rb +12 -2
  198. data/test/test_textmaker_cmd.rb +58 -0
  199. data/test/test_textutils.rb +109 -2
  200. data/test/test_tocprinter.rb +46 -0
  201. data/test/test_topbuilder.rb +400 -17
  202. data/test/test_update.rb +53 -44
  203. data/test/test_webtocprinter.rb +75 -43
  204. data/test/test_yamlloader.rb +13 -0
  205. data/test/test_zip_exporter.rb +5 -6
  206. data/vendor/gentombow/LICENSE +1 -1
  207. data/vendor/gentombow/Makefile +0 -1
  208. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  209. data/vendor/gentombow/bounddvi-en.tex +1 -0
  210. data/vendor/gentombow/bounddvi.pdf +0 -0
  211. data/vendor/gentombow/bounddvi.sty +30 -7
  212. data/vendor/gentombow/bounddvi.tex +1 -0
  213. data/vendor/gentombow/create_archive.sh +1 -0
  214. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  215. data/vendor/gentombow/gentombow-ja.tex +9 -0
  216. data/vendor/gentombow/gentombow.pdf +0 -0
  217. data/vendor/gentombow/gentombow.sty +32 -10
  218. data/vendor/gentombow/gentombow.tex +8 -0
  219. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  220. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  221. data/vendor/jsclasses/LICENSE +1 -1
  222. data/vendor/jsclasses/Makefile +3 -2
  223. data/vendor/jsclasses/create_archive.sh +5 -5
  224. data/vendor/jsclasses/jis/Makefile +3 -2
  225. data/vendor/jsclasses/jis/jsarticle.cls +74 -31
  226. data/vendor/jsclasses/jis/jsbook.cls +74 -31
  227. data/vendor/jsclasses/jis/jsclasses.dtx +176 -36
  228. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  229. data/vendor/jsclasses/jis/jslogo.dtx +4 -4
  230. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  231. data/vendor/jsclasses/jis/jslogo.sty +4 -16
  232. data/vendor/jsclasses/jis/jspf.cls +73 -30
  233. data/vendor/jsclasses/jis/jsreport.cls +74 -31
  234. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  235. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  236. data/vendor/jsclasses/jis/kiyou.cls +74 -31
  237. data/vendor/jsclasses/jis/minijs.sty +65 -22
  238. data/vendor/jsclasses/jis/okumacro.dtx +4 -5
  239. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  240. data/vendor/jsclasses/jis/okumacro.sty +4 -17
  241. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  242. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  243. data/vendor/jsclasses/jis/winjis.sty +23 -19
  244. data/vendor/jsclasses/jsarticle.cls +74 -31
  245. data/vendor/jsclasses/jsbook.cls +74 -31
  246. data/vendor/jsclasses/jsclasses.dtx +176 -36
  247. data/vendor/jsclasses/jsclasses.ins +15 -5
  248. data/vendor/jsclasses/jsclasses.pdf +0 -0
  249. data/vendor/jsclasses/jslogo.dtx +4 -4
  250. data/vendor/jsclasses/jslogo.ins +9 -0
  251. data/vendor/jsclasses/jslogo.pdf +0 -0
  252. data/vendor/jsclasses/jslogo.sty +4 -16
  253. data/vendor/jsclasses/jspf.cls +73 -30
  254. data/vendor/jsclasses/jsreport.cls +74 -31
  255. data/vendor/jsclasses/jsverb.ins +9 -0
  256. data/vendor/jsclasses/jsverb.pdf +0 -0
  257. data/vendor/jsclasses/jsverb.sty +1 -13
  258. data/vendor/jsclasses/kiyou.cls +74 -31
  259. data/vendor/jsclasses/minijs.sty +68 -22
  260. data/vendor/jsclasses/okumacro.dtx +4 -5
  261. data/vendor/jsclasses/okumacro.ins +9 -0
  262. data/vendor/jsclasses/okumacro.pdf +0 -0
  263. data/vendor/jsclasses/okumacro.sty +4 -17
  264. data/vendor/jsclasses/okuverb.ins +9 -0
  265. data/vendor/jsclasses/okuverb.pdf +0 -0
  266. data/vendor/jsclasses/okuverb.sty +1 -13
  267. data/vendor/jsclasses/tests/relfont.tex +10 -0
  268. data/vendor/jsclasses/winjis.sty +23 -19
  269. metadata +136 -23
  270. data/.rubocop_todo.yml +0 -7
  271. data/lib/epubmaker.rb +0 -23
  272. data/lib/epubmaker/content.rb +0 -110
  273. data/lib/epubmaker/epubcommon.rb +0 -441
  274. data/lib/epubmaker/epubv2.rb +0 -143
  275. data/lib/epubmaker/epubv3.rb +0 -233
  276. data/lib/epubmaker/producer.rb +0 -375
  277. data/lib/epubmaker/zip_exporter.rb +0 -81
  278. data/lib/lineinput.rb +0 -155
  279. data/lib/review/book/compilable.rb +0 -173
  280. data/lib/review/tocparser.rb +0 -271
  281. data/samples/syntax-book/review-ext.rb +0 -14
  282. 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,173 +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
- end
172
- end
173
- end
@@ -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