review 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +36 -0
- data/.rubocop.yml +1 -0
- data/ChangeLog +102 -0
- data/README.rdoc +2 -2
- data/bin/review-check +18 -16
- data/bin/review-compile +49 -42
- data/bin/review-epubmaker +23 -993
- data/bin/review-epubmaker-legacy +1024 -0
- data/bin/review-index +17 -15
- data/bin/review-init +39 -9
- data/bin/review-pdfmaker +124 -89
- data/bin/review-preproc +16 -14
- data/bin/review-vol +17 -15
- data/debian/docs +1 -1
- data/doc/catalog.rdoc +34 -0
- data/doc/format.rdoc +16 -2
- data/doc/libepubmaker/{config.yaml → config.yml} +63 -19
- data/doc/quickstart.rdoc +1 -1
- data/doc/{sample.yaml → sample.yml} +0 -0
- data/lib/epubmaker.rb +1 -1
- data/lib/epubmaker/content.rb +9 -1
- data/lib/epubmaker/epubv2.rb +59 -7
- data/lib/epubmaker/epubv3.rb +14 -9
- data/lib/epubmaker/producer.rb +68 -27
- data/lib/epubmaker/resource.rb +3 -1
- data/lib/lineinput.rb +2 -2
- data/lib/review/book/base.rb +125 -24
- data/lib/review/book/chapter.rb +42 -0
- data/lib/review/book/compilable.rb +23 -4
- data/lib/review/book/image_finder.rb +64 -0
- data/lib/review/book/index.rb +64 -50
- data/lib/review/book/page_metric.rb +1 -1
- data/lib/review/builder.rb +19 -12
- data/lib/review/catalog.rb +47 -0
- data/lib/review/compiler.rb +3 -2
- data/lib/review/configure.rb +5 -3
- data/lib/review/epubmaker.rb +130 -46
- data/lib/review/ewbbuilder.rb +27 -31
- data/lib/review/extentions/string.rb +4 -4
- data/lib/review/htmlbuilder.rb +140 -79
- data/lib/review/htmllayout.rb +26 -4
- data/lib/review/htmlutils.rb +20 -1
- data/lib/review/i18n.rb +5 -2
- data/lib/review/{i18n.yaml → i18n.yml} +4 -2
- data/lib/review/idgxmlbuilder.rb +65 -39
- data/lib/review/latexbuilder.rb +72 -24
- data/lib/review/latexutils.rb +3 -1
- data/lib/review/makerhelper.rb +8 -2
- data/lib/review/preprocessor.rb +20 -20
- data/lib/review/review.tex.erb +4 -0
- data/lib/review/sec_counter.rb +9 -11
- data/lib/review/tocparser.rb +2 -2
- data/lib/review/tocprinter.rb +12 -12
- data/lib/review/topbuilder.rb +15 -15
- data/lib/review/version.rb +1 -1
- data/lib/uuid.rb +7 -7
- data/review.gemspec +2 -2
- data/rubocop-todo.yml +443 -0
- data/test/sample-book/src/config.yml +2 -2
- data/test/sample-book/src/{main.css → style.css} +0 -0
- data/test/test_book.rb +46 -48
- data/test/test_book_chapter.rb +25 -13
- data/test/test_builder.rb +3 -3
- data/test/test_catalog.rb +107 -0
- data/test/test_epubmaker.rb +6 -6
- data/test/test_htmlbuilder.rb +160 -39
- data/test/test_htmlutils.rb +22 -0
- data/test/test_i18n.rb +2 -2
- data/test/test_idgxmlbuilder.rb +33 -47
- data/test/test_image_finder.rb +82 -0
- data/test/test_inaobuilder.rb +1 -1
- data/test/test_latexbuilder.rb +35 -39
- data/test/test_lineinput.rb +2 -2
- data/test/test_markdownbuilder.rb +2 -2
- data/test/test_topbuilder.rb +39 -23
- metadata +23 -14
- data/bin/review-epubmaker-ng +0 -23
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-2014 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -12,7 +12,7 @@
|
|
12
12
|
require 'epubmaker/epubv2'
|
13
13
|
|
14
14
|
module EPUBMaker
|
15
|
-
|
15
|
+
|
16
16
|
# EPUBv3 is EPUB version 3 producer.
|
17
17
|
class EPUBv3 < EPUBv2
|
18
18
|
def opf_guide
|
@@ -124,10 +124,14 @@ EOT
|
|
124
124
|
end
|
125
125
|
end
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
@producer.contents.each do |item|
|
129
129
|
next if item.file =~ /#/ || item.id.nil? # skip subgroup, or id=nil (for cover)
|
130
|
-
|
130
|
+
propstr = ""
|
131
|
+
if item.properties.size > 0
|
132
|
+
propstr = %Q[ properties="#{item.properties.sort.uniq.join(" ")}"]
|
133
|
+
end
|
134
|
+
s << %Q[ <item#{mathstr} id="#{item.id}" href="#{item.file}" media-type="#{item.media}"#{propstr}/>\n]
|
131
135
|
end
|
132
136
|
s << %Q[ </manifest>\n]
|
133
137
|
|
@@ -139,7 +143,7 @@ EOT
|
|
139
143
|
s << %Q[ <spine>\n]
|
140
144
|
s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="no"/>\n]
|
141
145
|
# s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n]
|
142
|
-
|
146
|
+
|
143
147
|
@producer.contents.each do |item|
|
144
148
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
145
149
|
s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
|
@@ -187,7 +191,7 @@ EOT
|
|
187
191
|
end
|
188
192
|
end
|
189
193
|
end
|
190
|
-
|
194
|
+
|
191
195
|
s << <<EOT
|
192
196
|
<item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
|
193
197
|
EOT
|
@@ -198,16 +202,17 @@ EOT
|
|
198
202
|
s =<<EOT
|
199
203
|
<?xml version="1.0" encoding="UTF-8"?>
|
200
204
|
<!DOCTYPE html>
|
201
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/
|
205
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/epub" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
|
202
206
|
<head>
|
203
207
|
<meta charset="UTF-8" />
|
204
|
-
<meta name="generator" content="
|
208
|
+
<meta name="generator" content="Re:VIEW" />
|
205
209
|
EOT
|
206
|
-
|
210
|
+
|
207
211
|
@producer.params["stylesheet"].each do |file|
|
208
212
|
s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
|
209
213
|
end
|
210
214
|
s
|
211
215
|
end
|
216
|
+
|
212
217
|
end
|
213
218
|
end
|
data/lib/epubmaker/producer.rb
CHANGED
@@ -26,19 +26,19 @@ module EPUBMaker
|
|
26
26
|
attr_accessor :params
|
27
27
|
# Message resource object.
|
28
28
|
attr_accessor :res
|
29
|
-
|
29
|
+
|
30
30
|
# Take YAML +file+ and return parameter hash.
|
31
31
|
def Producer.load(file)
|
32
32
|
raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
|
33
33
|
return YAML.load_file(file)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
# Take YAML +file+ and update parameter hash.
|
37
37
|
def load(file)
|
38
38
|
raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
|
39
39
|
merge_params(@params.merge(YAML.load_file(file)))
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
# Construct producer object.
|
43
43
|
# +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#merge_params.
|
44
44
|
# +version+ takes EPUB version (default is 2).
|
@@ -47,18 +47,18 @@ module EPUBMaker
|
|
47
47
|
@params = {}
|
48
48
|
@epub = nil
|
49
49
|
@params["epubversion"] = version unless version.nil?
|
50
|
-
|
50
|
+
|
51
51
|
unless params.nil?
|
52
52
|
merge_params(params)
|
53
53
|
end
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
# Update parameters by merging from new parameter hash +params+.
|
57
57
|
def merge_params(params)
|
58
58
|
@params = @params.merge(params)
|
59
59
|
complement
|
60
60
|
@res = EPUBMaker::Resource.new(@params)
|
61
|
-
|
61
|
+
|
62
62
|
unless @params["epubversion"].nil?
|
63
63
|
case @params["epubversion"].to_i
|
64
64
|
when 2
|
@@ -69,33 +69,34 @@ module EPUBMaker
|
|
69
69
|
raise "Invalid EPUB version (#{@params["epubversion"]}.)"
|
70
70
|
end
|
71
71
|
end
|
72
|
+
support_legacy_maker
|
72
73
|
end
|
73
|
-
|
74
|
+
|
74
75
|
# Write mimetype file to IO object +wobj+.
|
75
76
|
def mimetype(wobj)
|
76
77
|
s = @epub.mimetype
|
77
78
|
wobj.print s if !s.nil? && !wobj.nil?
|
78
79
|
end
|
79
|
-
|
80
|
+
|
80
81
|
# Write opf file to IO object +wobj+.
|
81
82
|
def opf(wobj)
|
82
83
|
s = @epub.opf
|
83
84
|
wobj.puts s if !s.nil? && !wobj.nil?
|
84
85
|
end
|
85
|
-
|
86
|
+
|
86
87
|
# Write ncx file to IO object +wobj+. +indentarray+ defines prefix
|
87
88
|
# string for each level.
|
88
89
|
def ncx(wobj, indentarray=[])
|
89
90
|
s = @epub.ncx(indentarray)
|
90
91
|
wobj.puts s if !s.nil? && !wobj.nil?
|
91
92
|
end
|
92
|
-
|
93
|
+
|
93
94
|
# Write container file to IO object +wobj+.
|
94
95
|
def container(wobj)
|
95
96
|
s = @epub.container
|
96
97
|
wobj.puts s if !s.nil? && !wobj.nil?
|
97
98
|
end
|
98
|
-
|
99
|
+
|
99
100
|
# Write cover file to IO object +wobj+.
|
100
101
|
# If Producer#params["coverimage"] is defined, it will be used for
|
101
102
|
# the cover image.
|
@@ -103,19 +104,19 @@ module EPUBMaker
|
|
103
104
|
s = @epub.cover
|
104
105
|
wobj.puts s if !s.nil? && !wobj.nil?
|
105
106
|
end
|
106
|
-
|
107
|
+
|
107
108
|
# Write title file (copying) to IO object +wobj+.
|
108
109
|
def titlepage(wobj)
|
109
110
|
s = @epub.titlepage
|
110
111
|
wobj.puts s if !s.nil? && !wobj.nil?
|
111
112
|
end
|
112
|
-
|
113
|
+
|
113
114
|
# Write colophon file to IO object +wobj+.
|
114
115
|
def colophon(wobj)
|
115
116
|
s = @epub.colophon
|
116
117
|
wobj.puts s if !s.nil? && !wobj.nil?
|
117
118
|
end
|
118
|
-
|
119
|
+
|
119
120
|
# Write own toc file to IO object +wobj+.
|
120
121
|
def mytoc(wobj)
|
121
122
|
s = @epub.mytoc
|
@@ -143,34 +144,38 @@ module EPUBMaker
|
|
143
144
|
end
|
144
145
|
end
|
145
146
|
|
146
|
-
|
147
|
-
|
147
|
+
alias_method :importImageInfo, :import_imageinfo
|
148
|
+
|
148
149
|
# Produce EPUB file +epubfile+.
|
149
150
|
# +basedir+ points the directory has contents (default: current directory.)
|
150
151
|
# +tmpdir+ defines temporary directory.
|
151
152
|
def produce(epubfile, basedir=nil, tmpdir=nil)
|
152
153
|
current = Dir.pwd
|
153
154
|
basedir = current if basedir.nil?
|
154
|
-
|
155
|
+
|
155
156
|
_tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
|
156
157
|
epubfile = "#{current}/#{epubfile}" if epubfile !~ /\A\// # /
|
157
|
-
|
158
|
+
|
158
159
|
# FIXME: error check
|
159
160
|
File.unlink(epubfile) if File.exist?(epubfile)
|
160
|
-
|
161
|
+
|
161
162
|
begin
|
162
163
|
@epub.produce(epubfile, basedir, _tmpdir)
|
163
164
|
ensure
|
164
165
|
FileUtils.rm_r(_tmpdir) if tmpdir.nil?
|
165
166
|
end
|
166
167
|
end
|
167
|
-
|
168
|
+
|
168
169
|
def call_hook(filename, *params)
|
169
170
|
if !filename.nil? && File.exist?(filename) && FileTest.executable?(filename)
|
170
|
-
|
171
|
+
if ENV["REVIEW_SAFE_MODE"].to_i & 1 > 0
|
172
|
+
warn "hook is prohibited in safe mode. ignored."
|
173
|
+
else
|
174
|
+
system(filename, *params)
|
175
|
+
end
|
171
176
|
end
|
172
177
|
end
|
173
|
-
|
178
|
+
|
174
179
|
private
|
175
180
|
|
176
181
|
# Complement parameters.
|
@@ -192,10 +197,10 @@ module EPUBMaker
|
|
192
197
|
"htmlversion" => 4,
|
193
198
|
"secnolevel" => 2,
|
194
199
|
"pre_secnolevel" => 0,
|
195
|
-
"post_secnolevel" =>
|
200
|
+
"post_secnolevel" => 1,
|
196
201
|
"part_secnolevel" => 1,
|
197
202
|
"titlepage" => nil,
|
198
|
-
"
|
203
|
+
"titlefile" => nil,
|
199
204
|
"originaltitlefile" => nil,
|
200
205
|
"profile" => nil,
|
201
206
|
"colophon" => nil,
|
@@ -212,6 +217,8 @@ module EPUBMaker
|
|
212
217
|
"fontdir" => "fonts",
|
213
218
|
"image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
|
214
219
|
"font_ext" => %w(ttf woff otf),
|
220
|
+
"verify_target_images" => nil,
|
221
|
+
"force_include_images" => [],
|
215
222
|
}
|
216
223
|
|
217
224
|
defaults.each_pair do |k, v|
|
@@ -219,16 +226,50 @@ module EPUBMaker
|
|
219
226
|
end
|
220
227
|
|
221
228
|
@params["htmlversion"] == 5 if @params["epubversion"] >= 3
|
222
|
-
|
229
|
+
|
223
230
|
%w[bookname title].each do |k|
|
224
231
|
raise "Key #{k} must have a value. Abort." if @params[k].nil?
|
225
232
|
end
|
226
233
|
# array
|
227
|
-
%w[subject aut a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl adp ann arr art asn aut aqt aft aui ant bkp clb cmm dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl stylesheet].each do |item|
|
234
|
+
%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 rights].each do |item|
|
228
235
|
@params[item] = [@params[item]] if !@params[item].nil? && @params[item].instance_of?(String)
|
229
236
|
end
|
230
237
|
# optional
|
231
|
-
# type, format, identifier, source, relation, coverpage,
|
238
|
+
# type, format, identifier, source, relation, coverpage, aut
|
239
|
+
end
|
240
|
+
|
241
|
+
def support_legacy_maker
|
242
|
+
# legacy review-epubmaker support
|
243
|
+
if @params["flag_legacy_coverfile"].nil? && !@params["coverfile"].nil? && File.exist?(@params["coverfile"])
|
244
|
+
@params["cover"] = "#{@params["bookname"]}-cover.#{@params["htmlext"]}"
|
245
|
+
@epub.legacy_cover_and_title_file(@params["coverfile"], @params["cover"])
|
246
|
+
@params["flag_legacy_coverfile"] = true
|
247
|
+
warn "Parameter 'coverfile' is obsolete. Please use 'cover' and make complete html file with header and footer."
|
248
|
+
end
|
249
|
+
|
250
|
+
if @params["flag_legacy_titlepagefile"].nil? && !@params["titlepagefile"].nil? && File.exist?(@params["titlepagefile"])
|
251
|
+
@params["titlefile"] = "#{@params["bookname"]}-title.#{@params["htmlext"]}"
|
252
|
+
@params["titlepage"] = true
|
253
|
+
@epub.legacy_cover_and_title_file(@params["titlepagefile"], @params["titlefile"])
|
254
|
+
@params["flag_legacy_titlepagefile"] = true
|
255
|
+
warn "Parameter 'titlepagefile' is obsolete. Please use 'titlefile' and make complete html file with header and footer."
|
256
|
+
end
|
257
|
+
|
258
|
+
if @params["flag_legacy_backcoverfile"].nil? && !@params["backcoverfile"].nil? && File.exist?(@params["backcoverfile"])
|
259
|
+
@params["backcover"] = "#{@params["bookname"]}-backcover.#{@params["htmlext"]}"
|
260
|
+
@epub.legacy_cover_and_title_file(@params["backcoverfile"], @params["backcover"])
|
261
|
+
@params["flag_legacy_backcoverfile"] = true
|
262
|
+
warn "Parameter 'backcoverfile' is obsolete. Please use 'backcover' and make complete html file with header and footer."
|
263
|
+
end
|
264
|
+
|
265
|
+
if @params["flag_legacy_pubhistory"].nil? && !@params["pubhistory"].nil?
|
266
|
+
@params["history"] = [[]]
|
267
|
+
@params["pubhistory"].split("\n").each do |date|
|
268
|
+
@params["history"][0].push(date.sub(/(\d+)年(\d+)月(\d+)日/, '\1-\2-\3'))
|
269
|
+
end
|
270
|
+
@params["flag_legacy_pubhistory"] = true
|
271
|
+
warn "Parameter 'pubhistory' is obsolete. Please use 'history' array."
|
272
|
+
end
|
232
273
|
end
|
233
274
|
end
|
234
275
|
end
|
data/lib/epubmaker/resource.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = resource.rb -- Message resources for EPUBMaker.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010-
|
4
|
+
# Copyright (c) 2010-2014 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -44,6 +44,7 @@ module EPUBMaker
|
|
44
44
|
"colophontitle" => "Colophon",
|
45
45
|
"profiletitle" => "Profile",
|
46
46
|
"advtitle" => "Advertisement",
|
47
|
+
"backcovertitle" => "Back Cover",
|
47
48
|
"c-aut" => "Author",
|
48
49
|
"c-csl" => "Consultant",
|
49
50
|
"c-dsr" => "Designer",
|
@@ -66,6 +67,7 @@ module EPUBMaker
|
|
66
67
|
"colophontitle" => "奥付",
|
67
68
|
"advtitle" => "広告",
|
68
69
|
"profiletitle" => "著者紹介",
|
70
|
+
"backcovertitle" => "裏表紙",
|
69
71
|
"c-aut" => "著 者",
|
70
72
|
"c-csl" => "監 修",
|
71
73
|
"c-dsr" => "デザイン",
|
data/lib/lineinput.rb
CHANGED
@@ -113,7 +113,7 @@ class LineInput
|
|
113
113
|
buf
|
114
114
|
end
|
115
115
|
|
116
|
-
|
116
|
+
alias_method :span, :getlines_while # from Haskell
|
117
117
|
|
118
118
|
def until_match(re)
|
119
119
|
while line = gets()
|
@@ -134,7 +134,7 @@ class LineInput
|
|
134
134
|
buf
|
135
135
|
end
|
136
136
|
|
137
|
-
|
137
|
+
alias_method :break, :getlines_until # from Haskell
|
138
138
|
|
139
139
|
def until_terminator(re)
|
140
140
|
while line = gets()
|
data/lib/review/book/base.rb
CHANGED
@@ -9,23 +9,24 @@
|
|
9
9
|
# the GNU LGPL, Lesser General Public License version 2.1.
|
10
10
|
# For details of the GNU LGPL, see the file "COPYING".
|
11
11
|
#
|
12
|
+
require 'review/configure'
|
13
|
+
require 'review/catalog'
|
14
|
+
|
12
15
|
module ReVIEW
|
13
16
|
module Book
|
14
17
|
class Base
|
15
18
|
|
16
|
-
|
19
|
+
attr_writer :config
|
17
20
|
|
18
21
|
def self.load_default
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
22
|
+
basedir = "."
|
23
|
+
if File.file?("#{basedir}/CHAPS") ||
|
24
|
+
File.file?("#{basedir}/catalog.yml")
|
25
|
+
book = load(basedir)
|
26
|
+
book
|
27
|
+
else
|
28
|
+
new(basedir)
|
27
29
|
end
|
28
|
-
new('.')
|
29
30
|
end
|
30
31
|
|
31
32
|
def self.load(dir)
|
@@ -37,11 +38,12 @@ module ReVIEW
|
|
37
38
|
|
38
39
|
def self.update_rubyenv(dir)
|
39
40
|
return if @basedir_seen.key?(dir)
|
40
|
-
if File.directory?("#{dir}/lib/review")
|
41
|
-
$LOAD_PATH.unshift "#{dir}/lib"
|
42
|
-
end
|
43
41
|
if File.file?("#{dir}/review-ext.rb")
|
44
|
-
|
42
|
+
if ENV["REVIEW_SAFE_MODE"].to_i & 2 > 0
|
43
|
+
warn "review-ext.rb is prohibited in safe mode. ignored."
|
44
|
+
else
|
45
|
+
Kernel.load File.expand_path("#{dir}/review-ext.rb")
|
46
|
+
end
|
45
47
|
end
|
46
48
|
@basedir_seen[dir] = true
|
47
49
|
end
|
@@ -93,37 +95,113 @@ module ReVIEW
|
|
93
95
|
chapters.each(&block)
|
94
96
|
end
|
95
97
|
|
98
|
+
def each_chapter_r(&block)
|
99
|
+
chapters.reverse.each(&block)
|
100
|
+
end
|
101
|
+
|
96
102
|
def chapter_index
|
97
|
-
@chapter_index
|
98
|
-
|
103
|
+
return @chapter_index if @chapter_index
|
104
|
+
|
105
|
+
contents = chapters()
|
106
|
+
parts().each do |prt|
|
107
|
+
if prt.id.present?
|
108
|
+
contents << prt
|
109
|
+
end
|
110
|
+
end
|
111
|
+
@chapter_index = ChapterIndex.new(contents)
|
99
112
|
end
|
100
113
|
|
101
114
|
def chapter(id)
|
102
115
|
chapter_index()[id]
|
103
116
|
end
|
104
117
|
|
118
|
+
def next_chapter(chapter)
|
119
|
+
finded = false
|
120
|
+
each_chapter do |c|
|
121
|
+
return c if finded
|
122
|
+
finded = true if c == chapter
|
123
|
+
end
|
124
|
+
nil # not found
|
125
|
+
end
|
126
|
+
|
127
|
+
def prev_chapter(chapter)
|
128
|
+
finded = false
|
129
|
+
each_chapter_r do |c|
|
130
|
+
return c if finded
|
131
|
+
finded = true if c == chapter
|
132
|
+
end
|
133
|
+
nil # not found
|
134
|
+
end
|
135
|
+
|
105
136
|
def volume
|
106
137
|
Volume.sum(chapters.map {|chap| chap.volume })
|
107
138
|
end
|
108
139
|
|
140
|
+
def config
|
141
|
+
@config ||= Configure.values
|
142
|
+
end
|
143
|
+
|
144
|
+
# backword compatible
|
145
|
+
def param=(param)
|
146
|
+
@config = param
|
147
|
+
end
|
148
|
+
|
149
|
+
# backword compatible
|
150
|
+
def param
|
151
|
+
@config
|
152
|
+
end
|
153
|
+
|
154
|
+
def catalog
|
155
|
+
return @catalog if @catalog.present?
|
156
|
+
|
157
|
+
catalogfile_path = "#{basedir}/#{config["catalogfile"]}"
|
158
|
+
if File.exist? catalogfile_path
|
159
|
+
@catalog = Catalog.new(File.open catalogfile_path)
|
160
|
+
end
|
161
|
+
|
162
|
+
@catalog
|
163
|
+
end
|
164
|
+
|
109
165
|
def read_CHAPS
|
110
|
-
|
166
|
+
if catalog
|
167
|
+
catalog.chaps
|
168
|
+
else
|
169
|
+
read_FILE(chapter_file)
|
170
|
+
end
|
111
171
|
end
|
112
172
|
|
113
173
|
def read_PREDEF
|
114
|
-
|
174
|
+
if catalog
|
175
|
+
catalog.predef
|
176
|
+
else
|
177
|
+
read_FILE(predef_file)
|
178
|
+
end
|
115
179
|
end
|
116
180
|
|
117
181
|
def read_POSTDEF
|
118
|
-
|
182
|
+
if catalog
|
183
|
+
catalog.postdef
|
184
|
+
else
|
185
|
+
read_FILE(postdef_file)
|
186
|
+
end
|
119
187
|
end
|
120
188
|
|
121
189
|
def read_PART
|
122
|
-
@read_PART
|
190
|
+
return @read_PART if @read_PART
|
191
|
+
|
192
|
+
if catalog
|
193
|
+
@read_PART = catalog.parts
|
194
|
+
else
|
195
|
+
@read_PART = File.read("#{@basedir}/#{part_file}")
|
196
|
+
end
|
123
197
|
end
|
124
198
|
|
125
199
|
def part_exist?
|
126
|
-
|
200
|
+
if catalog
|
201
|
+
catalog.parts.present?
|
202
|
+
else
|
203
|
+
File.exist?("#{@basedir}/#{part_file}")
|
204
|
+
end
|
127
205
|
end
|
128
206
|
|
129
207
|
def read_bib
|
@@ -135,6 +213,10 @@ module ReVIEW
|
|
135
213
|
end
|
136
214
|
|
137
215
|
def prefaces
|
216
|
+
if catalog
|
217
|
+
return mkpart_from_namelist(catalog.predef.split("\n"))
|
218
|
+
end
|
219
|
+
|
138
220
|
if File.file?("#{@basedir}/#{predef_file}")
|
139
221
|
begin
|
140
222
|
return mkpart_from_namelistfile("#{@basedir}/#{predef_file}")
|
@@ -147,6 +229,10 @@ module ReVIEW
|
|
147
229
|
end
|
148
230
|
|
149
231
|
def postscripts
|
232
|
+
if catalog
|
233
|
+
return mkpart_from_namelist(catalog.postdef.split("\n"))
|
234
|
+
end
|
235
|
+
|
150
236
|
if File.file?("#{@basedir}/#{postdef_file}")
|
151
237
|
begin
|
152
238
|
return mkpart_from_namelistfile("#{@basedir}/#{postdef_file}")
|
@@ -178,6 +264,21 @@ module ReVIEW
|
|
178
264
|
def parse_chapters
|
179
265
|
part = 0
|
180
266
|
num = 0
|
267
|
+
|
268
|
+
if catalog
|
269
|
+
return catalog.parts_with_chaps.map do |entry|
|
270
|
+
if entry.is_a? Hash
|
271
|
+
chaps = entry.values.first.map do |chap|
|
272
|
+
Chapter.new(self, (num += 1), chap, "#{@basedir}/#{chap}")
|
273
|
+
end
|
274
|
+
Part.new(self, (part += 1), chaps, read_PART.split("\n")[part - 1])
|
275
|
+
else
|
276
|
+
chap = Chapter.new(self, (num += 1), entry, "#{@basedir}/#{entry}")
|
277
|
+
Part.new(self, nil, [chap])
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
181
282
|
chap = read_CHAPS()\
|
182
283
|
.strip.lines.map {|line| line.strip }.join("\n").split(/\n{2,}/)\
|
183
284
|
.map {|part_chunk|
|
@@ -221,15 +322,15 @@ module ReVIEW
|
|
221
322
|
Chapter.new(self, number, name, path)
|
222
323
|
end
|
223
324
|
|
224
|
-
def mkchap_ifexist(
|
225
|
-
name
|
325
|
+
def mkchap_ifexist(name)
|
326
|
+
name += ext if File.extname(name) == ""
|
226
327
|
path = "#{@basedir}/#{name}"
|
227
328
|
File.file?(path) ? Chapter.new(self, nil, name, path) : nil
|
228
329
|
end
|
229
330
|
|
230
331
|
def read_FILE(filename)
|
231
332
|
res = ""
|
232
|
-
File.open("#{@basedir}/#{
|
333
|
+
File.open("#{@basedir}/#{filename}") do |f|
|
233
334
|
while line = f.gets
|
234
335
|
line.sub!(/\A\xEF\xBB\xBF/u, '') # remove BOM
|
235
336
|
if /\A#/ =~ line
|