class GEPUB::ResourceBuilder

Public Class Methods

new(book, attributes = {}, &block) click to toggle source
# File lib/gepub/resource_builder.rb, line 23
def initialize(book, attributes = {},  &block)
  @last_defined_item = nil
  @book = book
  @dir_prefix = ""
  @file_postprocess = {}
  @file_preprocess = {}
  @files_postprocess = {}
  @files_preprocess = {}
  current_wd = Dir.getwd
  Dir.chdir(attributes[:workdir]) unless attributes[:workdir].nil?
  instance_eval(&block)
  Dir.chdir current_wd
  true
end

Public Instance Methods

add_resource_dir(name) click to toggle source
# File lib/gepub/resource_builder.rb, line 121
def add_resource_dir(name)
  import "#{name}/resources.conf", :dir_prefix => name
end
add_resource_dirs(dirs) click to toggle source
# File lib/gepub/resource_builder.rb, line 125
def add_resource_dirs(dirs)
  dirs.each do
    |dir|
    add_resource_dir dir
  end
end
cover_image(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 132
def cover_image(val)
  file(val)
  @last_defined_item.cover_image
end
fallback_chain_files(*arg) click to toggle source
# File lib/gepub/resource_builder.rb, line 182
def fallback_chain_files(*arg)
  files(*arg)
  @last_defined_item.inject(nil) {
    |item1, item2|
    if !item1.nil?
      item1.item.set_fallback(item2.item.id)
    end
    item2
  }
end
fallback_group() { || ... } click to toggle source
# File lib/gepub/resource_builder.rb, line 159
def fallback_group
  raise 'fallback_group needs block.' unless block_given?
  count = 0
  before = nil

  @files_preprocess['fallback_group'] = Proc.new { raise "can't use files within fallback_group" }

  @file_preprocess['fallback_group'] = Proc.new {
    before = @last_defined_item
  }

  @file_postprocess['fallback_group'] = Proc.new {
    if count > 0
      before.item.set_fallback(@last_defined_item.item.id)
    end
    count += 1
  }
  yield
  @files_preprocess.delete('fallback_group')
  @file_postprocess.delete('fallback_group')
  @file_preprocess.delete('fallback_group')
end
file(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 44
def file(val)
  raise "can't specify multiple files on file keyword" if Hash === val && val.length > 1

  @file_preprocess.each {
    |_k,p|
    p.call
  }
  @last_defined_item = ResourceItem.new(create_one_file(val))
  @file_postprocess.each {
    |_k,p|
    p.call
  }
end
files(*arg) click to toggle source
# File lib/gepub/resource_builder.rb, line 58
def files(*arg)
  arg = arg[0] if arg.size == 1 && Hash === arg[0]
  @files_preprocess.each {
    |_k,p|
    p.call
  }
  @last_defined_item = arg.map {
    |val|
    ResourceItem.new(create_one_file(val))
  }
  @files_postprocess.each {
    |_k,p|
    p.call
  }
end
glob(arg) click to toggle source
# File lib/gepub/resource_builder.rb, line 108
def glob(arg)
  files(*Dir.glob(arg).select{|x| !File.directory?(x)} )
end
handles(media_type) click to toggle source
# File lib/gepub/resource_builder.rb, line 193
def handles(media_type)
  @last_defined_item.is_handler_of(media_type)
end
heading(text, id = nil) click to toggle source
# File lib/gepub/resource_builder.rb, line 142
def heading(text, id = nil)
  @last_defined_item.toc_text_with_id(text, id)
end
id(the_id) click to toggle source
# File lib/gepub/resource_builder.rb, line 146
def id(the_id)
  @last_defined_item.id = the_id
end
import(conf, args = {}) click to toggle source
# File lib/gepub/resource_builder.rb, line 112
def import(conf, args = {})
  dir_prefix_org = @dir_prefix
  @dir_prefix = args[:dir_prefix] || ""
  Dir.chdir(File.dirname(conf)) {
    instance_eval(File.new(File.basename(conf)).read)
  }
  @dir_prefix = dir_prefix_org
end
linear(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 102
def linear val
  itemref = @book.spine.itemref_by_id[@last_defined_item.item.id]
  raise 'linear should be called inside ordered' if (itemref.nil?)
  itemref.linear = val
end
nav(val) click to toggle source
ordered(&block) click to toggle source
# File lib/gepub/resource_builder.rb, line 38
def ordered(&block)
  @book.ordered {
    instance_eval(&block)
  }
end
page_spread_left() click to toggle source
# File lib/gepub/resource_builder.rb, line 74
def page_spread_left
  itemref = @book.spine.itemref_by_id[@last_defined_item.item.id]
  raise 'page_spread_left should be called inside ordered' if (itemref.nil?)
  itemref.page_spread_left
end
page_spread_right() click to toggle source
# File lib/gepub/resource_builder.rb, line 80
def page_spread_right
  itemref = @book.spine.itemref_by_id[@last_defined_item.item.id]
  raise 'page_spread_right should be called inside ordered' if (itemref.nil?)
  itemref.page_spread_right
end
rendition_layout(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 86
def rendition_layout val
  itemref = @book.spine.itemref_by_id[@last_defined_item.item.id]
  raise 'rendition should be called inside ordered' if (itemref.nil?)
  itemref.rendition_layout = val
end
rendition_orientation(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 91
def rendition_orientation val
  itemref = @book.spine.itemref_by_id[@last_defined_item.item.id]
  raise 'rendition should be called inside ordered' if (itemref.nil?)
  itemref.rendition_orientation = val
end
rendition_spread(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 96
def rendition_spread val
  itemref = @book.spine.itemref_by_id[@last_defined_item.item.id]
  raise 'rendition should be called inside ordered' if (itemref.nil?)
  itemref.rendition_spread = val
end
with_media_type(*type) { || ... } click to toggle source
# File lib/gepub/resource_builder.rb, line 150
def with_media_type(*type)
  raise 'with_media_type needs block.' unless block_given?
  @file_postprocess['with_media_type'] = Proc.new { media_type(*type) }
  @files_postprocess['with_media_type'] = Proc.new { media_type(*type) }
  yield 
  @file_postprocess.delete('with_media_type')
  @files_postprocess.delete('with_media_type')
end

Private Instance Methods

create_one_file(val) click to toggle source
# File lib/gepub/resource_builder.rb, line 199
def create_one_file(val)
  name = val
  io = val if (String === val && !val.start_with?('http'))
  if Hash === val 
    name = val.first[0]
    io = val.first[1]
  end
  if Array === val
    name = val[0]
    io = val[1]
  end
  name = "#{@dir_prefix}/#{name}" if !@dir_prefix.nil? && @dir_prefix.size > 0 && !name.start_with?('http')
  @book.add_item(name, content: io)
end