Class: Hatemile::Util::Html::NokogiriLib::NokogiriHTMLDOMElement

Inherits:
HTMLDOMElement show all
Includes:
NokogiriHTMLDOMNode
Defined in:
lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb

Overview

The NokogiriHTMLDOMElement class is official implementation of HTMLDOMElement interface for the Nokogiri library.

Constant Summary collapse

SELF_CLOSING_TAGS =

Tags that are self closing.

%w[
  area base br col embed hr img input keygen
  link menuitem meta param source track wbr
].freeze

Instance Method Summary collapse

Methods included from NokogiriHTMLDOMNode

#get_data, #get_parent_element, #get_text_content, #init, #insert_after, #insert_before, #remove_node, #replace_node, #set_node

Methods inherited from HTMLDOMNode

#get_data, #get_parent_element, #get_text_content, #insert_after, #insert_before, #remove_node, #replace_node

Constructor Details

#initialize(element) ⇒ NokogiriHTMLDOMElement

Initializes a new object that encapsulate the Nokogiri element.

Parameters:

  • element (Nokogiri::XML::Node)

    The Nokogiri element.



53
54
55
56
57
58
59
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 53

def initialize(element)
  Hatemile::Helper.require_not_nil(element)
  Hatemile::Helper.require_valid_type(element, Nokogiri::XML::Node)

  @data = element
  init(element, self)
end

Instance Method Details

#==(other) ⇒ Boolean

Compare if two elements object reference the same element.

Parameters:

Returns:

  • (Boolean)

    True if the object reference the same element or false if not.



293
294
295
296
297
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 293

def ==(other)
  return false if other.nil?
  return false unless other.is_a?(HTMLDOMElement)
  get_data == other.get_data
end

#append_element(element) ⇒ Object



99
100
101
102
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 99

def append_element(element)
  @data.add_child(element.get_data)
  self
end

#append_text(text) ⇒ Object



154
155
156
157
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 154

def append_text(text)
  @data.add_child(Nokogiri::XML::Text.new(text, @data.document))
  self
end

#clone_elementObject



206
207
208
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 206

def clone_element
  NokogiriHTMLDOMElement.new(@data.clone)
end

#get_attribute(name) ⇒ Object



69
70
71
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 69

def get_attribute(name)
  @data.get_attribute(name)
end

#get_childrenObject



123
124
125
126
127
128
129
130
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 123

def get_children
  array = []
  @data.children.each do |child|
    array.push(NokogiriHTMLDOMElement.new(child)) if child.element?
    array.push(NokogiriHTMLDOMTextNode.new(child)) if child.text?
  end
  array
end

#get_children_elementsObject



113
114
115
116
117
118
119
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 113

def get_children_elements
  array = []
  @data.element_children.each do |child|
    array.push(NokogiriHTMLDOMElement.new(child))
  end
  array
end

#get_first_element_childObject



212
213
214
215
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 212

def get_first_element_child
  return nil unless has_children_elements?
  get_children_elements.first
end

#get_first_node_childObject



226
227
228
229
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 226

def get_first_node_child
  return nil unless has_children?
  get_children.first
end

#get_inner_htmlObject



183
184
185
186
187
188
189
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 183

def get_inner_html
  html = ''
  @data.children.each do |child|
    html += to_string(child)
  end
  html
end

#get_last_element_childObject



219
220
221
222
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 219

def get_last_element_child
  return nil unless has_children_elements?
  get_children_elements.last
end

#get_last_node_childObject



233
234
235
236
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 233

def get_last_node_child
  return nil unless has_children?
  get_children.last
end

#get_outer_htmlObject



193
194
195
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 193

def get_outer_html
  to_string(@data)
end

#get_tag_nameObject



63
64
65
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 63

def get_tag_name
  @data.name.upcase
end

#has_attribute?(name) ⇒ Boolean

Returns:

  • (Boolean)

See Also:



87
88
89
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 87

def has_attribute?(name)
  !@data.attributes[name].nil?
end

#has_attributes?Boolean

Returns:

  • (Boolean)

See Also:



93
94
95
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 93

def has_attributes?
  !@data.attributes.empty?
end

#has_children?Boolean

Returns:

  • (Boolean)

See Also:



174
175
176
177
178
179
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 174

def has_children?
  @data.children.each do |child|
    return true if child.element? || child.text?
  end
  false
end

#has_children_elements?Boolean

Returns:

  • (Boolean)

See Also:



168
169
170
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 168

def has_children_elements?
  @data.element_children.empty? == false
end

#normalizeObject



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 134

def normalize
  return self unless has_children?

  last = nil
  get_children.each do |child|
    if child.is_a?(NokogiriHTMLDOMElement)
      child.normalize
    elsif child.is_a?(NokogiriHTMLDOMTextNode) &&
          last.is_a?(NokogiriHTMLDOMTextNode)
      child.prepend_text(last.get_text_content)
      last.remove_node
    end
    last = child
  end

  self
end

#prepend_element(element) ⇒ Object



106
107
108
109
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 106

def prepend_element(element)
  @data.prepend_child(element.get_data)
  self
end

#prepend_text(text) ⇒ Object



161
162
163
164
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 161

def prepend_text(text)
  @data.prepend_child(Nokogiri::XML::Text.new(text, @data.document))
  self
end

#remove_attribute(name) ⇒ Object



81
82
83
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 81

def remove_attribute(name)
  @data.remove_attribute(name) if has_attribute?(name)
end

#self_closing_tag?(tag) ⇒ Boolean

Returns if the tag is self closing.

Parameters:

  • tag (String)

    The element tag.

Returns:

  • (Boolean)

    True if the tag is self closing or false if not.



282
283
284
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 282

def self_closing_tag?(tag)
  SELF_CLOSING_TAGS.include?(tag.downcase)
end

#set_attribute(name, value) ⇒ Object



75
76
77
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 75

def set_attribute(name, value)
  @data.set_attribute(name, value)
end

#set_data(data) ⇒ Object



199
200
201
202
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 199

def set_data(data)
  @data = data
  set_node(data)
end

#to_string(node) ⇒ String

Convert a Nokogiri Node to a HTML code.

Parameters:

  • node (Nokogiri::XML::Node)

    The Nokogiri Node.

Returns:

  • (String)

    The HTML code of the Nokogiri Node.



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# File 'lib/hatemile/util/html/nokogiri/nokogiri_html_dom_element.rb', line 243

def to_string(node)
  string = ''
  if node.element?
    string += "<#{node.name.downcase}"
    node.attributes.each do |attribute, value|
      string += " #{attribute}=\"#{value}\""
    end
    string += if node.children.empty? && self_closing_tag?(node.name)
                ' />'
              else
                '>'
              end
  elsif node.comment?
    string += node.to_s
  elsif node.cdata?
    string += node.to_s
  elsif node.html?
    document = node.to_s
    string += document.split("\n")[0] + "\n"
  elsif node.text?
    string += node.text
  end

  node.children.each do |child|
    string += to_string(child)
  end

  if node.element? &&
     !(node.children.empty? && self_closing_tag?(node.name))
    string += "</#{node.name.downcase}>"
  end
  string
end