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::Nav

Returns nav Nav object

Parameters:

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

    nav element

Returns:

  • (EPUB::ContentDocument::Navigation::Nav)

    nav Nav object



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.type = element.attribute_with_prefix('type', 'epub')
  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, 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
# 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
  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::Nav>

Returns navs array of Nav object

Parameters:

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

    HTML document or element including nav

Returns:

  • (Array<EPUB::ContentDocument::Navigation::Nav>)

    navs array of Nav object



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