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
@@ -35,6 +35,12 @@ body {
35
35
  -epub-writing-mode: vertical-rl;
36
36
  writing-mode: tb-rl;
37
37
  }
38
+
39
+ span.tcy {
40
+ -webkit-text-combine: horizontal;
41
+ -ms-text-combine-horizontal: all;
42
+ text-combine-upright: all;
43
+ }
38
44
  ```
39
45
 
40
46
  また、縦書きの書籍は通常、「左開き」(右ページから左ページへ進む)となるので、config.yml の direction パラメータを設定します。
data/lib/review.rb CHANGED
@@ -1,3 +1,3 @@
1
- Dir["#{File.dirname(__FILE__)}/review/*.rb"].sort.each do |path|
1
+ Dir["#{__dir__}/review/*.rb"].sort.each do |path|
2
2
  require "review/#{File.basename(path, '.rb')}"
3
3
  end
data/lib/review/book.rb CHANGED
@@ -18,8 +18,8 @@ require 'review/book/index'
18
18
 
19
19
  module ReVIEW
20
20
  module Book
21
- def self.load(dir)
22
- Base.load(dir)
21
+ def self.load(_dir)
22
+ raise NotImplementedError, 'ReVIEW::Book.load is obsoleted. Please use ReVIEW::Book::Base.new.'
23
23
  end
24
24
  end
25
25
  end
@@ -9,26 +9,34 @@
9
9
  #
10
10
  require 'review/configure'
11
11
  require 'review/catalog'
12
+ require 'review/book/bib'
12
13
 
13
14
  module ReVIEW
14
15
  module Book
15
16
  class Base
16
17
  attr_accessor :config
17
18
  attr_writer :parts
18
- attr_writer :catalog
19
+ attr_accessor :catalog
19
20
  attr_reader :basedir
21
+ attr_accessor :bibpaper_index
20
22
 
21
- def self.load(dir = '.')
22
- new(dir)
23
+ def self.load(basedir = '.', config: nil)
24
+ new(basedir, config: config)
23
25
  end
24
26
 
25
- def initialize(basedir = '.')
27
+ def initialize(basedir = '.', config: nil)
26
28
  @basedir = basedir
27
29
  @logger = ReVIEW.logger
28
30
  @parts = nil
29
31
  @chapter_index = nil
30
- @config = ReVIEW::Configure.values
32
+ @config = config || ReVIEW::Configure.values
31
33
  @catalog = nil
34
+ @bibpaper_index = nil
35
+ catalog_path = filename_join(@basedir, @config['catalogfile'])
36
+ if catalog_path && File.file?(catalog_path)
37
+ parse_catalog_file(catalog_path)
38
+ end
39
+
32
40
  @warn_old_files = {} # XXX for checking CHAPS, PREDEF, POSTDEF
33
41
  @basedir_seen = {}
34
42
  update_rubyenv
@@ -44,6 +52,14 @@ module ReVIEW
44
52
  end
45
53
  end
46
54
 
55
+ def execute_indexer
56
+ return unless @catalog
57
+
58
+ parts.each do |part|
59
+ part.chapters.each(&:execute_indexer)
60
+ end
61
+ end
62
+
47
63
  def bib_file
48
64
  config['bib_file']
49
65
  end
@@ -79,7 +95,7 @@ module ReVIEW
79
95
  def page_metric
80
96
  if config['page_metric'].respond_to?(:downcase) && config['page_metric'].upcase =~ /\A[A-Z0-9_]+\Z/
81
97
  ReVIEW::Book::PageMetric.const_get(config['page_metric'].upcase)
82
- elsif config['page_metric'].is_a?(Array) && config['page_metric'].size == 5
98
+ elsif config['page_metric'].is_a?(Array) && (config['page_metric'].size == 5 || config['page_metric'].size == 4)
83
99
  ReVIEW::Book::PageMetric.new(*config['page_metric'])
84
100
  else
85
101
  config['page_metric']
@@ -94,6 +110,30 @@ module ReVIEW
94
110
  end
95
111
  end
96
112
 
113
+ def create_chapter_index
114
+ chapter_index = ChapterIndex.new
115
+ each_chapter do |chap|
116
+ chapter_index.add_item(Index::Item.new(chap.id, chap.number, chap))
117
+ end
118
+ parts.each do |prt|
119
+ if prt.id.present?
120
+ chapter_index.add_item(Index::Item.new(prt.id, prt.number, prt))
121
+ end
122
+ end
123
+ chapter_index
124
+ end
125
+
126
+ def generate_indexes
127
+ if bib_exist?
128
+ bib = ReVIEW::Book::Bib.new(file_content: bib_content, book: self)
129
+ bib.generate_indexes(use_bib: true)
130
+ @bibpaper_index = bib.bibpaper_index
131
+ end
132
+ self.each_chapter(&:generate_indexes)
133
+ self.parts.map(&:generate_indexes)
134
+ @chapter_index = create_chapter_index
135
+ end
136
+
97
137
  def parts
98
138
  @parts ||= read_parts
99
139
  end
@@ -101,7 +141,7 @@ module ReVIEW
101
141
  def parts_in_file
102
142
  # TODO: should be `parts.find_all{|part| part.present? and part.file?}` ?
103
143
  parts.find_all do |part|
104
- part if part.present? and part.file?
144
+ part if part.present? && part.file?
105
145
  end
106
146
  end
107
147
 
@@ -136,15 +176,8 @@ module ReVIEW
136
176
 
137
177
  def chapter_index
138
178
  return @chapter_index if @chapter_index
139
- @chapter_index = ChapterIndex.new
140
- each_chapter do |chap|
141
- @chapter_index.add_item(Index::Item.new(chap.id, chap.number, chap))
142
- end
143
- parts.each do |prt|
144
- if prt.id.present?
145
- @chapter_index.add_item(Index::Item.new(prt.id, prt.number, prt))
146
- end
147
- end
179
+
180
+ @chapter_index = create_chapter_index
148
181
  @chapter_index
149
182
  end
150
183
 
@@ -156,6 +189,7 @@ module ReVIEW
156
189
  finded = false
157
190
  each_chapter do |c|
158
191
  return c if finded
192
+
159
193
  if c == chapter
160
194
  finded = true
161
195
  end
@@ -167,6 +201,7 @@ module ReVIEW
167
201
  finded = false
168
202
  each_chapter_r do |c|
169
203
  return c if finded
204
+
170
205
  if c == chapter
171
206
  finded = true
172
207
  end
@@ -175,9 +210,7 @@ module ReVIEW
175
210
  end
176
211
 
177
212
  def volume
178
- vol = Volume.sum(chapters.map(&:volume))
179
- vol.page_per_kbyte = page_metric.page_per_kbyte
180
- vol
213
+ Volume.sum(parts.map(&:volume) + chapters.map(&:volume))
181
214
  end
182
215
 
183
216
  def load_config(filename)
@@ -185,17 +218,15 @@ module ReVIEW
185
218
  @config.merge!(new_conf)
186
219
  end
187
220
 
188
- def catalog
189
- return @catalog if @catalog.present?
190
-
191
- catalogfile_path = filename_join(@basedir, config['catalogfile'])
192
- if File.file?(catalogfile_path)
193
- @catalog = File.open(catalogfile_path, 'rt:BOM|utf-8') { |f| Catalog.new(f) }
221
+ def parse_catalog_file(path)
222
+ unless File.file?(path)
223
+ raise FileNotFound, "catalog.yml is not found #{path}"
194
224
  end
195
- if @catalog
225
+
226
+ File.open(path, 'rt:BOM|utf-8') do |f|
227
+ @catalog = Catalog.new(f)
196
228
  @catalog.validate!(@config, basedir)
197
229
  end
198
- @catalog
199
230
  end
200
231
 
201
232
  def read_chaps
@@ -254,6 +285,10 @@ module ReVIEW
254
285
  File.exist?(File.join(contentdir, bib_file))
255
286
  end
256
287
 
288
+ def bib_content
289
+ File.read(File.join(contentdir, bib_file))
290
+ end
291
+
257
292
  def prefaces
258
293
  if catalog
259
294
  return Part.mkpart_from_namelist(self, catalog.predef)
@@ -335,8 +370,8 @@ module ReVIEW
335
370
  end
336
371
  end
337
372
 
338
- chap = read_chaps.map(&:strip).join("\n").split(/\n{2,}/).
339
- map do |part_chunk|
373
+ # rubocop:disable Style/RedundantAssignment
374
+ chap = read_chaps.map(&:strip).join("\n").split(/\n{2,}/).map do |part_chunk|
340
375
  chaps = part_chunk.split.map { |chapid| Chapter.new(self, num += 1, chapid, File.join(contentdir, chapid)) }
341
376
  if part_exist? && read_part.size > part
342
377
  Part.new(self, part += 1, chaps, read_part[part - 1])
@@ -344,6 +379,8 @@ module ReVIEW
344
379
  Part.new(self, nil, chaps)
345
380
  end
346
381
  end
382
+ # rubocop:enable Style/RedundantAssignment
383
+
347
384
  chap
348
385
  end
349
386
 
@@ -358,6 +395,7 @@ module ReVIEW
358
395
  File.open(filename_join(@basedir, filename), 'rt:BOM|utf-8') do |f|
359
396
  f.each_line do |line|
360
397
  next if line.start_with?('#')
398
+
361
399
  line.gsub!(/#.*\Z/, '')
362
400
  res << line
363
401
  end
@@ -0,0 +1,21 @@
1
+ #
2
+ # Copyright (c) 2009-2020 Minero Aoki, Kenshi Muto
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/book/book_unit'
10
+ require 'review/lineinput'
11
+ require 'review/preprocessor'
12
+
13
+ module ReVIEW
14
+ module Book
15
+ class Bib < BookUnit
16
+ def number
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,158 @@
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
+ require 'review/index_builder'
11
+
12
+ module ReVIEW
13
+ module Book
14
+ class BookUnit
15
+ include TextUtils
16
+ attr_reader :book
17
+ attr_reader :path
18
+ attr_reader :lines
19
+ attr_accessor :content
20
+
21
+ attr_reader :list_index, :table_index, :equation_index, :footnote_index,
22
+ :numberless_image_index, :image_index, :icon_index, :indepimage_index,
23
+ :headline_index, :column_index
24
+
25
+ def initialize(file_content: nil, book: nil)
26
+ if book
27
+ @book = book
28
+ end
29
+ if file_content
30
+ @content = file_content
31
+ end
32
+ if @content
33
+ @lines = @content.lines
34
+ end
35
+ end
36
+
37
+ def execute_indexer(force: false)
38
+ if @index_builder && !force
39
+ return @index_builder
40
+ end
41
+
42
+ @index_builder = ReVIEW::IndexBuilder.new
43
+ compiler = ReVIEW::Compiler.new(@index_builder)
44
+ compiler.compile(self)
45
+ @index_builder
46
+ end
47
+
48
+ def generate_indexes(use_bib: false)
49
+ return unless content
50
+
51
+ @lines = content.lines
52
+
53
+ @indexes = execute_indexer
54
+
55
+ @list_index = @indexes.list_index
56
+ @table_index = @indexes.table_index
57
+ @equation_index = @indexes.equation_index
58
+ @footnote_index = @indexes.footnote_index
59
+ @headline_index = @indexes.headline_index
60
+ @column_index = @indexes.column_index
61
+ if use_bib
62
+ @book.bibpaper_index = @indexes.bibpaper_index
63
+ end
64
+ end
65
+
66
+ def dirname
67
+ @path && File.dirname(@path)
68
+ end
69
+
70
+ def basename
71
+ @path && File.basename(@path)
72
+ end
73
+
74
+ def name
75
+ @name && File.basename(@name, '.*')
76
+ end
77
+
78
+ alias_method :id, :name
79
+
80
+ def title
81
+ return @title if @title
82
+
83
+ @title = ''
84
+ return @title unless content
85
+
86
+ content.each_line do |line|
87
+ if line =~ /\A=+/
88
+ @title = line.sub(/\A=+(\[.+?\])?(\{.+?\})?/, '').strip
89
+ break
90
+ end
91
+ end
92
+ @title
93
+ end
94
+
95
+ def size
96
+ content.size
97
+ end
98
+
99
+ def volume
100
+ @volume ||= Volume.count_file(path)
101
+ end
102
+
103
+ def list(id)
104
+ list_index[id]
105
+ end
106
+
107
+ def table(id)
108
+ table_index[id]
109
+ end
110
+
111
+ def equation(id)
112
+ equation_index[id]
113
+ end
114
+
115
+ def footnote(id)
116
+ footnote_index[id]
117
+ end
118
+
119
+ def image(id)
120
+ return image_index[id] if image_index.key?(id)
121
+ return icon_index[id] if icon_index.key?(id)
122
+ return numberless_image_index[id] if numberless_image_index.key?(id)
123
+
124
+ indepimage_index[id]
125
+ end
126
+
127
+ def bibpaper(id)
128
+ bibpaper_index[id]
129
+ end
130
+
131
+ def bibpaper_index
132
+ raise FileNotFound, "no such bib file: #{@book.bib_file}" unless @book.bib_exist?
133
+
134
+ @book.bibpaper_index
135
+ end
136
+
137
+ def headline(caption)
138
+ headline_index[caption]
139
+ end
140
+
141
+ def column(id)
142
+ column_index[id]
143
+ end
144
+
145
+ def next_chapter
146
+ book.next_chapter(self)
147
+ end
148
+
149
+ def prev_chapter
150
+ book.prev_chapter(self)
151
+ end
152
+
153
+ def image_bound?(item_id)
154
+ image(item_id).path
155
+ end
156
+ end
157
+ end
158
+ end
@@ -7,21 +7,20 @@
7
7
  # the GNU LGPL, Lesser General Public License version 2.1.
8
8
  # For details of the GNU LGPL, see the file "COPYING".
9
9
  #
10
- require 'review/book/compilable'
10
+ require 'review/book/book_unit'
11
11
  require 'review/lineinput'
12
12
  require 'review/preprocessor'
13
13
 
14
14
  module ReVIEW
15
15
  module Book
16
- class Chapter
17
- include Compilable
18
-
16
+ class Chapter < BookUnit
19
17
  attr_reader :number, :book
20
18
 
21
19
  def self.mkchap(book, name, number = nil)
22
20
  name += book.ext if File.extname(name).empty?
23
21
  path = File.join(book.contentdir, name)
24
22
  raise FileNotFound, "file not exist: #{path}" unless File.file?(path)
23
+
25
24
  Chapter.new(book, number, name, path)
26
25
  end
27
26
 
@@ -53,35 +52,43 @@ module ReVIEW
53
52
  @content = File.read(@path, mode: 'rt:BOM|utf-8')
54
53
  @number = nil if %w[nonum nodisp notoc].include?(find_first_header_option)
55
54
  end
56
- @list_index = nil
57
- @table_index = nil
58
- @equation_index = nil
59
- @footnote_index = nil
60
- @image_index = nil
61
- @icon_index = nil
62
- @numberless_image_index = nil
63
- @indepimage_index = nil
64
- @headline_index = nil
65
- @column_index = nil
66
- @volume = nil
55
+
56
+ super()
57
+ end
58
+
59
+ def generate_indexes
60
+ super
61
+
62
+ return unless content
63
+
64
+ @numberless_image_index = @indexes.numberless_image_index
65
+ @image_index = @indexes.image_index
66
+ @icon_index = @indexes.icon_index
67
+ @indepimage_index = @indexes.indepimage_index
67
68
  end
68
69
 
69
70
  def find_first_header_option
70
71
  f = LineInput.new(StringIO.new(@content))
71
- while f.next?
72
- case f.peek
73
- when /\A=+[\[\s\{]/
74
- m = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/.match(f.gets)
75
- return m[2] # tag
76
- when %r{/\A//[a-z]+/}
77
- line = f.gets
78
- if line.rstrip[-1, 1] == '{'
79
- f.until_match(%r{\A//\}})
72
+ begin
73
+ while f.next?
74
+ case f.peek
75
+ when /\A=+[\[\s{]/
76
+ m = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/.match(f.gets)
77
+ return m[2] # tag
78
+ when %r{/\A//[a-z]+/}
79
+ line = f.gets
80
+ if line.rstrip[-1, 1] == '{'
81
+ f.until_match(%r{\A//\}})
82
+ end
80
83
  end
84
+ f.gets
81
85
  end
82
- f.gets
86
+ nil
87
+ rescue ArgumentError => e
88
+ raise ReVIEW::CompileError, "#{@name}: #{e}"
89
+ rescue SyntaxError => e
90
+ raise ReVIEW::SyntaxError, "#{@name}:#{f.lineno}: #{e}"
83
91
  end
84
- nil
85
92
  end
86
93
 
87
94
  def inspect