class GEPUB::Item

an Object to hold metadata and content of item in manifest.

following methods are created dynamically. id, id=, set_id, href, href=, set_href, media_type, media_type=, set_media_type, fallback, fallback=, set_fallback, media_overlay, media_overlay=, set_media_overlay

Constants

ATTRIBUTES

Attributes

content[RW]

Public Class Methods

create(parent, attributes = {}) click to toggle source
# File lib/gepub/item.rb, line 10
def self.create(parent, attributes = {})
  Item.new(attributes['id'], attributes['href'], attributes['media-type'], parent,
           attributes.reject { |k,_v| ['id','href','media-type'].member?(k) })
end
new(itemid, itemhref, itemmediatype = nil, parent = nil, attributes = {}) click to toggle source

create Item.

if mediatype is not specified, it will be guessed from extension name. Item can't guess media type for videos and audios, so you should specify one.

# File lib/gepub/item.rb, line 21
def initialize(itemid, itemhref, itemmediatype = nil, parent = nil, attributes = {})
  if attributes['properties'].class == String
    attributes['properties'] = attributes['properties'].split(' ')
  end
  @attributes = {'id' => itemid, 'href' => itemhref, 'media-type' => itemmediatype}.merge(attributes)
  @attributes['media-type'] = GEPUB::Mime.guess_mediatype(itemhref) if media_type.nil?
  @parent = parent
  @parent.register_item(self) unless @parent.nil?
  self
end

Public Instance Methods

[](x) click to toggle source
# File lib/gepub/item.rb, line 49
def [](x)
  @attributes[x]
end
[]=(x,y) click to toggle source
# File lib/gepub/item.rb, line 53
def []=(x,y)
  @attributes[x] = y
end
add_content(io_or_filename) click to toggle source

add content from io or file to the item

# File lib/gepub/item.rb, line 142
def add_content(io_or_filename)
  if io_or_filename.class == String
    File.open(io_or_filename, mode='r') do |f|
      add_content_io f
    end
  else
    add_content_io io_or_filename
  end
  self
end
add_content_io(io) click to toggle source
# File lib/gepub/item.rb, line 153
def add_content_io(io)
  io.binmode
  @content = io.read
  if File.extname(self.href) =~ /x?html$/
    @content.force_encoding('utf-8')
  end
  guess_content_property
  self
end
add_property(property) click to toggle source

add value to properties attribute.

# File lib/gepub/item.rb, line 58
def add_property(property)
  (@attributes['properties'] ||=[]) << property
  self
end
add_raw_content(data) click to toggle source

add content data to the item.

# File lib/gepub/item.rb, line 132
def add_raw_content(data)
  @content = data
  if File.extname(self.href) =~ /x?html$/
    @content.force_encoding('utf-8')
  end
  guess_content_property
  self
end
cover_image() click to toggle source

set 'cover-image' property to the Item. On generating EPUB, EPUB2-style cover image meta item will be added.

# File lib/gepub/item.rb, line 65
def cover_image
  add_property('cover-image')
end
guess_content_property() click to toggle source

guess and set content property from contents.

# File lib/gepub/item.rb, line 98
def guess_content_property
  if File.extname(self.href) =~ /.x?html/ && @attributes['media-type'] === 'application/xhtml+xml'
    @attributes['properties'] ||= []
    parsed = Nokogiri::XML::Document.parse(@content)
    return unless parsed.root.node_name === "html"
    ns_prefix =  parsed.namespaces.invert['http://www.w3.org/1999/xhtml']
    if ns_prefix.nil?
      prefix = ''
    else
      prefix = "#{ns_prefix}:"
    end
    images = parsed.xpath("//#{prefix}img[starts-with(@src,'http')]")
    videos = parsed.xpath("//#{prefix}video[starts-with(@src,'http')]") + parsed.xpath("//#{prefix}video/#{prefix}source[starts-with(@src,'http')]")
    audios = parsed.xpath("//#{prefix}audio[starts-with(@src,'http')]") + parsed.xpath("//#{prefix}audio/#{prefix}source[starts-with(@src,'http')]")
    if images.size > 0 || videos.size > 0 || audios.size > 0
      self.add_property('remote-resources')
    end
    if parsed.xpath("//p:math", { 'p' => 'http://www.w3.org/1998/Math/MathML' }).size > 0
      self.add_property('mathml')
    end
    if parsed.xpath("//s:svg", { 's' => 'http://www.w3.org/2000/svg' }).size > 0
      self.add_property('svg')
    end
    if parsed.xpath("//epub:switch", { 'epub' => 'http://www.idpf.org/2007/ops' }).size > 0
      self.add_property('switch')
    end
    scripts = parsed.xpath("//#{prefix}script") + parsed.xpath("//#{prefix}form")
    if scripts.size > 0
      self.add_property('scripted')
    end
  end
end
is_handler_of(media_type) click to toggle source

set bindings: item is a handler for media_type

# File lib/gepub/item.rb, line 87
def is_handler_of media_type
  bindings.add(self.id, media_type)
  self
end
itemid() click to toggle source

get item's id

# File lib/gepub/item.rb, line 40
def itemid
  id
end
landmark(type:, title:, id: nil) click to toggle source
# File lib/gepub/item.rb, line 92
def landmark(type:, title:, id: nil)
  landmarks.push(:type => type, :title => title, :item => self, :id => id)
  self
end
mediatype() click to toggle source

get mediatype of the item.

# File lib/gepub/item.rb, line 45
def mediatype
  media_type
end
nav() click to toggle source

set 'nav' property to the Item.

to_xml(builder, opf_version = '3.0') click to toggle source

generate xml to supplied Nokogiri builder.

# File lib/gepub/item.rb, line 164
def to_xml(builder, opf_version = '3.0')
  attr = @attributes.dup
  if opf_version.to_f < 3.0
    attr.reject!{ |k,_v| k == 'properties' }
  end
  if !attr['properties'].nil?
    attr['properties'] = attr['properties'].uniq.join(' ')
    if attr['properties'].size == 0
      attr.delete 'properties'
    end
  end
  builder.item(attr)
end
toc_text(text) click to toggle source

set toc text to the item

# File lib/gepub/item.rb, line 75
def toc_text text
  toc.push(:item => self, :text => text, :id => nil)
  self
end
toc_text_with_id(text, toc_id) click to toggle source

set toc text with id to the item

# File lib/gepub/item.rb, line 81
def toc_text_with_id text, toc_id
  toc.push(:item => self, :text => text, :id => toc_id)
  self
end