Class: Dommy::Fragment

Inherits:
Object
  • Object
show all
Includes:
EventTarget, Node
Defined in:
lib/dommy/element.rb

Constant Summary

Constants included from Node

Node::ATTRIBUTE_NODE, Node::CDATA_SECTION_NODE, Node::COMMENT_NODE, Node::DOCUMENT_FRAGMENT_NODE, Node::DOCUMENT_NODE, Node::DOCUMENT_POSITION_CONTAINED_BY, Node::DOCUMENT_POSITION_CONTAINS, Node::DOCUMENT_POSITION_DISCONNECTED, Node::DOCUMENT_POSITION_FOLLOWING, Node::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, Node::DOCUMENT_POSITION_PRECEDING, Node::DOCUMENT_TYPE_NODE, Node::ELEMENT_NODE, Node::PROCESSING_INSTRUCTION_NODE, Node::TEXT_NODE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from EventTarget

#__deliver_event__, #add_event_listener, #dispatch_event, #invoke_listener, #remove_event_listener

Constructor Details

#initialize(document, nokogiri_node) ⇒ Fragment

Returns a new instance of Fragment.



14
15
16
17
# File 'lib/dommy/element.rb', line 14

def initialize(document, nokogiri_node)
  @document = document
  @__node__ = nokogiri_node
end

Instance Attribute Details

#__node__Object (readonly)

Returns the value of attribute __node__.



12
13
14
# File 'lib/dommy/element.rb', line 12

def __node__
  @__node__
end

#documentObject (readonly)

Returns the value of attribute document.



12
13
14
# File 'lib/dommy/element.rb', line 12

def document
  @document
end

Instance Method Details

#__js_call__(method, args) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/dommy/element.rb', line 101

def __js_call__(method, args)
  case method
  when "cloneNode"
    deep = args.empty? ? false : !!args[0]
    deep ? @document.wrap_node(Parser.fragment(@__node__.to_html, owner_doc: @document.nokogiri_doc)) : @document
      .wrap_node(Parser.fragment("", owner_doc: @document.nokogiri_doc))
  when "querySelector"
    query_selector(args[0])
  when "querySelectorAll"
    query_selector_all(args[0])
  when "getElementById"
    get_element_by_id(args[0])
  when "appendChild"
    append_child(args[0])
  else
    nil
  end
end

#__js_get__(key) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/dommy/element.rb', line 78

def __js_get__(key)
  case key
  when "nodeType"
    11
  when "children"
    element_children
  when "childNodes"
    child_nodes
  when "childElementCount"
    child_element_count
  when "firstChild"
    first_child
  when "lastChild"
    last_child
  when "firstElementChild"
    first_element_child
  when "lastElementChild"
    last_element_child
  when "textContent"
    @__node__.text
  end
end

#append_child(child) ⇒ Object



53
54
55
56
57
58
# File 'lib/dommy/element.rb', line 53

def append_child(child)
  nodes = detach_dom_nodes(child)
  nodes.each { |n| @__node__.add_child(n) }
  @document.notify_child_list_mutation(target_node: @__node__, added_nodes: nodes, removed_nodes: [])
  child
end

#child_element_countObject



25
26
27
# File 'lib/dommy/element.rb', line 25

def child_element_count
  @__node__.element_children.size
end

#child_nodesObject



29
30
31
# File 'lib/dommy/element.rb', line 29

def child_nodes
  NodeList.new(@__node__.children.map { |n| @document.wrap_node(n) }.compact)
end

#childrenObject

Public Ruby API (DocumentFragment surface)



21
22
23
# File 'lib/dommy/element.rb', line 21

def children
  element_children
end

#extract_childrenObject



120
121
122
123
124
# File 'lib/dommy/element.rb', line 120

def extract_children
  nodes = @__node__.children.to_a
  nodes.each(&:unlink)
  nodes
end

#first_childObject



33
34
35
# File 'lib/dommy/element.rb', line 33

def first_child
  @document.wrap_node(@__node__.children.first)
end

#first_element_childObject



41
42
43
# File 'lib/dommy/element.rb', line 41

def first_element_child
  @document.wrap_node(@__node__.children.find(&:element?))
end

#get_element_by_id(id) ⇒ Object



72
73
74
75
76
# File 'lib/dommy/element.rb', line 72

def get_element_by_id(id)
  return nil if id.nil?

  @document.wrap_node(@__node__.at_css("##{id}"))
end

#last_childObject



37
38
39
# File 'lib/dommy/element.rb', line 37

def last_child
  @document.wrap_node(@__node__.children.last)
end

#last_element_childObject



45
46
47
# File 'lib/dommy/element.rb', line 45

def last_element_child
  @document.wrap_node(@__node__.element_children.last)
end

#query_selector(selector) ⇒ Object



60
61
62
63
64
# File 'lib/dommy/element.rb', line 60

def query_selector(selector)
  return nil if selector.nil? || selector.to_s.empty?

  @document.wrap_node(@__node__.at_css(selector.to_s))
end

#query_selector_all(selector) ⇒ Object



66
67
68
69
70
# File 'lib/dommy/element.rb', line 66

def query_selector_all(selector)
  return NodeList.new if selector.nil? || selector.to_s.empty?

  NodeList.new(@__node__.css(selector.to_s).map { |n| @document.wrap_node(n) }.compact)
end

#text_contentObject



49
50
51
# File 'lib/dommy/element.rb', line 49

def text_content
  @__node__.text
end