review 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +36 -0
  3. data/.rubocop.yml +1 -0
  4. data/ChangeLog +102 -0
  5. data/README.rdoc +2 -2
  6. data/bin/review-check +18 -16
  7. data/bin/review-compile +49 -42
  8. data/bin/review-epubmaker +23 -993
  9. data/bin/review-epubmaker-legacy +1024 -0
  10. data/bin/review-index +17 -15
  11. data/bin/review-init +39 -9
  12. data/bin/review-pdfmaker +124 -89
  13. data/bin/review-preproc +16 -14
  14. data/bin/review-vol +17 -15
  15. data/debian/docs +1 -1
  16. data/doc/catalog.rdoc +34 -0
  17. data/doc/format.rdoc +16 -2
  18. data/doc/libepubmaker/{config.yaml → config.yml} +63 -19
  19. data/doc/quickstart.rdoc +1 -1
  20. data/doc/{sample.yaml → sample.yml} +0 -0
  21. data/lib/epubmaker.rb +1 -1
  22. data/lib/epubmaker/content.rb +9 -1
  23. data/lib/epubmaker/epubv2.rb +59 -7
  24. data/lib/epubmaker/epubv3.rb +14 -9
  25. data/lib/epubmaker/producer.rb +68 -27
  26. data/lib/epubmaker/resource.rb +3 -1
  27. data/lib/lineinput.rb +2 -2
  28. data/lib/review/book/base.rb +125 -24
  29. data/lib/review/book/chapter.rb +42 -0
  30. data/lib/review/book/compilable.rb +23 -4
  31. data/lib/review/book/image_finder.rb +64 -0
  32. data/lib/review/book/index.rb +64 -50
  33. data/lib/review/book/page_metric.rb +1 -1
  34. data/lib/review/builder.rb +19 -12
  35. data/lib/review/catalog.rb +47 -0
  36. data/lib/review/compiler.rb +3 -2
  37. data/lib/review/configure.rb +5 -3
  38. data/lib/review/epubmaker.rb +130 -46
  39. data/lib/review/ewbbuilder.rb +27 -31
  40. data/lib/review/extentions/string.rb +4 -4
  41. data/lib/review/htmlbuilder.rb +140 -79
  42. data/lib/review/htmllayout.rb +26 -4
  43. data/lib/review/htmlutils.rb +20 -1
  44. data/lib/review/i18n.rb +5 -2
  45. data/lib/review/{i18n.yaml → i18n.yml} +4 -2
  46. data/lib/review/idgxmlbuilder.rb +65 -39
  47. data/lib/review/latexbuilder.rb +72 -24
  48. data/lib/review/latexutils.rb +3 -1
  49. data/lib/review/makerhelper.rb +8 -2
  50. data/lib/review/preprocessor.rb +20 -20
  51. data/lib/review/review.tex.erb +4 -0
  52. data/lib/review/sec_counter.rb +9 -11
  53. data/lib/review/tocparser.rb +2 -2
  54. data/lib/review/tocprinter.rb +12 -12
  55. data/lib/review/topbuilder.rb +15 -15
  56. data/lib/review/version.rb +1 -1
  57. data/lib/uuid.rb +7 -7
  58. data/review.gemspec +2 -2
  59. data/rubocop-todo.yml +443 -0
  60. data/test/sample-book/src/config.yml +2 -2
  61. data/test/sample-book/src/{main.css → style.css} +0 -0
  62. data/test/test_book.rb +46 -48
  63. data/test/test_book_chapter.rb +25 -13
  64. data/test/test_builder.rb +3 -3
  65. data/test/test_catalog.rb +107 -0
  66. data/test/test_epubmaker.rb +6 -6
  67. data/test/test_htmlbuilder.rb +160 -39
  68. data/test/test_htmlutils.rb +22 -0
  69. data/test/test_i18n.rb +2 -2
  70. data/test/test_idgxmlbuilder.rb +33 -47
  71. data/test/test_image_finder.rb +82 -0
  72. data/test/test_inaobuilder.rb +1 -1
  73. data/test/test_latexbuilder.rb +35 -39
  74. data/test/test_lineinput.rb +2 -2
  75. data/test/test_markdownbuilder.rb +2 -2
  76. data/test/test_topbuilder.rb +39 -23
  77. metadata +23 -14
  78. data/bin/review-epubmaker-ng +0 -23
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubv3.rb -- EPUB version 3 producer.
3
3
  #
4
- # Copyright (c) 2010-2013 Kenshi Muto
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
- s << %Q[ <item#{mathstr} id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
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/2011/epub" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
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="EPUBMaker::Producer"/>
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
@@ -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
- alias importImageInfo import_imageinfo
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
- system(filename, *params)
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" => 0,
200
+ "post_secnolevel" => 1,
196
201
  "part_secnolevel" => 1,
197
202
  "titlepage" => nil,
198
- "titlepagefile" => nil,
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, rights, aut
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
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = resource.rb -- Message resources for EPUBMaker.
3
3
  #
4
- # Copyright (c) 2010-2013 Kenshi Muto
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" => "デザイン",
@@ -113,7 +113,7 @@ class LineInput
113
113
  buf
114
114
  end
115
115
 
116
- alias span getlines_while # from Haskell
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
- alias break getlines_until # from Haskell
137
+ alias_method :break, :getlines_until # from Haskell
138
138
 
139
139
  def until_terminator(re)
140
140
  while line = gets()
@@ -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
- attr_accessor :param
19
+ attr_writer :config
17
20
 
18
21
  def self.load_default
19
- %w( . .. ../.. ).each do |basedir|
20
- if File.file?("#{basedir}/CHAPS")
21
- book = load(basedir)
22
- if File.file?("#{basedir}/config.rb")
23
- book.instance_variable_set("@parameters", Parameters.load("#{basedir}/config.rb"))
24
- end
25
- return book
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
- Kernel.load File.expand_path("#{dir}/review-ext.rb")
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 ||= ChapterIndex.new(chapters())
98
- @chapter_index
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
- read_FILE("chapter_file")
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
- read_FILE("predef_file")
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
- read_FILE("postdef_file")
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 ||= File.read("#{@basedir}/#{part_file}")
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
- File.exist?("#{@basedir}/#{part_file}")
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(id)
225
- name = "#{id}#{ext()}"
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}/#{eval(filename)}") do |f|
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