tmtms-review 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +9 -0
  3. data/COPYING +515 -0
  4. data/ChangeLog +2083 -0
  5. data/README.rdoc +50 -0
  6. data/Rakefile +56 -0
  7. data/VERSION +1 -0
  8. data/bin/review-check +178 -0
  9. data/bin/review-checkdep +63 -0
  10. data/bin/review-compile +205 -0
  11. data/bin/review-epubmaker +661 -0
  12. data/bin/review-epubmaker-ng +176 -0
  13. data/bin/review-index +118 -0
  14. data/bin/review-pdfmaker +208 -0
  15. data/bin/review-preproc +142 -0
  16. data/bin/review-validate +51 -0
  17. data/bin/review-vol +102 -0
  18. data/debian/README.Debian +12 -0
  19. data/debian/README.source +5 -0
  20. data/debian/changelog +5 -0
  21. data/debian/compat +1 -0
  22. data/debian/control +22 -0
  23. data/debian/copyright +62 -0
  24. data/debian/docs +6 -0
  25. data/debian/manpage.1.ex +59 -0
  26. data/debian/patches/path.diff +91 -0
  27. data/debian/patches/series +1 -0
  28. data/debian/review.install +13 -0
  29. data/debian/review.links +4 -0
  30. data/debian/rules +13 -0
  31. data/debian/source/format +1 -0
  32. data/doc/format.rdoc +582 -0
  33. data/doc/format_idg.rdoc +180 -0
  34. data/doc/libepubmaker/sample.yaml +90 -0
  35. data/doc/quickstart.rdoc +188 -0
  36. data/doc/ruby-uuid/README +11 -0
  37. data/doc/ruby-uuid/README.ja +34 -0
  38. data/doc/sample.css +108 -0
  39. data/doc/sample.yaml +62 -0
  40. data/lib/epubmaker.rb +28 -0
  41. data/lib/epubmaker/content.rb +82 -0
  42. data/lib/epubmaker/epubv2.rb +418 -0
  43. data/lib/epubmaker/epubv3.rb +249 -0
  44. data/lib/epubmaker/producer.rb +204 -0
  45. data/lib/epubmaker/resource.rb +66 -0
  46. data/lib/lineinput.rb +155 -0
  47. data/lib/review.rb +3 -0
  48. data/lib/review/book.rb +46 -0
  49. data/lib/review/book/base.rb +235 -0
  50. data/lib/review/book/chapter.rb +81 -0
  51. data/lib/review/book/compilable.rb +159 -0
  52. data/lib/review/book/index.rb +339 -0
  53. data/lib/review/book/page_metric.rb +38 -0
  54. data/lib/review/book/parameters.rb +97 -0
  55. data/lib/review/book/part.rb +44 -0
  56. data/lib/review/book/volume.rb +65 -0
  57. data/lib/review/builder.rb +444 -0
  58. data/lib/review/compiler.rb +550 -0
  59. data/lib/review/configure.rb +38 -0
  60. data/lib/review/epubbuilder.rb +18 -0
  61. data/lib/review/exception.rb +21 -0
  62. data/lib/review/extentions.rb +3 -0
  63. data/lib/review/extentions/object.rb +9 -0
  64. data/lib/review/extentions/string.rb +33 -0
  65. data/lib/review/htmlbuilder.rb +1097 -0
  66. data/lib/review/htmllayout.rb +19 -0
  67. data/lib/review/htmlutils.rb +36 -0
  68. data/lib/review/i18n.rb +30 -0
  69. data/lib/review/i18n.yaml +34 -0
  70. data/lib/review/idgxmlbuilder.rb +1145 -0
  71. data/lib/review/latexbuilder.rb +815 -0
  72. data/lib/review/latexindex.rb +35 -0
  73. data/lib/review/latexutils.rb +79 -0
  74. data/lib/review/preprocessor.rb +563 -0
  75. data/lib/review/review.tex.erb +232 -0
  76. data/lib/review/textbuilder.rb +17 -0
  77. data/lib/review/textutils.rb +66 -0
  78. data/lib/review/tocparser.rb +342 -0
  79. data/lib/review/tocprinter.rb +221 -0
  80. data/lib/review/topbuilder.rb +785 -0
  81. data/lib/review/unfold.rb +138 -0
  82. data/lib/uuid.rb +312 -0
  83. data/review.gemspec +141 -0
  84. data/test/CHAPS +2 -0
  85. data/test/bib.re +13 -0
  86. data/test/book_test_helper.rb +35 -0
  87. data/test/test.re +43 -0
  88. data/test/test_book.rb +598 -0
  89. data/test/test_book_chapter.rb +418 -0
  90. data/test/test_book_parameter.rb +42 -0
  91. data/test/test_book_part.rb +50 -0
  92. data/test/test_builder.rb +144 -0
  93. data/test/test_compiler.rb +44 -0
  94. data/test/test_epubmaker.rb +507 -0
  95. data/test/test_helper.rb +27 -0
  96. data/test/test_htmlbuilder.rb +554 -0
  97. data/test/test_htmlutils.rb +28 -0
  98. data/test/test_i18n.rb +64 -0
  99. data/test/test_idgxmlbuilder.rb +589 -0
  100. data/test/test_index.rb +31 -0
  101. data/test/test_latexbuilder.rb +656 -0
  102. data/test/test_lineinput.rb +198 -0
  103. data/test/test_preprocessor.rb +23 -0
  104. data/test/test_textutils.rb +68 -0
  105. data/test/test_topbuilder.rb +244 -0
  106. data/test/test_uuid.rb +156 -0
  107. metadata +161 -0
@@ -0,0 +1,249 @@
1
+ # encoding: utf-8
2
+ # = epubv3.rb -- EPUB version 3 producer.
3
+ #
4
+ # Copyright (c) 2010 Kenshi Muto
5
+ #
6
+ # This program is free software.
7
+ # You can distribute or modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ # For details of the GNU LGPL, see the file "COPYING".
10
+ #
11
+
12
+ require 'epubmaker/epubv2'
13
+
14
+ module EPUBMaker
15
+
16
+ # EPUBv3 is EPUB version 3 producer.
17
+ class EPUBv3 < EPUBv2
18
+ def ncx(indentarray)
19
+ # FIXME: handle indentarray
20
+ s = common_header
21
+ s << <<EOT
22
+ <title>#{@producer.res.v("toctitle")}</title>
23
+ </head>
24
+ <body>
25
+ <nav epub:type="toc" id="toc">
26
+ <h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
27
+ <ul class="toc-h1">
28
+ EOT
29
+
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]
57
+ end
58
+ s << <<EOT
59
+ </ul>
60
+ </nav>
61
+ </body>
62
+ </html>
63
+ EOT
64
+ return s
65
+ end
66
+
67
+ # Produce EPUB file +epubfile+.
68
+ # +basedir+ points the directory has contents.
69
+ # +tmpdir+ defines temporary directory.
70
+ 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) }
78
+ 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
+
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
109
+ end
110
+
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
119
+ %w[title language date type format source description relation coverage subject rights].each do |item|
120
+ next if @producer.params[item].nil?
121
+ 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
124
+ 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]
127
+ end
128
+ end
129
+
130
+ # ID
131
+ 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]
134
+ 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]
137
+ 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|
141
+ next if @producer.params[role].nil?
142
+ @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]
145
+ end
146
+ 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|
149
+ next if @producer.params[role].nil?
150
+ @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]
153
+
154
+ 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]
157
+ end
158
+ end
159
+ end
160
+
161
+ s << %Q[ </metadata>\n]
162
+
163
+ # manifest
164
+ s << <<EOT
165
+ <manifest>
166
+ <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"/>
167
+ <item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
168
+ EOT
169
+
170
+ if @producer.params["coverimage"]
171
+ @producer.contents.each do |item|
172
+ 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]
174
+ break
175
+ end
176
+ end
177
+ end
178
+
179
+ # s << %Q[ <item id="toc" href="#{@producer.params["tocfile"]}" media-type="application/xhtml+xml"/>\n] unless @producer.params["mytoc"].nil?
180
+
181
+ @producer.contents.each do |item|
182
+ next if item.file =~ /#/ # skip subgroup
183
+ s << %Q[ <item#{mathstr} id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
184
+ end
185
+ s << %Q[ </manifest>\n]
186
+
187
+ # tocx
188
+ s << %Q[ <spine>\n]
189
+ 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?
191
+
192
+ @producer.contents.each do |item|
193
+ next if item.media !~ /xhtml\+xml/ # skip non XHTML
194
+ s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
195
+ end
196
+ 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]
205
+ s << %Q[</package>\n]
206
+ return s
207
+ end
208
+
209
+ private
210
+
211
+ # Return cover pointer for opf file
212
+ def cover_in_opf
213
+ s = ""
214
+
215
+ if @producer.params["coverimage"]
216
+ @producer.contents.each do |item|
217
+ if item.media =~ /\Aimage/ && item.file =~ /#{@producer.params["coverimage"]}\Z/
218
+ s << <<EOT
219
+ <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>
220
+ EOT
221
+ break
222
+ end
223
+ end
224
+ end
225
+
226
+ s << <<EOT
227
+ <item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
228
+ EOT
229
+ return s
230
+ end
231
+
232
+ def common_header
233
+ s =<<EOT
234
+ <?xml version="1.0" encoding="UTF-8"?>
235
+ <!DOCTYPE html>
236
+ <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
+ <head>
238
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
239
+ <meta http-equiv="Content-Style-Type" content="text/css"/>
240
+ <meta name="generator" content="EPUBMaker::Producer"/>
241
+ EOT
242
+
243
+ @producer.params["stylesheet"].each do |file|
244
+ s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
245
+ end
246
+ return s
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,204 @@
1
+ # encoding: utf-8
2
+ # = producer.rb -- EPUB producer.
3
+ #
4
+ # Copyright (c) 2010 Kenshi Muto
5
+ #
6
+ # This program is free software.
7
+ # You can distribute or modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ # For details of the GNU LGPL, see the file "COPYING".
10
+
11
+ require 'tmpdir'
12
+ require 'fileutils'
13
+ require 'yaml'
14
+ require 'uuid'
15
+ require 'epubmaker/resource'
16
+ require 'epubmaker/content'
17
+ require 'epubmaker/epubv2'
18
+ require 'epubmaker/epubv3'
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 :params
27
+ # Message resource object.
28
+ attr_accessor :res
29
+
30
+ # Take YAML +file+ and return parameter hash.
31
+ def Producer.load(file)
32
+ raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
33
+ return YAML.load_file(file)
34
+ end
35
+
36
+ # Take YAML +file+ and update parameter hash.
37
+ def load(file)
38
+ raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
39
+ mergeparams(@params.merge(YAML.load_file(file)))
40
+ end
41
+
42
+ # Construct producer object.
43
+ # +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#mergeparams.
44
+ # +version+ takes EPUB version (default is 2).
45
+ def initialize(params=nil, version=nil)
46
+ @contents = []
47
+ @params = {}
48
+ @epub = nil
49
+ @params["epubversion"] = version unless version.nil?
50
+
51
+ unless params.nil?
52
+ mergeparams(params)
53
+ end
54
+ end
55
+
56
+ # Update parameters by merging from new parameter hash +params+.
57
+ def mergeparams(params)
58
+ @params = @params.merge(params)
59
+ complement
60
+ @res = EPUBMaker::Resource.new(@params)
61
+
62
+ unless @params["epubversion"].nil?
63
+ case @params["epubversion"].to_i
64
+ when 2
65
+ @epub = EPUBMaker::EPUBv2.new(self)
66
+ when 3
67
+ @epub = EPUBMaker::EPUBv3.new(self)
68
+ else
69
+ raise "Invalid EPUB version (#{@params["epubversion"]}.)"
70
+ end
71
+ end
72
+ end
73
+
74
+ # Write mimetype file to IO object +wobj+.
75
+ def mimetype(wobj)
76
+ s = @epub.mimetype
77
+ wobj.print s if !s.nil? && !wobj.nil?
78
+ end
79
+
80
+ # Write opf file to IO object +wobj+.
81
+ def opf(wobj)
82
+ s = @epub.opf
83
+ wobj.puts s if !s.nil? && !wobj.nil?
84
+ end
85
+
86
+ # Write ncx file to IO object +wobj+. +indentarray+ defines prefix
87
+ # string for each level.
88
+ def ncx(wobj, indentarray=[])
89
+ s = @epub.ncx(indentarray)
90
+ wobj.puts s if !s.nil? && !wobj.nil?
91
+ end
92
+
93
+ # Write container file to IO object +wobj+.
94
+ def container(wobj)
95
+ s = @epub.container
96
+ wobj.puts s if !s.nil? && !wobj.nil?
97
+ end
98
+
99
+ # Write cover file to IO object +wobj+.
100
+ # If Producer#params["coverimage"] is defined, it will be used for
101
+ # the cover image.
102
+ def cover(wobj)
103
+ s = @epub.cover
104
+ wobj.puts s if !s.nil? && !wobj.nil?
105
+ end
106
+
107
+ # Write title file (copying) to IO object +wobj+.
108
+ def titlepage(wobj)
109
+ s = @epub.titlepage
110
+ wobj.puts s if !s.nil? && !wobj.nil?
111
+ end
112
+
113
+ # Write colophon file to IO object +wobj+.
114
+ def colophon(wobj)
115
+ s = @epub.colophon
116
+ wobj.puts s if !s.nil? && !wobj.nil?
117
+ end
118
+
119
+ # Write own toc file to IO object +wobj+.
120
+ def mytoc(wobj)
121
+ s = @epub.mytoc
122
+ wobj.puts s if !s.nil? && !wobj.nil?
123
+ end
124
+
125
+ # Add informations of figure files in +path+ to contents array.
126
+ # +base+ defines a string to remove from path name.
127
+ def importImageInfo(path, base=nil)
128
+ Dir.foreach(path) do |f|
129
+ next if f =~ /\A\./
130
+ if f =~ /\.(png|jpg|jpeg|svg|gif)\Z/i # FIXME:EPUB3 accepts more types...
131
+ path.chop! if path =~ /\/\Z/
132
+ if base.nil?
133
+ @contents.push(EPUBMaker::Content.new({"file" => "#{path}/#{f}"}))
134
+ else
135
+ @contents.push(EPUBMaker::Content.new({"file" => "#{path.sub(base + "/", '')}/#{f}"}))
136
+ end
137
+ end
138
+ if FileTest.directory?("#{path}/#{f}")
139
+ importImageInfo("#{path}/#{f}", base)
140
+ end
141
+ end
142
+ end
143
+
144
+ # Produce EPUB file +epubfile+.
145
+ # +basedir+ points the directory has contents (default: current directory.)
146
+ # +tmpdir+ defines temporary directory.
147
+ def produce(epubfile, basedir=nil, tmpdir=nil)
148
+ current = Dir.pwd
149
+ basedir = current if basedir.nil?
150
+ # FIXME: produce cover, mytoc, titlepage, colophon?
151
+
152
+ _tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
153
+ epubfile = "#{current}/#{epubfile}" if epubfile !~ /\A\// # /
154
+
155
+ # FIXME: error check
156
+ File.unlink(epubfile) if File.exist?(epubfile)
157
+
158
+ begin
159
+ @epub.produce(epubfile, basedir, _tmpdir)
160
+ ensure
161
+ FileUtils.rm_r(_tmpdir) if tmpdir.nil?
162
+ end
163
+ end
164
+
165
+ private
166
+
167
+ # Complement parameters.
168
+ def complement
169
+ # FIXME: should separate for EPUB2/3?
170
+ # FIXME: escapeHTML?
171
+ # use default value if not defined
172
+ @params["htmlext"] = "html" if @params["htmlext"].nil?
173
+ defaults = {
174
+ "cover" => "#{@params["bookname"]}.#{@params["htmlext"]}",
175
+ "title" => @params["booktitle"], # backward compatibility
176
+ "language" => "ja",
177
+ "date" => Time.now.strftime("%Y-%m-%d"),
178
+ "urnid" => "urn:uid:#{UUID.create}",
179
+ "tocfile" => "toc.#{@params["htmlext"]}",
180
+ "toclevel" => 2,
181
+ "stylesheet" => [],
182
+ "epubversion" => 2,
183
+ "htmlversion" => 4,
184
+ }
185
+
186
+ defaults.each_pair do |k, v|
187
+ @params[k] = v if @params[k].nil?
188
+ end
189
+
190
+ @params["htmlversion"] == 5 if @params["epubversion"] >= 3 && @params["htmlversion"] == 4
191
+
192
+ # must be defined
193
+ %w[bookname title].each do |k|
194
+ raise "Key #{k} must have a value. Abort." if @params[k].nil? # FIXME: should not be error?
195
+ end
196
+ # array
197
+ %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
199
+ end
200
+ # optional
201
+ # type, format, identifier, source, relation, coverpage, rights, aut
202
+ end
203
+ end
204
+ end