Class: GEPUB::Item
- Inherits:
-
Object
- Object
- GEPUB::Item
- Defined in:
- lib/gepub/item.rb
Overview
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
Constant Summary collapse
- ATTRIBUTES =
['id', 'href', 'media-type', 'fallback', 'properties', 'media-overlay'].each { |name| methodbase = name.sub('-','_') define_method(methodbase + '=') { |val| @attributes[name] = val } define_method('set_' + methodbase) { |val| @attributes[name] = val; self } define_method(methodbase) { @attributes[name] } }
Instance Attribute Summary collapse
-
#content ⇒ Object
Returns the value of attribute content.
Class Method Summary collapse
Instance Method Summary collapse
- #[](x) ⇒ Object
- #[]=(x, y) ⇒ Object
-
#add_content(io_or_filename) ⇒ Object
add content form io or file to the item.
-
#add_property(property) ⇒ Object
add value to properties attribute.
-
#add_raw_content(data) ⇒ Object
add content data to the item.
-
#cover_image ⇒ Object
set ‘cover-image’ property to the Item.
-
#guess_content_property ⇒ Object
guess and set content property from contents.
-
#initialize(itemid, itemhref, itemmediatype = nil, parent = nil, attributes = {}) ⇒ Item
constructor
create Item.
-
#is_handler_of(media_type) ⇒ Object
set bindings: item is a handler for media_type.
-
#itemid ⇒ Object
get item’s id.
- #landmark(type:, title:, id: nil) ⇒ Object
-
#mediatype ⇒ Object
get mediatype of the item.
-
#nav ⇒ Object
set ‘nav’ property to the Item.
-
#to_xml(builder, opf_version = '3.0') ⇒ Object
generate xml to supplied Nokogiri builder.
-
#toc_text(text) ⇒ Object
set toc text to the item.
-
#toc_text_with_id(text, toc_id) ⇒ Object
set toc text with id to the item.
Constructor Details
#initialize(itemid, itemhref, itemmediatype = nil, parent = nil, attributes = {}) ⇒ Item
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.
21 22 23 24 25 26 27 28 29 30 |
# 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 |
Instance Attribute Details
#content ⇒ Object
Returns the value of attribute content.
9 10 11 |
# File 'lib/gepub/item.rb', line 9 def content @content end |
Class Method Details
Instance Method Details
#[](x) ⇒ Object
49 50 51 |
# File 'lib/gepub/item.rb', line 49 def [](x) @attributes[x] end |
#[]=(x, y) ⇒ Object
53 54 55 |
# File 'lib/gepub/item.rb', line 53 def []=(x,y) @attributes[x] = y end |
#add_content(io_or_filename) ⇒ Object
add content form io or file to the item
140 141 142 143 144 145 146 147 148 149 |
# File 'lib/gepub/item.rb', line 140 def add_content(io_or_filename) io = io_or_filename if io_or_filename.class == String io = File.new(io_or_filename) end io.binmode @content = io.read guess_content_property self end |
#add_property(property) ⇒ Object
add value to properties attribute.
58 59 60 61 |
# File 'lib/gepub/item.rb', line 58 def add_property(property) (@attributes['properties'] ||=[]) << property self end |
#add_raw_content(data) ⇒ Object
add content data to the item.
133 134 135 136 137 |
# File 'lib/gepub/item.rb', line 133 def add_raw_content(data) @content = data guess_content_property self end |
#cover_image ⇒ Object
set ‘cover-image’ property to the Item. On generating EPUB, EPUB2-style cover image meta item will be added.
65 66 67 |
# File 'lib/gepub/item.rb', line 65 def cover_image add_property('cover-image') end |
#guess_content_property ⇒ Object
guess and set content property from contents.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# 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'] = (@attributes['properties'] || []).reject { |x| x == 'svg' || x == 'mathml' || x == 'switch' || x == 'remote-resources' } 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 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 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) ⇒ Object
set bindings: item is a handler for media_type
87 88 89 90 |
# File 'lib/gepub/item.rb', line 87 def is_handler_of media_type bindings.add(self.id, media_type) self end |
#itemid ⇒ Object
get item’s id
40 41 42 |
# File 'lib/gepub/item.rb', line 40 def itemid id end |
#landmark(type:, title:, id: nil) ⇒ Object
92 93 94 95 |
# 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 ⇒ Object
get mediatype of the item.
45 46 47 |
# File 'lib/gepub/item.rb', line 45 def mediatype media_type end |
#nav ⇒ Object
set ‘nav’ property to the Item.
70 71 72 |
# File 'lib/gepub/item.rb', line 70 def nav add_property('nav') end |
#to_xml(builder, opf_version = '3.0') ⇒ Object
generate xml to supplied Nokogiri builder.
152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/gepub/item.rb', line 152 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) ⇒ Object
set toc text to the item
75 76 77 78 |
# 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) ⇒ Object
set toc text with id to the item
81 82 83 84 |
# 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 |