Class: ReVIEW::Book::Base

Inherits:
Object show all
Defined in:
lib/review/book/base.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(basedir = '.') ⇒ Base

Returns a new instance of Base.



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/review/book/base.rb', line 25

def initialize(basedir = '.')
  @basedir = basedir
  @logger = ReVIEW.logger
  @parts = nil
  @chapter_index = nil
  @config = ReVIEW::Configure.values
  @catalog = nil
  @read_part = nil
  @warn_old_files = {} # XXX for checking CHAPS, PREDEF, POSTDEF
  @basedir_seen = {}
  update_rubyenv
end

Instance Attribute Details

#basedirObject (readonly)

Returns the value of attribute basedir.



19
20
21
# File 'lib/review/book/base.rb', line 19

def basedir
  @basedir
end

#catalogObject



188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/review/book/base.rb', line 188

def catalog
  return @catalog if @catalog.present?

  catalogfile_path = filename_join(@basedir, config['catalogfile'])
  if File.file? catalogfile_path
    @catalog = File.open(catalogfile_path, 'r:BOM|utf-8') { |f| Catalog.new(f) }
  end
  if @catalog
    @catalog.validate!(@config, basedir)
  end
  @catalog
end

#configObject

Returns the value of attribute config.



16
17
18
# File 'lib/review/book/base.rb', line 16

def config
  @config
end

#partsObject



98
99
100
# File 'lib/review/book/base.rb', line 98

def parts
  @parts ||= read_parts
end

Class Method Details

.load(dir = '.') ⇒ Object



21
22
23
# File 'lib/review/book/base.rb', line 21

def self.load(dir = '.')
  new(dir)
end

Instance Method Details

#appendixObject



274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/review/book/base.rb', line 274

def appendix
  if catalog
    names = catalog.appendix.split("\n")
    chaps = names.each_with_index.map { |n, idx| mkchap_ifexist(n, idx) }.compact
    return mkpart(chaps)
  end

  begin
    postdef_file = filename_join(@basedir, config['postdef_file'])
    if File.file?(postdef_file)
      mkpart_from_namelistfile(postdef_file)
    end
  rescue FileNotFound => err
    raise FileNotFound, "postscript #{err.message}"
  end
end

#bib_exist?Boolean

Returns:

  • (Boolean)


255
256
257
# File 'lib/review/book/base.rb', line 255

def bib_exist?
  File.exist?(File.join(contentdir, bib_file))
end

#bib_fileObject



48
49
50
# File 'lib/review/book/base.rb', line 48

def bib_file
  config['bib_file']
end

#chapter(id) ⇒ Object



151
152
153
# File 'lib/review/book/base.rb', line 151

def chapter(id)
  chapter_index[id]
end

#chapter_indexObject



138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/review/book/base.rb', line 138

def chapter_index
  return @chapter_index if @chapter_index

  contents = chapters
  # TODO: contents += parts.find_all { |prt| prt.id.present? }
  parts.each do |prt|
    if prt.id.present?
      contents << prt
    end
  end
  @chapter_index = ChapterIndex.new(contents)
end

#chaptersObject



126
127
128
# File 'lib/review/book/base.rb', line 126

def chapters
  parts.map(&:chapters).flatten
end

#contentdirObject



72
73
74
75
76
77
78
# File 'lib/review/book/base.rb', line 72

def contentdir
  if !config['contentdir'].present? || config['contentdir'] == '.'
    @basedir
  else
    File.join(@basedir, config['contentdir'])
  end
end

#contentsObject



117
118
119
120
121
122
123
124
# File 'lib/review/book/base.rb', line 117

def contents
  # TODO: includes predef, appendix, postdef
  if parts.present?
    chapters + parts
  else
    chapters
  end
end

#each_chapter(&block) ⇒ Object



130
131
132
# File 'lib/review/book/base.rb', line 130

def each_chapter(&block)
  chapters.each(&block)
end

#each_chapter_r(&block) ⇒ Object



134
135
136
# File 'lib/review/book/base.rb', line 134

def each_chapter_r(&block)
  chapters.reverse_each(&block)
end

#each_part(&block) ⇒ Object



113
114
115
# File 'lib/review/book/base.rb', line 113

def each_part(&block)
  parts.each(&block)
end

#extObject



56
57
58
# File 'lib/review/book/base.rb', line 56

def ext
  config['ext']
end

#htmlversionObject



90
91
92
93
94
95
96
# File 'lib/review/book/base.rb', line 90

def htmlversion
  if config['htmlversion'].blank?
    nil
  else
    config['htmlversion'].to_i
  end
end

#image_typesObject



64
65
66
# File 'lib/review/book/base.rb', line 64

def image_types
  config['image_types']
end

#image_types=(types) ⇒ Object



68
69
70
# File 'lib/review/book/base.rb', line 68

def image_types=(types)
  config['image_types'] = types
end

#imagedirObject



60
61
62
# File 'lib/review/book/base.rb', line 60

def imagedir
  File.join(@basedir, config['imagedir'])
end

#load_config(filename) ⇒ Object



183
184
185
186
# File 'lib/review/book/base.rb', line 183

def load_config(filename)
  new_conf = YAML.load_file(filename)
  @config.merge!(new_conf)
end

#next_chapter(chapter) ⇒ Object



155
156
157
158
159
160
161
162
163
164
# File 'lib/review/book/base.rb', line 155

def next_chapter(chapter)
  finded = false
  each_chapter do |c|
    return c if finded
    if c == chapter
      finded = true
    end
  end
  nil # not found
end

#page_metricObject



80
81
82
83
84
85
86
87
88
# File 'lib/review/book/base.rb', line 80

def page_metric
  if config['page_metric'].respond_to?(:downcase) && config['page_metric'].upcase =~ /\A[A-Z0-9_]+\Z/
    ReVIEW::Book::PageMetric.const_get(config['page_metric'].upcase)
  elsif config['page_metric'].is_a?(Array) && config['page_metric'].size == 5
    ReVIEW::Book::PageMetric.new(*config['page_metric'])
  else
    config['page_metric']
  end
end

#part(n) ⇒ Object



109
110
111
# File 'lib/review/book/base.rb', line 109

def part(n)
  parts.detect { |part| part.number == n }
end

#part_exist?Boolean

Returns:

  • (Boolean)


243
244
245
246
247
248
249
# File 'lib/review/book/base.rb', line 243

def part_exist?
  if catalog
    catalog.parts.present?
  else
    File.exist?(File.join(@basedir, config['part_file']))
  end
end

#parts_in_fileObject



102
103
104
105
106
107
# File 'lib/review/book/base.rb', line 102

def parts_in_file
  # TODO: should be `parts.find_all{|part| part.present? and part.file?}` ?
  parts.find_all do |part|
    part if part.present? and part.file?
  end
end

#postscriptsObject



291
292
293
294
295
# File 'lib/review/book/base.rb', line 291

def postscripts
  if catalog
    mkpart_from_namelist(catalog.postdef.split("\n"))
  end
end

#prefacesObject



259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'lib/review/book/base.rb', line 259

def prefaces
  if catalog
    return mkpart_from_namelist(catalog.predef.split("\n"))
  end

  begin
    predef_file = filename_join(@basedir, config['predef_file'])
    if File.file?(predef_file)
      mkpart_from_namelistfile(predef_file)
    end
  rescue FileNotFound => err
    raise FileNotFound, "preface #{err.message}"
  end
end

#prev_chapter(chapter) ⇒ Object



166
167
168
169
170
171
172
173
174
175
# File 'lib/review/book/base.rb', line 166

def prev_chapter(chapter)
  finded = false
  each_chapter_r do |c|
    return c if finded
    if c == chapter
      finded = true
    end
  end
  nil # not found
end

#read_appendixObject



217
218
219
220
221
222
223
# File 'lib/review/book/base.rb', line 217

def read_appendix
  if catalog
    catalog.appendix
  else
    read_file(config['postdef_file']) # for backward compatibility
  end
end

#read_bibObject



251
252
253
# File 'lib/review/book/base.rb', line 251

def read_bib
  File.read(File.join(contentdir, bib_file))
end

#read_chapsObject



201
202
203
204
205
206
207
# File 'lib/review/book/base.rb', line 201

def read_chaps
  if catalog
    catalog.chaps
  else
    read_file(config['chapter_file'])
  end
end

#read_partObject



233
234
235
236
237
238
239
240
241
# File 'lib/review/book/base.rb', line 233

def read_part
  return @read_part if @read_part

  if catalog
    @read_part = catalog.parts
  else
    @read_part = File.read(File.join(@basedir, config['part_file']))
  end
end

#read_postdefObject



225
226
227
228
229
230
231
# File 'lib/review/book/base.rb', line 225

def read_postdef
  if catalog
    catalog.postdef
  else
    ''
  end
end

#read_predefObject



209
210
211
212
213
214
215
# File 'lib/review/book/base.rb', line 209

def read_predef
  if catalog
    catalog.predef
  else
    read_file(config['predef_file'])
  end
end

#reject_fileObject



52
53
54
# File 'lib/review/book/base.rb', line 52

def reject_file
  config['reject_file']
end

#update_rubyenvObject



38
39
40
41
42
43
44
45
46
# File 'lib/review/book/base.rb', line 38

def update_rubyenv
  if File.file?(File.join(@basedir, 'review-ext.rb'))
    if ENV['REVIEW_SAFE_MODE'].to_i & 2 > 0
      @logger.warn 'review-ext.rb is prohibited in safe mode. ignored.'
    else
      Kernel.load(File.expand_path(File.join(@basedir, 'review-ext.rb')))
    end
  end
end

#volumeObject



177
178
179
180
181
# File 'lib/review/book/base.rb', line 177

def volume
  vol = Volume.sum(chapters.map(&:volume))
  vol.page_per_kbyte = page_metric.page_per_kbyte
  vol
end