review 2.0.0.beta1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +66 -1
  3. data/.rubocop_todo.yml +617 -0
  4. data/.travis.yml +16 -1
  5. data/ChangeLog +48 -0
  6. data/Dockerfile +22 -0
  7. data/Gemfile +0 -1
  8. data/README.md +97 -0
  9. data/Rakefile +10 -11
  10. data/appveyor.yml +9 -0
  11. data/bin/review +46 -0
  12. data/bin/review-check +8 -21
  13. data/bin/review-compile +26 -43
  14. data/bin/review-index +9 -22
  15. data/bin/review-init +21 -25
  16. data/bin/review-preproc +9 -13
  17. data/bin/review-validate +1 -1
  18. data/bin/review-vol +3 -17
  19. data/bin/review-webmaker +15 -0
  20. data/doc/NEWS.ja.md +534 -0
  21. data/doc/NEWS.md +538 -0
  22. data/doc/catalog.ja.md +10 -18
  23. data/doc/catalog.md +5 -9
  24. data/doc/config.yml.sample +319 -0
  25. data/doc/customize_epub.ja.md +42 -0
  26. data/doc/format.ja.md +320 -288
  27. data/doc/format.md +277 -170
  28. data/doc/format_idg.ja.md +82 -175
  29. data/doc/pdfmaker.ja.md +61 -0
  30. data/doc/pdfmaker.md +65 -0
  31. data/doc/quickstart.ja.md +88 -98
  32. data/doc/quickstart.md +72 -110
  33. data/doc/sample.css +41 -0
  34. data/doc/writing_vertical.ja.md +55 -0
  35. data/doc/writing_vertical.md +5 -0
  36. data/lib/epubmaker/content.rb +3 -3
  37. data/lib/epubmaker/epubcommon.rb +173 -145
  38. data/lib/epubmaker/epubv2.rb +24 -77
  39. data/lib/epubmaker/epubv3.rb +72 -73
  40. data/lib/epubmaker/producer.rb +54 -30
  41. data/lib/lineinput.rb +48 -0
  42. data/lib/review/book.rb +0 -1
  43. data/lib/review/book/base.rb +47 -27
  44. data/lib/review/book/chapter.rb +48 -19
  45. data/lib/review/book/compilable.rb +10 -14
  46. data/lib/review/book/index.rb +10 -19
  47. data/lib/review/book/page_metric.rb +0 -10
  48. data/lib/review/book/part.rb +17 -3
  49. data/lib/review/builder.rb +84 -68
  50. data/lib/review/catalog.rb +5 -1
  51. data/lib/review/compiler.rb +327 -4657
  52. data/lib/review/configure.rb +84 -10
  53. data/lib/review/converter.rb +28 -0
  54. data/lib/review/epubbuilder.rb +1 -1
  55. data/lib/review/epubmaker.rb +142 -158
  56. data/lib/review/ewbbuilder.rb +5 -5
  57. data/lib/review/exception.rb +1 -1
  58. data/lib/review/extentions.rb +1 -1
  59. data/lib/review/extentions/hash.rb +15 -0
  60. data/lib/review/extentions/string.rb +2 -1
  61. data/lib/review/htmlbuilder.rb +364 -348
  62. data/lib/review/htmltoc.rb +44 -0
  63. data/lib/review/htmlutils.rb +12 -6
  64. data/lib/review/i18n.rb +78 -6
  65. data/lib/review/i18n.yml +7 -4
  66. data/lib/review/idgxmlbuilder.rb +226 -267
  67. data/lib/review/latexbuilder.rb +281 -274
  68. data/lib/review/latexutils.rb +56 -49
  69. data/lib/review/makerhelper.rb +8 -4
  70. data/lib/review/markdownbuilder.rb +80 -124
  71. data/lib/review/pdfmaker.rb +197 -138
  72. data/lib/review/preprocessor.rb +16 -67
  73. data/lib/review/template.rb +24 -0
  74. data/lib/review/textbuilder.rb +1 -1
  75. data/lib/review/textutils.rb +18 -24
  76. data/lib/review/tocparser.rb +51 -106
  77. data/lib/review/tocprinter.rb +61 -117
  78. data/lib/review/topbuilder.rb +119 -126
  79. data/lib/review/unfold.rb +2 -2
  80. data/lib/review/version.rb +1 -1
  81. data/lib/review/webmaker.rb +302 -0
  82. data/lib/review/webtocprinter.rb +48 -0
  83. data/lib/review/yamlloader.rb +47 -0
  84. data/review.gemspec +3 -3
  85. data/templates/html/layout-html5.html.erb +17 -0
  86. data/templates/html/layout-xhtml1.html.erb +20 -0
  87. data/{lib/review → templates/latex}/layout.tex.erb +107 -115
  88. data/templates/ncx/epubv2.ncx.erb +11 -0
  89. data/templates/opf/epubv2.opf.erb +21 -0
  90. data/templates/opf/epubv3.opf.erb +18 -0
  91. data/templates/web/html/layout-html5.html.erb +56 -0
  92. data/templates/web/html/layout-xhtml1.html.erb +20 -0
  93. data/templates/xml/container.xml.erb +6 -0
  94. data/test/assets/test.xml.erb +3 -0
  95. data/test/assets/test_template.tex +28 -71
  96. data/test/assets/test_template_backmatter.tex +1 -9
  97. data/test/sample-book/src/Rakefile +12 -3
  98. data/{doc/sample.yml → test/sample-book/src/config-epub2.yml} +92 -147
  99. data/test/sample-book/src/config.yml +40 -154
  100. data/test/sample-book/src/style-web.css +45 -0
  101. data/test/sample-book/src/style.css +23 -1
  102. data/test/test.re +1 -1
  103. data/test/test_book.rb +15 -17
  104. data/test/test_book_chapter.rb +2 -80
  105. data/test/test_book_part.rb +1 -1
  106. data/test/test_builder.rb +28 -6
  107. data/test/test_catalog.rb +17 -0
  108. data/test/test_compiler.rb +14 -59
  109. data/test/test_configure.rb +94 -0
  110. data/test/test_converter.rb +21 -0
  111. data/test/test_epub3maker.rb +155 -3
  112. data/test/test_epubmaker.rb +245 -30
  113. data/test/test_epubmaker_cmd.rb +2 -2
  114. data/test/test_extentions_hash.rb +60 -0
  115. data/test/test_helper.rb +4 -47
  116. data/test/test_htmlbuilder.rb +282 -175
  117. data/test/test_htmltoc.rb +33 -0
  118. data/test/test_i18n.rb +134 -70
  119. data/test/test_idgxmlbuilder.rb +58 -39
  120. data/test/test_latexbuilder.rb +132 -14
  121. data/test/test_lineinput.rb +5 -26
  122. data/test/test_makerhelper.rb +6 -4
  123. data/test/test_markdownbuilder.rb +23 -5
  124. data/test/test_pdfmaker.rb +86 -20
  125. data/test/test_pdfmaker_cmd.rb +1 -3
  126. data/test/test_review_ext.rb +1 -1
  127. data/test/test_template.rb +27 -0
  128. data/test/test_textutils.rb +36 -0
  129. data/test/test_tocparser.rb +25 -0
  130. data/test/test_topbuilder.rb +34 -2
  131. data/test/test_yamlloader.rb +188 -0
  132. metadata +71 -29
  133. data/README.rdoc +0 -81
  134. data/bin/review-epubmaker-legacy +0 -1024
  135. data/doc/ruby-uuid/README +0 -11
  136. data/doc/ruby-uuid/README.ja +0 -34
  137. data/lib/review/compiler/literals_1_8.kpeg +0 -19
  138. data/lib/review/compiler/literals_1_8.rb +0 -432
  139. data/lib/review/compiler/literals_1_9.kpeg +0 -22
  140. data/lib/review/compiler/literals_1_9.rb +0 -435
  141. data/lib/review/extentions/array.rb +0 -25
  142. data/lib/review/htmllayout.rb +0 -41
  143. data/lib/review/inaobuilder.rb +0 -357
  144. data/lib/review/location.rb +0 -24
  145. data/lib/review/node.rb +0 -267
  146. data/lib/review/review.kpeg +0 -724
  147. data/lib/uuid.rb +0 -312
  148. data/rubocop-todo.yml +0 -456
  149. data/test/test_inaobuilder.rb +0 -247
  150. data/test/test_uuid.rb +0 -157
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubv2.rb -- EPUB version 2 producer.
3
3
  #
4
- # Copyright (c) 2010-2015 Kenshi Muto and Masayoshi Takahashi
4
+ # Copyright (c) 2010-2016 Kenshi Muto and Masayoshi Takahashi
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -23,34 +23,24 @@ module EPUBMaker
23
23
 
24
24
  # Return opf file content.
25
25
  def opf
26
- s = <<EOT
27
- <?xml version="1.0" encoding="UTF-8"?>
28
- <package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
29
- <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
30
- EOT
31
-
32
- s << opf_metainfo
33
- s << opf_coverimage
34
-
35
- s << %Q[ </metadata>\n]
36
-
37
- s << opf_manifest
38
- s << opf_tocx
39
- s << opf_guide
40
-
41
- s << %Q[</package>\n]
42
-
43
- s
26
+ @opf_metainfo = opf_metainfo
27
+ @opf_coverimage = opf_coverimage
28
+ @opf_manifest = opf_manifest
29
+ @opf_toc = opf_tocx
30
+
31
+ tmplfile = File.expand_path('./opf/epubv2.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
32
+ tmpl = ReVIEW::Template.load(tmplfile)
33
+ return tmpl.result(binding)
44
34
  end
45
35
 
46
36
  def opf_metainfo
47
37
  s = ""
48
38
  %w[title language date type format source description relation coverage subject rights].each do |item|
49
- next if @producer.params[item].nil?
50
- if @producer.params[item].instance_of?(Array)
51
- s << @producer.params[item].map {|i| %Q[ <dc:#{item}>#{CGI.escapeHTML(i.to_s)}</dc:#{item}>\n]}.join
39
+ next unless @producer.params[item]
40
+ if @producer.params[item].kind_of?(Array)
41
+ s << @producer.params.names_of(item).map {|i| %Q[ <dc:#{item}>#{CGI.escapeHTML(i)}</dc:#{item}>\n]}.join
52
42
  else
53
- s << %Q[ <dc:#{item}>#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
43
+ s << %Q[ <dc:#{item}>#{CGI.escapeHTML(@producer.params.name_of(item))}</dc:#{item}>\n]
54
44
  end
55
45
  end
56
46
 
@@ -63,16 +53,16 @@ EOT
63
53
 
64
54
  # creator (should be array)
65
55
  %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|
66
- next if @producer.params[role].nil?
67
- @producer.params[role].each do |v|
56
+ next unless @producer.params[role]
57
+ @producer.params.names_of(role).each do |v|
68
58
  s << %Q[ <dc:creator opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</dc:creator>\n]
69
59
  end
70
60
  end
71
61
 
72
62
  # contributor (should be array)
73
63
  %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|
74
- next if @producer.params[role].nil?
75
- @producer.params[role].each do |v|
64
+ next unless @producer.params[role]
65
+ @producer.params.names_of(role).each do |v|
76
66
  s << %Q[ <dc:contributor opf:role="#{role}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
77
67
  if role == "prt"
78
68
  s << %Q[ <dc:publisher>#{v}</dc:publisher>\n]
@@ -115,45 +105,21 @@ EOT
115
105
 
116
106
  @producer.contents.each do |item|
117
107
  next if item.media !~ /xhtml\+xml/ # skip non XHTML
118
- s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
108
+ s << %Q[ <itemref idref="#{item.id}"/>\n]
119
109
  end
120
110
  s << %Q[ </spine>\n]
121
111
  s
122
112
  end
123
113
 
124
- def opf_guide
125
- s = ""
126
- s << %Q[ <guide>\n]
127
- s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
128
- s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
129
- s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["mytoc"].nil?
130
- s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
131
- s << %Q[ </guide>\n]
132
- s
133
- end
134
-
135
114
  # Return ncx content. +indentarray+ has prefix marks for each level.
136
115
  def ncx(indentarray)
137
- s = <<EOT
138
- <?xml version="1.0" encoding="UTF-8"?>
139
- <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
140
- <head>
141
- <meta name="dtb:depth" content="1"/>
142
- <meta name="dtb:totalPageCount" content="0"/>
143
- <meta name="dtb:maxPageNumber" content="0"/>
144
- EOT
145
- s << ncx_isbn
116
+ @ncx_isbn = ncx_isbn
117
+ @ncx_doctitle = ncx_doctitle
118
+ @ncx_navmap = ncx_navmap(indentarray)
146
119
 
147
- s << <<EOT
148
- </head>
149
- EOT
150
- s << ncx_doctitle
151
- s << ncx_navmap(indentarray)
152
-
153
- s << <<EOT
154
- </ncx>
155
- EOT
156
- s
120
+ tmplfile = File.expand_path('./ncx/epubv2.ncx.erb', ReVIEW::Template::TEMPLATE_DIR)
121
+ tmpl = ReVIEW::Template.load(tmplfile)
122
+ return tmpl.result(binding)
157
123
  end
158
124
 
159
125
  # Produce EPUB file +epubfile+.
@@ -169,24 +135,5 @@ EOT
169
135
  export_zip(tmpdir, epubfile)
170
136
  end
171
137
 
172
- private
173
-
174
- # Return common XHTML headder
175
- def common_header
176
- s =<<EOT
177
- <?xml version="1.0" encoding="UTF-8"?>
178
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
179
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
180
- <head>
181
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
182
- <meta http-equiv="Content-Style-Type" content="text/css"/>
183
- <meta name="generator" content="Re:VIEW"/>
184
- EOT
185
-
186
- @producer.params["stylesheet"].each do |file|
187
- s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
188
- end
189
- s
190
- end
191
138
  end
192
139
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubv3.rb -- EPUB version 3 producer.
3
3
  #
4
- # Copyright (c) 2010-2015 Kenshi Muto
4
+ # Copyright (c) 2010-2016 Kenshi Muto
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -18,37 +18,53 @@ module EPUBMaker
18
18
  # Construct object with parameter hash +params+ and message resource hash +res+.
19
19
  def initialize(producer)
20
20
  super
21
+ @opf_prefix = Hash.new
22
+ if @producer.params["opf_prefix"].present?
23
+ @producer.params["opf_prefix"].each do |k, v|
24
+ @opf_prefix[k] = v
25
+ end
26
+ end
21
27
  end
22
28
 
23
29
  # Return opf file content.
24
30
  def opf
25
- s = <<EOT
26
- <?xml version="1.0" encoding="UTF-8"?>
27
- <package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="#{@producer.params["language"]}">
28
- <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
29
- EOT
30
-
31
- s << opf_metainfo
32
-
33
- s << %Q[ </metadata>\n]
34
-
35
- s << opf_manifest
36
- s << opf_tocx
37
- s << opf_guide # same as ePUB2
38
-
39
- s << %Q[</package>\n]
31
+ @opf_metainfo = opf_metainfo
32
+ @opf_manifest = opf_manifest
33
+ @opf_toc = opf_tocx
34
+ @package_attrs = ""
35
+
36
+ if !@opf_prefix.empty?
37
+ prefixes_str = @opf_prefix.map{|k,v| %Q|#{k}: #{v}| }.join(" ")
38
+ @package_attrs << " prefix=\"#{prefixes_str}\""
39
+ end
40
40
 
41
- s
41
+ tmplfile = File.expand_path('./opf/epubv3.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
42
+ tmpl = ReVIEW::Template.load(tmplfile)
43
+ return tmpl.result(binding)
42
44
  end
43
45
 
44
46
  def opf_metainfo
45
47
  s = ""
46
48
  %w[title language date type format source description relation coverage subject rights].each do |item|
47
- next if @producer.params[item].nil?
48
- if @producer.params[item].instance_of?(Array)
49
- @producer.params[item].each_with_index {|v, i|
50
- s << %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n]
51
- }
49
+ next unless @producer.params[item]
50
+ if @producer.params[item].kind_of?(Array)
51
+ @producer.params[item].each_with_index do |v, i|
52
+ if v.kind_of?(Hash)
53
+ s << %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:#{item}>\n]
54
+ v.each_pair do |name, val|
55
+ next if name == "name"
56
+ s << %Q[ <meta refines="##{item}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n]
57
+ end
58
+ else
59
+ s << %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n]
60
+ end
61
+ end
62
+ elsif @producer.params[item].kind_of?(Hash)
63
+ s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item]["name"])}</dc:#{item}>\n]
64
+ @producer.params[item].each_pair do |name, val|
65
+ next if name == "name"
66
+ s << %Q[ <meta refines="##{item}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n]
67
+ end
52
68
  else
53
69
  s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
54
70
  end
@@ -65,9 +81,9 @@ EOT
65
81
 
66
82
  # creator (should be array)
67
83
  %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|
68
- next if @producer.params[role].nil?
84
+ next unless @producer.params[role]
69
85
  @producer.params[role].each_with_index do |v, i|
70
- if v.instance_of?(Hash)
86
+ if v.kind_of?(Hash)
71
87
  s << %Q[ <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:creator>\n]
72
88
  s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n]
73
89
  v.each_pair do |name, val|
@@ -83,9 +99,9 @@ EOT
83
99
 
84
100
  # contributor (should be array)
85
101
  %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|
86
- next if @producer.params[role].nil?
102
+ next unless @producer.params[role]
87
103
  @producer.params[role].each_with_index do |v, i|
88
- if v.instance_of?(Hash)
104
+ if v.kind_of?(Hash)
89
105
  s << %Q[ <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:contributor>\n]
90
106
  s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n]
91
107
  v.each_pair do |name, val|
@@ -98,7 +114,7 @@ EOT
98
114
  end
99
115
 
100
116
  if role == "prt" || role == "pbl"
101
- if v.instance_of?(Hash)
117
+ if v.kind_of?(Hash)
102
118
  s << %Q[ <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:publisher>\n]
103
119
  s << %Q[ <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n]
104
120
  v.each_pair do |name, val|
@@ -113,6 +129,13 @@ EOT
113
129
  end
114
130
  end
115
131
 
132
+ ## add custom <meta> element
133
+ if @producer.params["opf_meta"].present?
134
+ @producer.params["opf_meta"].each do |k, v|
135
+ s << %Q[ <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n]
136
+ end
137
+ end
138
+
116
139
  s
117
140
  end
118
141
 
@@ -126,7 +149,7 @@ EOT
126
149
 
127
150
  if @producer.params["coverimage"]
128
151
  @producer.contents.each do |item|
129
- if item.media =~ /\Aimage/ && File.basename(item.file) == @producer.params["coverimage"]
152
+ if item.media.start_with?('image') && File.basename(item.file) == @producer.params["coverimage"]
130
153
  s << %Q[ <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
131
154
  item.id = nil
132
155
  break
@@ -155,51 +178,42 @@ EOT
155
178
  end
156
179
 
157
180
  s = ""
158
- s << %Q[ <spine>\n]
181
+ if @producer.params["direction"]
182
+ s << %Q[ <spine page-progression-direction="#{@producer.params["direction"]}">\n]
183
+ else
184
+ s << %Q[ <spine>\n]
185
+ end
159
186
  s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="#{cover_linear}"/>\n]
160
187
  s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n] if @producer.params["toc"]
161
188
 
162
189
  @producer.contents.each do |item|
163
190
  next if item.media !~ /xhtml\+xml/ # skip non XHTML
164
- s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
191
+ s << %Q[ <itemref idref="#{item.id}"/>\n]
165
192
  end
166
193
  s << %Q[ </spine>\n]
167
194
 
168
195
  s
169
196
  end
170
197
 
171
- def opf_guide
172
- s = ""
173
- s << %Q[ <guide>\n]
174
- s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
175
- s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
176
- s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n]
177
- s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
178
- s << %Q[ </guide>\n]
179
- s
180
- end
181
-
182
198
  def ncx(indentarray)
183
- s = common_header
184
- s << <<EOT
185
- <title>#{@producer.res.v("toctitle")}</title>
186
- </head>
187
- <body>
188
- <nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
189
- <h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
190
- EOT
191
-
192
199
  if @producer.params["epubmaker"]["flattoc"].nil?
193
- s << hierarchy_ncx("ol")
200
+ ncx_main = hierarchy_ncx("ol")
194
201
  else
195
- s << flat_ncx("ol", @producer.params["epubmaker"]["flattocindent"])
202
+ ncx_main = flat_ncx("ol", @producer.params["epubmaker"]["flattocindent"])
196
203
  end
197
- s << <<EOT
198
- </nav>
199
- </body>
200
- </html>
204
+
205
+ @body = <<EOT
206
+ <nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
207
+ <h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v("toctitle"))}</h1>
208
+ #{ncx_main} </nav>
201
209
  EOT
202
- s
210
+
211
+ @title = CGI.escapeHTML(@producer.res.v("toctitle"))
212
+ @language = @producer.params['language']
213
+ @stylesheets = @producer.params["stylesheet"]
214
+ tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
215
+ tmpl = ReVIEW::Template.load(tmplfile)
216
+ return tmpl.result(binding)
203
217
  end
204
218
 
205
219
  # Produce EPUB file +epubfile+.
@@ -222,7 +236,7 @@ EOT
222
236
 
223
237
  if @producer.params["coverimage"]
224
238
  @producer.contents.each do |item|
225
- if item.media =~ /\Aimage/ && item.file =~ /#{@producer.params["coverimage"]}\Z/
239
+ if item.media.start_with?('image') && item.file =~ /#{@producer.params["coverimage"]}\Z/
226
240
  s << <<EOT
227
241
  <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>
228
242
  EOT
@@ -237,20 +251,5 @@ EOT
237
251
  s
238
252
  end
239
253
 
240
- def common_header
241
- s =<<EOT
242
- <?xml version="1.0" encoding="UTF-8"?>
243
- <!DOCTYPE html>
244
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
245
- <head>
246
- <meta charset="UTF-8" />
247
- <meta name="generator" content="Re:VIEW" />
248
- EOT
249
-
250
- @producer.params["stylesheet"].each do |file|
251
- s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
252
- end
253
- s
254
- end
255
254
  end
256
255
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = producer.rb -- EPUB producer.
3
3
  #
4
- # Copyright (c) 2010-2015 Kenshi Muto
4
+ # Copyright (c) 2010-2016 Kenshi Muto
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -10,12 +10,14 @@
10
10
 
11
11
  require 'tmpdir'
12
12
  require 'fileutils'
13
- require 'yaml'
14
- require 'uuid'
13
+ require 'review/yamlloader'
14
+ require 'securerandom'
15
15
  require 'epubmaker/content'
16
16
  require 'epubmaker/epubv2'
17
17
  require 'epubmaker/epubv3'
18
18
  require 'review/i18n'
19
+ require 'review/configure'
20
+ require 'review/extentions/hash'
19
21
 
20
22
  module EPUBMaker
21
23
  # EPUBMaker produces EPUB file.
@@ -29,14 +31,16 @@ module EPUBMaker
29
31
 
30
32
  # Take YAML +file+ and return parameter hash.
31
33
  def Producer.load(file)
32
- raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
33
- return YAML.load_file(file)
34
+ raise "Can't open #{file}." if file.nil? || !File.exist?(file)
35
+ loader = ReVIEW::YAMLLoader.new
36
+ loader.load_file(file)
34
37
  end
35
38
 
36
39
  # Take YAML +file+ and update parameter hash.
37
40
  def load(file)
38
- raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
39
- merge_params(@params.merge(YAML.load_file(file)))
41
+ raise "Can't open #{file}." if file.nil? || !File.exist?(file)
42
+ loader = ReVIEW::YAMLLoader.new
43
+ merge_params(@params.deep_merge(loader.load_file(file)))
40
44
  end
41
45
 
42
46
  # Construct producer object.
@@ -44,19 +48,29 @@ module EPUBMaker
44
48
  # +version+ takes EPUB version (default is 2).
45
49
  def initialize(params=nil, version=nil)
46
50
  @contents = []
47
- @params = {}
51
+ @params = ReVIEW::Configure.new
48
52
  @epub = nil
49
53
  @params["epubversion"] = version unless version.nil?
50
54
  @res = ReVIEW::I18n
51
55
 
52
- unless params.nil?
56
+ if params
53
57
  merge_params(params)
54
58
  end
55
59
  end
56
60
 
61
+ def coverimage
62
+ return nil unless params["coverimage"]
63
+ @contents.each do |item|
64
+ if item.media.start_with?('image') && item.file =~ /#{params["coverimage"]}\Z/ # /
65
+ return item.file
66
+ end
67
+ end
68
+ return nil
69
+ end
70
+
57
71
  # Update parameters by merging from new parameter hash +params+.
58
72
  def merge_params(params)
59
- @params = @params.merge(params)
73
+ @params.deep_merge!(params)
60
74
  complement
61
75
 
62
76
  unless @params["epubversion"].nil?
@@ -133,7 +147,7 @@ module EPUBMaker
133
147
  return nil unless File.exist?(path)
134
148
  allow_exts = @params["image_ext"] if allow_exts.nil?
135
149
  Dir.foreach(path) do |f|
136
- next if f =~ /\A\./
150
+ next if f.start_with?('.')
137
151
  if f =~ /\.(#{allow_exts.join("|")})\Z/i
138
152
  path.chop! if path =~ /\/\Z/
139
153
  if base.nil?
@@ -180,23 +194,33 @@ module EPUBMaker
180
194
  end
181
195
  end
182
196
 
197
+ def isbn_hyphen
198
+ str = @params["isbn"].to_s
199
+
200
+ if str =~ /\A\d{10}\Z/
201
+ "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
202
+ elsif str =~ /\A\d{13}\Z/
203
+ "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
204
+ else
205
+ nil
206
+ end
207
+ end
208
+
183
209
  private
184
210
 
185
211
  # Complement parameters.
186
212
  def complement
187
213
  @params["htmlext"] = "html" if @params["htmlext"].nil?
188
- defaults = {
189
- "cover" => "#{@params["bookname"]}.#{@params["htmlext"]}",
190
- "title" => @params["booktitle"],
214
+ defaults = ReVIEW::Configure.new.merge({
191
215
  "language" => "ja",
192
216
  "date" => Time.now.strftime("%Y-%m-%d"),
193
217
  "modified" => Time.now.strftime("%Y-%02m-%02dT%02H:%02M:%02SZ"),
194
- "urnid" => "urn:uid:#{UUID.create}",
218
+ "urnid" => "urn:uid:#{SecureRandom.uuid}",
195
219
  "isbn" => nil,
196
220
  "toclevel" => 2,
197
221
  "stylesheet" => [],
198
- "epubversion" => 2,
199
- "htmlversion" => 4,
222
+ "epubversion" => 3,
223
+ "htmlversion" => 5,
200
224
  "secnolevel" => 2,
201
225
  "pre_secnolevel" => 0,
202
226
  "post_secnolevel" => 1,
@@ -206,6 +230,8 @@ module EPUBMaker
206
230
  "originaltitlefile" => nil,
207
231
  "profile" => nil,
208
232
  "colophon" => nil,
233
+ "colophon_order" => %w[aut csl trl dsr ill edt pbl prt pht],
234
+ "direction" => "ltr",
209
235
  "epubmaker" => {
210
236
  "flattoc" => nil,
211
237
  "flattocindent" => true,
@@ -224,21 +250,15 @@ module EPUBMaker
224
250
  "force_include_images" => [],
225
251
  "cover_linear" => nil,
226
252
  },
253
+ "externallink" => true,
227
254
  "imagedir" => "images",
228
255
  "fontdir" => "fonts",
229
256
  "image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
230
257
  "font_ext" => %w(ttf woff otf),
231
- }
258
+ })
232
259
 
233
- defaults.each_pair do |k, v|
234
- if k == "epubmaker" && !@params[k].nil?
235
- v.each_pair do |k2, v2|
236
- @params[k][k2] = v2 if @params[k][k2].nil?
237
- end
238
- else
239
- @params[k] = v if @params[k].nil?
240
- end
241
- end
260
+ @params = defaults.deep_merge(@params)
261
+ @params["title"] = @params["booktitle"] unless @params["title"]
242
262
 
243
263
  deprecated_parameters = {
244
264
  "ncxindent" => "epubmaker:ncxindent",
@@ -268,14 +288,18 @@ module EPUBMaker
268
288
  end
269
289
  end
270
290
 
271
- @params["htmlversion"] == 5 if @params["epubversion"] >= 3
291
+ @params["htmlversion"] = 5 if @params["epubversion"] >= 3
292
+
293
+ @params.maker = "epubmaker"
294
+ @params["cover"] = "#{@params["bookname"]}.#{@params["htmlext"]}" unless @params["cover"]
272
295
 
273
296
  %w[bookname title].each do |k|
274
- raise "Key #{k} must have a value. Abort." if @params[k].nil?
297
+ raise "Key #{k} must have a value. Abort." unless @params[k]
275
298
  end
276
299
  # array
277
300
  %w[subject 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 adp ann arr art asn aut aqt aft aui ant bkp clb cmm dsr edt ill lyr mdc mus nrt oth pht pbl prt red rev spn ths trc trl stylesheet rights].each do |item|
278
- @params[item] = [@params[item]] if !@params[item].nil? && @params[item].instance_of?(String)
301
+ next unless @params[item]
302
+ @params[item] = [@params[item]] if @params[item].kind_of?(String)
279
303
  end
280
304
  # optional
281
305
  # type, format, identifier, source, relation, coverpage, aut