review 3.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (225) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +45 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.rubocop.yml +161 -34
  5. data/.travis.yml +16 -15
  6. data/Dockerfile +21 -5
  7. data/NEWS.ja.md +394 -0
  8. data/NEWS.md +395 -1
  9. data/README.md +10 -7
  10. data/appveyor.yml +1 -3
  11. data/bin/review-catalog-converter +5 -5
  12. data/bin/review-check +10 -12
  13. data/bin/review-checkdep +2 -2
  14. data/bin/review-compile +17 -23
  15. data/bin/review-epubmaker +3 -35
  16. data/bin/review-idgxmlmaker +16 -0
  17. data/bin/review-index +2 -89
  18. data/bin/review-preproc +13 -13
  19. data/bin/review-validate +4 -4
  20. data/bin/review-vol +4 -78
  21. data/doc/config.yml.sample +47 -12
  22. data/doc/config.yml.sample-simple +3 -2
  23. data/doc/format.ja.md +120 -17
  24. data/doc/format.md +119 -27
  25. data/doc/makeindex.ja.md +2 -2
  26. data/doc/pdfmaker.ja.md +43 -1
  27. data/doc/pdfmaker.md +42 -1
  28. data/doc/quickstart.ja.md +45 -25
  29. data/doc/quickstart.md +37 -16
  30. data/lib/epubmaker/content.rb +3 -2
  31. data/lib/epubmaker/epubcommon.rb +34 -27
  32. data/lib/epubmaker/epubv2.rb +5 -6
  33. data/lib/epubmaker/epubv3.rb +21 -18
  34. data/lib/epubmaker/producer.rb +2 -1
  35. data/lib/review/book.rb +2 -2
  36. data/lib/review/book/base.rb +91 -96
  37. data/lib/review/book/bib.rb +21 -0
  38. data/lib/review/book/book_unit.rb +155 -0
  39. data/lib/review/book/chapter.rb +48 -29
  40. data/lib/review/book/index.rb +46 -240
  41. data/lib/review/book/index/item.rb +46 -0
  42. data/lib/review/book/page_metric.rb +7 -7
  43. data/lib/review/book/part.rb +45 -10
  44. data/lib/review/book/volume.rb +4 -5
  45. data/lib/review/builder.rb +172 -56
  46. data/lib/review/catalog.rb +14 -17
  47. data/lib/review/compiler.rb +219 -121
  48. data/lib/review/configure.rb +39 -7
  49. data/lib/review/converter.rb +1 -1
  50. data/lib/review/epub2html.rb +43 -5
  51. data/lib/review/epubmaker.rb +69 -27
  52. data/lib/review/extentions/string.rb +0 -4
  53. data/lib/review/htmlbuilder.rb +112 -101
  54. data/lib/review/htmlutils.rb +9 -13
  55. data/lib/review/i18n.rb +3 -3
  56. data/lib/review/idgxmlbuilder.rb +202 -78
  57. data/lib/review/idgxmlmaker.rb +186 -0
  58. data/lib/review/index_builder.rb +653 -0
  59. data/lib/review/init-web/finish.html +10 -0
  60. data/lib/review/init-web/index.html +190 -0
  61. data/lib/review/init-web/review-layout-design.js +691 -0
  62. data/lib/review/init.rb +129 -46
  63. data/lib/review/latexbuilder.rb +255 -92
  64. data/lib/review/lineinput.rb +1 -1
  65. data/lib/review/location.rb +32 -0
  66. data/lib/review/logger.rb +4 -8
  67. data/lib/review/makerhelper.rb +35 -5
  68. data/lib/review/markdownbuilder.rb +50 -38
  69. data/lib/review/md2inaobuilder.rb +3 -5
  70. data/lib/review/pdfmaker.rb +60 -57
  71. data/lib/review/plaintextbuilder.rb +154 -87
  72. data/lib/review/preprocessor.rb +20 -42
  73. data/lib/review/rstbuilder.rb +57 -38
  74. data/lib/review/sec_counter.rb +13 -0
  75. data/lib/review/textmaker.rb +23 -15
  76. data/lib/review/textutils.rb +76 -2
  77. data/lib/review/tocprinter.rb +230 -102
  78. data/lib/review/topbuilder.rb +139 -60
  79. data/lib/review/update.rb +24 -24
  80. data/lib/review/version.rb +1 -1
  81. data/lib/review/volumeprinter.rb +98 -0
  82. data/lib/review/webmaker.rb +20 -24
  83. data/lib/review/webtocprinter.rb +38 -35
  84. data/lib/review/yamlloader.rb +26 -16
  85. data/review.gemspec +6 -4
  86. data/samples/sample-book/README.md +7 -2
  87. data/samples/sample-book/src/.gitignore +154 -0
  88. data/samples/sample-book/src/config-ebook.yml +4 -0
  89. data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
  90. data/samples/sample-book/src/config-jlreq.yml +6 -0
  91. data/samples/sample-book/src/config.yml +2 -2
  92. data/samples/sample-book/src/lib/tasks/review.rake +29 -14
  93. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  94. data/samples/syntax-book/Gemfile +1 -1
  95. data/samples/syntax-book/ch01.re +4 -2
  96. data/samples/syntax-book/ch02.re +8 -16
  97. data/samples/syntax-book/ch03.re +3 -6
  98. data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
  99. data/samples/syntax-book/config-jlreq.yml +5 -0
  100. data/samples/syntax-book/config-print.yml +3 -0
  101. data/samples/syntax-book/config.yml +1 -1
  102. data/samples/syntax-book/lib/tasks/review.rake +30 -15
  103. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  104. data/templates/latex/config.erb +39 -25
  105. data/templates/latex/layout.tex.erb +1 -0
  106. data/templates/latex/review-jlreq/README.md +3 -1
  107. data/templates/latex/review-jlreq/review-base.sty +161 -50
  108. data/templates/latex/review-jlreq/review-jlreq.cls +21 -22
  109. data/templates/latex/review-jlreq/review-style.sty +4 -1
  110. data/templates/latex/review-jsbook/README.md +46 -5
  111. data/templates/latex/review-jsbook/review-base.sty +123 -35
  112. data/templates/latex/review-jsbook/review-jsbook.cls +10 -4
  113. data/templates/latex/review-jsbook/review-style.sty +5 -2
  114. data/templates/opf/epubv3.opf.erb +1 -0
  115. data/templates/web/html/layout-html5.html.erb +3 -3
  116. data/test/assets/test_template.tex +19 -7
  117. data/test/assets/test_template_backmatter.tex +19 -7
  118. data/test/book_test_helper.rb +11 -5
  119. data/test/test_book.rb +124 -79
  120. data/test/test_book_chapter.rb +97 -54
  121. data/test/test_book_part.rb +3 -3
  122. data/test/test_builder.rb +38 -13
  123. data/test/test_catalog.rb +24 -42
  124. data/test/test_catalog_converter_cmd.rb +1 -1
  125. data/test/test_converter.rb +1 -0
  126. data/test/test_epub3maker.rb +2 -2
  127. data/test/test_epubmaker.rb +8 -0
  128. data/test/test_epubmaker_cmd.rb +14 -7
  129. data/test/test_helper.rb +18 -7
  130. data/test/test_htmlbuilder.rb +1491 -205
  131. data/test/test_htmlutils.rb +0 -12
  132. data/test/test_i18n.rb +37 -37
  133. data/test/test_idgxmlbuilder.rb +744 -42
  134. data/test/test_idgxmlmaker_cmd.rb +46 -0
  135. data/test/test_image_finder.rb +52 -70
  136. data/test/test_index.rb +94 -44
  137. data/test/test_indexbuilder.rb +52 -0
  138. data/test/test_latexbuilder.rb +1784 -161
  139. data/test/test_latexbuilder_v2.rb +671 -102
  140. data/test/test_logger.rb +17 -4
  141. data/test/test_makerhelper.rb +2 -14
  142. data/test/test_markdownbuilder.rb +137 -16
  143. data/test/test_md2inaobuilder.rb +32 -9
  144. data/test/test_pdfmaker.rb +30 -12
  145. data/test/test_pdfmaker_cmd.rb +100 -6
  146. data/test/test_plaintextbuilder.rb +791 -30
  147. data/test/test_preprocessor.rb +2 -16
  148. data/test/test_review_ext.rb +2 -1
  149. data/test/test_rstbuilder.rb +274 -27
  150. data/test/test_sec_counter.rb +156 -0
  151. data/test/test_textmaker_cmd.rb +54 -0
  152. data/test/test_textutils.rb +109 -2
  153. data/test/test_topbuilder.rb +724 -34
  154. data/test/test_update.rb +20 -11
  155. data/test/test_webtocprinter.rb +75 -43
  156. data/test/test_yamlloader.rb +13 -0
  157. data/vendor/gentombow/LICENSE +1 -1
  158. data/vendor/gentombow/Makefile +0 -1
  159. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  160. data/vendor/gentombow/bounddvi-en.tex +1 -0
  161. data/vendor/gentombow/bounddvi.pdf +0 -0
  162. data/vendor/gentombow/bounddvi.sty +30 -7
  163. data/vendor/gentombow/bounddvi.tex +1 -0
  164. data/vendor/gentombow/create_archive.sh +1 -0
  165. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  166. data/vendor/gentombow/gentombow-ja.tex +9 -0
  167. data/vendor/gentombow/gentombow.pdf +0 -0
  168. data/vendor/gentombow/gentombow.sty +32 -10
  169. data/vendor/gentombow/gentombow.tex +8 -0
  170. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  171. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  172. data/vendor/jsclasses/LICENSE +1 -1
  173. data/vendor/jsclasses/Makefile +3 -2
  174. data/vendor/jsclasses/create_archive.sh +5 -5
  175. data/vendor/jsclasses/jis/Makefile +3 -2
  176. data/vendor/jsclasses/jis/jsarticle.cls +74 -31
  177. data/vendor/jsclasses/jis/jsbook.cls +74 -31
  178. data/vendor/jsclasses/jis/jsclasses.dtx +176 -36
  179. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  180. data/vendor/jsclasses/jis/jslogo.dtx +4 -4
  181. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  182. data/vendor/jsclasses/jis/jslogo.sty +4 -16
  183. data/vendor/jsclasses/jis/jspf.cls +73 -30
  184. data/vendor/jsclasses/jis/jsreport.cls +74 -31
  185. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  186. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  187. data/vendor/jsclasses/jis/kiyou.cls +74 -31
  188. data/vendor/jsclasses/jis/minijs.sty +65 -22
  189. data/vendor/jsclasses/jis/okumacro.dtx +4 -5
  190. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  191. data/vendor/jsclasses/jis/okumacro.sty +4 -17
  192. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  193. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  194. data/vendor/jsclasses/jis/winjis.sty +23 -19
  195. data/vendor/jsclasses/jsarticle.cls +74 -31
  196. data/vendor/jsclasses/jsbook.cls +74 -31
  197. data/vendor/jsclasses/jsclasses.dtx +176 -36
  198. data/vendor/jsclasses/jsclasses.ins +15 -5
  199. data/vendor/jsclasses/jsclasses.pdf +0 -0
  200. data/vendor/jsclasses/jslogo.dtx +4 -4
  201. data/vendor/jsclasses/jslogo.ins +9 -0
  202. data/vendor/jsclasses/jslogo.pdf +0 -0
  203. data/vendor/jsclasses/jslogo.sty +4 -16
  204. data/vendor/jsclasses/jspf.cls +73 -30
  205. data/vendor/jsclasses/jsreport.cls +74 -31
  206. data/vendor/jsclasses/jsverb.ins +9 -0
  207. data/vendor/jsclasses/jsverb.pdf +0 -0
  208. data/vendor/jsclasses/jsverb.sty +1 -13
  209. data/vendor/jsclasses/kiyou.cls +74 -31
  210. data/vendor/jsclasses/minijs.sty +68 -22
  211. data/vendor/jsclasses/okumacro.dtx +4 -5
  212. data/vendor/jsclasses/okumacro.ins +9 -0
  213. data/vendor/jsclasses/okumacro.pdf +0 -0
  214. data/vendor/jsclasses/okumacro.sty +4 -17
  215. data/vendor/jsclasses/okuverb.ins +9 -0
  216. data/vendor/jsclasses/okuverb.pdf +0 -0
  217. data/vendor/jsclasses/okuverb.sty +1 -13
  218. data/vendor/jsclasses/tests/relfont.tex +10 -0
  219. data/vendor/jsclasses/winjis.sty +23 -19
  220. metadata +65 -12
  221. data/.rubocop_todo.yml +0 -7
  222. data/lib/review/book/compilable.rb +0 -173
  223. data/lib/review/tocparser.rb +0 -271
  224. data/samples/syntax-book/review-ext.rb +0 -14
  225. data/test/test_tocparser.rb +0 -25
@@ -9,7 +9,7 @@ Re:VIEW is free software under the terms of the GNU Lesser General Public Licens
9
9
 
10
10
  This article describes how to setup Re:VIEW and use it.
11
11
 
12
- The supported version of the article is Re:VIEW 3.0.
12
+ The supported version of the article is Re:VIEW 4.2.
13
13
 
14
14
  ## Set up Re:VIEW
15
15
 
@@ -59,7 +59,7 @@ $ git pull
59
59
 
60
60
  ## Writing Re:VIEW Document
61
61
 
62
- ### Generating template fiels
62
+ ### Generating template files
63
63
 
64
64
  After setup, you can use `review-init` command to generate Re:VIEW project directory.
65
65
 
@@ -72,14 +72,23 @@ $ ls hello
72
72
  Rakefile catalog.yml config.yml hello.re images/ layouts/ sty/ style.css
73
73
  ```
74
74
 
75
+ If your purpose is to create a PDF using TeX, it is a good idea to use the wizard mode for basic layouting in a web browser. Add `-w` option to review-init.
76
+
77
+ (notice: currently wizard UI supports only Japanese language)
78
+
79
+ ```bash
80
+ $ review-init -w hello
81
+ (access http://localhost:18000 on Web browser)
82
+ ```
83
+
75
84
  In `hello` directory, many files are generated.
76
85
 
77
86
  * `*.re` : Re:VIEW format file.
78
87
  * config.yml : configuration file
88
+ * config-ebook.yml : configuration file for ebook (when using the wizard mode)
79
89
  * catalog.yml : catalog file (for TOC)
80
90
  * Rakefile : rule file for `rake` command
81
91
  * images : folder for images
82
- * layouts : forlder for layout files
83
92
  * style.css : sample stylesheet
84
93
  * sty : style files for LaTeX
85
94
  * doc : various documents (including this document)
@@ -116,29 +125,38 @@ The web site of Re:VIEW is @<tt>{https://reviewml.org/}.
116
125
 
117
126
  You should use UTF-8 as encodings in text files.
118
127
 
119
- ### generating PDF, EPUB, and plain-text
128
+ ### generating PDF, EPUB, plain-text, and InDesign XML
129
+
130
+ To convert files in the project, use review-*maker command.
120
131
 
121
- You can generate a PDF file with `review-pdfmaker` command. Also you can generate an EPUB file with `review-epubmaker` command, and can generate an plain-text file with 'review-textmaker' command.
132
+ - review-pdfmaker: generate PDF
133
+ - review-epubmaker: generate EPUB
134
+ - review-textmaker: genrate plaintext
135
+ - review-idgxmlmaker: genrate InDesign XML
122
136
 
123
- To generate PDF, you should install TeXLive 2012 or later. To generate EPUB, you should install zip command.
137
+ To generate PDF, you should install TeXLive 2012 or later. To generate EPUB, you should install zip command.
124
138
  When you want to use MathML, you should install [MathML library](http://www.hinet.mydns.jp/?mathml.rb)
125
139
 
126
- Each maker need `config.yml`, configuration YAML files. `review-init` command generates `config.yml` in default.
140
+ Each maker need `config.yml`, configuration YAML files. `review-init` command generates `config.yml` in default.
127
141
 
128
142
  ```bash
129
- $ review-pdfmaker config.yml ## generate PDF
130
- $ review-epubmaker config.yml ## generate EPUB
131
- $ review-textmaker config.yml ## generate text with decoration
132
- $ review-textmaker -n config.yml ## generate text without decoration
143
+ $ review-pdfmaker config.yml ## generate PDF
144
+ $ review-pdfmaker config-ebook.yml ## generate PDF (for ebook)
145
+ $ review-epubmaker config.yml ## generate EPUB
146
+ $ review-textmaker config.yml ## generate text with decoration
147
+ $ review-textmaker -n config.yml ## generate text without decoration
148
+ $ review-idgxmlmaker config.yml ## generate InDesign XML
133
149
  ```
134
150
 
135
151
  You also can generate them with Rake.
136
152
 
137
153
  ```bash
138
154
  $ rake pdf ## generate PDF
155
+ $ REVIEW_CONFIG_FILE=config-ebook.yml rake pdf ## generate PDF (for ebook)
139
156
  $ rake epub ## generate EPUB
140
157
  $ rake text ## generate text with decoration
141
158
  $ rake plaintext ## generate text without decoration
159
+ $ rake idgxml ## generate InDesign XML
142
160
  ```
143
161
 
144
162
  There is a sample YAML file [config.yml.sample](https://github.com/kmuto/review/blob/master/doc/config.yml.sample) in the same directory of this document.
@@ -205,17 +223,20 @@ $ review-vol
205
223
  You can also use `review-index` command to generate header list.
206
224
 
207
225
  ```bash
208
- $ review-index --level <heading level> -a
226
+ $ review-index --level <heading level>
227
+ $ review-index --level <heading level> -d ## show volumes also
209
228
  ```
210
229
 
230
+ review-vol and review-index can have large differences in the number of characters, lines, and pages. While review-vol only estimates from the file, review-index actually compiles and calculates.
231
+
211
232
  ## how to update the document folder to the new Re:VIEW version
212
233
 
213
- Re:VIEW is updated regularly. We Re:VIEW team watch the backward compatibility carefully, but if you want to use the features in the new version, you can use review-update command to update the document folder.
234
+ Re:VIEW is updated regularly. We Re:VIEW team watch the backward compatibility carefully, but if you want to use the features in the new version, you can use review-update command to update the project folder.
214
235
 
215
236
  ```bash
216
237
  $ review-update
217
- ** review-update updates your project to 3.0.0 **
218
- config.yml: Update 'review_version' to '3.0'? [y]/n
238
+ ** review-update updates your project to 5.0.0 **
239
+ config.yml: Update 'review_version' to '5.0'? [y]/n
219
240
  Rakefile will be overridden with Re:VIEW version (/.../review/samples/sample-book/src/Rakefile). Do you really proceed? [y]/n
220
241
  lib/tasks/review.rake will be overridden with Re:VIEW version (/.../review/samples/sample-book/src/lib/tasks/review.rake). Do you really proceed? [y]/n
221
242
  INFO: new file /.../sty/plistings.sty is created.
@@ -231,7 +252,7 @@ Finished.
231
252
 
232
253
  ## Copyright
233
254
 
234
- The original author of Re:VIEW is Minero Aoki. The current maintainer is Kenshi Muto(@kmuto), and committers are Masayoshi Takahashi and Masanori Kado (February 2019).
255
+ The original author of Re:VIEW is Minero Aoki. The current maintainer is Kenshi Muto(@kmuto), and committers are Masayoshi Takahashi and Masanori Kado (March 2020).
235
256
 
236
257
  If you want to report bugs and patches, or to get more information, see:
237
258
 
@@ -1,6 +1,6 @@
1
1
  # = content.rb -- Content object for EPUBMaker.
2
2
  #
3
- # Copyright (c) 2010-2017 Kenshi Muto
3
+ # Copyright (c) 2010-2020 Kenshi Muto
4
4
  #
5
5
  # This program is free software.
6
6
  # You can distribute or modify this program under the terms of
@@ -73,11 +73,12 @@ module EPUBMaker
73
73
  # Complement other parameters by using file parameter.
74
74
  def complement
75
75
  if @id.nil?
76
- @id = @file.gsub(%r{[\\/\. ]}, '-')
76
+ @id = @file.gsub(%r{[\\/. ]}, '-')
77
77
  end
78
78
  if @id =~ /\A[^a-z]/i
79
79
  @id = "rv-#{@id}"
80
80
  end
81
+ @id = CGI.escape(@id).gsub('%', '_25_')
81
82
 
82
83
  if !@file.nil? && @media.nil?
83
84
  @media = @file.sub(/.+\./, '').downcase
@@ -10,7 +10,11 @@
10
10
 
11
11
  require 'review/i18n'
12
12
  require 'review/template'
13
- require 'cgi'
13
+ begin
14
+ require 'cgi/escape'
15
+ rescue LoadError
16
+ require 'cgi/util'
17
+ end
14
18
 
15
19
  module EPUBMaker
16
20
  # EPUBCommon is the common class for EPUB producer.
@@ -22,6 +26,10 @@ module EPUBMaker
22
26
  @body_ext = nil
23
27
  end
24
28
 
29
+ def h(str)
30
+ CGI.escapeHTML(str)
31
+ end
32
+
25
33
  # Return mimetype content.
26
34
  def mimetype
27
35
  'application/epub+zip'
@@ -36,10 +44,9 @@ module EPUBMaker
36
44
  if @producer.config['coverimage']
37
45
  file = nil
38
46
  @producer.contents.each do |item|
39
- if !item.media.start_with?('image') || item.file !~ /#{@producer.config["coverimage"]}\Z/
47
+ if !item.media.start_with?('image') || item.file !~ /#{@producer.config['coverimage']}\Z/
40
48
  next
41
49
  end
42
-
43
50
  s << %Q( <meta name="cover" content="#{item.id}"/>\n)
44
51
  file = item.file
45
52
  break
@@ -60,10 +67,10 @@ module EPUBMaker
60
67
  def ncx_doctitle
61
68
  <<EOT
62
69
  <docTitle>
63
- <text>#{CGI.escapeHTML(@producer.config['title'])}</text>
70
+ <text>#{h(@producer.config['title'])}</text>
64
71
  </docTitle>
65
72
  <docAuthor>
66
- <text>#{@producer.config['aut'].nil? ? '' : CGI.escapeHTML(join_with_separator(@producer.config['aut'], ReVIEW::I18n.t('names_splitter')))}</text>
73
+ <text>#{@producer.config['aut'].nil? ? '' : h(join_with_separator(@producer.config['aut'], ReVIEW::I18n.t('names_splitter')))}</text>
67
74
  </docAuthor>
68
75
  EOT
69
76
  end
@@ -73,7 +80,7 @@ EOT
73
80
  <navMap>
74
81
  <navPoint id="top" playOrder="1">
75
82
  <navLabel>
76
- <text>#{CGI.escapeHTML(@producer.config['title'])}</text>
83
+ <text>#{h(@producer.config['title'])}</text>
77
84
  </navLabel>
78
85
  <content src="#{@producer.config['cover']}"/>
79
86
  </navPoint>
@@ -85,7 +92,7 @@ EOT
85
92
  s << <<EOT
86
93
  <navPoint id="toc" playOrder="#{nav_count}">
87
94
  <navLabel>
88
- <text>#{CGI.escapeHTML(@producer.res.v('toctitle'))}</text>
95
+ <text>#{h(@producer.res.v('toctitle'))}</text>
89
96
  </navLabel>
90
97
  <content src="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}"/>
91
98
  </navPoint>
@@ -101,7 +108,7 @@ EOT
101
108
  s << <<EOT
102
109
  <navPoint id="nav-#{nav_count}" playOrder="#{nav_count}">
103
110
  <navLabel>
104
- <text>#{indent[level]}#{CGI.escapeHTML(item.title)}</text>
111
+ <text>#{indent[level]}#{h(item.title)}</text>
105
112
  </navLabel>
106
113
  <content src="#{item.file}"/>
107
114
  </navPoint>
@@ -132,21 +139,21 @@ EOT
132
139
  raise "coverimage #{@producer.config['coverimage']} not found. Abort." unless file
133
140
  @body = <<-EOT
134
141
  <div id="cover-image" class="cover-image">
135
- <img src="#{file}" alt="#{CGI.escapeHTML(@producer.config.name_of('title'))}" class="max"/>
142
+ <img src="#{file}" alt="#{h(@producer.config.name_of('title'))}" class="max"/>
136
143
  </div>
137
144
  EOT
138
145
  else
139
146
  @body = <<-EOT
140
- <h1 class="cover-title">#{CGI.escapeHTML(@producer.config.name_of('title'))}</h1>
147
+ <h1 class="cover-title">#{h(@producer.config.name_of('title'))}</h1>
141
148
  EOT
142
149
  if @producer.config['subtitle']
143
150
  @body << <<-EOT
144
- <h2 class="cover-subtitle">#{CGI.escapeHTML(@producer.config.name_of('subtitle'))}</h2>
151
+ <h2 class="cover-subtitle">#{h(@producer.config.name_of('subtitle'))}</h2>
145
152
  EOT
146
153
  end
147
154
  end
148
155
 
149
- @title = CGI.escapeHTML(@producer.config.name_of('title'))
156
+ @title = h(@producer.config.name_of('title'))
150
157
  @language = @producer.config['language']
151
158
  @stylesheets = @producer.config['stylesheet']
152
159
  tmplfile = if @producer.config['htmlversion'].to_i == 5
@@ -162,7 +169,7 @@ EOT
162
169
  # NOTE: this method is not used yet.
163
170
  # see lib/review/epubmaker.rb#build_titlepage
164
171
  def titlepage
165
- @title = CGI.escapeHTML(@producer.config.name_of('title'))
172
+ @title = h(@producer.config.name_of('title'))
166
173
 
167
174
  @body = <<EOT
168
175
  <h1 class="tp-title">#{@title}</h1>
@@ -170,7 +177,7 @@ EOT
170
177
 
171
178
  if @producer.config['subtitle']
172
179
  @body << <<EOT
173
- <h2 class="tp-subtitle">#{CGI.escapeHTML(@producer.config.name_of('subtitle'))}</h2>
180
+ <h2 class="tp-subtitle">#{h(@producer.config.name_of('subtitle'))}</h2>
174
181
  EOT
175
182
  end
176
183
 
@@ -180,7 +187,7 @@ EOT
180
187
  <br />
181
188
  <br />
182
189
  </p>
183
- <h2 class="tp-author">#{CGI.escapeHTML(join_with_separator(@producer.config.names_of('aut'), ReVIEW::I18n.t('names_splitter')))}</h2>
190
+ <h2 class="tp-author">#{h(join_with_separator(@producer.config.names_of('aut'), ReVIEW::I18n.t('names_splitter')))}</h2>
184
191
  EOT
185
192
  end
186
193
 
@@ -193,7 +200,7 @@ EOT
193
200
  <br />
194
201
  <br />
195
202
  </p>
196
- <h3 class="tp-publisher">#{CGI.escapeHTML(join_with_separator(publisher, ReVIEW::I18n.t('names_splitter')))}</h3>
203
+ <h3 class="tp-publisher">#{h(join_with_separator(publisher, ReVIEW::I18n.t('names_splitter')))}</h3>
197
204
  EOT
198
205
  end
199
206
 
@@ -210,18 +217,18 @@ EOT
210
217
 
211
218
  # Return colophon content.
212
219
  def colophon
213
- @title = CGI.escapeHTML(@producer.res.v('colophontitle'))
220
+ @title = h(@producer.res.v('colophontitle'))
214
221
  @body = <<EOT
215
222
  <div class="colophon">
216
223
  EOT
217
224
 
218
225
  if @producer.config['subtitle'].nil?
219
226
  @body << <<EOT
220
- <p class="title">#{CGI.escapeHTML(@producer.config.name_of('title'))}</p>
227
+ <p class="title">#{h(@producer.config.name_of('title'))}</p>
221
228
  EOT
222
229
  else
223
230
  @body << <<EOT
224
- <p class="title">#{CGI.escapeHTML(@producer.config.name_of('title'))}<br /><span class="subtitle">#{CGI.escapeHTML(@producer.config.name_of('subtitle'))}</span></p>
231
+ <p class="title">#{h(@producer.config.name_of('title'))}<br /><span class="subtitle">#{h(@producer.config.name_of('subtitle'))}</span></p>
225
232
  EOT
226
233
  end
227
234
 
@@ -230,7 +237,7 @@ EOT
230
237
  @body << %Q( <table class="colophon">\n)
231
238
  @body << @producer.config['colophon_order'].map do |role|
232
239
  if @producer.config[role]
233
- %Q( <tr><th>#{CGI.escapeHTML(@producer.res.v(role))}</th><td>#{CGI.escapeHTML(join_with_separator(@producer.config.names_of(role), ReVIEW::I18n.t('names_splitter')))}</td></tr>\n)
240
+ %Q( <tr><th>#{h(@producer.res.v(role))}</th><td>#{h(join_with_separator(@producer.config.names_of(role), ReVIEW::I18n.t('names_splitter')))}</td></tr>\n)
234
241
  else
235
242
  ''
236
243
  end
@@ -239,7 +246,7 @@ EOT
239
246
  @body << %Q( <tr><th>ISBN</th><td>#{@producer.isbn_hyphen}</td></tr>\n) if @producer.isbn_hyphen
240
247
  @body << %Q( </table>\n)
241
248
  if @producer.config['rights'] && !@producer.config['rights'].empty?
242
- @body << %Q( <p class="copyright">#{join_with_separator(@producer.config.names_of('rights').map { |m| CGI.escapeHTML(m) }, '<br />')}</p>\n)
249
+ @body << %Q( <p class="copyright">#{join_with_separator(@producer.config.names_of('rights').map { |m| h(m) }, '<br />')}</p>\n)
243
250
  end
244
251
  @body << %Q( </div>\n)
245
252
 
@@ -262,11 +269,11 @@ EOT
262
269
  items.each_with_index do |item, rev|
263
270
  editstr = edit == 0 ? ReVIEW::I18n.t('first_edition') : ReVIEW::I18n.t('nth_edition', (edit + 1).to_s)
264
271
  revstr = ReVIEW::I18n.t('nth_impression', (rev + 1).to_s)
265
- if item =~ /\A\d+\-\d+\-\d+\Z/
272
+ if item =~ /\A\d+-\d+-\d+\Z/
266
273
  buf << %Q( <p>#{ReVIEW::I18n.t('published_by1', [date_to_s(item), editstr + revstr])}</p>\n)
267
- elsif item =~ /\A(\d+\-\d+\-\d+)[\s ](.+)/
274
+ elsif item =~ /\A(\d+-\d+-\d+)[\s ](.+)/
268
275
  # custom date with string
269
- item.match(/\A(\d+\-\d+\-\d+)[\s ](.+)/) do |m|
276
+ item.match(/\A(\d+-\d+-\d+)[\s ](.+)/) do |m|
270
277
  buf << %Q( <p>#{ReVIEW::I18n.t('published_by3', [date_to_s(m[1]), m[2]])}</p>\n)
271
278
  end
272
279
  else
@@ -290,9 +297,9 @@ EOT
290
297
 
291
298
  # Return own toc content.
292
299
  def mytoc
293
- @title = CGI.escapeHTML(@producer.res.v('toctitle'))
300
+ @title = h(@producer.res.v('toctitle'))
294
301
 
295
- @body = %Q( <h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v('toctitle'))}</h1>\n)
302
+ @body = %Q( <h1 class="toc-title">#{h(@producer.res.v('toctitle'))}</h1>\n)
296
303
  if @producer.config['epubmaker']['flattoc'].nil?
297
304
  @body << hierarchy_ncx('ul')
298
305
  else
@@ -386,7 +393,7 @@ EOT
386
393
  @producer.contents.each do |item|
387
394
  next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > @producer.config['toclevel'].to_i
388
395
  is = indent == true ? ' ' * item.level : ''
389
- s << %Q(<li><a href="#{item.file}">#{is}#{CGI.escapeHTML(item.title)}</a></li>\n)
396
+ s << %Q(<li><a href="#{item.file}">#{is}#{h(item.title)}</a></li>\n)
390
397
  end
391
398
  s << %Q(</#{type}>\n)
392
399
 
@@ -9,14 +9,13 @@
9
9
  #
10
10
 
11
11
  require 'epubmaker/epubcommon'
12
- require 'cgi'
13
12
  require 'epubmaker/zip_exporter'
14
13
 
15
14
  module EPUBMaker
16
15
  # EPUBv2 is EPUB version 2 producer.
17
16
  class EPUBv2 < EPUBCommon
18
17
  # Construct object with parameter hash +config+ and message resource hash +res+.
19
- def initialize(producer)
18
+ def initialize(producer) # rubocop:disable Lint/UselessMethodDefinition
20
19
  super
21
20
  end
22
21
 
@@ -37,9 +36,9 @@ module EPUBMaker
37
36
  %w[title language date type format source description relation coverage subject rights].each do |item|
38
37
  next unless @producer.config[item]
39
38
  if @producer.config[item].is_a?(Array)
40
- s << @producer.config.names_of(item).map { |i| %Q( <dc:#{item}>#{CGI.escapeHTML(i)}</dc:#{item}>\n) }.join
39
+ s << @producer.config.names_of(item).map { |i| %Q( <dc:#{item}>#{h(i)}</dc:#{item}>\n) }.join
41
40
  else
42
- s << %Q( <dc:#{item}>#{CGI.escapeHTML(@producer.config.name_of(item))}</dc:#{item}>\n)
41
+ s << %Q( <dc:#{item}>#{h(@producer.config.name_of(item).to_s)}</dc:#{item}>\n)
43
42
  end
44
43
  end
45
44
 
@@ -54,7 +53,7 @@ module EPUBMaker
54
53
  %w[aut 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 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].each do |role|
55
54
  next unless @producer.config[role]
56
55
  @producer.config.names_of(role).each do |v|
57
- s << %Q( <dc:creator opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</dc:creator>\n)
56
+ s << %Q( <dc:creator opf:role="#{role.sub('a-', '')}">#{h(v)}</dc:creator>\n)
58
57
  end
59
58
  end
60
59
 
@@ -62,7 +61,7 @@ module EPUBMaker
62
61
  %w[adp ann arr art asn aqt aft aui ant bkp clb cmm dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl].each do |role|
63
62
  next unless @producer.config[role]
64
63
  @producer.config.names_of(role).each do |v|
65
- s << %Q( <dc:contributor opf:role="#{role}">#{CGI.escapeHTML(v)}</dc:contributor>\n)
64
+ s << %Q( <dc:contributor opf:role="#{role}">#{h(v)}</dc:contributor>\n)
66
65
  if role == 'prt'
67
66
  s << %Q( <dc:publisher>#{v}</dc:publisher>\n)
68
67
  end
@@ -26,6 +26,7 @@ module EPUBMaker
26
26
  # Return opf file content.
27
27
  def opf
28
28
  @opf_metainfo = opf_metainfo
29
+ @opf_coverimage = opf_coverimage
29
30
  @opf_manifest = opf_manifest
30
31
  @opf_toc = opf_tocx
31
32
  @package_attrs = ''
@@ -39,6 +40,7 @@ module EPUBMaker
39
40
  ReVIEW::Template.load(tmplfile).result(binding)
40
41
  end
41
42
 
43
+ # rubocop:disable Metrics/PerceivedComplexity
42
44
  def opf_metainfo
43
45
  s = ''
44
46
  %w[title language date type format source description relation coverage subject rights].each do |item|
@@ -46,23 +48,23 @@ module EPUBMaker
46
48
  if @producer.config[item].is_a?(Array)
47
49
  @producer.config[item].each_with_index do |v, i|
48
50
  if v.is_a?(Hash)
49
- s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:#{item}>\n)
51
+ s << %Q( <dc:#{item} id="#{item}-#{i}">#{h(v['name'])}</dc:#{item}>\n)
50
52
  v.each_pair do |name, val|
51
53
  next if name == 'name'
52
- s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
54
+ s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{h(val)}</meta>\n)
53
55
  end
54
56
  else
55
- s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n)
57
+ s << %Q( <dc:#{item} id="#{item}-#{i}">#{h(v.to_s)}</dc:#{item}>\n)
56
58
  end
57
59
  end
58
60
  elsif @producer.config[item].is_a?(Hash)
59
- s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item]['name'])}</dc:#{item}>\n)
61
+ s << %Q( <dc:#{item} id="#{item}">#{h(@producer.config[item]['name'])}</dc:#{item}>\n)
60
62
  @producer.config[item].each_pair do |name, val|
61
63
  next if name == 'name'
62
- s << %Q( <meta refines="##{item}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
64
+ s << %Q( <meta refines="##{item}" property="#{name}">#{h(val)}</meta>\n)
63
65
  end
64
66
  else
65
- s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item].to_s)}</dc:#{item}>\n)
67
+ s << %Q( <dc:#{item} id="#{item}">#{h(@producer.config[item].to_s)}</dc:#{item}>\n)
66
68
  end
67
69
  end
68
70
 
@@ -80,14 +82,14 @@ module EPUBMaker
80
82
  next unless @producer.config[role]
81
83
  @producer.config[role].each_with_index do |v, i|
82
84
  if v.is_a?(Hash)
83
- s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:creator>\n)
85
+ s << %Q( <dc:creator id="#{role}-#{i}">#{h(v['name'])}</dc:creator>\n)
84
86
  s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
85
87
  v.each_pair do |name, val|
86
88
  next if name == 'name'
87
- s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
89
+ s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{h(val)}</meta>\n)
88
90
  end
89
91
  else
90
- s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n)
92
+ s << %Q( <dc:creator id="#{role}-#{i}">#{h(v)}</dc:creator>\n)
91
93
  s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
92
94
  end
93
95
  end
@@ -98,27 +100,27 @@ module EPUBMaker
98
100
  next unless @producer.config[role]
99
101
  @producer.config[role].each_with_index do |v, i|
100
102
  if v.is_a?(Hash)
101
- s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:contributor>\n)
103
+ s << %Q( <dc:contributor id="#{role}-#{i}">#{h(v['name'])}</dc:contributor>\n)
102
104
  s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
103
105
  v.each_pair do |name, val|
104
106
  next if name == 'name'
105
- s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
107
+ s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{h(val)}</meta>\n)
106
108
  end
107
109
  else
108
- s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n)
110
+ s << %Q( <dc:contributor id="#{role}-#{i}">#{h(v)}</dc:contributor>\n)
109
111
  s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
110
112
  end
111
113
 
112
114
  if %w[prt pbl].include?(role)
113
115
  if v.is_a?(Hash)
114
- s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:publisher>\n)
116
+ s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{h(v['name'])}</dc:publisher>\n)
115
117
  s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
116
118
  v.each_pair do |name, val|
117
119
  next if name == 'name'
118
- s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
120
+ s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{h(val)}</meta>\n)
119
121
  end
120
122
  else
121
- s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:publisher>\n)
123
+ s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{h(v)}</dc:publisher>\n)
122
124
  s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">prt</meta>\n)
123
125
  end
124
126
  end
@@ -128,12 +130,13 @@ module EPUBMaker
128
130
  ## add custom <meta> element
129
131
  if @producer.config['opf_meta'].present?
130
132
  @producer.config['opf_meta'].each do |k, v|
131
- s << %Q( <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n)
133
+ s << %Q( <meta property="#{k}">#{h(v)}</meta>\n)
132
134
  end
133
135
  end
134
136
 
135
137
  s
136
138
  end
139
+ # rubocop:enable Metrics/PerceivedComplexity
137
140
 
138
141
  def opf_manifest
139
142
  s = ''
@@ -205,11 +208,11 @@ EOT
205
208
 
206
209
  @body = <<EOT
207
210
  <nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
208
- <h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v('toctitle'))}</h1>
211
+ <h1 class="toc-title">#{h(@producer.res.v('toctitle'))}</h1>
209
212
  #{ncx_main} </nav>
210
213
  EOT
211
214
 
212
- @title = CGI.escapeHTML(@producer.res.v('toctitle'))
215
+ @title = h(@producer.res.v('toctitle'))
213
216
  @language = @producer.config['language']
214
217
  @stylesheets = @producer.config['stylesheet']
215
218
  tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)