class EPUB::Publication::Package::Manifest::Item

Constants

DUMMY_ROOT_IRI

Attributes

fallback[RW]

@!attribute [rw] manifest

@return [Manifest] Returns the value of manifest

@!attribute [rw] id

@return [String] Returns the value of id

@!attribute [rw] href

@return [Addressable::URI] Returns the value of href,
                           which is relative IRI from rootfile(OPF file)

@!attribute [rw] media_type

@return [String] Returns the value of media_type

@!attribute [rw] properties

@return [Set<String>] Returns the value of properties

@!attribute [rw] media_overlay

@return [String] Returns the value of media_overlay

@!attribute [rw] fallback

@return [Item] Returns the value of attribute fallback
href[R]
id[RW]

@!attribute [rw] manifest

@return [Manifest] Returns the value of manifest

@!attribute [rw] id

@return [String] Returns the value of id

@!attribute [rw] href

@return [Addressable::URI] Returns the value of href,
                           which is relative IRI from rootfile(OPF file)

@!attribute [rw] media_type

@return [String] Returns the value of media_type

@!attribute [rw] properties

@return [Set<String>] Returns the value of properties

@!attribute [rw] media_overlay

@return [String] Returns the value of media_overlay

@!attribute [rw] fallback

@return [Item] Returns the value of attribute fallback
manifest[RW]

@!attribute [rw] manifest

@return [Manifest] Returns the value of manifest

@!attribute [rw] id

@return [String] Returns the value of id

@!attribute [rw] href

@return [Addressable::URI] Returns the value of href,
                           which is relative IRI from rootfile(OPF file)

@!attribute [rw] media_type

@return [String] Returns the value of media_type

@!attribute [rw] properties

@return [Set<String>] Returns the value of properties

@!attribute [rw] media_overlay

@return [String] Returns the value of media_overlay

@!attribute [rw] fallback

@return [Item] Returns the value of attribute fallback
media_overlay[RW]

@!attribute [rw] manifest

@return [Manifest] Returns the value of manifest

@!attribute [rw] id

@return [String] Returns the value of id

@!attribute [rw] href

@return [Addressable::URI] Returns the value of href,
                           which is relative IRI from rootfile(OPF file)

@!attribute [rw] media_type

@return [String] Returns the value of media_type

@!attribute [rw] properties

@return [Set<String>] Returns the value of properties

@!attribute [rw] media_overlay

@return [String] Returns the value of media_overlay

@!attribute [rw] fallback

@return [Item] Returns the value of attribute fallback
media_type[RW]

@!attribute [rw] manifest

@return [Manifest] Returns the value of manifest

@!attribute [rw] id

@return [String] Returns the value of id

@!attribute [rw] href

@return [Addressable::URI] Returns the value of href,
                           which is relative IRI from rootfile(OPF file)

@!attribute [rw] media_type

@return [String] Returns the value of media_type

@!attribute [rw] properties

@return [Set<String>] Returns the value of properties

@!attribute [rw] media_overlay

@return [String] Returns the value of media_overlay

@!attribute [rw] fallback

@return [Item] Returns the value of attribute fallback
properties[R]

Public Class Methods

new() click to toggle source
# File lib/epub/publication/package/manifest.rb, line 102
def initialize
  @properties = Set.new
  @full_path = nil
end

Public Instance Methods

content_document() click to toggle source
# File lib/epub/publication/package/manifest.rb, line 200
def content_document
  return nil unless %w[application/xhtml+xml image/svg+xml].include? media_type
  @content_document ||= Parser::ContentDocument.new(self).parse
end
cover_image?() click to toggle source
# File lib/epub/publication/package/manifest.rb, line 178
def cover_image?
  properties.include? 'cover-image'
end
entry_name() click to toggle source

full path in archive @return [String]

# File lib/epub/publication/package/manifest.rb, line 133
def entry_name
  Addressable::URI.unencode(full_path)
end
fallback_chain() click to toggle source

@todo Handle circular fallback chain

# File lib/epub/publication/package/manifest.rb, line 116
def fallback_chain
  @fallback_chain ||= traverse_fallback_chain([])
end
find_item_by_relative_iri(iri) click to toggle source

@param iri [Addressable::URI] relative iri @return [Item] @return [nil] when item not found @raise ArgumentError when iri is not relative @raise ArgumentError when iri starts with “/”(slash) @note Algorithm stolen form Rack::Utils#clean_path_info

# File lib/epub/publication/package/manifest.rb, line 217
def find_item_by_relative_iri(iri)
  raise ArgumentError, "Not relative: #{iri.inspect}" unless iri.relative?
  raise ArgumentError, "Start with slash: #{iri.inspect}" if iri.path.start_with? Addressable::URI::SLASH
  target_href = href + iri
  target_href.fragment = nil
  segments = target_href.to_s.split(Addressable::URI::SLASH)
  clean_segments = []
  segments.each do |segment|
    next if segment.empty? || segment == '.'
    segment == '..' ? clean_segments.pop : clean_segments << segment
  end
  target_iri = Addressable::URI.parse(clean_segments.join(Addressable::URI::SLASH))
  manifest.items.find { |item| item.href == target_iri}
end
full_path() click to toggle source

full path in archive @return [Addressable::URI]

# File lib/epub/publication/package/manifest.rb, line 122
def full_path
  return @full_path if @full_path
  path = DUMMY_ROOT_IRI + manifest.package.full_path + href
  path.scheme = nil
  path.host = nil
  path.path = path.path[1..-1]
  @full_path = path
end
href=(iri) click to toggle source
# File lib/epub/publication/package/manifest.rb, line 111
def href=(iri)
  @href = iri.kind_of?(Addressable::URI) ? iri : Addressable::URI.parse(iri)
end
inspect() click to toggle source
# File lib/epub/publication/package/manifest.rb, line 232
def inspect
  "#<%{class}:%{object_id} %{manifest} %{attributes}>" % {
    :class      => self.class,
    :object_id  => inspect_object_id,
    :manifest   => "@manifest=#{@manifest.inspect_simply}",
    :attributes => inspect_instance_variables(exclude: [:@manifest])
  }
end
itemref() click to toggle source

@return [Package::Spine::Itemref] @return nil when no Itemref refers this Item

# File lib/epub/publication/package/manifest.rb, line 207
def itemref
  manifest.package.spine.itemrefs.find {|itemref| itemref.idref == id}
end
nav?() click to toggle source
properties=(props) click to toggle source
# File lib/epub/publication/package/manifest.rb, line 107
def properties=(props)
  @properties = props.kind_of?(Set) ? props : Set.new(props)
end
read(detect_encoding: false) click to toggle source

Read content from EPUB archive

@param detect_encoding [Boolean] Whether read tries auto-detection of character encoding. The default value is false. @return [String] Content with encoding:

US-ASCII when the content is not in text format such images.
UTF-8 when the content is in text format and +detect_encoding+ is +false+.
auto-detected encoding when the content is in text format and +detect_encoding+ is +true+.
# File lib/epub/publication/package/manifest.rb, line 144
def read(detect_encoding: false)
  raw_content = manifest.package.book.container_adapter.read(manifest.package.book.epub_file, entry_name)

  unless media_type.start_with?('text/') or
      media_type.end_with?('xml') or
      ['application/json', 'application/javascript', 'application/ecmascript', 'application/xml-dtd'].include?(media_type)
    return raw_content
  end
  if detect_encoding
    # CharDet.detect doesn't raise Encoding::CompatibilityError
    # that is caused when trying compare CharDet's internal
    # ASCII-8BIT RegExp with a String with other encoding
    # because Zip::File#read returns a String with encoding ASCII-8BIT.
    # So, no need to rescue the error here.
    encoding = CharDet.detect(raw_content)['encoding']
    if encoding
      raw_content.force_encoding(encoding)
    else
      warn "No encoding detected for #{entry_name}. Set to ASCII-8BIT" if $DEBUG || $VERBOSE
      raw_content
    end
  else
    raw_content.force_encoding("UTF-8");
  end
end
use_fallback_chain(options = {}) { |self| ... } click to toggle source

@todo Handle circular fallback chain

# File lib/epub/publication/package/manifest.rb, line 183
def use_fallback_chain(options = {})
  supported = EPUB::MediaType::CORE
  if ad = options[:supported]
    supported = supported | (ad.respond_to?(:to_ary) ? ad : [ad])
  end
  if del = options[:unsupported]
    supported = supported - (del.respond_to?(:to_ary) ? del : [del])
  end

  return yield self if supported.include? media_type
  if (bindings = manifest.package.bindings) && (binding_media_type = bindings[media_type])
    return yield binding_media_type.handler
  end
  return fallback.use_fallback_chain(options) {|fb| yield fb} if fallback
  raise EPUB::MediaType::UnsupportedMediaType
end
xhtml?() click to toggle source
# File lib/epub/publication/package/manifest.rb, line 170
def xhtml?
  media_type == 'application/xhtml+xml'
end

Protected Instance Methods

traverse_fallback_chain(chain) click to toggle source
# File lib/epub/publication/package/manifest.rb, line 243
def traverse_fallback_chain(chain)
  chain << self
  return chain unless fallback
  fallback.traverse_fallback_chain(chain)
end