class ReVIEW::Book::Base

Attributes

config[W]

Public Class Methods

clear_rubyenv() click to toggle source
# File lib/review/book/base.rb, line 43
def self.clear_rubyenv
  @basedir_seen = {}
end
load(dir = ".") click to toggle source
# File lib/review/book/base.rb, line 24
def self.load(dir = ".")
  update_rubyenv dir
  new(dir)
end
load_default() click to toggle source
# File lib/review/book/base.rb, line 19
def self.load_default
  warn 'Book::Base.load_default() is obsoleted. Use Book::Base.load().'
  load()
end
new(basedir) click to toggle source
# File lib/review/book/base.rb, line 47
def initialize(basedir)
  @basedir = basedir
  @parts = nil
  @chapter_index = nil
  @config = ReVIEW::Configure.values
  @catalog = nil
  @read_part = nil
end
update_rubyenv(dir) click to toggle source
# File lib/review/book/base.rb, line 31
def self.update_rubyenv(dir)
  return if @basedir_seen.key?(dir)
  if File.file?("#{dir}/review-ext.rb")
    if ENV["REVIEW_SAFE_MODE"].to_i & 2 > 0
      warn "review-ext.rb is prohibited in safe mode. ignored."
    else
      Kernel.load File.expand_path("#{dir}/review-ext.rb")
    end
  end
  @basedir_seen[dir] = true
end

Public Instance Methods

appendix() click to toggle source
# File lib/review/book/base.rb, line 277
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

  if File.file?("#{@basedir}/#{config["postdef_file"]}")
    begin
      return mkpart_from_namelistfile("#{@basedir}/#{config["postdef_file"]}")
    rescue FileNotFound => err
      raise FileNotFound, "postscript #{err.message}"
    end
  end
end
basedir() click to toggle source
# File lib/review/book/base.rb, line 301
def basedir
  @basedir
end
bib_exist?() click to toggle source
# File lib/review/book/base.rb, line 259
def bib_exist?
  File.exist?("#{@basedir}/#{bib_file}")
end
bib_file() click to toggle source
# File lib/review/book/base.rb, line 56
def bib_file
  config["bib_file"]
end
catalog() click to toggle source
# File lib/review/book/base.rb, line 190
def catalog
  return @catalog if @catalog.present?

  catalogfile_path = "#{basedir}/#{config["catalogfile"]}"
  if File.file? catalogfile_path
    @catalog = File.open(catalogfile_path){|f| Catalog.new(f) }
  end

  @catalog
end
catalog=(catalog) click to toggle source
# File lib/review/book/base.rb, line 201
def catalog=(catalog)
  @catalog = catalog
end
chapter(id) click to toggle source
# File lib/review/book/base.rb, line 153
def chapter(id)
  chapter_index()[id]
end
chapter_index() click to toggle source
# File lib/review/book/base.rb, line 141
def chapter_index
  return @chapter_index if @chapter_index

  contents = chapters()
  parts().each do |prt|
    if prt.id.present?
      contents << prt
    end
  end
  @chapter_index = ChapterIndex.new(contents)
end
chapters() click to toggle source
# File lib/review/book/base.rb, line 129
def chapters
  parts().map {|p| p.chapters }.flatten
end
config() click to toggle source
# File lib/review/book/base.rb, line 181
def config
  @config ||= Configure.values
end
contents() click to toggle source
# File lib/review/book/base.rb, line 120
def contents
  # TODO: includes predef, appendix, postdef
  if parts.present?
    chapters + parts
  else
    chapters
  end
end
each_chapter(&block) click to toggle source
# File lib/review/book/base.rb, line 133
def each_chapter(&block)
  chapters.each(&block)
end
each_chapter_r(&block) click to toggle source
# File lib/review/book/base.rb, line 137
def each_chapter_r(&block)
  chapters.reverse_each(&block)
end
each_part(&block) click to toggle source
# File lib/review/book/base.rb, line 116
def each_part(&block)
  parts.each(&block)
end
ext() click to toggle source
# File lib/review/book/base.rb, line 64
def ext
  config["ext"]
end
htmlversion() click to toggle source
# File lib/review/book/base.rb, line 90
def htmlversion
  if config["htmlversion"].blank?
    nil
  else
    config["htmlversion"].to_i
  end
end
image_dir() click to toggle source
# File lib/review/book/base.rb, line 68
def image_dir
  config["image_dir"]
end
image_types() click to toggle source
# File lib/review/book/base.rb, line 72
def image_types
  config["image_types"]
end
image_types=(types) click to toggle source
# File lib/review/book/base.rb, line 76
def image_types=(types)
  config["image_types"] = types
end
load_config(filename) click to toggle source
# File lib/review/book/base.rb, line 185
def load_config(filename)
  new_conf = YAML.load_file(filename)
  @config.merge!(new_conf)
end
next_chapter(chapter) click to toggle source
# File lib/review/book/base.rb, line 157
def next_chapter(chapter)
  finded = false
  each_chapter do |c|
    return c if finded
    finded = true if c == chapter
  end
  nil # not found
end
page_metric() click to toggle source
# File lib/review/book/base.rb, line 80
def page_metric
  if config["page_metric"].respond_to?(:downcase) && config["page_metric"].upcase =~ /^[A-Z0-9_]+$/
    ReVIEW::Book::PageMetric.const_get(config["page_metric"].upcase)
  elsif config["page_metric"].kind_of?(Array) && config["page_metric"].size == 5
    ReVIEW::Book::PageMetric.new(*config["page_metric"])
  else
    config["page_metric"]
  end
end
part(n) click to toggle source
# File lib/review/book/base.rb, line 112
def part(n)
  parts.detect {|part| part.number == n }
end
part_exist?() click to toggle source
# File lib/review/book/base.rb, line 247
def part_exist?
  if catalog
    catalog.parts.present?
  else
    File.exist?("#{@basedir}/#{config["part_file"]}")
  end
end
parts() click to toggle source
# File lib/review/book/base.rb, line 98
def parts
  @parts ||= read_parts()
end
parts=(parts) click to toggle source
# File lib/review/book/base.rb, line 102
def parts=(parts)
  @parts = parts
end
parts_in_file() click to toggle source
# File lib/review/book/base.rb, line 106
def parts_in_file
  parts.find_all{|part|
    part if part.present? and part.file?
  }
end
postscripts() click to toggle source
# File lib/review/book/base.rb, line 295
def postscripts
  if catalog
    mkpart_from_namelist(catalog.postdef.split("\n"))
  end
end
prefaces() click to toggle source
# File lib/review/book/base.rb, line 263
def prefaces
  if catalog
    return mkpart_from_namelist(catalog.predef.split("\n"))
  end

  if File.file?("#{@basedir}/#{config["predef_file"]}")
    begin
      return mkpart_from_namelistfile("#{@basedir}/#{config["predef_file"]}")
    rescue FileNotFound => err
      raise FileNotFound, "preface #{err.message}"
    end
  end
end
prev_chapter(chapter) click to toggle source
# File lib/review/book/base.rb, line 166
def prev_chapter(chapter)
  finded = false
  each_chapter_r do |c|
    return c if finded
    finded = true if c == chapter
  end
  nil # not found
end
read_APPENDIX() click to toggle source
# File lib/review/book/base.rb, line 221
def read_APPENDIX
  if catalog
    catalog.appendix
  else
    read_FILE(config["postdef_file"]) # for backward compatibility
  end
end
read_CHAPS() click to toggle source
# File lib/review/book/base.rb, line 205
def read_CHAPS
  if catalog
    catalog.chaps
  else
    read_FILE(config["chapter_file"])
  end
end
read_PART() click to toggle source
# File lib/review/book/base.rb, line 237
def read_PART
  return @read_part if @read_part

  if catalog
    @read_part = catalog.parts
  else
    @read_part = File.read("#{@basedir}/#{config["part_file"]}")
  end
end
read_POSTDEF() click to toggle source
# File lib/review/book/base.rb, line 229
def read_POSTDEF
  if catalog
    catalog.postdef
  else
    ""
  end
end
read_PREDEF() click to toggle source
# File lib/review/book/base.rb, line 213
def read_PREDEF
  if catalog
    catalog.predef
  else
    read_FILE(config["predef_file"])
  end
end
read_bib() click to toggle source
# File lib/review/book/base.rb, line 255
def read_bib
  File.read("#{@basedir}/#{bib_file}")
end
reject_file() click to toggle source
# File lib/review/book/base.rb, line 60
def reject_file
  config["reject_file"]
end
volume() click to toggle source
# File lib/review/book/base.rb, line 175
def volume
  vol = Volume.sum(chapters.map {|chap| chap.volume })
  vol.page_per_kbyte = page_metric.page_per_kbyte
  vol
end

Private Instance Methods

mkchap(name, number = nil) click to toggle source
# File lib/review/book/base.rb, line 382
def mkchap(name, number = nil)
  name += ext if File.extname(name) == ""
  path = "#{@basedir}/#{name}"
  raise FileNotFound, "file not exist: #{path}" unless File.file?(path)
  Chapter.new(self, number, name, path)
end
mkchap_ifexist(name, idx = nil) click to toggle source
# File lib/review/book/base.rb, line 389
def mkchap_ifexist(name, idx = nil)
  name += ext if File.extname(name) == ""
  path = "#{@basedir}/#{name}"
  if File.file?(path)
    idx += 1 if idx
    Chapter.new(self, idx, name, path)
  end
end
mkpart(chaps) click to toggle source
# File lib/review/book/base.rb, line 378
def mkpart(chaps)
  chaps.empty? ? nil : Part.new(self, nil, chaps)
end
mkpart_from_namelist(names) click to toggle source
# File lib/review/book/base.rb, line 374
def mkpart_from_namelist(names)
  mkpart(names.map {|n| mkchap_ifexist(n) }.compact)
end
mkpart_from_namelistfile(path) click to toggle source
# File lib/review/book/base.rb, line 362
def mkpart_from_namelistfile(path)
  chaps = []
  File.read(path, :mode => 'r:BOM|utf-8').split.each_with_index do |name, idx|
    if path =~ /PREDEF/
      chaps << mkchap(name)
    else
      chaps << mkchap(name, idx + 1)
    end
  end
  mkpart(chaps)
end
parse_chapters() click to toggle source

return Array of Part, not Chapter

# File lib/review/book/base.rb, line 323
def parse_chapters
  part = 0
  num = 0

  if catalog
    return catalog.parts_with_chaps.map do |entry|
      if entry.is_a? Hash
        chaps = entry.values.first.map do |chap|
          chap = Chapter.new(self, (num += 1), chap, "#{@basedir}/#{chap}")
          chap
        end
        Part.new(self, (part += 1), chaps, read_PART.split("\n")[part - 1])
      else
        chap = Chapter.new(self, (num += 1), entry, "#{@basedir}/#{entry}")
        if chap.number
          num = chap.number
        else
          num -= 1
        end
        Part.new(self, nil, [chap])
      end
    end
  end

  chap = read_CHAPS()                .strip.lines.map {|line| line.strip }.join("\n").split(/\n{2,}/)                .map {|part_chunk|
    chaps = part_chunk.split.map {|chapid|
      Chapter.new(self, (num += 1), chapid, "#{@basedir}/#{chapid}")
    }
    if part_exist? && read_PART.split("\n").size > part
      Part.new(self, (part += 1), chaps, read_PART.split("\n")[part-1])
    else
      Part.new(self, nil, chaps)
    end
  }
  return chap
end
read_FILE(filename) click to toggle source
# File lib/review/book/base.rb, line 398
def read_FILE(filename)
  res = ""
  File.open("#{@basedir}/#{filename}", 'r:BOM|utf-8') do |f|
    while line = f.gets
      if /\A#/ =~ line
        next
      end
      line.gsub!(/#.*$/, "")
      res << line
    end
  end
  res
rescue Errno::ENOENT
  Dir.glob("#{@basedir}/*#{ext()}").sort.join("\n")
rescue Errno::EISDIR
  ""
end
read_parts() click to toggle source
# File lib/review/book/base.rb, line 307
def read_parts
  list = parse_chapters
  if pre = prefaces
    list.unshift pre
  end
  if app = appendix
    list.push app
  end
  if post = postscripts
    list.push post
  end
  list
end