Class: Dommy::Fragment

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

Constant Summary collapse

JS_METHOD_NAMES =

Methods routed through js_call (keep in sync with its when-arms).

%w[cloneNode querySelector querySelectorAll getElementById appendChild].freeze

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

#__internal_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.



16
17
18
19
# File 'lib/dommy/element.rb', line 16

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

Instance Attribute Details

#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

#__dommy_backend_node__Object



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

def __dommy_backend_node__ = @__node__

#__js_call__(method, args) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/dommy/element.rb', line 109

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



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

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

#__js_method_names__Object



105
106
107
# File 'lib/dommy/element.rb', line 105

def __js_method_names__
  JS_METHOD_NAMES
end

#append_child(child) ⇒ Object



55
56
57
58
59
60
# File 'lib/dommy/element.rb', line 55

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



27
28
29
# File 'lib/dommy/element.rb', line 27

def child_element_count
  @__node__.element_children.size
end

#child_nodesObject



31
32
33
# File 'lib/dommy/element.rb', line 31

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

#childrenObject

Public Ruby API (DocumentFragment surface)



23
24
25
# File 'lib/dommy/element.rb', line 23

def children
  element_children
end

#extract_childrenObject



128
129
130
131
132
# File 'lib/dommy/element.rb', line 128

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

#first_childObject



35
36
37
# File 'lib/dommy/element.rb', line 35

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

#first_element_childObject



43
44
45
# File 'lib/dommy/element.rb', line 43

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

#get_element_by_id(id) ⇒ Object



74
75
76
77
78
# File 'lib/dommy/element.rb', line 74

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

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

#last_childObject



39
40
41
# File 'lib/dommy/element.rb', line 39

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

#last_element_childObject



47
48
49
# File 'lib/dommy/element.rb', line 47

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

#query_selector(selector) ⇒ Object



62
63
64
65
66
# File 'lib/dommy/element.rb', line 62

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



68
69
70
71
72
# File 'lib/dommy/element.rb', line 68

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



51
52
53
# File 'lib/dommy/element.rb', line 51

def text_content
  @__node__.text
end