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,233 +0,0 @@
1
- # = epubv3.rb -- EPUB version 3 producer.
2
- #
3
- # Copyright (c) 2010-2017 Kenshi Muto
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 'epubmaker/epubcommon'
12
- require 'epubmaker/zip_exporter'
13
-
14
- module EPUBMaker
15
- # EPUBv3 is EPUB version 3 producer.
16
- class EPUBv3 < EPUBCommon
17
- # Construct object with parameter hash +config+ and message resource hash +res+.
18
- def initialize(producer)
19
- super
20
- @opf_prefix = {}
21
- if @producer.config['opf_prefix'].present?
22
- @producer.config['opf_prefix'].each { |k, v| @opf_prefix[k] = v }
23
- end
24
- end
25
-
26
- # Return opf file content.
27
- def opf
28
- @opf_metainfo = opf_metainfo
29
- @opf_coverimage = opf_coverimage
30
- @opf_manifest = opf_manifest
31
- @opf_toc = opf_tocx
32
- @package_attrs = ''
33
-
34
- if @opf_prefix && @opf_prefix.size > 0
35
- prefixes_str = @opf_prefix.map { |k, v| %Q(#{k}: #{v}) }.join(' ')
36
- @package_attrs << %Q( prefix="#{prefixes_str}")
37
- end
38
-
39
- tmplfile = File.expand_path('./opf/epubv3.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
40
- ReVIEW::Template.load(tmplfile).result(binding)
41
- end
42
-
43
- def opf_metainfo
44
- s = ''
45
- %w[title language date type format source description relation coverage subject rights].each do |item|
46
- next unless @producer.config[item]
47
- if @producer.config[item].is_a?(Array)
48
- @producer.config[item].each_with_index do |v, i|
49
- if v.is_a?(Hash)
50
- s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:#{item}>\n)
51
- v.each_pair do |name, val|
52
- next if name == 'name'
53
- s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
54
- end
55
- else
56
- s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n)
57
- end
58
- end
59
- elsif @producer.config[item].is_a?(Hash)
60
- s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item]['name'])}</dc:#{item}>\n)
61
- @producer.config[item].each_pair do |name, val|
62
- next if name == 'name'
63
- s << %Q( <meta refines="##{item}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
64
- end
65
- else
66
- s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item].to_s)}</dc:#{item}>\n)
67
- end
68
- end
69
-
70
- s << %Q( <meta property="dcterms:modified">#{@producer.config['modified']}</meta>\n)
71
-
72
- # ID
73
- if @producer.config['isbn'].nil?
74
- s << %Q( <dc:identifier id="BookId">#{@producer.config['urnid']}</dc:identifier>\n)
75
- else
76
- s << %Q( <dc:identifier id="BookId">#{@producer.config['isbn']}</dc:identifier>\n)
77
- end
78
-
79
- # creator (should be array)
80
- %w[a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-csl a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl aut].each do |role|
81
- next unless @producer.config[role]
82
- @producer.config[role].each_with_index do |v, i|
83
- if v.is_a?(Hash)
84
- s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:creator>\n)
85
- s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
86
- v.each_pair do |name, val|
87
- next if name == 'name'
88
- s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
89
- end
90
- else
91
- s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n)
92
- s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
93
- end
94
- end
95
- end
96
-
97
- # contributor (should be array)
98
- %w[adp ann arr art asn aqt aft aui ant bkp clb cmm csl dsr edt ill lyr mdc mus nrt oth pbd pbl pht prt red rev spn ths trc trl].each do |role|
99
- next unless @producer.config[role]
100
- @producer.config[role].each_with_index do |v, i|
101
- if v.is_a?(Hash)
102
- s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:contributor>\n)
103
- s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
104
- v.each_pair do |name, val|
105
- next if name == 'name'
106
- s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
107
- end
108
- else
109
- s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n)
110
- s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
111
- end
112
-
113
- if %w[prt pbl].include?(role)
114
- if v.is_a?(Hash)
115
- s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:publisher>\n)
116
- s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
117
- v.each_pair do |name, val|
118
- next if name == 'name'
119
- s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
120
- end
121
- else
122
- s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:publisher>\n)
123
- s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">prt</meta>\n)
124
- end
125
- end
126
- end
127
- end
128
-
129
- ## add custom <meta> element
130
- if @producer.config['opf_meta'].present?
131
- @producer.config['opf_meta'].each do |k, v|
132
- s << %Q( <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n)
133
- end
134
- end
135
-
136
- s
137
- end
138
-
139
- def opf_manifest
140
- s = ''
141
- s << <<EOT
142
- <manifest>
143
- <item properties="nav" id="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" href="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" media-type="application/xhtml+xml"/>
144
- <item id="#{@producer.config['bookname']}" href="#{@producer.config['cover']}" media-type="application/xhtml+xml"/>
145
- EOT
146
-
147
- if @producer.config['coverimage']
148
- @producer.contents.each do |item|
149
- next if !item.media.start_with?('image') || File.basename(item.file) != @producer.config['coverimage']
150
- s << %Q( <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n)
151
- item.id = nil
152
- break
153
- end
154
- end
155
-
156
- @producer.contents.each do |item|
157
- next if item.file =~ /#/ || item.id.nil? # skip subgroup, or id=nil (for cover)
158
- propstr = ''
159
- if item.properties.size > 0
160
- propstr = %Q( properties="#{item.properties.sort.uniq.join(' ')}")
161
- end
162
- s << %Q( <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"#{propstr}/>\n)
163
- end
164
- s << %Q( </manifest>\n)
165
-
166
- s
167
- end
168
-
169
- def opf_tocx
170
- if @producer.config['epubmaker']['cover_linear'] && @producer.config['epubmaker']['cover_linear'] != 'no'
171
- cover_linear = 'yes'
172
- else
173
- cover_linear = 'no'
174
- end
175
-
176
- s = ''
177
- if @producer.config['direction']
178
- s << %Q( <spine page-progression-direction="#{@producer.config['direction']}">\n)
179
- else
180
- s << %Q( <spine>\n)
181
- end
182
- s << %Q( <itemref idref="#{@producer.config['bookname']}" linear="#{cover_linear}"/>\n)
183
-
184
- toc = nil
185
- @producer.contents.each do |item|
186
- next if item.media !~ /xhtml\+xml/ # skip non XHTML
187
- if toc.nil? && item.chaptype != 'pre'
188
- if @producer.config['toc']
189
- s << %Q( <itemref idref="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" />\n)
190
- end
191
- toc = true
192
- end
193
- s << %Q( <itemref idref="#{item.id}"/>\n)
194
- end
195
- s << %Q( </spine>\n)
196
-
197
- s
198
- end
199
-
200
- def ncx(indentarray)
201
- ncx_main = if @producer.config['epubmaker']['flattoc'].nil?
202
- hierarchy_ncx('ol')
203
- else
204
- flat_ncx('ol', @producer.config['epubmaker']['flattocindent'])
205
- end
206
-
207
- @body = <<EOT
208
- <nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
209
- <h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v('toctitle'))}</h1>
210
- #{ncx_main} </nav>
211
- EOT
212
-
213
- @title = CGI.escapeHTML(@producer.res.v('toctitle'))
214
- @language = @producer.config['language']
215
- @stylesheets = @producer.config['stylesheet']
216
- tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
217
- ReVIEW::Template.load(tmplfile).result(binding)
218
- end
219
-
220
- # Produce EPUB file +epubfile+.
221
- # +basedir+ points the directory has contents.
222
- # +tmpdir+ defines temporary directory.
223
- def produce(epubfile, basedir, tmpdir)
224
- produce_write_common(basedir, tmpdir)
225
-
226
- File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}", 'w') { |f| @producer.ncx(f, @producer.config['epubmaker']['ncxindent']) }
227
-
228
- @producer.call_hook(@producer.config['epubmaker']['hook_prepack'], tmpdir)
229
- expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.config)
230
- expoter.export_zip(epubfile)
231
- end
232
- end
233
- end
@@ -1,375 +0,0 @@
1
- # = producer.rb -- EPUB producer.
2
- #
3
- # Copyright (c) 2010-2017 Kenshi Muto
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
- require 'tmpdir'
11
- require 'fileutils'
12
- require 'review/yamlloader'
13
- require 'epubmaker/content'
14
- require 'epubmaker/epubv2'
15
- require 'epubmaker/epubv3'
16
- require 'review/i18n'
17
- require 'review/configure'
18
- require 'review/extentions/hash'
19
-
20
- module EPUBMaker
21
- # EPUBMaker produces EPUB file.
22
- class Producer
23
- # Array of content objects.
24
- attr_accessor :contents
25
- # Parameter hash.
26
- attr_accessor :config
27
- # Message resource object.
28
- attr_reader :res
29
-
30
- # Take YAML +file+ and return parameter hash.
31
- def self.load(file)
32
- if file.nil? || !File.exist?(file)
33
- raise "Can't open #{file}."
34
- end
35
- loader = ReVIEW::YAMLLoader.new
36
- loader.load_file(file)
37
- end
38
-
39
- # Take YAML +file+ and update parameter hash.
40
- def load(file)
41
- if file.nil? || !File.exist?(file)
42
- raise "Can't open #{file}."
43
- end
44
- loader = ReVIEW::YAMLLoader.new
45
- merge_config(@config.deep_merge(loader.load_file(file)))
46
- end
47
-
48
- def warn(msg)
49
- @logger.warn(msg)
50
- end
51
-
52
- # Construct producer object.
53
- # +config+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#merge_config.
54
- # +version+ takes EPUB version (default is 2).
55
- def initialize(config = nil, version = nil)
56
- @contents = []
57
- @config = ReVIEW::Configure.new
58
- @epub = nil
59
- @config['epubversion'] = version unless version.nil?
60
- @res = ReVIEW::I18n
61
- @logger = ReVIEW.logger
62
-
63
- merge_config(config) if config
64
- end
65
-
66
- def coverimage
67
- return nil unless config['coverimage']
68
- @contents.each do |item|
69
- if item.media.start_with?('image') && item.file =~ /#{config['coverimage']}\Z/
70
- return item.file
71
- end
72
- end
73
- nil
74
- end
75
-
76
- # Update parameters by merging from new parameter hash +config+.
77
- def merge_config(config)
78
- @config.deep_merge!(config)
79
- complement
80
-
81
- unless @config['epubversion'].nil?
82
- case @config['epubversion'].to_i
83
- when 2
84
- @epub = EPUBMaker::EPUBv2.new(self)
85
- when 3
86
- @epub = EPUBMaker::EPUBv3.new(self)
87
- else
88
- raise "Invalid EPUB version (#{@config['epubversion']}.)"
89
- end
90
- end
91
- if config['language']
92
- ReVIEW::I18n.locale = config['language']
93
- end
94
- support_legacy_maker
95
- end
96
-
97
- # Write mimetype file to IO object +wobj+.
98
- def mimetype(wobj)
99
- s = @epub.mimetype
100
- if !s.nil? && !wobj.nil?
101
- wobj.print s
102
- end
103
- end
104
-
105
- # Write opf file to IO object +wobj+.
106
- def opf(wobj)
107
- s = @epub.opf
108
- if !s.nil? && !wobj.nil?
109
- wobj.puts s
110
- end
111
- end
112
-
113
- # Write ncx file to IO object +wobj+. +indentarray+ defines prefix
114
- # string for each level.
115
- def ncx(wobj, indentarray = [])
116
- s = @epub.ncx(indentarray)
117
- if !s.nil? && !wobj.nil?
118
- wobj.puts s
119
- end
120
- end
121
-
122
- # Write container file to IO object +wobj+.
123
- def container(wobj)
124
- s = @epub.container
125
- if !s.nil? && !wobj.nil?
126
- wobj.puts s
127
- end
128
- end
129
-
130
- # Write cover file to IO object +wobj+.
131
- # If Producer#config["coverimage"] is defined, it will be used for
132
- # the cover image.
133
- def cover(wobj)
134
- type = @config['epubversion'] >= 3 ? 'cover' : nil
135
- s = @epub.cover(type)
136
- if !s.nil? && !wobj.nil?
137
- wobj.puts s
138
- end
139
- end
140
-
141
- # Write title file (copying) to IO object +wobj+.
142
- def titlepage(wobj)
143
- s = @epub.titlepage
144
- if !s.nil? && !wobj.nil?
145
- wobj.puts s
146
- end
147
- end
148
-
149
- # Write colophon file to IO object +wobj+.
150
- def colophon(wobj)
151
- s = @epub.colophon
152
- if !s.nil? && !wobj.nil?
153
- wobj.puts s
154
- end
155
- end
156
-
157
- # Write own toc file to IO object +wobj+.
158
- def mytoc(wobj)
159
- s = @epub.mytoc
160
- if !s.nil? && !wobj.nil?
161
- wobj.puts s
162
- end
163
- end
164
-
165
- # Add informations of figure files in +path+ to contents array.
166
- # +base+ defines a string to remove from path name.
167
- def import_imageinfo(path, base = nil, allow_exts = nil)
168
- return nil unless File.exist?(path)
169
- allow_exts ||= @config['image_ext']
170
- Dir.foreach(path) do |f|
171
- next if f.start_with?('.')
172
- if f =~ /\.(#{allow_exts.join('|')})\Z/i
173
- path.chop! if path =~ %r{/\Z}
174
- if base.nil?
175
- @contents.push(EPUBMaker::Content.new('file' => "#{path}/#{f}"))
176
- else
177
- @contents.push(EPUBMaker::Content.new('file' => "#{path.sub(base + '/', '')}/#{f}"))
178
- end
179
- end
180
- if FileTest.directory?("#{path}/#{f}")
181
- import_imageinfo("#{path}/#{f}", base)
182
- end
183
- end
184
- end
185
-
186
- alias_method :importImageInfo, :import_imageinfo
187
-
188
- # Produce EPUB file +epubfile+.
189
- # +basedir+ points the directory has contents (default: current directory.)
190
- # +tmpdir+ defines temporary directory.
191
- def produce(epubfile, basedir = nil, tmpdir = nil)
192
- current = Dir.pwd
193
- basedir ||= current
194
-
195
- # use Dir to solve a path for Windows (see #1011)
196
- new_tmpdir = Dir[File.join(tmpdir.nil? ? Dir.mktmpdir : tmpdir)][0]
197
- if epubfile !~ %r{\A/}
198
- epubfile = "#{current}/#{epubfile}"
199
- end
200
-
201
- # FIXME: error check
202
- File.unlink(epubfile) if File.exist?(epubfile)
203
-
204
- begin
205
- @epub.produce(epubfile, basedir, new_tmpdir)
206
- ensure
207
- FileUtils.rm_r(new_tmpdir) if tmpdir.nil?
208
- end
209
- end
210
-
211
- def call_hook(filename, *params)
212
- return if !filename.present? || !File.exist?(filename) || !FileTest.executable?(filename)
213
- if ENV['REVIEW_SAFE_MODE'].to_i & 1 > 0
214
- warn 'hook is prohibited in safe mode. ignored.'
215
- else
216
- system(filename, *params)
217
- end
218
- end
219
-
220
- def isbn_hyphen
221
- str = @config['isbn'].to_s
222
-
223
- if str =~ /\A\d{10}\Z/
224
- return "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
225
- end
226
- if str =~ /\A\d{13}\Z/
227
- return "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
228
- end
229
- nil
230
- end
231
-
232
- private
233
-
234
- # Complement parameters.
235
- def complement
236
- @config['htmlext'] ||= 'html'
237
- defaults = ReVIEW::Configure.new.merge(
238
- 'language' => 'ja',
239
- 'date' => Time.now.strftime('%Y-%m-%d'),
240
- 'modified' => Time.now.utc.strftime('%Y-%02m-%02dT%02H:%02M:%02SZ'),
241
- 'isbn' => nil,
242
- 'toclevel' => 2,
243
- 'stylesheet' => [],
244
- 'epubversion' => 3,
245
- 'htmlversion' => 5,
246
- 'secnolevel' => 2,
247
- 'pre_secnolevel' => 0,
248
- 'post_secnolevel' => 1,
249
- 'part_secnolevel' => 1,
250
- 'titlepage' => true,
251
- 'titlefile' => nil,
252
- 'originaltitlefile' => nil,
253
- 'profile' => nil,
254
- 'colophon' => nil,
255
- 'colophon_order' => %w[aut csl trl dsr ill edt pbl prt pht],
256
- 'direction' => 'ltr',
257
- 'epubmaker' => {
258
- 'flattoc' => nil,
259
- 'flattocindent' => true,
260
- 'ncx_indent' => [],
261
- 'zip_stage1' => 'zip -0Xq',
262
- 'zip_stage2' => 'zip -Xr9Dq',
263
- 'zip_addpath' => nil,
264
- 'hook_beforeprocess' => nil,
265
- 'hook_afterfrontmatter' => nil,
266
- 'hook_afterbody' => nil,
267
- 'hook_afterbackmatter' => nil,
268
- 'hook_aftercopyimage' => nil,
269
- 'hook_prepack' => nil,
270
- 'rename_for_legacy' => nil,
271
- 'verify_target_images' => nil,
272
- 'force_include_images' => [],
273
- 'cover_linear' => nil,
274
- 'back_footnote' => nil
275
- },
276
- 'externallink' => true,
277
- 'contentdir' => '.',
278
- 'imagedir' => 'images',
279
- 'fontdir' => 'fonts',
280
- 'image_ext' => %w[png gif jpg jpeg svg ttf woff otf],
281
- 'image_maxpixels' => 4_000_000,
282
- 'font_ext' => %w[ttf woff otf]
283
- )
284
-
285
- @config = defaults.deep_merge(@config)
286
- @config['title'] = @config['booktitle'] unless @config['title']
287
-
288
- deprecated_parameters = {
289
- 'ncxindent' => 'epubmaker:ncxindent',
290
- 'flattoc' => 'epubmaker:flattoc',
291
- 'flattocindent' => 'epubmaker:flattocindent',
292
- 'hook_beforeprocess' => 'epubmaker:hook_beforeprocess',
293
- 'hook_afterfrontmatter' => 'epubmaker:hook_afterfrontmatter',
294
- 'hook_afterbody' => 'epubmaker:hook_afterbody',
295
- 'hook_afterbackmatter' => 'epubmaker:hook_afterbackmatter',
296
- 'hook_aftercopyimage' => 'epubmaker:hook_aftercopyimage',
297
- 'hook_prepack' => 'epubmaker:hook_prepack',
298
- 'rename_for_legacy' => 'epubmaker:rename_for_legacy',
299
- 'zip_stage1' => 'epubmaker:zip_stage1',
300
- 'zip_stage2' => 'epubmaker:zip_stage2',
301
- 'zip_addpath' => 'epubmaker:zip_addpath',
302
- 'verify_target_images' => 'epubmaker:verify_target_images',
303
- 'force_include_images' => 'epubmaker:force_include_images',
304
- 'cover_linear' => 'epubmaker:cover_linear'
305
- }
306
-
307
- deprecated_parameters.each_pair do |k, v|
308
- next if @config[k].nil?
309
- sa = v.split(':', 2)
310
- warn "Parameter #{k} is deprecated. Use:\n#{sa[0]}:\n #{sa[1]}: ...\n\n"
311
- @config[sa[0]][sa[1]] = @config[k]
312
- @config.delete(k)
313
- end
314
-
315
- if @config['epubversion'] >= 3
316
- @config['htmlversion'] = 5
317
- end
318
-
319
- @config.maker = 'epubmaker'
320
- @config['cover'] = "#{@config['bookname']}.#{@config['htmlext']}" unless @config['cover']
321
-
322
- %w[bookname title].each do |k|
323
- raise "Key #{k} must have a value. Abort." unless @config[k]
324
- end
325
- # array
326
- %w[subject aut
327
- a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-dsr a-edt
328
- a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl
329
- adp ann arr art asn aut aqt aft aui ant bkp clb cmm dsr edt
330
- ill lyr mdc mus nrt oth pht pbl prt red rev spn ths trc trl
331
- stylesheet rights].each do |item|
332
- next unless @config[item]
333
- if @config[item].is_a?(String)
334
- @config[item] = [@config[item]]
335
- end
336
- end
337
- # optional
338
- # type, format, identifier, source, relation, coverpage, aut
339
- end
340
-
341
- def support_legacy_maker
342
- # legacy review-epubmaker support
343
- if @config['flag_legacy_coverfile'].nil? && !@config['coverfile'].nil? && File.exist?(@config['coverfile'])
344
- @config['cover'] = "#{@config['bookname']}-cover.#{@config['htmlext']}"
345
- @epub.legacy_cover_and_title_file(@config['coverfile'], @config['cover'])
346
- @config['flag_legacy_coverfile'] = true
347
- warn %Q(Parameter 'coverfile' is obsolete. Please use 'cover' and make complete html file with header and footer.)
348
- end
349
-
350
- if @config['flag_legacy_titlepagefile'].nil? && !@config['titlepagefile'].nil? && File.exist?(@config['titlepagefile'])
351
- @config['titlefile'] = "#{@config['bookname']}-title.#{@config['htmlext']}"
352
- @config['titlepage'] = true
353
- @epub.legacy_cover_and_title_file(@config['titlepagefile'], @config['titlefile'])
354
- @config['flag_legacy_titlepagefile'] = true
355
- warn %Q(Parameter 'titlepagefile' is obsolete. Please use 'titlefile' and make complete html file with header and footer.)
356
- end
357
-
358
- if @config['flag_legacy_backcoverfile'].nil? && !@config['backcoverfile'].nil? && File.exist?(@config['backcoverfile'])
359
- @config['backcover'] = "#{@config['bookname']}-backcover.#{@config['htmlext']}"
360
- @epub.legacy_cover_and_title_file(@config['backcoverfile'], @config['backcover'])
361
- @config['flag_legacy_backcoverfile'] = true
362
- warn %Q(Parameter 'backcoverfile' is obsolete. Please use 'backcover' and make complete html file with header and footer.)
363
- end
364
-
365
- if @config['flag_legacy_pubhistory'].nil? && @config['pubhistory']
366
- @config['history'] = [[]]
367
- @config['pubhistory'].split("\n").each { |date| @config['history'][0].push(date.sub(/(\d+)年(\d+)月(\d+)日/, '\1-\2-\3')) }
368
- @config['flag_legacy_pubhistory'] = true
369
- warn %Q(Parameter 'pubhistory' is obsolete. Please use 'history' array.)
370
- end
371
-
372
- true
373
- end
374
- end
375
- end