review 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +1 -0
  3. data/ChangeLog +100 -0
  4. data/README.rdoc +11 -12
  5. data/Rakefile +6 -2
  6. data/bin/review-check +1 -1
  7. data/bin/review-compile +13 -4
  8. data/bin/review-epubmaker +172 -24
  9. data/bin/review-epubmaker-ng +8 -161
  10. data/bin/review-index +1 -1
  11. data/bin/review-init +17 -5
  12. data/bin/review-pdfmaker +40 -19
  13. data/bin/review-preproc +1 -1
  14. data/bin/review-validate +2 -2
  15. data/bin/review-vol +1 -1
  16. data/debian/control +2 -2
  17. data/doc/format.rdoc +23 -6
  18. data/doc/format_idg.rdoc +3 -3
  19. data/doc/libepubmaker/config.yaml +163 -0
  20. data/doc/quickstart.rdoc +27 -27
  21. data/doc/sample.yaml +10 -5
  22. data/lib/epubmaker.rb +2 -5
  23. data/lib/epubmaker/content.rb +9 -6
  24. data/lib/epubmaker/epubv2.rb +233 -109
  25. data/lib/epubmaker/epubv3.rb +83 -119
  26. data/lib/epubmaker/producer.rb +50 -20
  27. data/lib/epubmaker/resource.rb +22 -8
  28. data/lib/review/book/base.rb +1 -0
  29. data/lib/review/book/chapter.rb +2 -2
  30. data/lib/review/book/compilable.rb +1 -1
  31. data/lib/review/book/index.rb +33 -27
  32. data/lib/review/book/parameters.rb +3 -2
  33. data/lib/review/book/part.rb +1 -1
  34. data/lib/review/builder.rb +10 -42
  35. data/lib/review/compiler.rb +1 -1
  36. data/lib/review/configure.rb +3 -3
  37. data/lib/review/epubmaker.rb +428 -0
  38. data/lib/review/htmlbuilder.rb +45 -95
  39. data/lib/review/htmlutils.rb +2 -0
  40. data/lib/review/i18n.yaml +25 -0
  41. data/lib/review/idgxmlbuilder.rb +11 -9
  42. data/lib/review/inaobuilder.rb +1 -1
  43. data/lib/review/latexbuilder.rb +7 -6
  44. data/lib/review/latexutils.rb +6 -0
  45. data/lib/review/makerhelper.rb +4 -2
  46. data/lib/review/markdownbuilder.rb +8 -0
  47. data/lib/review/sec_counter.rb +71 -0
  48. data/lib/review/topbuilder.rb +0 -1
  49. data/lib/review/version.rb +2 -2
  50. data/review.gemspec +4 -4
  51. data/test/sample-book/README.md +2 -2
  52. data/test/sample-book/src/Rakefile +2 -2
  53. data/test/sample-book/src/config.yml +4 -4
  54. data/test/sample-book/src/images/cover.jpg +0 -0
  55. data/test/sample-book/src/sty/{samplemacro.sty → reviewmacro.sty} +1 -1
  56. data/test/test_book_parameter.rb +1 -1
  57. data/test/test_epubmaker.rb +77 -15
  58. data/test/test_epubmaker_cmd.rb +11 -7
  59. data/test/test_helper.rb +7 -0
  60. data/test/test_htmlbuilder.rb +39 -6
  61. data/test/test_idgxmlbuilder.rb +14 -2
  62. data/test/test_inaobuilder.rb +2 -1
  63. data/test/test_latexbuilder.rb +23 -2
  64. data/test/test_makerhelper.rb +19 -3
  65. data/test/test_markdownbuilder.rb +35 -0
  66. data/test/test_pdfmaker_cmd.rb +11 -7
  67. data/test/test_topbuilder.rb +36 -2
  68. metadata +18 -18
  69. data/VERSION +0 -1
  70. data/doc/libepubmaker/sample.yaml +0 -90
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubv3.rb -- EPUB version 3 producer.
3
3
  #
4
- # Copyright (c) 2010 Kenshi Muto
4
+ # Copyright (c) 2010-2013 Kenshi Muto
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -15,152 +15,100 @@ module EPUBMaker
15
15
 
16
16
  # EPUBv3 is EPUB version 3 producer.
17
17
  class EPUBv3 < EPUBv2
18
+ def opf_guide
19
+ s = ""
20
+ s << %Q[ <guide>\n]
21
+ s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
22
+ s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
23
+ s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n]
24
+ s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
25
+ s << %Q[ </guide>\n]
26
+ s
27
+ end
28
+
18
29
  def ncx(indentarray)
19
- # FIXME: handle indentarray
20
30
  s = common_header
21
31
  s << <<EOT
22
32
  <title>#{@producer.res.v("toctitle")}</title>
23
33
  </head>
24
34
  <body>
25
- <nav epub:type="toc" id="toc">
35
+ <nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
26
36
  <h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
27
- <ul class="toc-h1">
28
37
  EOT
29
38
 
30
- current = 1
31
- init_item = true
32
- @producer.contents.each do |item|
33
- next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > @producer.params["toclevel"].to_i
34
- if item.level > current
35
- s << %Q[\n<ul class="toc-h#{item.level}">\n]
36
- current = item.level
37
- elsif item.level < current
38
- (current - 1).downto(item.level) do |n|
39
- s << %Q[</li>\n</ul>\n]
40
- end
41
- s << %Q[</li>\n]
42
- current = item.level
43
- elsif init_item
44
- # noop
45
- else
46
- s << %Q[</li>\n]
47
- end
48
- s << %Q[<li><a href="#{item.file}">#{item.title}</a>]
49
- init_item = false
50
- end
51
-
52
- (current - 1).downto(1) do |n|
53
- s << %Q[</li>\n</ul>\n]
54
- end
55
- if !init_item
56
- s << %Q[</li>\n]
39
+ if @producer.params["flattoc"].nil?
40
+ s << hierarchy_ncx("ol")
41
+ else
42
+ s << flat_ncx("ol", @producer.params["flattocindent"])
57
43
  end
58
44
  s << <<EOT
59
- </ul>
60
45
  </nav>
61
46
  </body>
62
47
  </html>
63
48
  EOT
64
- return s
49
+ s
65
50
  end
66
51
 
67
52
  # Produce EPUB file +epubfile+.
68
53
  # +basedir+ points the directory has contents.
69
54
  # +tmpdir+ defines temporary directory.
70
55
  def produce(epubfile, basedir, tmpdir)
71
- File.open("#{tmpdir}/mimetype", "w") {|f| @producer.mimetype(f) }
72
-
73
- Dir.mkdir("#{tmpdir}/META-INF") unless File.exist?("#{tmpdir}/META-INF")
74
- File.open("#{tmpdir}/META-INF/container.xml", "w") {|f| @producer.container(f) }
75
-
76
- Dir.mkdir("#{tmpdir}/OEBPS") unless File.exist?("#{tmpdir}/OEBPS")
77
- File.open("#{tmpdir}/OEBPS/#{@producer.params["bookname"]}.opf", "w") {|f| @producer.opf(f) }
56
+ produce_write_common(basedir, tmpdir)
57
+
78
58
  File.open("#{tmpdir}/OEBPS/#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}", "w") {|f| @producer.ncx(f, @producer.params["ncxindent"]) }
79
- # File.open("#{tmpdir}/OEBPS/#{@producer.params["tocfile"]}", "w") {|f| @producer.mytoc(f) } unless @producer.params["mytoc"].nil?
80
-
81
- if File.exist?("#{basedir}/#{@producer.params["cover"]}")
82
- FileUtils.cp("#{basedir}/#{@producer.params["cover"]}", "#{tmpdir}/OEBPS")
83
- else
84
- File.open("#{tmpdir}/OEBPS/#{@producer.params["cover"]}", "w") {|f| @producer.cover(f) }
85
- end
86
-
87
- # FIXME:colophon and titlepage should be included in @producer.contents.
88
-
89
- @producer.contents.each do |item|
90
- next if item.file =~ /#/ # skip subgroup
91
- fname = "#{basedir}/#{item.file}"
92
- raise "#{fname} doesn't exist. Abort." unless File.exist?(fname)
93
- FileUtils.mkdir_p(File.dirname("#{tmpdir}/OEBPS/#{item.file}")) unless File.exist?(File.dirname("#{tmpdir}/OEBPS/#{item.file}"))
94
- FileUtils.cp(fname, "#{tmpdir}/OEBPS/#{item.file}")
95
- end
96
59
 
97
- fork {
98
- Dir.chdir(tmpdir) {|d|
99
- exec("zip", "-0X", "#{epubfile}", "mimetype")
100
- }
101
- }
102
- Process.waitall
103
- fork {
104
- Dir.chdir(tmpdir) {|d|
105
- exec("zip", "-Xr9D", "#{epubfile}", "META-INF", "OEBPS")
106
- }
107
- }
108
- Process.waitall
60
+ @producer.call_hook(@producer.params["hook_prepack"], tmpdir)
61
+ export_zip(tmpdir, epubfile)
109
62
  end
110
63
 
111
- # Return opf file content.
112
- def opf
113
- mathstr = @producer.params["mathml"].nil? ? "" : %Q[ properties="mathml"]
114
- s = <<EOT
115
- <?xml version="1.0" encoding="UTF-8"?>
116
- <package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="#{@producer.params["language"]}" profile="http://www.idpf.org/epub/30/profile/package/">
117
- <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
118
- EOT
64
+ def opf_metainfo
65
+ s = ""
119
66
  %w[title language date type format source description relation coverage subject rights].each do |item|
120
67
  next if @producer.params[item].nil?
121
68
  if @producer.params[item].instance_of?(Array)
122
- s << @producer.params[item].map {|i| %Q[ <dc:#{item} prefer="#{item}">#{CGI.escapeHTML(i.to_s)}</dc:#{item}>\n]}.join
123
- s << @producer.params[item].map {|i| %Q[ <meta id="#{item}" property="dcterms:#{item}">#{CGI.escapeHTML(i.to_s)}</meta>\n]}.join
69
+ s << @producer.params[item].map.with_index {|v, i| %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n]}.join
124
70
  else
125
- s << %Q[ <dc:#{item} prefer="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
126
- s << %Q[ <meta id="#{item}" property="dcterms:#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</meta>\n]
71
+ s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
127
72
  end
128
73
  end
129
74
 
75
+ s << %Q[ <meta property="dcterms:modified">#{@producer.params["modified"]}</meta>\n]
76
+
130
77
  # ID
131
78
  if @producer.params["isbn"].nil?
132
- s << %Q[ <dc:identifier id="BookId" prefer="bookid">#{@producer.params["urnid"]}</dc:identifier>\n]
133
- s << %Q[ <meta property="dcterms:identifier" id="bookid">#{@producer.params["urnid"]}</meta>\n]
79
+ s << %Q[ <dc:identifier id="BookId">#{@producer.params["urnid"]}</dc:identifier>\n]
134
80
  else
135
- s << %Q[ <dc:identifier id="BookId" opf:scheme="ISBN" prefer="bookid">#{@producer.params["isbn"]}</dc:identifier>\n]
136
- s << %Q[ <meta property="dcterms:identifier" id="bookid" opf:scheme="ISBN">#{@producer.params["isbn"]}</meta>\n]
81
+ s << %Q[ <dc:identifier id="BookId">#{@producer.params["isbn"]}</dc:identifier>\n]
137
82
  end
138
-
139
- # creator
140
- %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|
83
+
84
+ # creator (should be array)
85
+ %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-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].each do |role|
141
86
  next if @producer.params[role].nil?
142
87
  @producer.params[role].each_with_index do |v, i|
143
- s << %Q[ <dc:creator opf:role="#{role.sub('a-', '')}" prefer="creator-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n]
144
- s << %Q[ <meta property="dcterms:creator" id="creator-#{i}" opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</meta>\n]
88
+ s << %Q[ <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n]
89
+ s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n]
145
90
  end
146
91
  end
147
- # contributor
148
- %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|
92
+
93
+ # contributor (should be array)
94
+ %w[adp ann arr art asn aqt aft aui ant bkp clb cmm csl dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl].each do |role|
149
95
  next if @producer.params[role].nil?
150
96
  @producer.params[role].each_with_index do |v, i|
151
- s << %Q[ <dc:contributor opf:role="#{role}" prefer="contributor-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
152
- s << %Q[ <meta property="dcterms:contributor" id="contributor-#{i}" opf:role="#{role}">#{CGI.escapeHTML(v)}</meta>\n]
97
+ s << %Q[ <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
98
+ s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n]
153
99
 
154
100
  if role == "prt"
155
- s << %Q[ <dc:publisher prefer="publisher">#{CGI.escapeHTML(v)}</dc:publisher>\n]
156
- s << %Q[ <meta property="dcterms:publisher" id="publisher">#{CGI.escapeHTML(v)}</meta>\n]
101
+ s << %Q[ <dc:publisher id="prt">#{CGI.escapeHTML(v)}</dc:publisher>\n]
102
+ s << %Q[ <meta refines="#prt" property="role" scheme="marc:relators">prt</meta>\n]
157
103
  end
158
104
  end
159
105
  end
160
106
 
161
- s << %Q[ </metadata>\n]
162
-
163
- # manifest
107
+ s
108
+ end
109
+
110
+ def opf_manifest(mathstr)
111
+ s = ""
164
112
  s << <<EOT
165
113
  <manifest>
166
114
  <item properties="nav#{mathstr.empty? ? '' : ' mathml'}" id="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" media-type="application/xhtml+xml"/>
@@ -170,40 +118,57 @@ EOT
170
118
  if @producer.params["coverimage"]
171
119
  @producer.contents.each do |item|
172
120
  if item.media =~ /\Aimage/ && item.file =~ /#{@producer.params["coverimage"]}\Z/
173
- s << %Q[ <item properties="cover-image" id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
121
+ s << %Q[ <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
122
+ item.id = nil
174
123
  break
175
124
  end
176
125
  end
177
126
  end
178
127
 
179
- # s << %Q[ <item id="toc" href="#{@producer.params["tocfile"]}" media-type="application/xhtml+xml"/>\n] unless @producer.params["mytoc"].nil?
180
-
181
128
  @producer.contents.each do |item|
182
- next if item.file =~ /#/ # skip subgroup
129
+ next if item.file =~ /#/ || item.id.nil? # skip subgroup, or id=nil (for cover)
183
130
  s << %Q[ <item#{mathstr} id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
184
131
  end
185
132
  s << %Q[ </manifest>\n]
186
-
187
- # tocx
133
+
134
+ s
135
+ end
136
+
137
+ def opf_tocx
138
+ s = ""
188
139
  s << %Q[ <spine>\n]
189
140
  s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="no"/>\n]
190
- s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n] unless @producer.params["mytoc"].nil?
141
+ # s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n]
191
142
 
192
143
  @producer.contents.each do |item|
193
144
  next if item.media !~ /xhtml\+xml/ # skip non XHTML
194
145
  s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
195
146
  end
196
147
  s << %Q[ </spine>\n]
197
-
198
- # guide
199
- s << %Q[ <guide>\n]
200
- s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
201
- s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="#{@producer.params["titlepage"]}"/>\n] unless @producer.params["titlepage"].nil?
202
- s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["mytoc"].nil?
203
- s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil? # FIXME: path
204
- s << %Q[ </guide>\n]
148
+
149
+ s
150
+ end
151
+
152
+ # Return opf file content.
153
+ def opf
154
+ mathstr = @producer.params["mathml"].nil? ? "" : %Q[ properties="mathml"]
155
+ s = <<EOT
156
+ <?xml version="1.0" encoding="UTF-8"?>
157
+ <package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="#{@producer.params["language"]}">
158
+ <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
159
+ EOT
160
+
161
+ s << opf_metainfo
162
+
163
+ s << %Q[ </metadata>\n]
164
+
165
+ s << opf_manifest(mathstr)
166
+ s << opf_tocx
167
+ s << opf_guide # same as ePUB2
168
+
205
169
  s << %Q[</package>\n]
206
- return s
170
+
171
+ s
207
172
  end
208
173
 
209
174
  private
@@ -226,7 +191,7 @@ EOT
226
191
  s << <<EOT
227
192
  <item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
228
193
  EOT
229
- return s
194
+ s
230
195
  end
231
196
 
232
197
  def common_header
@@ -235,15 +200,14 @@ EOT
235
200
  <!DOCTYPE html>
236
201
  <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2011/epub" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
237
202
  <head>
238
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
239
- <meta http-equiv="Content-Style-Type" content="text/css"/>
203
+ <meta charset="UTF-8" />
240
204
  <meta name="generator" content="EPUBMaker::Producer"/>
241
205
  EOT
242
206
 
243
207
  @producer.params["stylesheet"].each do |file|
244
208
  s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
245
209
  end
246
- return s
210
+ s
247
211
  end
248
212
  end
249
213
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = producer.rb -- EPUB producer.
3
3
  #
4
- # Copyright (c) 2010 Kenshi Muto
4
+ # Copyright (c) 2010-2014 Kenshi Muto
5
5
  #
6
6
  # This program is free software.
7
7
  # You can distribute or modify this program under the terms of
@@ -36,11 +36,11 @@ module EPUBMaker
36
36
  # Take YAML +file+ and update parameter hash.
37
37
  def load(file)
38
38
  raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
39
- mergeparams(@params.merge(YAML.load_file(file)))
39
+ merge_params(@params.merge(YAML.load_file(file)))
40
40
  end
41
41
 
42
42
  # Construct producer object.
43
- # +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#mergeparams.
43
+ # +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#merge_params.
44
44
  # +version+ takes EPUB version (default is 2).
45
45
  def initialize(params=nil, version=nil)
46
46
  @contents = []
@@ -49,12 +49,12 @@ module EPUBMaker
49
49
  @params["epubversion"] = version unless version.nil?
50
50
 
51
51
  unless params.nil?
52
- mergeparams(params)
52
+ merge_params(params)
53
53
  end
54
54
  end
55
55
 
56
56
  # Update parameters by merging from new parameter hash +params+.
57
- def mergeparams(params)
57
+ def merge_params(params)
58
58
  @params = @params.merge(params)
59
59
  complement
60
60
  @res = EPUBMaker::Resource.new(@params)
@@ -121,13 +121,15 @@ module EPUBMaker
121
121
  s = @epub.mytoc
122
122
  wobj.puts s if !s.nil? && !wobj.nil?
123
123
  end
124
-
124
+
125
125
  # Add informations of figure files in +path+ to contents array.
126
126
  # +base+ defines a string to remove from path name.
127
- def importImageInfo(path, base=nil)
127
+ def import_imageinfo(path, base=nil, allow_exts=nil)
128
+ return nil unless File.exist?(path)
129
+ allow_exts = @params["image_ext"] if allow_exts.nil?
128
130
  Dir.foreach(path) do |f|
129
131
  next if f =~ /\A\./
130
- if f =~ /\.(png|jpg|jpeg|svg|gif)\Z/i # FIXME:EPUB3 accepts more types...
132
+ if f =~ /\.(#{allow_exts.join("|")})\Z/i
131
133
  path.chop! if path =~ /\/\Z/
132
134
  if base.nil?
133
135
  @contents.push(EPUBMaker::Content.new({"file" => "#{path}/#{f}"}))
@@ -136,10 +138,12 @@ module EPUBMaker
136
138
  end
137
139
  end
138
140
  if FileTest.directory?("#{path}/#{f}")
139
- importImageInfo("#{path}/#{f}", base)
141
+ import_imageinfo("#{path}/#{f}", base)
140
142
  end
141
143
  end
142
144
  end
145
+
146
+ alias importImageInfo import_imageinfo
143
147
 
144
148
  # Produce EPUB file +epubfile+.
145
149
  # +basedir+ points the directory has contents (default: current directory.)
@@ -147,7 +151,6 @@ module EPUBMaker
147
151
  def produce(epubfile, basedir=nil, tmpdir=nil)
148
152
  current = Dir.pwd
149
153
  basedir = current if basedir.nil?
150
- # FIXME: produce cover, mytoc, titlepage, colophon?
151
154
 
152
155
  _tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
153
156
  epubfile = "#{current}/#{epubfile}" if epubfile !~ /\A\// # /
@@ -162,40 +165,67 @@ module EPUBMaker
162
165
  end
163
166
  end
164
167
 
165
- private
168
+ def call_hook(filename, *params)
169
+ if !filename.nil? && File.exist?(filename) && FileTest.executable?(filename)
170
+ system(filename, *params)
171
+ end
172
+ end
166
173
 
174
+ private
175
+
167
176
  # Complement parameters.
168
177
  def complement
169
- # FIXME: should separate for EPUB2/3?
170
- # FIXME: escapeHTML?
171
- # use default value if not defined
172
178
  @params["htmlext"] = "html" if @params["htmlext"].nil?
173
179
  defaults = {
174
180
  "cover" => "#{@params["bookname"]}.#{@params["htmlext"]}",
175
- "title" => @params["booktitle"], # backward compatibility
181
+ "title" => @params["booktitle"],
176
182
  "language" => "ja",
177
183
  "date" => Time.now.strftime("%Y-%m-%d"),
184
+ "modified" => Time.now.strftime("%Y-%02m-%02dT%02H:%02M:%02SZ"),
178
185
  "urnid" => "urn:uid:#{UUID.create}",
179
- "tocfile" => "toc.#{@params["htmlext"]}",
186
+ "isbn" => nil,
180
187
  "toclevel" => 2,
188
+ "flattoc" => nil,
189
+ "flattocindent" => true,
181
190
  "stylesheet" => [],
182
191
  "epubversion" => 2,
183
192
  "htmlversion" => 4,
193
+ "secnolevel" => 2,
194
+ "pre_secnolevel" => 0,
195
+ "post_secnolevel" => 0,
196
+ "part_secnolevel" => 1,
197
+ "titlepage" => nil,
198
+ "titlepagefile" => nil,
199
+ "originaltitlefile" => nil,
200
+ "profile" => nil,
201
+ "colophon" => nil,
202
+ "zip_stage1" => "zip -0Xq",
203
+ "zip_stage2" => "zip -Xr9Dq",
204
+ "hook_beforeprocess" => nil,
205
+ "hook_afterfrontmatter" => nil,
206
+ "hook_afterbody" => nil,
207
+ "hook_afterbackmatter" => nil,
208
+ "hook_aftercopyimage" => nil,
209
+ "hook_prepack" => nil,
210
+ "rename_for_legacy" => nil,
211
+ "imagedir" => "images",
212
+ "fontdir" => "fonts",
213
+ "image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
214
+ "font_ext" => %w(ttf woff otf),
184
215
  }
185
216
 
186
217
  defaults.each_pair do |k, v|
187
218
  @params[k] = v if @params[k].nil?
188
219
  end
189
220
 
190
- @params["htmlversion"] == 5 if @params["epubversion"] >= 3 && @params["htmlversion"] == 4
221
+ @params["htmlversion"] == 5 if @params["epubversion"] >= 3
191
222
 
192
- # must be defined
193
223
  %w[bookname title].each do |k|
194
- raise "Key #{k} must have a value. Abort." if @params[k].nil? # FIXME: should not be error?
224
+ raise "Key #{k} must have a value. Abort." if @params[k].nil?
195
225
  end
196
226
  # array
197
227
  %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 prt red rev spn ths trc trl stylesheet].each do |item|
198
- @params[item] = [@params[item]] if !@params[item].nil? && @params[item].instance_of?(String) # FIXME: avoid double insert
228
+ @params[item] = [@params[item]] if !@params[item].nil? && @params[item].instance_of?(String)
199
229
  end
200
230
  # optional
201
231
  # type, format, identifier, source, relation, coverpage, rights, aut