Class: EPUB::Publication::Package::Manifest::Item
- Inherits:
-
Object
- Object
- EPUB::Publication::Package::Manifest::Item
- Includes:
- Inspector
- Defined in:
- lib/epub/publication/package/manifest.rb
Constant Summary collapse
- DUMMY_ROOT_IRI =
Addressable::URI.parse('http://example.net/').freeze
Constants included from Inspector
Inspector::INSTANCE_VARIABLES_OPTION, Inspector::SIMPLE_TEMPLATE
Instance Attribute Summary collapse
-
#fallback ⇒ Item
Returns the value of attribute fallback.
-
#href ⇒ Addressable::URI
Returns the value of href, which is relative IRI from rootfile(OPF file).
-
#id ⇒ String
Returns the value of id.
-
#manifest ⇒ Manifest
Returns the value of manifest.
-
#media_overlay ⇒ String
Returns the value of media_overlay.
-
#media_type ⇒ String
Returns the value of media_type.
-
#properties ⇒ Set<String>
Returns the value of properties.
Instance Method Summary collapse
- #content_document ⇒ Object
- #cover_image? ⇒ Boolean
-
#entry_name ⇒ String
full path in archive.
- #fallback_chain ⇒ Object
- #find_item_by_relative_iri(iri) ⇒ Item?
-
#full_path ⇒ Addressable::URI
full path in archive.
-
#initialize ⇒ Item
constructor
A new instance of Item.
- #inspect ⇒ Object
- #itemref ⇒ Package::Spine::Itemref
- #nav? ⇒ Boolean
-
#read(detect_encoding: false) ⇒ String
Read content from EPUB archive.
- #use_fallback_chain(options = {}) ⇒ Object
- #xhtml? ⇒ Boolean
Methods included from Inspector
#inspect_instance_variables, #inspect_object_id, #inspect_simply
Constructor Details
#initialize ⇒ Item
Returns a new instance of Item.
102 103 104 105 |
# File 'lib/epub/publication/package/manifest.rb', line 102 def initialize @properties = Set.new @full_path = nil end |
Instance Attribute Details
#fallback ⇒ Item
Returns the value of attribute fallback
98 99 |
# File 'lib/epub/publication/package/manifest.rb', line 98 attr_accessor :manifest, :id, :media_type, :fallback, :media_overlay |
#href ⇒ Addressable::URI
Returns the value of href, which is relative IRI from rootfile(OPF file)
98 99 |
# File 'lib/epub/publication/package/manifest.rb', line 98 attr_accessor :manifest, :id, :media_type, :fallback, :media_overlay |
#id ⇒ String
Returns the value of id
98 99 |
# File 'lib/epub/publication/package/manifest.rb', line 98 attr_accessor :manifest, :id, :media_type, :fallback, :media_overlay |
#manifest ⇒ Manifest
Returns the value of manifest
98 99 100 |
# File 'lib/epub/publication/package/manifest.rb', line 98 def manifest @manifest end |
#media_overlay ⇒ String
Returns the value of media_overlay
98 99 |
# File 'lib/epub/publication/package/manifest.rb', line 98 attr_accessor :manifest, :id, :media_type, :fallback, :media_overlay |
#media_type ⇒ String
Returns the value of media_type
98 99 |
# File 'lib/epub/publication/package/manifest.rb', line 98 attr_accessor :manifest, :id, :media_type, :fallback, :media_overlay |
#properties ⇒ Set<String>
Returns the value of properties
98 99 |
# File 'lib/epub/publication/package/manifest.rb', line 98 attr_accessor :manifest, :id, :media_type, :fallback, :media_overlay |
Instance Method Details
#content_document ⇒ Object
200 201 202 203 |
# 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? ⇒ Boolean
178 179 180 |
# File 'lib/epub/publication/package/manifest.rb', line 178 def cover_image? properties.include? 'cover-image' end |
#entry_name ⇒ String
full path in archive
133 134 135 |
# File 'lib/epub/publication/package/manifest.rb', line 133 def entry_name Addressable::URI.unencode(full_path) end |
#fallback_chain ⇒ Object
Handle circular fallback chain
116 117 118 |
# File 'lib/epub/publication/package/manifest.rb', line 116 def fallback_chain @fallback_chain ||= traverse_fallback_chain([]) end |
#find_item_by_relative_iri(iri) ⇒ Item?
Algorithm stolen form Rack::Utils#clean_path_info
217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# 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 ⇒ Addressable::URI
full path in archive
122 123 124 125 126 127 128 129 |
# 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 |
#inspect ⇒ Object
232 233 234 235 236 237 238 239 |
# 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 ⇒ Package::Spine::Itemref
207 208 209 |
# File 'lib/epub/publication/package/manifest.rb', line 207 def itemref manifest.package.spine.itemrefs.find {|itemref| itemref.idref == id} end |
#nav? ⇒ Boolean
174 175 176 |
# File 'lib/epub/publication/package/manifest.rb', line 174 def nav? properties.include? 'nav' end |
#read(detect_encoding: false) ⇒ String
Read content from EPUB archive
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# 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 = {}) ⇒ Object
Handle circular fallback chain
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/epub/publication/package/manifest.rb', line 183 def use_fallback_chain( = {}) supported = EPUB::MediaType::CORE if ad = [:supported] supported = supported | (ad.respond_to?(:to_ary) ? ad : [ad]) end if del = [: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() {|fb| yield fb} if fallback raise EPUB::MediaType::UnsupportedMediaType end |
#xhtml? ⇒ Boolean
170 171 172 |
# File 'lib/epub/publication/package/manifest.rb', line 170 def xhtml? media_type == 'application/xhtml+xml' end |