review 4.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-tex.yml +35 -0
- data/.github/workflows/ruby-win.yml +19 -9
- data/.github/workflows/ruby.yml +7 -3
- data/.rubocop.yml +138 -34
- data/NEWS.ja.md +285 -0
- data/NEWS.md +285 -1
- data/README.md +7 -6
- data/Rakefile +7 -2
- data/bin/review +2 -4
- data/bin/review-catalog-converter +4 -4
- data/bin/review-check +8 -12
- data/bin/review-checkdep +2 -5
- data/bin/review-compile +18 -34
- data/bin/review-epub2html +1 -4
- data/bin/review-epubmaker +3 -4
- data/bin/review-idgxmlmaker +1 -3
- data/bin/review-index +5 -86
- data/bin/review-init +1 -4
- data/bin/review-pdfmaker +1 -3
- data/bin/review-preproc +30 -38
- data/bin/review-textmaker +1 -3
- data/bin/review-update +1 -4
- data/bin/review-validate +4 -4
- data/bin/review-vol +5 -82
- data/bin/review-webmaker +1 -3
- data/doc/config.yml.sample +45 -11
- data/doc/config.yml.sample-simple +3 -3
- data/doc/format.ja.md +103 -13
- data/doc/format.md +104 -16
- data/doc/makeindex.ja.md +2 -2
- data/doc/pdfmaker.ja.md +42 -0
- data/doc/pdfmaker.md +41 -0
- data/doc/quickstart.ja.md +19 -6
- data/doc/quickstart.md +18 -6
- data/doc/writing_vertical.ja.md +6 -0
- data/lib/review.rb +1 -1
- data/lib/review/book.rb +2 -2
- data/lib/review/book/base.rb +67 -29
- data/lib/review/book/bib.rb +21 -0
- data/lib/review/book/book_unit.rb +158 -0
- data/lib/review/book/chapter.rb +33 -26
- data/lib/review/book/index.rb +24 -185
- data/lib/review/book/index/item.rb +7 -1
- data/lib/review/book/page_metric.rb +7 -7
- data/lib/review/book/part.rb +26 -11
- data/lib/review/book/volume.rb +5 -5
- data/lib/review/builder.rb +121 -52
- data/lib/review/call_hook.rb +20 -0
- data/lib/review/catalog.rb +3 -2
- data/lib/review/compiler.rb +230 -111
- data/lib/review/configure.rb +91 -7
- data/lib/review/converter.rb +1 -1
- data/lib/review/epub2html.rb +6 -1
- data/lib/review/epubmaker.rb +124 -152
- data/lib/review/epubmaker/content.rb +113 -0
- data/lib/review/epubmaker/epubcommon.rb +372 -0
- data/lib/review/epubmaker/epubv2.rb +178 -0
- data/lib/review/epubmaker/epubv3.rb +231 -0
- data/lib/review/epubmaker/producer.rb +167 -0
- data/lib/review/epubmaker/reviewheaderlistener.rb +12 -2
- data/lib/review/epubmaker/zip_exporter.rb +84 -0
- data/lib/review/exception.rb +13 -0
- data/lib/review/htmlbuilder.rb +176 -89
- data/lib/review/htmlutils.rb +8 -11
- data/lib/review/i18n.rb +2 -1
- data/lib/review/idgxmlbuilder.rb +165 -75
- data/lib/review/idgxmlmaker.rb +24 -28
- data/lib/review/img_math.rb +238 -0
- data/lib/review/index_builder.rb +645 -0
- data/lib/review/init.rb +9 -17
- data/lib/review/latexbox.rb +58 -0
- data/lib/review/latexbuilder.rb +193 -75
- data/lib/review/latexutils.rb +9 -1
- data/lib/review/lineinput.rb +112 -2
- data/lib/review/loggable.rb +27 -0
- data/lib/review/logger.rb +90 -3
- data/lib/review/makerhelper.rb +17 -188
- data/lib/review/markdownbuilder.rb +54 -4
- data/lib/review/pdfmaker.rb +76 -84
- data/lib/review/plaintextbuilder.rb +106 -22
- data/lib/review/preprocessor.rb +107 -303
- data/lib/review/preprocessor/directive.rb +35 -0
- data/lib/review/preprocessor/line.rb +34 -0
- data/lib/review/preprocessor/repository.rb +177 -0
- data/lib/review/rstbuilder.rb +27 -8
- data/lib/review/sec_counter.rb +14 -0
- data/lib/review/template.rb +11 -1
- data/lib/review/textmaker.rb +27 -32
- data/lib/review/textutils.rb +3 -12
- data/lib/review/tocprinter.rb +242 -97
- data/lib/review/topbuilder.rb +98 -31
- data/lib/review/update.rb +12 -13
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +97 -0
- data/lib/review/webmaker.rb +40 -47
- data/lib/review/webtocprinter.rb +39 -35
- data/lib/review/yamlloader.rb +2 -1
- data/review.gemspec +5 -3
- data/samples/sample-book/src/config-epub2.yml +1 -1
- data/samples/sample-book/src/config.yml +3 -3
- data/samples/sample-book/src/lib/tasks/review.rake +19 -1
- data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +2 -1
- data/samples/syntax-book/Gemfile +1 -1
- data/samples/syntax-book/ch01.re +1 -1
- data/samples/syntax-book/ch02.re +21 -6
- data/samples/syntax-book/ch03.re +1 -1
- data/samples/syntax-book/config.yml +1 -1
- data/samples/syntax-book/images/img3-2.png +0 -0
- data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +2 -1
- data/templates/html/_colophon.html.erb +23 -0
- data/templates/html/_colophon_history.html.erb +9 -0
- data/templates/html/_cover.html.erb +10 -0
- data/templates/html/_part_body.html.erb +6 -0
- data/templates/html/_titlepage.html.erb +20 -0
- data/templates/html/layout-html5.html.erb +6 -0
- data/templates/html/layout-xhtml1.html.erb +6 -0
- data/templates/latex/config.erb +35 -23
- data/templates/latex/review-jlreq/README.md +3 -1
- data/templates/latex/review-jlreq/review-base.sty +36 -23
- data/templates/latex/review-jlreq/review-jlreq.cls +18 -25
- data/templates/latex/review-jlreq/review-style.sty +6 -1
- data/templates/latex/review-jlreq/review-tcbox.sty +348 -0
- data/templates/latex/review-jlreq/reviewmacro.sty +5 -0
- data/templates/latex/review-jsbook/README.md +7 -5
- data/templates/latex/review-jsbook/review-base.sty +40 -24
- data/templates/latex/review-jsbook/review-jsbook.cls +13 -3
- data/templates/latex/review-jsbook/review-style.sty +6 -1
- data/templates/latex/review-jsbook/review-tcbox.sty +348 -0
- data/templates/latex/review-jsbook/reviewmacro.sty +5 -0
- data/templates/opf/epubv2.opf.erb +7 -7
- data/templates/opf/epubv3.opf.erb +7 -7
- data/templates/opf/opf_manifest_epubv2.opf.erb +10 -0
- data/templates/opf/opf_manifest_epubv3.opf.erb +10 -0
- data/templates/opf/opf_metainfo_epubv2.opf.erb +17 -0
- data/templates/opf/opf_metainfo_epubv3.opf.erb +49 -0
- data/templates/opf/opf_tocx_epubv2.opf.erb +9 -0
- data/templates/opf/opf_tocx_epubv3.opf.erb +17 -0
- data/templates/web/html/layout-html5.html.erb +9 -8
- data/templates/web/html/layout-xhtml1.html.erb +6 -0
- data/test/assets/header_listener.html +35 -0
- data/test/assets/img_math/img1.png +0 -0
- data/test/assets/img_math/img2.png +0 -0
- data/test/assets/img_math/img3.png +0 -0
- data/test/assets/syntax_book_index_detail.txt +58 -0
- data/test/assets/test_template.tex +6 -3
- data/test/assets/test_template_backmatter.tex +6 -3
- data/test/book_test_helper.rb +11 -5
- data/test/run_test.rb +1 -1
- data/test/test_book.rb +54 -63
- data/test/test_book_chapter.rb +95 -54
- data/test/test_book_part.rb +3 -3
- data/test/test_builder.rb +29 -20
- data/test/test_catalog_converter_cmd.rb +1 -1
- data/test/test_converter.rb +1 -0
- data/test/test_epub3maker.rb +170 -126
- data/test/test_epubmaker.rb +254 -129
- data/test/test_epubmaker_cmd.rb +15 -4
- data/test/test_helper.rb +12 -5
- data/test/test_htmlbuilder.rb +926 -76
- data/test/test_htmlutils.rb +0 -12
- data/test/test_i18n.rb +33 -33
- data/test/test_idgxmlbuilder.rb +531 -20
- data/test/test_idgxmlmaker_cmd.rb +7 -3
- data/test/test_img_math.rb +111 -0
- data/test/test_index.rb +62 -52
- data/test/test_indexbuilder.rb +52 -0
- data/test/test_latexbuilder.rb +891 -20
- data/test/test_latexbuilder_v2.rb +56 -10
- data/test/test_lineinput.rb +20 -93
- data/test/test_logger.rb +7 -7
- data/test/test_makerhelper.rb +0 -12
- data/test/test_markdownbuilder.rb +32 -0
- data/test/test_pdfmaker.rb +100 -11
- data/test/test_pdfmaker_cmd.rb +3 -3
- data/test/test_plaintextbuilder.rb +546 -32
- data/test/test_preprocessor.rb +188 -1
- data/test/test_review_ext.rb +2 -1
- data/test/test_reviewheaderlistener.rb +49 -0
- data/test/test_rstbuilder.rb +25 -1
- data/test/test_sec_counter.rb +156 -0
- data/test/test_template.rb +12 -2
- data/test/test_textmaker_cmd.rb +5 -1
- data/test/test_tocprinter.rb +46 -0
- data/test/test_topbuilder.rb +324 -20
- data/test/test_update.rb +44 -44
- data/test/test_webtocprinter.rb +75 -43
- data/test/test_zip_exporter.rb +5 -6
- data/vendor/gentombow/LICENSE +1 -1
- data/vendor/gentombow/Makefile +0 -1
- data/vendor/gentombow/bounddvi-en.pdf +0 -0
- data/vendor/gentombow/bounddvi-en.tex +1 -0
- data/vendor/gentombow/bounddvi.pdf +0 -0
- data/vendor/gentombow/bounddvi.sty +30 -7
- data/vendor/gentombow/bounddvi.tex +1 -0
- data/vendor/gentombow/create_archive.sh +1 -0
- data/vendor/gentombow/gentombow-ja.pdf +0 -0
- data/vendor/gentombow/gentombow-ja.tex +9 -0
- data/vendor/gentombow/gentombow.pdf +0 -0
- data/vendor/gentombow/gentombow.sty +32 -10
- data/vendor/gentombow/gentombow.tex +8 -0
- data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
- data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
- data/vendor/jsclasses/Makefile +3 -2
- data/vendor/jsclasses/create_archive.sh +5 -5
- data/vendor/jsclasses/jis/Makefile +3 -2
- data/vendor/jsclasses/jis/jsarticle.cls +22 -18
- data/vendor/jsclasses/jis/jsbook.cls +22 -18
- data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jis/jsclasses.ins +15 -5
- data/vendor/jsclasses/jis/jslogo.ins +9 -0
- data/vendor/jsclasses/jis/jslogo.sty +1 -13
- data/vendor/jsclasses/jis/jspf.cls +22 -18
- data/vendor/jsclasses/jis/jsreport.cls +22 -18
- data/vendor/jsclasses/jis/jsverb.ins +9 -0
- data/vendor/jsclasses/jis/jsverb.sty +1 -13
- data/vendor/jsclasses/jis/kiyou.cls +22 -18
- data/vendor/jsclasses/jis/minijs.sty +65 -22
- data/vendor/jsclasses/jis/okumacro.ins +9 -0
- data/vendor/jsclasses/jis/okumacro.sty +1 -13
- data/vendor/jsclasses/jis/okuverb.ins +9 -0
- data/vendor/jsclasses/jis/okuverb.sty +1 -13
- data/vendor/jsclasses/jis/winjis.sty +23 -19
- data/vendor/jsclasses/jsarticle.cls +22 -18
- data/vendor/jsclasses/jsbook.cls +22 -18
- data/vendor/jsclasses/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jsclasses.ins +15 -5
- data/vendor/jsclasses/jsclasses.pdf +0 -0
- data/vendor/jsclasses/jslogo.ins +9 -0
- data/vendor/jsclasses/jslogo.pdf +0 -0
- data/vendor/jsclasses/jslogo.sty +1 -13
- data/vendor/jsclasses/jspf.cls +22 -18
- data/vendor/jsclasses/jsreport.cls +22 -18
- data/vendor/jsclasses/jsverb.ins +9 -0
- data/vendor/jsclasses/jsverb.pdf +0 -0
- data/vendor/jsclasses/jsverb.sty +1 -13
- data/vendor/jsclasses/kiyou.cls +22 -18
- data/vendor/jsclasses/minijs.sty +68 -22
- data/vendor/jsclasses/okumacro.ins +9 -0
- data/vendor/jsclasses/okumacro.pdf +0 -0
- data/vendor/jsclasses/okumacro.sty +1 -13
- data/vendor/jsclasses/okuverb.ins +9 -0
- data/vendor/jsclasses/okuverb.pdf +0 -0
- data/vendor/jsclasses/okuverb.sty +1 -13
- data/vendor/jsclasses/tests/relfont.tex +10 -0
- data/vendor/jsclasses/winjis.sty +23 -19
- metadata +106 -22
- data/.rubocop_todo.yml +0 -7
- data/lib/epubmaker.rb +0 -23
- data/lib/epubmaker/content.rb +0 -110
- data/lib/epubmaker/epubcommon.rb +0 -441
- data/lib/epubmaker/epubv2.rb +0 -143
- data/lib/epubmaker/epubv3.rb +0 -233
- data/lib/epubmaker/producer.rb +0 -375
- data/lib/epubmaker/zip_exporter.rb +0 -81
- data/lib/lineinput.rb +0 -155
- data/lib/review/book/compilable.rb +0 -178
- data/lib/review/tocparser.rb +0 -275
- data/test/test_tocparser.rb +0 -25
data/lib/epubmaker/epubv2.rb
DELETED
@@ -1,143 +0,0 @@
|
|
1
|
-
# = epubv2.rb -- EPUB version 2 producer.
|
2
|
-
#
|
3
|
-
# Copyright (c) 2010-2017 Kenshi Muto and Masayoshi Takahashi
|
4
|
-
#
|
5
|
-
# This program is free software.
|
6
|
-
# You can distribute or modify this program under the terms of
|
7
|
-
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
-
#
|
10
|
-
|
11
|
-
require 'epubmaker/epubcommon'
|
12
|
-
require 'cgi'
|
13
|
-
require 'epubmaker/zip_exporter'
|
14
|
-
|
15
|
-
module EPUBMaker
|
16
|
-
# EPUBv2 is EPUB version 2 producer.
|
17
|
-
class EPUBv2 < EPUBCommon
|
18
|
-
# Construct object with parameter hash +config+ and message resource hash +res+.
|
19
|
-
def initialize(producer)
|
20
|
-
super
|
21
|
-
end
|
22
|
-
|
23
|
-
# Return opf file content.
|
24
|
-
def opf
|
25
|
-
@opf_metainfo = opf_metainfo
|
26
|
-
@opf_coverimage = opf_coverimage
|
27
|
-
@opf_manifest = opf_manifest
|
28
|
-
@opf_toc = opf_tocx
|
29
|
-
|
30
|
-
tmplfile = File.expand_path('./opf/epubv2.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
|
31
|
-
tmpl = ReVIEW::Template.load(tmplfile)
|
32
|
-
tmpl.result(binding)
|
33
|
-
end
|
34
|
-
|
35
|
-
def opf_metainfo
|
36
|
-
s = ''
|
37
|
-
%w[title language date type format source description relation coverage subject rights].each do |item|
|
38
|
-
next unless @producer.config[item]
|
39
|
-
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
|
41
|
-
else
|
42
|
-
s << %Q( <dc:#{item}>#{CGI.escapeHTML(@producer.config.name_of(item).to_s)}</dc:#{item}>\n)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# ID
|
47
|
-
if @producer.config['isbn'].nil?
|
48
|
-
s << %Q( <dc:identifier id="BookId">#{@producer.config['urnid']}</dc:identifier>\n)
|
49
|
-
else
|
50
|
-
s << %Q( <dc:identifier id="BookId" opf:scheme="ISBN">#{@producer.config['isbn']}</dc:identifier>\n)
|
51
|
-
end
|
52
|
-
|
53
|
-
# creator (should be array)
|
54
|
-
%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
|
-
next unless @producer.config[role]
|
56
|
-
@producer.config.names_of(role).each do |v|
|
57
|
-
s << %Q( <dc:creator opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</dc:creator>\n)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# contributor (should be array)
|
62
|
-
%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
|
-
next unless @producer.config[role]
|
64
|
-
@producer.config.names_of(role).each do |v|
|
65
|
-
s << %Q( <dc:contributor opf:role="#{role}">#{CGI.escapeHTML(v)}</dc:contributor>\n)
|
66
|
-
if role == 'prt'
|
67
|
-
s << %Q( <dc:publisher>#{v}</dc:publisher>\n)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
s
|
73
|
-
end
|
74
|
-
|
75
|
-
def opf_manifest
|
76
|
-
s = ''
|
77
|
-
s << <<EOT
|
78
|
-
<manifest>
|
79
|
-
<item id="ncx" href="#{@producer.config['bookname']}.ncx" media-type="application/x-dtbncx+xml"/>
|
80
|
-
<item id="#{@producer.config['bookname']}" href="#{@producer.config['cover']}" media-type="application/xhtml+xml"/>
|
81
|
-
EOT
|
82
|
-
|
83
|
-
s << %Q( <item id="toc" href="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" media-type="application/xhtml+xml"/>\n) if @producer.config['toc'] && @producer.config['mytoc']
|
84
|
-
|
85
|
-
@producer.contents.each do |item|
|
86
|
-
next if item.file =~ /#/ # skip subgroup
|
87
|
-
s << %Q( <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n)
|
88
|
-
end
|
89
|
-
s << %Q( </manifest>\n)
|
90
|
-
s
|
91
|
-
end
|
92
|
-
|
93
|
-
def opf_tocx
|
94
|
-
cover_linear = if @producer.config['epubmaker']['cover_linear'] && @producer.config['epubmaker']['cover_linear'] != 'no'
|
95
|
-
'yes'
|
96
|
-
else
|
97
|
-
'no'
|
98
|
-
end
|
99
|
-
|
100
|
-
s = ''
|
101
|
-
s << %Q( <spine toc="ncx">\n)
|
102
|
-
s << %Q( <itemref idref="#{@producer.config['bookname']}" linear="#{cover_linear}"/>\n)
|
103
|
-
s << %Q( <itemref idref="toc" />\n) unless @producer.config['mytoc'].nil?
|
104
|
-
|
105
|
-
@producer.contents.each do |item|
|
106
|
-
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
107
|
-
s << %Q( <itemref idref="#{item.id}"/>\n)
|
108
|
-
end
|
109
|
-
s << %Q( </spine>\n)
|
110
|
-
s
|
111
|
-
end
|
112
|
-
|
113
|
-
# Return ncx content. +indentarray+ has prefix marks for each level.
|
114
|
-
def ncx(indentarray)
|
115
|
-
@ncx_isbn = ncx_isbn
|
116
|
-
@ncx_doctitle = ncx_doctitle
|
117
|
-
@ncx_navmap = ncx_navmap(indentarray)
|
118
|
-
|
119
|
-
tmplfile = File.expand_path('./ncx/epubv2.ncx.erb', ReVIEW::Template::TEMPLATE_DIR)
|
120
|
-
ReVIEW::Template.load(tmplfile).result(binding)
|
121
|
-
end
|
122
|
-
|
123
|
-
# Produce EPUB file +epubfile+.
|
124
|
-
# +basedir+ points the directory has contents.
|
125
|
-
# +tmpdir+ defines temporary directory.
|
126
|
-
def produce(epubfile, basedir, tmpdir)
|
127
|
-
produce_write_common(basedir, tmpdir)
|
128
|
-
|
129
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}.ncx", 'w') do |f|
|
130
|
-
@producer.ncx(f, @producer.config['epubmaker']['ncxindent'])
|
131
|
-
end
|
132
|
-
if @producer.config['mytoc']
|
133
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}", 'w') do |f|
|
134
|
-
@producer.mytoc(f)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
@producer.call_hook(@producer.config['epubmaker']['hook_prepack'], tmpdir)
|
139
|
-
expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.config)
|
140
|
-
expoter.export_zip(epubfile)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
data/lib/epubmaker/epubv3.rb
DELETED
@@ -1,233 +0,0 @@
|
|
1
|
-
# = epubv3.rb -- EPUB version 3 producer.
|
2
|
-
#
|
3
|
-
# Copyright (c) 2010-2017 Kenshi Muto
|
4
|
-
#
|
5
|
-
# This program is free software.
|
6
|
-
# You can distribute or modify this program under the terms of
|
7
|
-
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
-
#
|
10
|
-
|
11
|
-
require 'epubmaker/epubcommon'
|
12
|
-
require 'epubmaker/zip_exporter'
|
13
|
-
|
14
|
-
module EPUBMaker
|
15
|
-
# EPUBv3 is EPUB version 3 producer.
|
16
|
-
class EPUBv3 < EPUBCommon
|
17
|
-
# Construct object with parameter hash +config+ and message resource hash +res+.
|
18
|
-
def initialize(producer)
|
19
|
-
super
|
20
|
-
@opf_prefix = {}
|
21
|
-
if @producer.config['opf_prefix'].present?
|
22
|
-
@producer.config['opf_prefix'].each { |k, v| @opf_prefix[k] = v }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Return opf file content.
|
27
|
-
def opf
|
28
|
-
@opf_metainfo = opf_metainfo
|
29
|
-
@opf_coverimage = opf_coverimage
|
30
|
-
@opf_manifest = opf_manifest
|
31
|
-
@opf_toc = opf_tocx
|
32
|
-
@package_attrs = ''
|
33
|
-
|
34
|
-
if @opf_prefix && @opf_prefix.size > 0
|
35
|
-
prefixes_str = @opf_prefix.map { |k, v| %Q(#{k}: #{v}) }.join(' ')
|
36
|
-
@package_attrs << %Q( prefix="#{prefixes_str}")
|
37
|
-
end
|
38
|
-
|
39
|
-
tmplfile = File.expand_path('./opf/epubv3.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
|
40
|
-
ReVIEW::Template.load(tmplfile).result(binding)
|
41
|
-
end
|
42
|
-
|
43
|
-
def opf_metainfo
|
44
|
-
s = ''
|
45
|
-
%w[title language date type format source description relation coverage subject rights].each do |item|
|
46
|
-
next unless @producer.config[item]
|
47
|
-
if @producer.config[item].is_a?(Array)
|
48
|
-
@producer.config[item].each_with_index do |v, i|
|
49
|
-
if v.is_a?(Hash)
|
50
|
-
s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:#{item}>\n)
|
51
|
-
v.each_pair do |name, val|
|
52
|
-
next if name == 'name'
|
53
|
-
s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
54
|
-
end
|
55
|
-
else
|
56
|
-
s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
elsif @producer.config[item].is_a?(Hash)
|
60
|
-
s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item]['name'])}</dc:#{item}>\n)
|
61
|
-
@producer.config[item].each_pair do |name, val|
|
62
|
-
next if name == 'name'
|
63
|
-
s << %Q( <meta refines="##{item}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
64
|
-
end
|
65
|
-
else
|
66
|
-
s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item].to_s)}</dc:#{item}>\n)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
s << %Q( <meta property="dcterms:modified">#{@producer.config['modified']}</meta>\n)
|
71
|
-
|
72
|
-
# ID
|
73
|
-
if @producer.config['isbn'].nil?
|
74
|
-
s << %Q( <dc:identifier id="BookId">#{@producer.config['urnid']}</dc:identifier>\n)
|
75
|
-
else
|
76
|
-
s << %Q( <dc:identifier id="BookId">#{@producer.config['isbn']}</dc:identifier>\n)
|
77
|
-
end
|
78
|
-
|
79
|
-
# creator (should be array)
|
80
|
-
%w[a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-csl a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl aut].each do |role|
|
81
|
-
next unless @producer.config[role]
|
82
|
-
@producer.config[role].each_with_index do |v, i|
|
83
|
-
if v.is_a?(Hash)
|
84
|
-
s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:creator>\n)
|
85
|
-
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
|
86
|
-
v.each_pair do |name, val|
|
87
|
-
next if name == 'name'
|
88
|
-
s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
89
|
-
end
|
90
|
-
else
|
91
|
-
s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n)
|
92
|
-
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# contributor (should be array)
|
98
|
-
%w[adp ann arr art asn aqt aft aui ant bkp clb cmm csl dsr edt ill lyr mdc mus nrt oth pbd pbl pht prt red rev spn ths trc trl].each do |role|
|
99
|
-
next unless @producer.config[role]
|
100
|
-
@producer.config[role].each_with_index do |v, i|
|
101
|
-
if v.is_a?(Hash)
|
102
|
-
s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:contributor>\n)
|
103
|
-
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
104
|
-
v.each_pair do |name, val|
|
105
|
-
next if name == 'name'
|
106
|
-
s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
107
|
-
end
|
108
|
-
else
|
109
|
-
s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n)
|
110
|
-
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
111
|
-
end
|
112
|
-
|
113
|
-
if %w[prt pbl].include?(role)
|
114
|
-
if v.is_a?(Hash)
|
115
|
-
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:publisher>\n)
|
116
|
-
s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
117
|
-
v.each_pair do |name, val|
|
118
|
-
next if name == 'name'
|
119
|
-
s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
120
|
-
end
|
121
|
-
else
|
122
|
-
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:publisher>\n)
|
123
|
-
s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">prt</meta>\n)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
## add custom <meta> element
|
130
|
-
if @producer.config['opf_meta'].present?
|
131
|
-
@producer.config['opf_meta'].each do |k, v|
|
132
|
-
s << %Q( <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
s
|
137
|
-
end
|
138
|
-
|
139
|
-
def opf_manifest
|
140
|
-
s = ''
|
141
|
-
s << <<EOT
|
142
|
-
<manifest>
|
143
|
-
<item properties="nav" id="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" href="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" media-type="application/xhtml+xml"/>
|
144
|
-
<item id="#{@producer.config['bookname']}" href="#{@producer.config['cover']}" media-type="application/xhtml+xml"/>
|
145
|
-
EOT
|
146
|
-
|
147
|
-
if @producer.config['coverimage']
|
148
|
-
@producer.contents.each do |item|
|
149
|
-
next if !item.media.start_with?('image') || File.basename(item.file) != @producer.config['coverimage']
|
150
|
-
s << %Q( <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n)
|
151
|
-
item.id = nil
|
152
|
-
break
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
@producer.contents.each do |item|
|
157
|
-
next if item.file =~ /#/ || item.id.nil? # skip subgroup, or id=nil (for cover)
|
158
|
-
propstr = ''
|
159
|
-
if item.properties.size > 0
|
160
|
-
propstr = %Q( properties="#{item.properties.sort.uniq.join(' ')}")
|
161
|
-
end
|
162
|
-
s << %Q( <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"#{propstr}/>\n)
|
163
|
-
end
|
164
|
-
s << %Q( </manifest>\n)
|
165
|
-
|
166
|
-
s
|
167
|
-
end
|
168
|
-
|
169
|
-
def opf_tocx
|
170
|
-
if @producer.config['epubmaker']['cover_linear'] && @producer.config['epubmaker']['cover_linear'] != 'no'
|
171
|
-
cover_linear = 'yes'
|
172
|
-
else
|
173
|
-
cover_linear = 'no'
|
174
|
-
end
|
175
|
-
|
176
|
-
s = ''
|
177
|
-
if @producer.config['direction']
|
178
|
-
s << %Q( <spine page-progression-direction="#{@producer.config['direction']}">\n)
|
179
|
-
else
|
180
|
-
s << %Q( <spine>\n)
|
181
|
-
end
|
182
|
-
s << %Q( <itemref idref="#{@producer.config['bookname']}" linear="#{cover_linear}"/>\n)
|
183
|
-
|
184
|
-
toc = nil
|
185
|
-
@producer.contents.each do |item|
|
186
|
-
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
187
|
-
if toc.nil? && item.chaptype != 'pre'
|
188
|
-
if @producer.config['toc']
|
189
|
-
s << %Q( <itemref idref="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" />\n)
|
190
|
-
end
|
191
|
-
toc = true
|
192
|
-
end
|
193
|
-
s << %Q( <itemref idref="#{item.id}"/>\n)
|
194
|
-
end
|
195
|
-
s << %Q( </spine>\n)
|
196
|
-
|
197
|
-
s
|
198
|
-
end
|
199
|
-
|
200
|
-
def ncx(indentarray)
|
201
|
-
ncx_main = if @producer.config['epubmaker']['flattoc'].nil?
|
202
|
-
hierarchy_ncx('ol')
|
203
|
-
else
|
204
|
-
flat_ncx('ol', @producer.config['epubmaker']['flattocindent'])
|
205
|
-
end
|
206
|
-
|
207
|
-
@body = <<EOT
|
208
|
-
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
209
|
-
<h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v('toctitle'))}</h1>
|
210
|
-
#{ncx_main} </nav>
|
211
|
-
EOT
|
212
|
-
|
213
|
-
@title = CGI.escapeHTML(@producer.res.v('toctitle'))
|
214
|
-
@language = @producer.config['language']
|
215
|
-
@stylesheets = @producer.config['stylesheet']
|
216
|
-
tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
217
|
-
ReVIEW::Template.load(tmplfile).result(binding)
|
218
|
-
end
|
219
|
-
|
220
|
-
# Produce EPUB file +epubfile+.
|
221
|
-
# +basedir+ points the directory has contents.
|
222
|
-
# +tmpdir+ defines temporary directory.
|
223
|
-
def produce(epubfile, basedir, tmpdir)
|
224
|
-
produce_write_common(basedir, tmpdir)
|
225
|
-
|
226
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}", 'w') { |f| @producer.ncx(f, @producer.config['epubmaker']['ncxindent']) }
|
227
|
-
|
228
|
-
@producer.call_hook(@producer.config['epubmaker']['hook_prepack'], tmpdir)
|
229
|
-
expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.config)
|
230
|
-
expoter.export_zip(epubfile)
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
data/lib/epubmaker/producer.rb
DELETED
@@ -1,375 +0,0 @@
|
|
1
|
-
# = producer.rb -- EPUB producer.
|
2
|
-
#
|
3
|
-
# Copyright (c) 2010-2017 Kenshi Muto
|
4
|
-
#
|
5
|
-
# This program is free software.
|
6
|
-
# You can distribute or modify this program under the terms of
|
7
|
-
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
-
|
10
|
-
require 'tmpdir'
|
11
|
-
require 'fileutils'
|
12
|
-
require 'review/yamlloader'
|
13
|
-
require 'epubmaker/content'
|
14
|
-
require 'epubmaker/epubv2'
|
15
|
-
require 'epubmaker/epubv3'
|
16
|
-
require 'review/i18n'
|
17
|
-
require 'review/configure'
|
18
|
-
require 'review/extentions/hash'
|
19
|
-
|
20
|
-
module EPUBMaker
|
21
|
-
# EPUBMaker produces EPUB file.
|
22
|
-
class Producer
|
23
|
-
# Array of content objects.
|
24
|
-
attr_accessor :contents
|
25
|
-
# Parameter hash.
|
26
|
-
attr_accessor :config
|
27
|
-
# Message resource object.
|
28
|
-
attr_reader :res
|
29
|
-
|
30
|
-
# Take YAML +file+ and return parameter hash.
|
31
|
-
def self.load(file)
|
32
|
-
if file.nil? || !File.exist?(file)
|
33
|
-
raise "Can't open #{file}."
|
34
|
-
end
|
35
|
-
loader = ReVIEW::YAMLLoader.new
|
36
|
-
loader.load_file(file)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Take YAML +file+ and update parameter hash.
|
40
|
-
def load(file)
|
41
|
-
if file.nil? || !File.exist?(file)
|
42
|
-
raise "Can't open #{file}."
|
43
|
-
end
|
44
|
-
loader = ReVIEW::YAMLLoader.new
|
45
|
-
merge_config(@config.deep_merge(loader.load_file(file)))
|
46
|
-
end
|
47
|
-
|
48
|
-
def warn(msg)
|
49
|
-
@logger.warn(msg)
|
50
|
-
end
|
51
|
-
|
52
|
-
# Construct producer object.
|
53
|
-
# +config+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#merge_config.
|
54
|
-
# +version+ takes EPUB version (default is 2).
|
55
|
-
def initialize(config = nil, version = nil)
|
56
|
-
@contents = []
|
57
|
-
@config = ReVIEW::Configure.new
|
58
|
-
@epub = nil
|
59
|
-
@config['epubversion'] = version unless version.nil?
|
60
|
-
@res = ReVIEW::I18n
|
61
|
-
@logger = ReVIEW.logger
|
62
|
-
|
63
|
-
merge_config(config) if config
|
64
|
-
end
|
65
|
-
|
66
|
-
def coverimage
|
67
|
-
return nil unless config['coverimage']
|
68
|
-
@contents.each do |item|
|
69
|
-
if item.media.start_with?('image') && item.file =~ /#{config['coverimage']}\Z/
|
70
|
-
return item.file
|
71
|
-
end
|
72
|
-
end
|
73
|
-
nil
|
74
|
-
end
|
75
|
-
|
76
|
-
# Update parameters by merging from new parameter hash +config+.
|
77
|
-
def merge_config(config)
|
78
|
-
@config.deep_merge!(config)
|
79
|
-
complement
|
80
|
-
|
81
|
-
unless @config['epubversion'].nil?
|
82
|
-
case @config['epubversion'].to_i
|
83
|
-
when 2
|
84
|
-
@epub = EPUBMaker::EPUBv2.new(self)
|
85
|
-
when 3
|
86
|
-
@epub = EPUBMaker::EPUBv3.new(self)
|
87
|
-
else
|
88
|
-
raise "Invalid EPUB version (#{@config['epubversion']}.)"
|
89
|
-
end
|
90
|
-
end
|
91
|
-
if config['language']
|
92
|
-
ReVIEW::I18n.locale = config['language']
|
93
|
-
end
|
94
|
-
support_legacy_maker
|
95
|
-
end
|
96
|
-
|
97
|
-
# Write mimetype file to IO object +wobj+.
|
98
|
-
def mimetype(wobj)
|
99
|
-
s = @epub.mimetype
|
100
|
-
if !s.nil? && !wobj.nil?
|
101
|
-
wobj.print s
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# Write opf file to IO object +wobj+.
|
106
|
-
def opf(wobj)
|
107
|
-
s = @epub.opf
|
108
|
-
if !s.nil? && !wobj.nil?
|
109
|
-
wobj.puts s
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
# Write ncx file to IO object +wobj+. +indentarray+ defines prefix
|
114
|
-
# string for each level.
|
115
|
-
def ncx(wobj, indentarray = [])
|
116
|
-
s = @epub.ncx(indentarray)
|
117
|
-
if !s.nil? && !wobj.nil?
|
118
|
-
wobj.puts s
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
# Write container file to IO object +wobj+.
|
123
|
-
def container(wobj)
|
124
|
-
s = @epub.container
|
125
|
-
if !s.nil? && !wobj.nil?
|
126
|
-
wobj.puts s
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# Write cover file to IO object +wobj+.
|
131
|
-
# If Producer#config["coverimage"] is defined, it will be used for
|
132
|
-
# the cover image.
|
133
|
-
def cover(wobj)
|
134
|
-
type = @config['epubversion'] >= 3 ? 'cover' : nil
|
135
|
-
s = @epub.cover(type)
|
136
|
-
if !s.nil? && !wobj.nil?
|
137
|
-
wobj.puts s
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
# Write title file (copying) to IO object +wobj+.
|
142
|
-
def titlepage(wobj)
|
143
|
-
s = @epub.titlepage
|
144
|
-
if !s.nil? && !wobj.nil?
|
145
|
-
wobj.puts s
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Write colophon file to IO object +wobj+.
|
150
|
-
def colophon(wobj)
|
151
|
-
s = @epub.colophon
|
152
|
-
if !s.nil? && !wobj.nil?
|
153
|
-
wobj.puts s
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
# Write own toc file to IO object +wobj+.
|
158
|
-
def mytoc(wobj)
|
159
|
-
s = @epub.mytoc
|
160
|
-
if !s.nil? && !wobj.nil?
|
161
|
-
wobj.puts s
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
# Add informations of figure files in +path+ to contents array.
|
166
|
-
# +base+ defines a string to remove from path name.
|
167
|
-
def import_imageinfo(path, base = nil, allow_exts = nil)
|
168
|
-
return nil unless File.exist?(path)
|
169
|
-
allow_exts ||= @config['image_ext']
|
170
|
-
Dir.foreach(path) do |f|
|
171
|
-
next if f.start_with?('.')
|
172
|
-
if f =~ /\.(#{allow_exts.join('|')})\Z/i
|
173
|
-
path.chop! if path =~ %r{/\Z}
|
174
|
-
if base.nil?
|
175
|
-
@contents.push(EPUBMaker::Content.new('file' => "#{path}/#{f}"))
|
176
|
-
else
|
177
|
-
@contents.push(EPUBMaker::Content.new('file' => "#{path.sub(base + '/', '')}/#{f}"))
|
178
|
-
end
|
179
|
-
end
|
180
|
-
if FileTest.directory?("#{path}/#{f}")
|
181
|
-
import_imageinfo("#{path}/#{f}", base)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
alias_method :importImageInfo, :import_imageinfo
|
187
|
-
|
188
|
-
# Produce EPUB file +epubfile+.
|
189
|
-
# +basedir+ points the directory has contents (default: current directory.)
|
190
|
-
# +tmpdir+ defines temporary directory.
|
191
|
-
def produce(epubfile, basedir = nil, tmpdir = nil)
|
192
|
-
current = Dir.pwd
|
193
|
-
basedir ||= current
|
194
|
-
|
195
|
-
# use Dir to solve a path for Windows (see #1011)
|
196
|
-
new_tmpdir = Dir[File.join(tmpdir.nil? ? Dir.mktmpdir : tmpdir)][0]
|
197
|
-
if epubfile !~ %r{\A/}
|
198
|
-
epubfile = "#{current}/#{epubfile}"
|
199
|
-
end
|
200
|
-
|
201
|
-
# FIXME: error check
|
202
|
-
File.unlink(epubfile) if File.exist?(epubfile)
|
203
|
-
|
204
|
-
begin
|
205
|
-
@epub.produce(epubfile, basedir, new_tmpdir)
|
206
|
-
ensure
|
207
|
-
FileUtils.rm_r(new_tmpdir) if tmpdir.nil?
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
def call_hook(filename, *params)
|
212
|
-
return if !filename.present? || !File.exist?(filename) || !FileTest.executable?(filename)
|
213
|
-
if ENV['REVIEW_SAFE_MODE'].to_i & 1 > 0
|
214
|
-
warn 'hook is prohibited in safe mode. ignored.'
|
215
|
-
else
|
216
|
-
system(filename, *params)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
def isbn_hyphen
|
221
|
-
str = @config['isbn'].to_s
|
222
|
-
|
223
|
-
if str =~ /\A\d{10}\Z/
|
224
|
-
return "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
|
225
|
-
end
|
226
|
-
if str =~ /\A\d{13}\Z/
|
227
|
-
return "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
|
228
|
-
end
|
229
|
-
nil
|
230
|
-
end
|
231
|
-
|
232
|
-
private
|
233
|
-
|
234
|
-
# Complement parameters.
|
235
|
-
def complement
|
236
|
-
@config['htmlext'] ||= 'html'
|
237
|
-
defaults = ReVIEW::Configure.new.merge(
|
238
|
-
'language' => 'ja',
|
239
|
-
'date' => Time.now.strftime('%Y-%m-%d'),
|
240
|
-
'modified' => Time.now.utc.strftime('%Y-%02m-%02dT%02H:%02M:%02SZ'),
|
241
|
-
'isbn' => nil,
|
242
|
-
'toclevel' => 2,
|
243
|
-
'stylesheet' => [],
|
244
|
-
'epubversion' => 3,
|
245
|
-
'htmlversion' => 5,
|
246
|
-
'secnolevel' => 2,
|
247
|
-
'pre_secnolevel' => 0,
|
248
|
-
'post_secnolevel' => 1,
|
249
|
-
'part_secnolevel' => 1,
|
250
|
-
'titlepage' => true,
|
251
|
-
'titlefile' => nil,
|
252
|
-
'originaltitlefile' => nil,
|
253
|
-
'profile' => nil,
|
254
|
-
'colophon' => nil,
|
255
|
-
'colophon_order' => %w[aut csl trl dsr ill edt pbl prt pht],
|
256
|
-
'direction' => 'ltr',
|
257
|
-
'epubmaker' => {
|
258
|
-
'flattoc' => nil,
|
259
|
-
'flattocindent' => true,
|
260
|
-
'ncx_indent' => [],
|
261
|
-
'zip_stage1' => 'zip -0Xq',
|
262
|
-
'zip_stage2' => 'zip -Xr9Dq',
|
263
|
-
'zip_addpath' => nil,
|
264
|
-
'hook_beforeprocess' => nil,
|
265
|
-
'hook_afterfrontmatter' => nil,
|
266
|
-
'hook_afterbody' => nil,
|
267
|
-
'hook_afterbackmatter' => nil,
|
268
|
-
'hook_aftercopyimage' => nil,
|
269
|
-
'hook_prepack' => nil,
|
270
|
-
'rename_for_legacy' => nil,
|
271
|
-
'verify_target_images' => nil,
|
272
|
-
'force_include_images' => [],
|
273
|
-
'cover_linear' => nil,
|
274
|
-
'back_footnote' => nil
|
275
|
-
},
|
276
|
-
'externallink' => true,
|
277
|
-
'contentdir' => '.',
|
278
|
-
'imagedir' => 'images',
|
279
|
-
'fontdir' => 'fonts',
|
280
|
-
'image_ext' => %w[png gif jpg jpeg svg ttf woff otf],
|
281
|
-
'image_maxpixels' => 4_000_000,
|
282
|
-
'font_ext' => %w[ttf woff otf]
|
283
|
-
)
|
284
|
-
|
285
|
-
@config = defaults.deep_merge(@config)
|
286
|
-
@config['title'] = @config['booktitle'] unless @config['title']
|
287
|
-
|
288
|
-
deprecated_parameters = {
|
289
|
-
'ncxindent' => 'epubmaker:ncxindent',
|
290
|
-
'flattoc' => 'epubmaker:flattoc',
|
291
|
-
'flattocindent' => 'epubmaker:flattocindent',
|
292
|
-
'hook_beforeprocess' => 'epubmaker:hook_beforeprocess',
|
293
|
-
'hook_afterfrontmatter' => 'epubmaker:hook_afterfrontmatter',
|
294
|
-
'hook_afterbody' => 'epubmaker:hook_afterbody',
|
295
|
-
'hook_afterbackmatter' => 'epubmaker:hook_afterbackmatter',
|
296
|
-
'hook_aftercopyimage' => 'epubmaker:hook_aftercopyimage',
|
297
|
-
'hook_prepack' => 'epubmaker:hook_prepack',
|
298
|
-
'rename_for_legacy' => 'epubmaker:rename_for_legacy',
|
299
|
-
'zip_stage1' => 'epubmaker:zip_stage1',
|
300
|
-
'zip_stage2' => 'epubmaker:zip_stage2',
|
301
|
-
'zip_addpath' => 'epubmaker:zip_addpath',
|
302
|
-
'verify_target_images' => 'epubmaker:verify_target_images',
|
303
|
-
'force_include_images' => 'epubmaker:force_include_images',
|
304
|
-
'cover_linear' => 'epubmaker:cover_linear'
|
305
|
-
}
|
306
|
-
|
307
|
-
deprecated_parameters.each_pair do |k, v|
|
308
|
-
next if @config[k].nil?
|
309
|
-
sa = v.split(':', 2)
|
310
|
-
warn "Parameter #{k} is deprecated. Use:\n#{sa[0]}:\n #{sa[1]}: ...\n\n"
|
311
|
-
@config[sa[0]][sa[1]] = @config[k]
|
312
|
-
@config.delete(k)
|
313
|
-
end
|
314
|
-
|
315
|
-
if @config['epubversion'] >= 3
|
316
|
-
@config['htmlversion'] = 5
|
317
|
-
end
|
318
|
-
|
319
|
-
@config.maker = 'epubmaker'
|
320
|
-
@config['cover'] = "#{@config['bookname']}.#{@config['htmlext']}" unless @config['cover']
|
321
|
-
|
322
|
-
%w[bookname title].each do |k|
|
323
|
-
raise "Key #{k} must have a value. Abort." unless @config[k]
|
324
|
-
end
|
325
|
-
# array
|
326
|
-
%w[subject aut
|
327
|
-
a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-dsr a-edt
|
328
|
-
a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl
|
329
|
-
adp ann arr art asn aut aqt aft aui ant bkp clb cmm dsr edt
|
330
|
-
ill lyr mdc mus nrt oth pht pbl prt red rev spn ths trc trl
|
331
|
-
stylesheet rights].each do |item|
|
332
|
-
next unless @config[item]
|
333
|
-
if @config[item].is_a?(String)
|
334
|
-
@config[item] = [@config[item]]
|
335
|
-
end
|
336
|
-
end
|
337
|
-
# optional
|
338
|
-
# type, format, identifier, source, relation, coverpage, aut
|
339
|
-
end
|
340
|
-
|
341
|
-
def support_legacy_maker
|
342
|
-
# legacy review-epubmaker support
|
343
|
-
if @config['flag_legacy_coverfile'].nil? && !@config['coverfile'].nil? && File.exist?(@config['coverfile'])
|
344
|
-
@config['cover'] = "#{@config['bookname']}-cover.#{@config['htmlext']}"
|
345
|
-
@epub.legacy_cover_and_title_file(@config['coverfile'], @config['cover'])
|
346
|
-
@config['flag_legacy_coverfile'] = true
|
347
|
-
warn %Q(Parameter 'coverfile' is obsolete. Please use 'cover' and make complete html file with header and footer.)
|
348
|
-
end
|
349
|
-
|
350
|
-
if @config['flag_legacy_titlepagefile'].nil? && !@config['titlepagefile'].nil? && File.exist?(@config['titlepagefile'])
|
351
|
-
@config['titlefile'] = "#{@config['bookname']}-title.#{@config['htmlext']}"
|
352
|
-
@config['titlepage'] = true
|
353
|
-
@epub.legacy_cover_and_title_file(@config['titlepagefile'], @config['titlefile'])
|
354
|
-
@config['flag_legacy_titlepagefile'] = true
|
355
|
-
warn %Q(Parameter 'titlepagefile' is obsolete. Please use 'titlefile' and make complete html file with header and footer.)
|
356
|
-
end
|
357
|
-
|
358
|
-
if @config['flag_legacy_backcoverfile'].nil? && !@config['backcoverfile'].nil? && File.exist?(@config['backcoverfile'])
|
359
|
-
@config['backcover'] = "#{@config['bookname']}-backcover.#{@config['htmlext']}"
|
360
|
-
@epub.legacy_cover_and_title_file(@config['backcoverfile'], @config['backcover'])
|
361
|
-
@config['flag_legacy_backcoverfile'] = true
|
362
|
-
warn %Q(Parameter 'backcoverfile' is obsolete. Please use 'backcover' and make complete html file with header and footer.)
|
363
|
-
end
|
364
|
-
|
365
|
-
if @config['flag_legacy_pubhistory'].nil? && @config['pubhistory']
|
366
|
-
@config['history'] = [[]]
|
367
|
-
@config['pubhistory'].split("\n").each { |date| @config['history'][0].push(date.sub(/(\d+)年(\d+)月(\d+)日/, '\1-\2-\3')) }
|
368
|
-
@config['flag_legacy_pubhistory'] = true
|
369
|
-
warn %Q(Parameter 'pubhistory' is obsolete. Please use 'history' array.)
|
370
|
-
end
|
371
|
-
|
372
|
-
true
|
373
|
-
end
|
374
|
-
end
|
375
|
-
end
|