class EPUBMaker::Producer

EPUBMaker produces EPUB file.

Attributes

contents[RW]

Array of content objects.

params[RW]

Parameter hash.

res[R]

Message resource object.

Public Class Methods

load(file) click to toggle source

Take YAML file and return parameter hash.

# File lib/epubmaker/producer.rb, line 32
def Producer.load(file)
  raise "Can't open #{file}." if file.nil? || !File.exist?(file)
  loader = ReVIEW::YAMLLoader.new
  loader.load_file(file)
end
new(params=nil, version=nil) click to toggle source

Construct producer object. params takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#merge_params. version takes EPUB version (default is 2).

# File lib/epubmaker/producer.rb, line 48
def initialize(params=nil, version=nil)
  @contents = []
  @params = ReVIEW::Configure.new
  @epub = nil
  @params["epubversion"] = version unless version.nil?
  @res = ReVIEW::I18n

  if params
    merge_params(params)
  end
end

Public Instance Methods

call_hook(filename, *params) click to toggle source
# File lib/epubmaker/producer.rb, line 186
def call_hook(filename, *params)
  if !filename.nil? && File.exist?(filename) && FileTest.executable?(filename)
    if ENV["REVIEW_SAFE_MODE"].to_i & 1 > 0
      warn "hook is prohibited in safe mode. ignored."
    else
      system(filename, *params)
    end
  end
end
colophon(wobj) click to toggle source

Write colophon file to IO object wobj.

# File lib/epubmaker/producer.rb, line 132
def colophon(wobj)
  s = @epub.colophon
  wobj.puts s if !s.nil? && !wobj.nil?
end
container(wobj) click to toggle source

Write container file to IO object wobj.

# File lib/epubmaker/producer.rb, line 111
def container(wobj)
  s = @epub.container
  wobj.puts s if !s.nil? && !wobj.nil?
end
cover(wobj) click to toggle source

Write cover file to IO object wobj. If #params is defined, it will be used for the cover image.

# File lib/epubmaker/producer.rb, line 119
def cover(wobj)
  type = (@params["epubversion"] >= 3) ? "cover" : nil
  s = @epub.cover(type)
  wobj.puts s if !s.nil? && !wobj.nil?
end
coverimage() click to toggle source
# File lib/epubmaker/producer.rb, line 60
def coverimage
  return nil unless params["coverimage"]
  @contents.each do |item|
    if item.media.start_with?('image') && item.file =~ /#{params["coverimage"]}\Z/ # /
      return item.file
    end
  end
  return nil
end
importImageInfo(path, base=nil, allow_exts=nil)
Alias for: import_imageinfo
import_imageinfo(path, base=nil, allow_exts=nil) click to toggle source

Add informations of figure files in path to contents array. base defines a string to remove from path name.

# File lib/epubmaker/producer.rb, line 145
def import_imageinfo(path, base=nil, allow_exts=nil)
  return nil unless File.exist?(path)
  allow_exts = @params["image_ext"] if allow_exts.nil?
  Dir.foreach(path) do |f|
    next if f.start_with?('.')
    if f =~ /\.(#{allow_exts.join("|")})\Z/i
      path.chop! if path =~ /\/\Z/
      if base.nil?
        @contents.push(EPUBMaker::Content.new({"file" => "#{path}/#{f}"}))
      else
        @contents.push(EPUBMaker::Content.new({"file" => "#{path.sub(base + "/", '')}/#{f}"}))
      end
    end
    if FileTest.directory?("#{path}/#{f}")
      import_imageinfo("#{path}/#{f}", base)
    end
  end
end
Also aliased as: importImageInfo
isbn_hyphen() click to toggle source
# File lib/epubmaker/producer.rb, line 196
def isbn_hyphen
  str = @params["isbn"].to_s

  if str =~ /\A\d{10}\Z/
    "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
  elsif str =~ /\A\d{13}\Z/
    "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
  else
    nil
  end
end
load(file) click to toggle source

Take YAML file and update parameter hash.

# File lib/epubmaker/producer.rb, line 39
def load(file)
  raise "Can't open #{file}." if file.nil? || !File.exist?(file)
  loader = ReVIEW::YAMLLoader.new
  merge_params(@params.deep_merge(loader.load_file(file)))
end
merge_params(params) click to toggle source

Update parameters by merging from new parameter hash params.

# File lib/epubmaker/producer.rb, line 71
def merge_params(params)
  @params.deep_merge!(params)
  complement

  unless @params["epubversion"].nil?
    case @params["epubversion"].to_i
    when 2
      @epub = EPUBMaker::EPUBv2.new(self)
    when 3
      @epub = EPUBMaker::EPUBv3.new(self)
    else
      raise "Invalid EPUB version (#{@params["epubversion"]}.)"
    end
  end
  if params["language"]
    ReVIEW::I18n.locale = params["language"]
  end
  support_legacy_maker
end
mimetype(wobj) click to toggle source

Write mimetype file to IO object wobj.

# File lib/epubmaker/producer.rb, line 92
def mimetype(wobj)
  s = @epub.mimetype
  wobj.print s if !s.nil? && !wobj.nil?
end
mytoc(wobj) click to toggle source

Write own toc file to IO object wobj.

# File lib/epubmaker/producer.rb, line 138
def mytoc(wobj)
  s = @epub.mytoc
  wobj.puts s if !s.nil? && !wobj.nil?
end
ncx(wobj, indentarray=[]) click to toggle source

Write ncx file to IO object wobj. indentarray defines prefix string for each level.

# File lib/epubmaker/producer.rb, line 105
def ncx(wobj, indentarray=[])
  s = @epub.ncx(indentarray)
  wobj.puts s if !s.nil? && !wobj.nil?
end
opf(wobj) click to toggle source

Write opf file to IO object wobj.

# File lib/epubmaker/producer.rb, line 98
def opf(wobj)
  s = @epub.opf
  wobj.puts s if !s.nil? && !wobj.nil?
end
produce(epubfile, basedir=nil, tmpdir=nil) click to toggle source

Produce EPUB file epubfile. basedir points the directory has contents (default: current directory.) tmpdir defines temporary directory.

# File lib/epubmaker/producer.rb, line 169
def produce(epubfile, basedir=nil, tmpdir=nil)
  current = Dir.pwd
  basedir = current if basedir.nil?

  _tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
  epubfile = "#{current}/#{epubfile}" if epubfile !~ /\A\// # /

  # FIXME: error check
  File.unlink(epubfile) if File.exist?(epubfile)

  begin
    @epub.produce(epubfile, basedir, _tmpdir)
  ensure
    FileUtils.rm_r(_tmpdir) if tmpdir.nil?
  end
end
titlepage(wobj) click to toggle source

Write title file (copying) to IO object wobj.

# File lib/epubmaker/producer.rb, line 126
def titlepage(wobj)
  s = @epub.titlepage
  wobj.puts s if !s.nil? && !wobj.nil?
end

Private Instance Methods

complement() click to toggle source

Complement parameters.

# File lib/epubmaker/producer.rb, line 211
def complement
  @params["htmlext"] = "html" if @params["htmlext"].nil?
  defaults = ReVIEW::Configure.new.merge({
    "language" => "ja",
    "date" => Time.now.strftime("%Y-%m-%d"),
    "modified" => Time.now.strftime("%Y-%02m-%02dT%02H:%02M:%02SZ"),
    "urnid" => "urn:uid:#{SecureRandom.uuid}",
    "isbn" => nil,
    "toclevel" => 2,
    "stylesheet" => [],
    "epubversion" => 3,
    "htmlversion" => 5,
    "secnolevel" => 2,
    "pre_secnolevel" => 0,
    "post_secnolevel" => 1,
    "part_secnolevel" => 1,
    "titlepage" => nil,
    "titlefile" => nil,
    "originaltitlefile" => nil,
    "profile" => nil,
    "colophon" => nil,
    "colophon_order" => %w[aut csl trl dsr ill edt pbl prt pht],
    "direction" => "ltr",
    "epubmaker" => {
      "flattoc" => nil,
      "flattocindent" => true,
      "ncx_indent" => [],
      "zip_stage1" => "zip -0Xq",
      "zip_stage2" => "zip -Xr9Dq",
      "zip_addpath" => nil,
      "hook_beforeprocess" => nil,
      "hook_afterfrontmatter" => nil,
      "hook_afterbody" => nil,
      "hook_afterbackmatter" => nil,
      "hook_aftercopyimage" => nil,
      "hook_prepack" => nil,
      "rename_for_legacy" => nil,
      "verify_target_images" => nil,
      "force_include_images" => [],
      "cover_linear" => nil,
    },
    "externallink" => true,
    "imagedir" => "images",
    "fontdir" => "fonts",
    "image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
    "font_ext" => %w(ttf woff otf),
  })

  @params = defaults.deep_merge(@params)
  @params["title"] = @params["booktitle"] unless @params["title"]

  deprecated_parameters = {
    "ncxindent" => "epubmaker:ncxindent",
    "flattoc" => "epubmaker:flattoc",
    "flattocindent" => "epubmaker:flattocindent",
    "hook_beforeprocess" => "epubmaker:hook_beforeprocess",
    "hook_afterfrontmatter" => "epubmaker:hook_afterfrontmatter",
    "hook_afterbody" => "epubmaker:hook_afterbody",
    "hook_afterbackmatter" => "epubmaker:hook_afterbackmatter",
    "hook_aftercopyimage" => "epubmaker:hook_aftercopyimage",
    "hook_prepack" => "epubmaker:hook_prepack",
    "rename_for_legacy" => "epubmaker:rename_for_legacy",
    "zip_stage1" => "epubmaker:zip_stage1",
    "zip_stage2" => "epubmaker:zip_stage2",
    "zip_addpath" => "epubmaker:zip_addpath",
    "verify_target_images" => "epubmaker:verify_target_images",
    "force_include_images" => "epubmaker:force_include_images",
    "cover_linear" => "epubmaker:cover_linear",
  }

  deprecated_parameters.each_pair do |k, v|
    unless @params[k].nil?
      sa = v.split(":", 2)
      warn "Parameter #{k} is deprecated. Use:\n#{sa[0]}:\n  #{sa[1]}: ...\n\n"
      @params[sa[0]][sa[1]] = @params[k]
      @params.delete(k)
    end
  end

  @params["htmlversion"] = 5 if @params["epubversion"] >= 3

  @params.maker = "epubmaker"
  @params["cover"] = "#{@params["bookname"]}.#{@params["htmlext"]}" unless @params["cover"]

  %w[bookname title].each do |k|
    raise "Key #{k} must have a value. Abort." unless @params[k]
  end
  # array
  %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 pbl prt red rev spn ths trc trl stylesheet rights].each do |item|
    next unless @params[item]
    @params[item] = [@params[item]] if @params[item].kind_of?(String)
  end
  # optional
  # type, format, identifier, source, relation, coverpage, aut
end
support_legacy_maker() click to toggle source
# File lib/epubmaker/producer.rb, line 307
def support_legacy_maker
  # legacy review-epubmaker support
  if @params["flag_legacy_coverfile"].nil? && !@params["coverfile"].nil? && File.exist?(@params["coverfile"])
    @params["cover"] = "#{@params["bookname"]}-cover.#{@params["htmlext"]}"
    @epub.legacy_cover_and_title_file(@params["coverfile"], @params["cover"])
    @params["flag_legacy_coverfile"] = true
    warn "Parameter 'coverfile' is obsolete. Please use 'cover' and make complete html file with header and footer."
  end

  if @params["flag_legacy_titlepagefile"].nil? && !@params["titlepagefile"].nil? && File.exist?(@params["titlepagefile"])
    @params["titlefile"] = "#{@params["bookname"]}-title.#{@params["htmlext"]}"
    @params["titlepage"] = true
    @epub.legacy_cover_and_title_file(@params["titlepagefile"], @params["titlefile"])
    @params["flag_legacy_titlepagefile"] = true
    warn "Parameter 'titlepagefile' is obsolete. Please use 'titlefile' and make complete html file with header and footer."
  end

  if @params["flag_legacy_backcoverfile"].nil? && !@params["backcoverfile"].nil? && File.exist?(@params["backcoverfile"])
    @params["backcover"] = "#{@params["bookname"]}-backcover.#{@params["htmlext"]}"
    @epub.legacy_cover_and_title_file(@params["backcoverfile"], @params["backcover"])
    @params["flag_legacy_backcoverfile"] = true
    warn "Parameter 'backcoverfile' is obsolete. Please use 'backcover' and make complete html file with header and footer."
  end

  if @params["flag_legacy_pubhistory"].nil? && !@params["pubhistory"].nil?
    @params["history"] = [[]]
    @params["pubhistory"].split("\n").each do |date|
      @params["history"][0].push(date.sub(/(\d+)年(\d+)月(\d+)日/, '\1-\2-\3'))
    end
    @params["flag_legacy_pubhistory"] = true
    warn "Parameter 'pubhistory' is obsolete. Please use 'history' array."
  end
end