review 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +1 -0
- data/ChangeLog +87 -0
- data/bin/review-check +2 -2
- data/bin/review-compile +15 -30
- data/bin/review-index +1 -1
- data/bin/review-init +12 -7
- data/bin/review-vol +9 -1
- data/doc/catalog.ja.md +53 -0
- data/doc/catalog.md +52 -0
- data/doc/format.ja.md +734 -0
- data/doc/format.md +746 -0
- data/doc/format_idg.ja.md +203 -0
- data/doc/{quickstart.rdoc → quickstart.ja.md} +138 -104
- data/doc/quickstart.md +252 -0
- data/doc/sample.yml +216 -48
- data/lib/epubmaker.rb +0 -1
- data/lib/epubmaker/content.rb +2 -2
- data/lib/epubmaker/epubcommon.rb +440 -0
- data/lib/epubmaker/epubv2.rb +8 -418
- data/lib/epubmaker/epubv3.rb +67 -61
- data/lib/epubmaker/producer.rb +60 -19
- data/lib/review/book.rb +1 -3
- data/lib/review/book/base.rb +18 -11
- data/lib/review/book/chapter.rb +5 -24
- data/lib/review/book/compilable.rb +5 -1
- data/lib/review/book/index.rb +48 -17
- data/lib/review/book/page_metric.rb +17 -8
- data/lib/review/book/part.rb +12 -2
- data/lib/review/book/volume.rb +3 -2
- data/lib/review/builder.rb +30 -10
- data/lib/review/compiler.rb +6 -4
- data/lib/review/configure.rb +3 -3
- data/lib/review/epubmaker.rb +56 -26
- data/lib/review/htmlbuilder.rb +33 -42
- data/lib/review/htmlutils.rb +12 -7
- data/lib/review/i18n.rb +77 -17
- data/lib/review/i18n.yml +80 -4
- data/lib/review/idgxmlbuilder.rb +27 -57
- data/lib/review/inaobuilder.rb +3 -3
- data/lib/review/latexbuilder.rb +90 -67
- data/lib/review/layout.tex.erb +54 -7
- data/lib/review/markdownbuilder.rb +21 -3
- data/lib/review/pdfmaker.rb +67 -38
- data/lib/review/sec_counter.rb +1 -1
- data/lib/review/tocparser.rb +9 -5
- data/lib/review/topbuilder.rb +6 -6
- data/lib/review/version.rb +1 -1
- data/review.gemspec +3 -1
- data/test/book_test_helper.rb +1 -1
- data/test/sample-book/README.md +2 -0
- data/test/sample-book/src/Rakefile +31 -0
- data/test/sample-book/src/_cover.html +0 -0
- data/test/sample-book/src/catalog.yml +10 -0
- data/test/sample-book/src/ch01.re +0 -0
- data/test/sample-book/src/ch02.re +0 -0
- data/test/sample-book/src/config.yml +160 -32
- data/test/sample-book/src/images/ch01-imgsample.jpg +0 -0
- data/test/sample-book/src/images/cover.jpg +0 -0
- data/test/sample-book/src/preface.re +0 -0
- data/test/sample-book/src/sty/jumoline.sty +0 -0
- data/test/sample-book/src/sty/reviewmacro.sty +18 -0
- data/test/sample-book/src/style.css +0 -0
- data/test/test_book.rb +25 -27
- data/test/test_book_chapter.rb +4 -73
- data/test/test_book_part.rb +5 -4
- data/test/test_builder.rb +3 -3
- data/test/test_epub3maker.rb +527 -0
- data/test/test_epubmaker.rb +6 -6
- data/test/test_htmlbuilder.rb +143 -6
- data/test/test_i18n.rb +95 -10
- data/test/test_idgxmlbuilder.rb +28 -2
- data/test/test_index.rb +109 -1
- data/test/test_latexbuilder.rb +51 -0
- data/test/test_markdownbuilder.rb +54 -1
- data/test/test_pdfmaker.rb +7 -6
- data/test/test_review_ext.rb +31 -0
- data/test/test_topbuilder.rb +3 -1
- metadata +46 -13
- data/doc/catalog.rdoc +0 -49
- data/doc/format.rdoc +0 -618
- data/doc/format_idg.rdoc +0 -180
- data/doc/libepubmaker/config.yml +0 -207
- data/lib/epubmaker/resource.rb +0 -82
- data/test/sample-book/src/CHAPS +0 -2
- data/test/sample-book/src/PREDEF +0 -1
data/lib/epubmaker/epubv3.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = epubv3.rb -- EPUB version 3 producer.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010-
|
4
|
+
# Copyright (c) 2010-2015 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -9,56 +9,36 @@
|
|
9
9
|
# For details of the GNU LGPL, see the file "COPYING".
|
10
10
|
#
|
11
11
|
|
12
|
-
require 'epubmaker/
|
12
|
+
require 'epubmaker/epubcommon'
|
13
13
|
|
14
14
|
module EPUBMaker
|
15
15
|
|
16
16
|
# EPUBv3 is EPUB version 3 producer.
|
17
|
-
class EPUBv3 <
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
17
|
+
class EPUBv3 < EPUBCommon
|
18
|
+
# Construct object with parameter hash +params+ and message resource hash +res+.
|
19
|
+
def initialize(producer)
|
20
|
+
super
|
27
21
|
end
|
28
22
|
|
29
|
-
|
30
|
-
|
31
|
-
s
|
32
|
-
|
33
|
-
|
34
|
-
<
|
35
|
-
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
36
|
-
<h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
|
23
|
+
# Return opf file content.
|
24
|
+
def opf
|
25
|
+
s = <<EOT
|
26
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
27
|
+
<package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="#{@producer.params["language"]}">
|
28
|
+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
37
29
|
EOT
|
38
30
|
|
39
|
-
|
40
|
-
s << hierarchy_ncx("ol")
|
41
|
-
else
|
42
|
-
s << flat_ncx("ol", @producer.params["flattocindent"])
|
43
|
-
end
|
44
|
-
s << <<EOT
|
45
|
-
</nav>
|
46
|
-
</body>
|
47
|
-
</html>
|
48
|
-
EOT
|
49
|
-
s
|
50
|
-
end
|
31
|
+
s << opf_metainfo
|
51
32
|
|
52
|
-
|
53
|
-
# +basedir+ points the directory has contents.
|
54
|
-
# +tmpdir+ defines temporary directory.
|
55
|
-
def produce(epubfile, basedir, tmpdir)
|
56
|
-
produce_write_common(basedir, tmpdir)
|
33
|
+
s << %Q[ </metadata>\n]
|
57
34
|
|
58
|
-
|
35
|
+
s << opf_manifest
|
36
|
+
s << opf_tocx
|
37
|
+
s << opf_guide # same as ePUB2
|
59
38
|
|
60
|
-
|
61
|
-
|
39
|
+
s << %Q[</package>\n]
|
40
|
+
|
41
|
+
s
|
62
42
|
end
|
63
43
|
|
64
44
|
def opf_metainfo
|
@@ -66,7 +46,9 @@ EOT
|
|
66
46
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
67
47
|
next if @producer.params[item].nil?
|
68
48
|
if @producer.params[item].instance_of?(Array)
|
69
|
-
|
49
|
+
@producer.params[item].each_with_index {|v, i|
|
50
|
+
s << %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n]
|
51
|
+
}
|
70
52
|
else
|
71
53
|
s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
|
72
54
|
end
|
@@ -134,11 +116,11 @@ EOT
|
|
134
116
|
s
|
135
117
|
end
|
136
118
|
|
137
|
-
def opf_manifest
|
119
|
+
def opf_manifest
|
138
120
|
s = ""
|
139
121
|
s << <<EOT
|
140
122
|
<manifest>
|
141
|
-
<item properties="nav
|
123
|
+
<item properties="nav" id="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" media-type="application/xhtml+xml"/>
|
142
124
|
<item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
|
143
125
|
EOT
|
144
126
|
|
@@ -158,7 +140,7 @@ EOT
|
|
158
140
|
if item.properties.size > 0
|
159
141
|
propstr = %Q[ properties="#{item.properties.sort.uniq.join(" ")}"]
|
160
142
|
end
|
161
|
-
s << %Q[ <item
|
143
|
+
s << %Q[ <item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"#{propstr}/>\n]
|
162
144
|
end
|
163
145
|
s << %Q[ </manifest>\n]
|
164
146
|
|
@@ -166,7 +148,7 @@ EOT
|
|
166
148
|
end
|
167
149
|
|
168
150
|
def opf_tocx
|
169
|
-
if @producer.params["cover_linear"] && @producer.params["cover_linear"] != "no"
|
151
|
+
if @producer.params["epubmaker"]["cover_linear"] && @producer.params["epubmaker"]["cover_linear"] != "no"
|
170
152
|
cover_linear = "yes"
|
171
153
|
else
|
172
154
|
cover_linear = "no"
|
@@ -175,7 +157,7 @@ EOT
|
|
175
157
|
s = ""
|
176
158
|
s << %Q[ <spine>\n]
|
177
159
|
s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="#{cover_linear}"/>\n]
|
178
|
-
|
160
|
+
s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n] if @producer.params["toc"]
|
179
161
|
|
180
162
|
@producer.contents.each do |item|
|
181
163
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
@@ -186,26 +168,50 @@ EOT
|
|
186
168
|
s
|
187
169
|
end
|
188
170
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
s =
|
193
|
-
|
194
|
-
<
|
195
|
-
|
196
|
-
|
171
|
+
def opf_guide
|
172
|
+
s = ""
|
173
|
+
s << %Q[ <guide>\n]
|
174
|
+
s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
|
175
|
+
s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
|
176
|
+
s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n]
|
177
|
+
s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
|
178
|
+
s << %Q[ </guide>\n]
|
179
|
+
s
|
180
|
+
end
|
197
181
|
|
198
|
-
|
182
|
+
def ncx(indentarray)
|
183
|
+
s = common_header
|
184
|
+
s << <<EOT
|
185
|
+
<title>#{@producer.res.v("toctitle")}</title>
|
186
|
+
</head>
|
187
|
+
<body>
|
188
|
+
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
189
|
+
<h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
|
190
|
+
EOT
|
199
191
|
|
200
|
-
|
192
|
+
if @producer.params["epubmaker"]["flattoc"].nil?
|
193
|
+
s << hierarchy_ncx("ol")
|
194
|
+
else
|
195
|
+
s << flat_ncx("ol", @producer.params["epubmaker"]["flattocindent"])
|
196
|
+
end
|
197
|
+
s << <<EOT
|
198
|
+
</nav>
|
199
|
+
</body>
|
200
|
+
</html>
|
201
|
+
EOT
|
202
|
+
s
|
203
|
+
end
|
201
204
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
+
# Produce EPUB file +epubfile+.
|
206
|
+
# +basedir+ points the directory has contents.
|
207
|
+
# +tmpdir+ defines temporary directory.
|
208
|
+
def produce(epubfile, basedir, tmpdir)
|
209
|
+
produce_write_common(basedir, tmpdir)
|
205
210
|
|
206
|
-
|
211
|
+
File.open("#{tmpdir}/OEBPS/#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}", "w") {|f| @producer.ncx(f, @producer.params["epubmaker"]["ncxindent"]) }
|
207
212
|
|
208
|
-
|
213
|
+
@producer.call_hook(@producer.params["epubmaker"]["hook_prepack"], tmpdir)
|
214
|
+
export_zip(tmpdir, epubfile)
|
209
215
|
end
|
210
216
|
|
211
217
|
private
|
data/lib/epubmaker/producer.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = producer.rb -- EPUB producer.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010-
|
4
|
+
# Copyright (c) 2010-2015 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -12,10 +12,10 @@ require 'tmpdir'
|
|
12
12
|
require 'fileutils'
|
13
13
|
require 'yaml'
|
14
14
|
require 'uuid'
|
15
|
-
require 'epubmaker/resource'
|
16
15
|
require 'epubmaker/content'
|
17
16
|
require 'epubmaker/epubv2'
|
18
17
|
require 'epubmaker/epubv3'
|
18
|
+
require 'review/i18n'
|
19
19
|
|
20
20
|
module EPUBMaker
|
21
21
|
# EPUBMaker produces EPUB file.
|
@@ -25,7 +25,7 @@ module EPUBMaker
|
|
25
25
|
# Parameter hash.
|
26
26
|
attr_accessor :params
|
27
27
|
# Message resource object.
|
28
|
-
|
28
|
+
attr_reader :res
|
29
29
|
|
30
30
|
# Take YAML +file+ and return parameter hash.
|
31
31
|
def Producer.load(file)
|
@@ -47,6 +47,7 @@ module EPUBMaker
|
|
47
47
|
@params = {}
|
48
48
|
@epub = nil
|
49
49
|
@params["epubversion"] = version unless version.nil?
|
50
|
+
@res = ReVIEW::I18n
|
50
51
|
|
51
52
|
unless params.nil?
|
52
53
|
merge_params(params)
|
@@ -57,7 +58,6 @@ module EPUBMaker
|
|
57
58
|
def merge_params(params)
|
58
59
|
@params = @params.merge(params)
|
59
60
|
complement
|
60
|
-
@res = EPUBMaker::Resource.new(@params)
|
61
61
|
|
62
62
|
unless @params["epubversion"].nil?
|
63
63
|
case @params["epubversion"].to_i
|
@@ -69,6 +69,9 @@ module EPUBMaker
|
|
69
69
|
raise "Invalid EPUB version (#{@params["epubversion"]}.)"
|
70
70
|
end
|
71
71
|
end
|
72
|
+
if params["language"]
|
73
|
+
ReVIEW::I18n.locale = params["language"]
|
74
|
+
end
|
72
75
|
support_legacy_maker
|
73
76
|
end
|
74
77
|
|
@@ -191,8 +194,6 @@ module EPUBMaker
|
|
191
194
|
"urnid" => "urn:uid:#{UUID.create}",
|
192
195
|
"isbn" => nil,
|
193
196
|
"toclevel" => 2,
|
194
|
-
"flattoc" => nil,
|
195
|
-
"flattocindent" => true,
|
196
197
|
"stylesheet" => [],
|
197
198
|
"epubversion" => 2,
|
198
199
|
"htmlversion" => 4,
|
@@ -205,26 +206,66 @@ module EPUBMaker
|
|
205
206
|
"originaltitlefile" => nil,
|
206
207
|
"profile" => nil,
|
207
208
|
"colophon" => nil,
|
208
|
-
"
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
209
|
+
"epubmaker" => {
|
210
|
+
"flattoc" => nil,
|
211
|
+
"flattocindent" => true,
|
212
|
+
"ncx_indent" => [],
|
213
|
+
"zip_stage1" => "zip -0Xq",
|
214
|
+
"zip_stage2" => "zip -Xr9Dq",
|
215
|
+
"zip_addpath" => nil,
|
216
|
+
"hook_beforeprocess" => nil,
|
217
|
+
"hook_afterfrontmatter" => nil,
|
218
|
+
"hook_afterbody" => nil,
|
219
|
+
"hook_afterbackmatter" => nil,
|
220
|
+
"hook_aftercopyimage" => nil,
|
221
|
+
"hook_prepack" => nil,
|
222
|
+
"rename_for_legacy" => nil,
|
223
|
+
"verify_target_images" => nil,
|
224
|
+
"force_include_images" => [],
|
225
|
+
"cover_linear" => nil,
|
226
|
+
},
|
217
227
|
"imagedir" => "images",
|
218
228
|
"fontdir" => "fonts",
|
219
229
|
"image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
|
220
230
|
"font_ext" => %w(ttf woff otf),
|
221
|
-
"verify_target_images" => nil,
|
222
|
-
"force_include_images" => [],
|
223
|
-
"cover_linear" => nil,
|
224
231
|
}
|
225
232
|
|
226
233
|
defaults.each_pair do |k, v|
|
227
|
-
|
234
|
+
if k == "epubmaker" && !@params[k].nil?
|
235
|
+
v.each_pair do |k2, v2|
|
236
|
+
@params[k][k2] = v2 if @params[k][k2].nil?
|
237
|
+
end
|
238
|
+
else
|
239
|
+
@params[k] = v if @params[k].nil?
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
deprecated_parameters = {
|
244
|
+
"ncxindent" => "epubmaker:ncxindent",
|
245
|
+
"flattoc" => "epubmaker:flattoc",
|
246
|
+
"flattocindent" => "epubmaker:flattocindent",
|
247
|
+
"hook_beforeprocess" => "epubmaker:hook_beforeprocess",
|
248
|
+
"hook_afterfrontmatter" => "epubmaker:hook_afterfrontmatter",
|
249
|
+
"hook_afterbody" => "epubmaker:hook_afterbody",
|
250
|
+
"hook_afterbackmatter" => "epubmaker:hook_afterbackmatter",
|
251
|
+
"hook_aftercopyimage" => "epubmaker:hook_aftercopyimage",
|
252
|
+
"hook_prepack" => "epubmaker:hook_prepack",
|
253
|
+
"rename_for_legacy" => "epubmaker:rename_for_legacy",
|
254
|
+
"zip_stage1" => "epubmaker:zip_stage1",
|
255
|
+
"zip_stage2" => "epubmaker:zip_stage2",
|
256
|
+
"zip_addpath" => "epubmaker:zip_addpath",
|
257
|
+
"verify_target_images" => "epubmaker:verify_target_images",
|
258
|
+
"force_include_images" => "epubmaker:force_include_images",
|
259
|
+
"cover_linear" => "epubmaker:cover_linear",
|
260
|
+
}
|
261
|
+
|
262
|
+
deprecated_parameters.each_pair do |k, v|
|
263
|
+
unless @params[k].nil?
|
264
|
+
sa = v.split(":", 2)
|
265
|
+
warn "Parameter #{k} is deprecated. Use:\n#{sa[0]}:\n #{sa[1]}: ...\n\n"
|
266
|
+
@params[sa[0]][sa[1]] = @params[k]
|
267
|
+
@params.delete(k)
|
268
|
+
end
|
228
269
|
end
|
229
270
|
|
230
271
|
@params["htmlversion"] == 5 if @params["epubversion"] >= 3
|
data/lib/review/book.rb
CHANGED
@@ -12,8 +12,6 @@
|
|
12
12
|
|
13
13
|
require 'review/exception'
|
14
14
|
require 'review/extentions'
|
15
|
-
require 'forwardable'
|
16
|
-
require 'nkf'
|
17
15
|
|
18
16
|
require 'review/book/base'
|
19
17
|
require 'review/book/chapter'
|
@@ -26,7 +24,7 @@ module ReVIEW
|
|
26
24
|
@default_book = nil
|
27
25
|
|
28
26
|
def ReVIEW.book
|
29
|
-
@default_book ||= Book::Base.
|
27
|
+
@default_book ||= Book::Base.load
|
30
28
|
end
|
31
29
|
|
32
30
|
module Book
|
data/lib/review/book/base.rb
CHANGED
@@ -19,17 +19,11 @@ module ReVIEW
|
|
19
19
|
attr_writer :config
|
20
20
|
|
21
21
|
def self.load_default
|
22
|
-
|
23
|
-
|
24
|
-
File.file?("#{basedir}/catalog.yml")
|
25
|
-
book = load(basedir)
|
26
|
-
book
|
27
|
-
else
|
28
|
-
new(basedir)
|
29
|
-
end
|
22
|
+
warn 'Book::Base.load_default() is obsoleted. Use Book::Base.load().'
|
23
|
+
load()
|
30
24
|
end
|
31
25
|
|
32
|
-
def self.load(dir)
|
26
|
+
def self.load(dir = ".")
|
33
27
|
update_rubyenv dir
|
34
28
|
new(dir)
|
35
29
|
end
|
@@ -81,7 +75,13 @@ module ReVIEW
|
|
81
75
|
end
|
82
76
|
|
83
77
|
def page_metric
|
84
|
-
config["page_metric"]
|
78
|
+
if config["page_metric"].respond_to?(:downcase) && config["page_metric"].upcase =~ /^[A-Z0-9_]+$/
|
79
|
+
ReVIEW::Book::PageMetric.const_get(config["page_metric"].upcase)
|
80
|
+
elsif config["page_metric"].kind_of?(Array) && config["page_metric"].size == 5
|
81
|
+
ReVIEW::Book::PageMetric.new(*config["page_metric"])
|
82
|
+
else
|
83
|
+
config["page_metric"]
|
84
|
+
end
|
85
85
|
end
|
86
86
|
|
87
87
|
def parts
|
@@ -149,7 +149,9 @@ module ReVIEW
|
|
149
149
|
end
|
150
150
|
|
151
151
|
def volume
|
152
|
-
Volume.sum(chapters.map {|chap| chap.volume })
|
152
|
+
vol = Volume.sum(chapters.map {|chap| chap.volume })
|
153
|
+
vol.page_per_kbyte = page_metric.page_per_kbyte
|
154
|
+
vol
|
153
155
|
end
|
154
156
|
|
155
157
|
def config
|
@@ -161,6 +163,11 @@ module ReVIEW
|
|
161
163
|
@config = param
|
162
164
|
end
|
163
165
|
|
166
|
+
def load_config(filename)
|
167
|
+
new_conf = YAML.load_file(filename)
|
168
|
+
@config.merge!(new_conf)
|
169
|
+
end
|
170
|
+
|
164
171
|
# backward compatible
|
165
172
|
def param
|
166
173
|
@config
|
data/lib/review/book/chapter.rb
CHANGED
@@ -12,26 +12,13 @@
|
|
12
12
|
require 'review/book/compilable'
|
13
13
|
module ReVIEW
|
14
14
|
module Book
|
15
|
+
ROMAN = %w[0 I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII]
|
16
|
+
ALPHA = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
|
17
|
+
|
15
18
|
class Chapter
|
16
19
|
include Compilable
|
17
20
|
|
18
|
-
|
19
|
-
ALPHA = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
|
20
|
-
|
21
|
-
def Chapter.intern_pathes(pathes)
|
22
|
-
books = {}
|
23
|
-
pathes.map {|path|
|
24
|
-
basedir = File.dirname(path)
|
25
|
-
book = (books[File.expand_path(basedir)] ||= Book.load(basedir))
|
26
|
-
begin
|
27
|
-
book.chapter(File.basename(path, '.*'))
|
28
|
-
rescue KeyError
|
29
|
-
raise FileNotFound, "No such chapter in your book. Check if the catalog files contain the chapter. : #{path}"
|
30
|
-
end
|
31
|
-
}
|
32
|
-
end
|
33
|
-
|
34
|
-
attr_reader :number
|
21
|
+
attr_reader :number, :book
|
35
22
|
|
36
23
|
def initialize(book, number, name, path, io = nil)
|
37
24
|
@book = book
|
@@ -64,12 +51,7 @@ module ReVIEW
|
|
64
51
|
if on_APPENDIX?
|
65
52
|
return "#{@number}" if @number < 1 || @number > 27
|
66
53
|
|
67
|
-
|
68
|
-
type = "arabic"
|
69
|
-
else
|
70
|
-
type = @book.config["appendix_format"].downcase.strip
|
71
|
-
end
|
72
|
-
|
54
|
+
type = @book.config["appendix_format"].blank? ? "arabic" : @book.config["appendix_format"].downcase.strip
|
73
55
|
appendix = case type
|
74
56
|
when "roman"
|
75
57
|
ROMAN[@number]
|
@@ -79,7 +61,6 @@ module ReVIEW
|
|
79
61
|
# nil, "arabic", etc...
|
80
62
|
"#{@number}"
|
81
63
|
end
|
82
|
-
|
83
64
|
if heading
|
84
65
|
return "#{I18n.t("appendix", appendix)}"
|
85
66
|
else
|