review 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +90 -66
- data/.travis.yml +1 -1
- data/Gemfile +0 -1
- data/NEWS.ja.md +82 -0
- data/NEWS.md +83 -0
- data/README.md +5 -3
- data/Rakefile +8 -8
- data/bin/review +1 -5
- data/bin/review-catalog-converter +22 -27
- data/bin/review-check +36 -43
- data/bin/review-checkdep +10 -15
- data/bin/review-compile +37 -55
- data/bin/review-epubmaker +4 -5
- data/bin/review-index +21 -29
- data/bin/review-init +26 -37
- data/bin/review-pdfmaker +0 -2
- data/bin/review-preproc +25 -45
- data/bin/review-validate +19 -18
- data/bin/review-vol +15 -27
- data/doc/config.yml.sample +5 -2
- data/doc/format.ja.md +20 -1
- data/doc/format.md +21 -5
- data/doc/images/review-generate.png +0 -0
- data/lib/epubmaker.rb +1 -3
- data/lib/epubmaker/content.rb +24 -27
- data/lib/epubmaker/epubcommon.rb +135 -148
- data/lib/epubmaker/epubv2.rb +39 -46
- data/lib/epubmaker/epubv3.rb +93 -103
- data/lib/epubmaker/producer.rb +138 -151
- data/lib/epubmaker/zip_exporter.rb +21 -26
- data/lib/review/book.rb +3 -6
- data/lib/review/book/base.rb +78 -103
- data/lib/review/book/chapter.rb +36 -40
- data/lib/review/book/compilable.rb +28 -31
- data/lib/review/book/image_finder.rb +6 -13
- data/lib/review/book/index.rb +100 -121
- data/lib/review/book/page_metric.rb +2 -7
- data/lib/review/book/part.rb +18 -20
- data/lib/review/book/volume.rb +9 -13
- data/lib/review/builder.rb +81 -116
- data/lib/review/catalog.rb +15 -19
- data/lib/review/compiler.rb +64 -83
- data/lib/review/configure.rb +87 -97
- data/lib/review/converter.rb +2 -7
- data/lib/review/epubbuilder.rb +1 -3
- data/lib/review/epubmaker.rb +213 -205
- data/lib/review/exception.rb +2 -4
- data/lib/review/extentions.rb +0 -1
- data/lib/review/extentions/hash.rb +2 -2
- data/lib/review/extentions/string.rb +5 -30
- data/lib/review/htmlbuilder.rb +320 -375
- data/lib/review/htmltoc.rb +4 -7
- data/lib/review/htmlutils.rb +29 -32
- data/lib/review/i18n.rb +33 -44
- data/lib/review/i18n.yml +3 -3
- data/lib/review/idgxmlbuilder.rb +309 -345
- data/lib/review/latexbuilder.rb +175 -212
- data/lib/review/latexindex.rb +2 -8
- data/lib/review/latexutils.rb +33 -43
- data/lib/review/lineinput.rb +1 -1
- data/lib/review/logger.rb +21 -0
- data/lib/review/makerhelper.rb +1 -4
- data/lib/review/markdownbuilder.rb +44 -53
- data/lib/review/md2inaobuilder.rb +6 -12
- data/lib/review/pdfmaker.rb +143 -173
- data/lib/review/preprocessor.rb +64 -101
- data/lib/review/rstbuilder.rb +126 -158
- data/lib/review/sec_counter.rb +18 -34
- data/lib/review/template.rb +4 -5
- data/lib/review/textbuilder.rb +2 -3
- data/lib/review/textutils.rb +7 -13
- data/lib/review/tocparser.rb +31 -56
- data/lib/review/tocprinter.rb +26 -52
- data/lib/review/topbuilder.rb +219 -247
- data/lib/review/unfold.rb +15 -24
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +75 -99
- data/lib/review/webtocprinter.rb +15 -20
- data/lib/review/yamlloader.rb +13 -15
- data/review.gemspec +20 -22
- data/templates/latex/layout.tex.erb +2 -2
- data/templates/opf/epubv2.opf.erb +7 -7
- data/templates/opf/epubv3.opf.erb +7 -7
- data/templates/web/html/layout-html5.html.erb +2 -2
- data/test/assets/black.eps +280 -0
- data/test/assets/fit.png +0 -0
- data/test/assets/large.gif +0 -0
- data/test/assets/large.jpg +0 -0
- data/test/assets/large.png +0 -0
- data/test/assets/large.svg +65 -0
- data/test/assets/test_template.tex +1 -1
- data/test/book_test_helper.rb +2 -2
- data/test/run_test.rb +4 -4
- data/test/sample-book/src/Rakefile +21 -22
- data/test/syntax-book/Gemfile +4 -0
- data/test/syntax-book/Rakefile +72 -0
- data/test/syntax-book/appA.re +22 -0
- data/test/syntax-book/bib.re +6 -0
- data/test/syntax-book/catalog.yml +15 -0
- data/test/syntax-book/ch01.re +136 -0
- data/test/syntax-book/ch02.re +351 -0
- data/test/syntax-book/ch03.re +82 -0
- data/test/syntax-book/config.yml +35 -0
- data/test/syntax-book/images/ball.png +0 -0
- data/test/syntax-book/images/cover.jpg +0 -0
- data/test/syntax-book/images/fractal.png +0 -0
- data/test/syntax-book/images/img3-1.png +0 -0
- data/test/syntax-book/images/inlineicon.jpg +0 -0
- data/test/syntax-book/images/logic.png +0 -0
- data/test/syntax-book/images/logic2.png +0 -0
- data/test/syntax-book/images/puzzle.jpg +0 -0
- data/test/syntax-book/images/table.jpg +0 -0
- data/test/syntax-book/part2.re +6 -0
- data/test/syntax-book/pre01.re +26 -0
- data/test/syntax-book/review-ext.rb +14 -0
- data/test/syntax-book/sty/jumoline.sty +310 -0
- data/test/syntax-book/sty/reviewmacro.sty +39 -0
- data/test/syntax-book/style.css +494 -0
- data/test/syntax-book/syntax.dic +2 -0
- data/test/test_book.rb +106 -111
- data/test/test_book_chapter.rb +21 -22
- data/test/test_book_part.rb +3 -5
- data/test/test_builder.rb +11 -22
- data/test/test_catalog.rb +17 -18
- data/test/test_catalog_converter_cmd.rb +5 -5
- data/test/test_compiler.rb +18 -16
- data/test/test_configure.rb +35 -38
- data/test/test_converter.rb +3 -4
- data/test/test_epub3maker.rb +136 -117
- data/test/test_epubmaker.rb +107 -114
- data/test/test_epubmaker_cmd.rb +2 -4
- data/test/test_extentions_hash.rb +32 -33
- data/test/test_helper.rb +9 -11
- data/test/test_htmlbuilder.rb +454 -420
- data/test/test_htmltoc.rb +8 -12
- data/test/test_htmlutils.rb +0 -2
- data/test/test_i18n.rb +159 -150
- data/test/test_idgxmlbuilder.rb +190 -197
- data/test/test_image_finder.rb +21 -22
- data/test/test_index.rb +24 -29
- data/test/test_latexbuilder.rb +274 -264
- data/test/test_lineinput.rb +7 -10
- data/test/test_location.rb +7 -7
- data/test/test_makerhelper.rb +13 -25
- data/test/test_markdownbuilder.rb +23 -26
- data/test/test_md2inaobuilder.rb +8 -11
- data/test/test_pdfmaker.rb +114 -123
- data/test/test_pdfmaker_cmd.rb +1 -3
- data/test/test_review_ext.rb +3 -5
- data/test/test_rstbuilder.rb +92 -97
- data/test/test_template.rb +3 -7
- data/test/test_textutils.rb +27 -27
- data/test/test_tocparser.rb +2 -2
- data/test/test_topbuilder.rb +98 -103
- data/test/test_webtocprinter.rb +5 -6
- data/test/test_yamlloader.rb +42 -42
- data/test/test_zip_exporter.rb +12 -18
- metadata +86 -9
- data/lib/review/ewbbuilder.rb +0 -382
data/lib/epubmaker/epubv2.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# = epubv2.rb -- EPUB version 2 producer.
|
4
2
|
#
|
5
3
|
# Copyright (c) 2010-2017 Kenshi Muto and Masayoshi Takahashi
|
@@ -15,10 +13,9 @@ require 'cgi'
|
|
15
13
|
require 'epubmaker/zip_exporter'
|
16
14
|
|
17
15
|
module EPUBMaker
|
18
|
-
|
19
16
|
# EPUBv2 is EPUB version 2 producer.
|
20
17
|
class EPUBv2 < EPUBCommon
|
21
|
-
# Construct object with parameter hash +
|
18
|
+
# Construct object with parameter hash +config+ and message resource hash +res+.
|
22
19
|
def initialize(producer)
|
23
20
|
super
|
24
21
|
end
|
@@ -32,43 +29,41 @@ module EPUBMaker
|
|
32
29
|
|
33
30
|
tmplfile = File.expand_path('./opf/epubv2.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
|
34
31
|
tmpl = ReVIEW::Template.load(tmplfile)
|
35
|
-
|
32
|
+
tmpl.result(binding)
|
36
33
|
end
|
37
34
|
|
38
35
|
def opf_metainfo
|
39
|
-
s =
|
36
|
+
s = ''
|
40
37
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
41
|
-
next unless @producer.
|
42
|
-
if @producer.
|
43
|
-
s << @producer.
|
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
|
44
41
|
else
|
45
|
-
s << %Q
|
42
|
+
s << %Q( <dc:#{item}>#{CGI.escapeHTML(@producer.config.name_of(item))}</dc:#{item}>\n)
|
46
43
|
end
|
47
44
|
end
|
48
45
|
|
49
46
|
# ID
|
50
|
-
if @producer.
|
51
|
-
s << %Q
|
47
|
+
if @producer.config['isbn'].nil?
|
48
|
+
s << %Q( <dc:identifier id="BookId">#{@producer.config['urnid']}</dc:identifier>\n)
|
52
49
|
else
|
53
|
-
s << %Q
|
50
|
+
s << %Q( <dc:identifier id="BookId" opf:scheme="ISBN">#{@producer.config['isbn']}</dc:identifier>\n)
|
54
51
|
end
|
55
52
|
|
56
53
|
# creator (should be array)
|
57
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|
|
58
|
-
next unless @producer.
|
59
|
-
@producer.
|
60
|
-
s << %Q
|
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)
|
61
58
|
end
|
62
59
|
end
|
63
60
|
|
64
61
|
# contributor (should be array)
|
65
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|
|
66
|
-
next unless @producer.
|
67
|
-
@producer.
|
68
|
-
s << %Q
|
69
|
-
if role ==
|
70
|
-
s << %Q[ <dc:publisher>#{v}</dc:publisher>\n]
|
71
|
-
end
|
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
|
+
s << %Q( <dc:publisher>#{v}</dc:publisher>\n) if role == 'prt'
|
72
67
|
end
|
73
68
|
end
|
74
69
|
|
@@ -76,40 +71,40 @@ module EPUBMaker
|
|
76
71
|
end
|
77
72
|
|
78
73
|
def opf_manifest
|
79
|
-
s =
|
74
|
+
s = ''
|
80
75
|
s << <<EOT
|
81
76
|
<manifest>
|
82
|
-
<item id="ncx" href="#{@producer.
|
83
|
-
<item id="#{@producer.
|
77
|
+
<item id="ncx" href="#{@producer.config['bookname']}.ncx" media-type="application/x-dtbncx+xml"/>
|
78
|
+
<item id="#{@producer.config['bookname']}" href="#{@producer.config['cover']}" media-type="application/xhtml+xml"/>
|
84
79
|
EOT
|
85
80
|
|
86
|
-
s << %Q
|
81
|
+
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']
|
87
82
|
|
88
83
|
@producer.contents.each do |item|
|
89
84
|
next if item.file =~ /#/ # skip subgroup
|
90
|
-
s << %Q
|
85
|
+
s << %Q( <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n)
|
91
86
|
end
|
92
|
-
s << %Q
|
87
|
+
s << %Q( </manifest>\n)
|
93
88
|
s
|
94
89
|
end
|
95
90
|
|
96
91
|
def opf_tocx
|
97
|
-
if @producer.
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
92
|
+
cover_linear = if @producer.config['epubmaker']['cover_linear'] && @producer.config['epubmaker']['cover_linear'] != 'no'
|
93
|
+
'yes'
|
94
|
+
else
|
95
|
+
'no'
|
96
|
+
end
|
102
97
|
|
103
|
-
s =
|
104
|
-
s << %Q
|
105
|
-
s << %Q
|
106
|
-
s << %Q
|
98
|
+
s = ''
|
99
|
+
s << %Q( <spine toc="ncx">\n)
|
100
|
+
s << %Q( <itemref idref="#{@producer.config['bookname']}" linear="#{cover_linear}"/>\n)
|
101
|
+
s << %Q( <itemref idref="toc" />\n) unless @producer.config['mytoc'].nil?
|
107
102
|
|
108
103
|
@producer.contents.each do |item|
|
109
104
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
110
|
-
s << %Q
|
105
|
+
s << %Q( <itemref idref="#{item.id}"/>\n)
|
111
106
|
end
|
112
|
-
s << %Q
|
107
|
+
s << %Q( </spine>\n)
|
113
108
|
s
|
114
109
|
end
|
115
110
|
|
@@ -120,8 +115,7 @@ EOT
|
|
120
115
|
@ncx_navmap = ncx_navmap(indentarray)
|
121
116
|
|
122
117
|
tmplfile = File.expand_path('./ncx/epubv2.ncx.erb', ReVIEW::Template::TEMPLATE_DIR)
|
123
|
-
|
124
|
-
return tmpl.result(binding)
|
118
|
+
ReVIEW::Template.load(tmplfile).result(binding)
|
125
119
|
end
|
126
120
|
|
127
121
|
# Produce EPUB file +epubfile+.
|
@@ -130,13 +124,12 @@ EOT
|
|
130
124
|
def produce(epubfile, basedir, tmpdir)
|
131
125
|
produce_write_common(basedir, tmpdir)
|
132
126
|
|
133
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.
|
134
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.
|
127
|
+
File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}.ncx", 'w') { |f| @producer.ncx(f, @producer.config['epubmaker']['ncxindent']) }
|
128
|
+
File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}", 'w') { |f| @producer.mytoc(f) } if @producer.config['mytoc']
|
135
129
|
|
136
|
-
@producer.call_hook(@producer.
|
137
|
-
expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.
|
130
|
+
@producer.call_hook(@producer.config['epubmaker']['hook_prepack'], tmpdir)
|
131
|
+
expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.config)
|
138
132
|
expoter.export_zip(epubfile)
|
139
133
|
end
|
140
|
-
|
141
134
|
end
|
142
135
|
end
|
data/lib/epubmaker/epubv3.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
# = epubv3.rb -- EPUB version 3 producer.
|
4
2
|
#
|
5
3
|
# Copyright (c) 2010-2017 Kenshi Muto
|
@@ -14,18 +12,13 @@ require 'epubmaker/epubcommon'
|
|
14
12
|
require 'epubmaker/zip_exporter'
|
15
13
|
|
16
14
|
module EPUBMaker
|
17
|
-
|
18
15
|
# EPUBv3 is EPUB version 3 producer.
|
19
16
|
class EPUBv3 < EPUBCommon
|
20
|
-
# Construct object with parameter hash +
|
17
|
+
# Construct object with parameter hash +config+ and message resource hash +res+.
|
21
18
|
def initialize(producer)
|
22
19
|
super
|
23
20
|
@opf_prefix = {}
|
24
|
-
if @producer.
|
25
|
-
@producer.params["opf_prefix"].each do |k, v|
|
26
|
-
@opf_prefix[k] = v
|
27
|
-
end
|
28
|
-
end
|
21
|
+
@producer.config['opf_prefix'].each { |k, v| @opf_prefix[k] = v } if @producer.config['opf_prefix'].present?
|
29
22
|
end
|
30
23
|
|
31
24
|
# Return opf file content.
|
@@ -33,189 +26,186 @@ module EPUBMaker
|
|
33
26
|
@opf_metainfo = opf_metainfo
|
34
27
|
@opf_manifest = opf_manifest
|
35
28
|
@opf_toc = opf_tocx
|
36
|
-
@package_attrs =
|
29
|
+
@package_attrs = ''
|
37
30
|
|
38
|
-
if
|
39
|
-
prefixes_str = @opf_prefix.map{|k,v| %Q
|
40
|
-
@package_attrs <<
|
31
|
+
if @opf_prefix && @opf_prefix.size > 0
|
32
|
+
prefixes_str = @opf_prefix.map { |k, v| %Q(#{k}: #{v}) }.join(' ')
|
33
|
+
@package_attrs << %Q( prefix="#{prefixes_str}")
|
41
34
|
end
|
42
35
|
|
43
36
|
tmplfile = File.expand_path('./opf/epubv3.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
|
44
|
-
|
45
|
-
return tmpl.result(binding)
|
37
|
+
ReVIEW::Template.load(tmplfile).result(binding)
|
46
38
|
end
|
47
39
|
|
48
40
|
def opf_metainfo
|
49
|
-
s =
|
41
|
+
s = ''
|
50
42
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
51
|
-
next unless @producer.
|
52
|
-
if @producer.
|
53
|
-
@producer.
|
54
|
-
if v.
|
55
|
-
s << %Q
|
43
|
+
next unless @producer.config[item]
|
44
|
+
if @producer.config[item].is_a?(Array)
|
45
|
+
@producer.config[item].each_with_index do |v, i|
|
46
|
+
if v.is_a?(Hash)
|
47
|
+
s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:#{item}>\n)
|
56
48
|
v.each_pair do |name, val|
|
57
|
-
next if name ==
|
58
|
-
s << %Q
|
49
|
+
next if name == 'name'
|
50
|
+
s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
59
51
|
end
|
60
52
|
else
|
61
|
-
s << %Q
|
53
|
+
s << %Q( <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n)
|
62
54
|
end
|
63
55
|
end
|
64
|
-
elsif @producer.
|
65
|
-
s << %Q
|
66
|
-
@producer.
|
67
|
-
next if name ==
|
68
|
-
s << %Q
|
56
|
+
elsif @producer.config[item].is_a?(Hash)
|
57
|
+
s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item]['name'])}</dc:#{item}>\n)
|
58
|
+
@producer.config[item].each_pair do |name, val|
|
59
|
+
next if name == 'name'
|
60
|
+
s << %Q( <meta refines="##{item}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
69
61
|
end
|
70
62
|
else
|
71
|
-
s << %Q
|
63
|
+
s << %Q( <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.config[item].to_s)}</dc:#{item}>\n)
|
72
64
|
end
|
73
65
|
end
|
74
66
|
|
75
|
-
s << %Q
|
67
|
+
s << %Q( <meta property="dcterms:modified">#{@producer.config['modified']}</meta>\n)
|
76
68
|
|
77
69
|
# ID
|
78
|
-
if @producer.
|
79
|
-
s << %Q
|
70
|
+
if @producer.config['isbn'].nil?
|
71
|
+
s << %Q( <dc:identifier id="BookId">#{@producer.config['urnid']}</dc:identifier>\n)
|
80
72
|
else
|
81
|
-
s << %Q
|
73
|
+
s << %Q( <dc:identifier id="BookId">#{@producer.config['isbn']}</dc:identifier>\n)
|
82
74
|
end
|
83
75
|
|
84
76
|
# creator (should be array)
|
85
77
|
%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|
|
86
|
-
next unless @producer.
|
87
|
-
@producer.
|
88
|
-
if v.
|
89
|
-
s << %Q
|
90
|
-
s << %Q
|
78
|
+
next unless @producer.config[role]
|
79
|
+
@producer.config[role].each_with_index do |v, i|
|
80
|
+
if v.is_a?(Hash)
|
81
|
+
s << %Q( <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:creator>\n)
|
82
|
+
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
|
91
83
|
v.each_pair do |name, val|
|
92
|
-
next if name ==
|
93
|
-
s << %Q
|
84
|
+
next if name == 'name'
|
85
|
+
s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
94
86
|
end
|
95
87
|
else
|
96
|
-
s << %Q
|
97
|
-
s << %Q
|
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)
|
98
90
|
end
|
99
91
|
end
|
100
92
|
end
|
101
93
|
|
102
94
|
# contributor (should be array)
|
103
95
|
%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|
|
104
|
-
next unless @producer.
|
105
|
-
@producer.
|
106
|
-
if v.
|
107
|
-
s << %Q
|
108
|
-
s << %Q
|
96
|
+
next unless @producer.config[role]
|
97
|
+
@producer.config[role].each_with_index do |v, i|
|
98
|
+
if v.is_a?(Hash)
|
99
|
+
s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:contributor>\n)
|
100
|
+
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
109
101
|
v.each_pair do |name, val|
|
110
|
-
next if name ==
|
111
|
-
s << %Q
|
102
|
+
next if name == 'name'
|
103
|
+
s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
112
104
|
end
|
113
105
|
else
|
114
|
-
s << %Q
|
115
|
-
s << %Q
|
106
|
+
s << %Q( <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n)
|
107
|
+
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
116
108
|
end
|
117
109
|
|
118
|
-
if
|
119
|
-
if v.
|
120
|
-
s << %Q
|
121
|
-
s << %Q
|
110
|
+
if %w[prt pbl].include?(role)
|
111
|
+
if v.is_a?(Hash)
|
112
|
+
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v['name'])}</dc:publisher>\n)
|
113
|
+
s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
122
114
|
v.each_pair do |name, val|
|
123
|
-
next if name ==
|
124
|
-
s << %Q
|
115
|
+
next if name == 'name'
|
116
|
+
s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n)
|
125
117
|
end
|
126
118
|
else
|
127
|
-
s << %Q
|
128
|
-
s << %Q
|
119
|
+
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:publisher>\n)
|
120
|
+
s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">prt</meta>\n)
|
129
121
|
end
|
130
122
|
end
|
131
123
|
end
|
132
124
|
end
|
133
125
|
|
134
126
|
## add custom <meta> element
|
135
|
-
if @producer.
|
136
|
-
@producer.params["opf_meta"].each do |k, v|
|
137
|
-
s << %Q[ <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n]
|
138
|
-
end
|
139
|
-
end
|
127
|
+
@producer.config['opf_meta'].each { |k, v| s << %Q( <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n) } if @producer.config['opf_meta'].present?
|
140
128
|
|
141
129
|
s
|
142
130
|
end
|
143
131
|
|
144
132
|
def opf_manifest
|
145
|
-
s =
|
133
|
+
s = ''
|
146
134
|
s << <<EOT
|
147
135
|
<manifest>
|
148
|
-
<item properties="nav" id="#{@producer.
|
149
|
-
<item id="#{@producer.
|
136
|
+
<item properties="nav" id="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" href="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" media-type="application/xhtml+xml"/>
|
137
|
+
<item id="#{@producer.config['bookname']}" href="#{@producer.config['cover']}" media-type="application/xhtml+xml"/>
|
150
138
|
EOT
|
151
139
|
|
152
|
-
if @producer.
|
140
|
+
if @producer.config['coverimage']
|
153
141
|
@producer.contents.each do |item|
|
154
|
-
if item.media.start_with?('image')
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
end
|
142
|
+
next if !item.media.start_with?('image') || File.basename(item.file) != @producer.config['coverimage']
|
143
|
+
s << %Q( <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n)
|
144
|
+
item.id = nil
|
145
|
+
break
|
159
146
|
end
|
160
147
|
end
|
161
148
|
|
162
149
|
@producer.contents.each do |item|
|
163
150
|
next if item.file =~ /#/ || item.id.nil? # skip subgroup, or id=nil (for cover)
|
164
|
-
propstr =
|
151
|
+
propstr = ''
|
165
152
|
if item.properties.size > 0
|
166
|
-
propstr = %Q
|
153
|
+
propstr = %Q( properties="#{item.properties.sort.uniq.join(' ')}")
|
167
154
|
end
|
168
|
-
s << %Q
|
155
|
+
s << %Q( <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"#{propstr}/>\n)
|
169
156
|
end
|
170
|
-
s << %Q
|
157
|
+
s << %Q( </manifest>\n)
|
171
158
|
|
172
159
|
s
|
173
160
|
end
|
174
161
|
|
175
162
|
def opf_tocx
|
176
|
-
if @producer.
|
177
|
-
cover_linear =
|
163
|
+
if @producer.config['epubmaker']['cover_linear'] && @producer.config['epubmaker']['cover_linear'] != 'no'
|
164
|
+
cover_linear = 'yes'
|
178
165
|
else
|
179
|
-
cover_linear =
|
166
|
+
cover_linear = 'no'
|
180
167
|
end
|
181
168
|
|
182
|
-
s =
|
183
|
-
if @producer.
|
184
|
-
s << %Q
|
169
|
+
s = ''
|
170
|
+
if @producer.config['direction']
|
171
|
+
s << %Q( <spine page-progression-direction="#{@producer.config['direction']}">\n)
|
185
172
|
else
|
186
|
-
s << %Q
|
173
|
+
s << %Q( <spine>\n)
|
187
174
|
end
|
188
|
-
s << %Q
|
189
|
-
s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n] if @producer.params["toc"]
|
175
|
+
s << %Q( <itemref idref="#{@producer.config['bookname']}" linear="#{cover_linear}"/>\n)
|
190
176
|
|
177
|
+
toc = nil
|
191
178
|
@producer.contents.each do |item|
|
192
179
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
193
|
-
|
180
|
+
if toc.nil? && item.chaptype != 'pre'
|
181
|
+
s << %Q( <itemref idref="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" />\n) if @producer.config['toc']
|
182
|
+
toc = true
|
183
|
+
end
|
184
|
+
s << %Q( <itemref idref="#{item.id}"/>\n)
|
194
185
|
end
|
195
|
-
s << %Q
|
186
|
+
s << %Q( </spine>\n)
|
196
187
|
|
197
188
|
s
|
198
189
|
end
|
199
190
|
|
200
191
|
def ncx(indentarray)
|
201
|
-
if @producer.
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
192
|
+
ncx_main = if @producer.config['epubmaker']['flattoc'].nil?
|
193
|
+
hierarchy_ncx('ol')
|
194
|
+
else
|
195
|
+
flat_ncx('ol', @producer.config['epubmaker']['flattocindent'])
|
196
|
+
end
|
206
197
|
|
207
198
|
@body = <<EOT
|
208
199
|
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
209
|
-
<h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v(
|
200
|
+
<h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v('toctitle'))}</h1>
|
210
201
|
#{ncx_main} </nav>
|
211
202
|
EOT
|
212
203
|
|
213
|
-
@title = CGI.escapeHTML(@producer.res.v(
|
214
|
-
@language = @producer.
|
215
|
-
@stylesheets = @producer.
|
204
|
+
@title = CGI.escapeHTML(@producer.res.v('toctitle'))
|
205
|
+
@language = @producer.config['language']
|
206
|
+
@stylesheets = @producer.config['stylesheet']
|
216
207
|
tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
217
|
-
|
218
|
-
return tmpl.result(binding)
|
208
|
+
ReVIEW::Template.load(tmplfile).result(binding)
|
219
209
|
end
|
220
210
|
|
221
211
|
# Produce EPUB file +epubfile+.
|
@@ -224,10 +214,10 @@ EOT
|
|
224
214
|
def produce(epubfile, basedir, tmpdir)
|
225
215
|
produce_write_common(basedir, tmpdir)
|
226
216
|
|
227
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.
|
217
|
+
File.open("#{tmpdir}/OEBPS/#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}", 'w') { |f| @producer.ncx(f, @producer.config['epubmaker']['ncxindent']) }
|
228
218
|
|
229
|
-
@producer.call_hook(@producer.
|
230
|
-
expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.
|
219
|
+
@producer.call_hook(@producer.config['epubmaker']['hook_prepack'], tmpdir)
|
220
|
+
expoter = EPUBMaker::ZipExporter.new(tmpdir, @producer.config)
|
231
221
|
expoter.export_zip(epubfile)
|
232
222
|
end
|
233
223
|
end
|