Class: EPUB::Parser::ContentDocument

Inherits:
Object
  • Object
show all
Defined in:
lib/epub/parser/content_document.rb

Instance Method Summary collapse

Constructor Details

#initialize(item) ⇒ ContentDocument

Returns a new instance of ContentDocument.



11
12
13
# File 'lib/epub/parser/content_document.rb', line 11

def initialize(item)
  @item = item
end

Instance Method Details

#parseObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/epub/parser/content_document.rb', line 15

def parse
  content_document = case @item.media_type
                     when 'application/xhtml+xml'
                       if @item.nav?
                         EPUB::ContentDocument::Navigation.new
                       else
                         EPUB::ContentDocument::XHTML.new
                       end
                     when 'image/svg+xml'
                       EPUB::ContentDocument::SVG.new
                     else
                       nil
                     end
  return content_document if content_document.nil?
  content_document.item = @item
  document = XMLDocument.new(@item.read)
  # parse_content_document(document)
  if @item.nav?
    content_document.navigations = parse_navigations(document)
  end
  content_document
end

#parse_navigation(element) ⇒ EPUB::ContentDocument::Navigation::Navigation

Returns nav Navigation object.

Parameters:

  • element (REXML::Element, Oga::XML::Element, Nokogiri::XML::Element)

    nav element

Returns:



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/epub/parser/content_document.rb', line 46

def parse_navigation(element)
  nav = EPUB::ContentDocument::Navigation::Navigation.new
  nav.text = find_heading(element)
  hidden = element.attribute_with_prefix('hidden')
  nav.hidden = hidden.nil? ? nil : true
  nav.types = element.attribute_with_prefix('type', 'epub')&.split(/\s+/)
  element.each_element_by_xpath('./xhtml:ol/xhtml:li', EPUB::NAMESPACES).map do |elem|
    nav.items << parse_navigation_item(elem)
  end

  nav
end

#parse_navigation_item(element) ⇒ Object

Parameters:

  • element (REXML::Element, Oga::XML::Element, Nokogiri::XML::Element)

    li element



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/epub/parser/content_document.rb', line 60

def parse_navigation_item(element)
  item = EPUB::ContentDocument::Navigation::Item.new
  a_or_span = element.each_element_by_xpath('./xhtml:a[1]|xhtml:span[1]', EPUB::NAMESPACES).first
  return a_or_span if a_or_span.nil?

  item.text = a_or_span.content
  item.types = a_or_span.attribute_with_prefix('type', 'epub')&.split(/\s+/)
  if a_or_span.name == 'a'
    if item.text.empty?
      embedded_content = a_or_span.each_element_by_xpath('./xhtml:audio[1]|xhtml:canvas[1]|xhtml:embed[1]|xhtml:iframe[1]|xhtml:img[1]|xhtml:math[1]|xhtml:object[1]|xhtml:svg[1]|xhtml:video[1]', EPUB::NAMESPACES).first
      unless embedded_content.nil?
        case embedded_content.name
        when 'audio', 'canvas', 'embed', 'iframe'
          item.text = embedded_content.attribute_with_prefix('name') || embedded_content.attribute_with_prefix('srcdoc')
        when 'img'
          item.text = embedded_content.attribute_with_prefix('alt')
        when 'math', 'object'
          item.text = embedded_content.attribute_with_prefix('name')
        when 'svg', 'video'
        else
        end
      end
      item.text = a_or_span.attribute_with_prefix('title').to_s if item.text.nil? || item.text.empty?
    end
    item.href = a_or_span.attribute_with_prefix('href')
    item.item = @item.find_item_by_relative_iri(item.href)
  end
  item.items = element.each_element_by_xpath('./xhtml:ol[1]/xhtml:li', EPUB::NAMESPACES).map {|li| parse_navigation_item(li)}

  item
end

#parse_navigations(document) ⇒ Array<EPUB::ContentDocument::Navigation::Navigation>

Returns navs array of Navigation object.

Parameters:

  • document (XMLDocument, REXML::Document, Oga::XML::Document, Nokogiri::HTML::Document)

    HTML document or element including nav

Returns:



40
41
42
# File 'lib/epub/parser/content_document.rb', line 40

def parse_navigations(document)
  document.each_element_by_xpath('/xhtml:html/xhtml:body//xhtml:nav', EPUB::NAMESPACES).collect {|elem| parse_navigation elem}
end