xmlparser 0.6.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MANIFEST +112 -0
- data/README +697 -0
- data/README.ja +789 -0
- data/Rakefile +34 -0
- data/ext/encoding.h +91 -0
- data/ext/xmlparser/mkrf_conf.rb +28 -0
- data/ext/xmlparser/xmlparser.c +2226 -0
- data/lib/sax.rb +1 -0
- data/lib/saxdriver.rb +1 -0
- data/lib/wget.rb +47 -0
- data/lib/xml/dom/builder-ja.rb +58 -0
- data/lib/xml/dom/builder.rb +310 -0
- data/lib/xml/dom/core.rb +3276 -0
- data/lib/xml/dom/digest.rb +94 -0
- data/lib/xml/dom/visitor.rb +182 -0
- data/lib/xml/dom2/attr.rb +213 -0
- data/lib/xml/dom2/cdatasection.rb +76 -0
- data/lib/xml/dom2/characterdata.rb +177 -0
- data/lib/xml/dom2/comment.rb +81 -0
- data/lib/xml/dom2/core.rb +19 -0
- data/lib/xml/dom2/document.rb +317 -0
- data/lib/xml/dom2/documentfragment.rb +82 -0
- data/lib/xml/dom2/documenttype.rb +102 -0
- data/lib/xml/dom2/dombuilder.rb +277 -0
- data/lib/xml/dom2/dombuilderfilter.rb +12 -0
- data/lib/xml/dom2/domentityresolver.rb +13 -0
- data/lib/xml/dom2/domentityresolverimpl.rb +37 -0
- data/lib/xml/dom2/domexception.rb +95 -0
- data/lib/xml/dom2/domimplementation.rb +61 -0
- data/lib/xml/dom2/dominputsource.rb +29 -0
- data/lib/xml/dom2/element.rb +533 -0
- data/lib/xml/dom2/entity.rb +110 -0
- data/lib/xml/dom2/entityreference.rb +107 -0
- data/lib/xml/dom2/namednodemap.rb +138 -0
- data/lib/xml/dom2/node.rb +587 -0
- data/lib/xml/dom2/nodelist.rb +231 -0
- data/lib/xml/dom2/notation.rb +86 -0
- data/lib/xml/dom2/processinginstruction.rb +155 -0
- data/lib/xml/dom2/text.rb +128 -0
- data/lib/xml/dom2/xpath.rb +398 -0
- data/lib/xml/encoding-ja.rb +42 -0
- data/lib/xml/parser.rb +13 -0
- data/lib/xml/parserns.rb +236 -0
- data/lib/xml/sax.rb +353 -0
- data/lib/xml/saxdriver.rb +370 -0
- data/lib/xml/xpath.rb +3284 -0
- data/lib/xml/xpath.ry +2352 -0
- data/lib/xmldigest.rb +1 -0
- data/lib/xmltree.rb +1 -0
- data/lib/xmltreebuilder.rb +1 -0
- data/lib/xmltreevisitor.rb +1 -0
- metadata +111 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
require 'xml/dom2/node'
|
7
|
+
require 'xml/dom2/domexception'
|
8
|
+
|
9
|
+
module XML
|
10
|
+
module DOM
|
11
|
+
|
12
|
+
=begin
|
13
|
+
== Class XML::DOM::Entity
|
14
|
+
|
15
|
+
=== superclass
|
16
|
+
Node
|
17
|
+
=end
|
18
|
+
class Entity<Node
|
19
|
+
|
20
|
+
=begin
|
21
|
+
=== Class Methods
|
22
|
+
|
23
|
+
--- Entity.new(name, pubid, sysid, notation)
|
24
|
+
|
25
|
+
creates a new Entity.
|
26
|
+
=end
|
27
|
+
def initialize(name, pubid, sysid, notation)
|
28
|
+
super()
|
29
|
+
@name = name.freeze
|
30
|
+
@pubid = pubid.freeze
|
31
|
+
@sysid = sysid.freeze
|
32
|
+
@notation = notation.freeze
|
33
|
+
end
|
34
|
+
|
35
|
+
=begin
|
36
|
+
=== Methods
|
37
|
+
|
38
|
+
--- Entity#nodeType
|
39
|
+
|
40
|
+
[DOM]
|
41
|
+
returns the nodeType.
|
42
|
+
=end
|
43
|
+
## [DOM]
|
44
|
+
def nodeType
|
45
|
+
ENTITY_NODE
|
46
|
+
end
|
47
|
+
|
48
|
+
=begin
|
49
|
+
--- Entity#nodeName
|
50
|
+
|
51
|
+
[DOM]
|
52
|
+
returns the nodeName.
|
53
|
+
=end
|
54
|
+
## [DOM]
|
55
|
+
def nodeName
|
56
|
+
@name
|
57
|
+
end
|
58
|
+
|
59
|
+
=begin
|
60
|
+
--- Entity#publicId
|
61
|
+
|
62
|
+
returns the publicId of the Entity.
|
63
|
+
=end
|
64
|
+
def publicId
|
65
|
+
@pubid
|
66
|
+
end
|
67
|
+
|
68
|
+
=begin
|
69
|
+
--- Entity#systemId
|
70
|
+
|
71
|
+
returns the systemId of the Entity.
|
72
|
+
=end
|
73
|
+
def systemId
|
74
|
+
@sysid
|
75
|
+
end
|
76
|
+
|
77
|
+
=begin
|
78
|
+
--- Entity#notationName
|
79
|
+
|
80
|
+
returns the notationname of the Entity.
|
81
|
+
=end
|
82
|
+
def notationName
|
83
|
+
@notation
|
84
|
+
end
|
85
|
+
|
86
|
+
=begin
|
87
|
+
--- Entity#cloneNode(deep = true)
|
88
|
+
|
89
|
+
[DOM]
|
90
|
+
returns the copy of the Entity.
|
91
|
+
=end
|
92
|
+
## [DOM]
|
93
|
+
def cloneNode(deep = true)
|
94
|
+
super(deep, @name, @pubid, @sysid, @notation)
|
95
|
+
end
|
96
|
+
|
97
|
+
def _checkNode(node)
|
98
|
+
unless node.nodeType == ELEMENT_NODE ||
|
99
|
+
node.nodeType == PROCESSING_INSTRUCTION_NODE ||
|
100
|
+
node.nodeType == COMMENT_NODE ||
|
101
|
+
node.nodeType == TEXT_NODE ||
|
102
|
+
node.nodeType == CDATA_SECTION_NODE ||
|
103
|
+
node.nodeType == ENTITY_REFERENCE_NODE
|
104
|
+
raise DOMException.new(DOMException::HIERARCHY_REQUEST_ERR)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
require 'xml/dom2/node'
|
7
|
+
require 'xml/dom2/domexception'
|
8
|
+
|
9
|
+
module XML
|
10
|
+
module DOM
|
11
|
+
|
12
|
+
=begin
|
13
|
+
== Class XML::DOM::EntityReference
|
14
|
+
|
15
|
+
=== superclass
|
16
|
+
Node
|
17
|
+
=end
|
18
|
+
class EntityReference<Node
|
19
|
+
|
20
|
+
=begin
|
21
|
+
=== Class Methods
|
22
|
+
|
23
|
+
--- EntityReference.new(name, *children)
|
24
|
+
|
25
|
+
creates a new EntityReference.
|
26
|
+
=end
|
27
|
+
def initialize(name, *children)
|
28
|
+
super(*children)
|
29
|
+
raise "parameter error" if !name
|
30
|
+
@name = name.freeze
|
31
|
+
@value = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
=begin
|
35
|
+
=== Methods
|
36
|
+
|
37
|
+
--- EntityReference#nodeType
|
38
|
+
|
39
|
+
[DOM]
|
40
|
+
returns the nodeType.
|
41
|
+
=end
|
42
|
+
## [DOM]
|
43
|
+
def nodeType
|
44
|
+
ENTITY_REFERENCE_NODE
|
45
|
+
end
|
46
|
+
|
47
|
+
=begin
|
48
|
+
--- EntityReference#nodeName
|
49
|
+
|
50
|
+
[DOM]
|
51
|
+
returns the nodeName.
|
52
|
+
=end
|
53
|
+
## [DOM]
|
54
|
+
def nodeName
|
55
|
+
@name
|
56
|
+
end
|
57
|
+
|
58
|
+
=begin
|
59
|
+
--- EntityReference#to_s
|
60
|
+
|
61
|
+
returns the string representation of the EntityReference.
|
62
|
+
=end
|
63
|
+
## reference form or expanded form?
|
64
|
+
def to_s
|
65
|
+
"&#{@name};"
|
66
|
+
end
|
67
|
+
|
68
|
+
=begin
|
69
|
+
--- EntityReference#dump(depth = 0)
|
70
|
+
|
71
|
+
dumps the EntityReference.
|
72
|
+
=end
|
73
|
+
def dump(depth = 0)
|
74
|
+
print ' ' * depth * 2
|
75
|
+
print "&#{@name}{\n"
|
76
|
+
@children.each do |child|
|
77
|
+
child.dump(depth + 1)
|
78
|
+
end if @children
|
79
|
+
print ' ' * depth * 2
|
80
|
+
print "}\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
=begin
|
84
|
+
--- EntityReference#cloneNode(deep = true)
|
85
|
+
|
86
|
+
[DOM]
|
87
|
+
returns the copy of the EntityReference.
|
88
|
+
=end
|
89
|
+
## [DOM]
|
90
|
+
def cloneNode(deep = true)
|
91
|
+
super(deep, @name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def _checkNode(node)
|
95
|
+
unless node.nodeType == ELEMENT_NODE ||
|
96
|
+
node.nodeType == PROCESSING_INSTRUCTION_NODE ||
|
97
|
+
node.nodeType == COMMENT_NODE ||
|
98
|
+
node.nodeType == TEXT_NODE ||
|
99
|
+
node.nodeType == CDATA_SECTION_NODE ||
|
100
|
+
node.nodeType == ENTITY_REFERENCE_NODE
|
101
|
+
raise DOMException.new(DOMException::HIERARCHY_REQUEST_ERR)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
module XML
|
7
|
+
module DOM
|
8
|
+
=begin
|
9
|
+
== Class XML::DOM::NamedNodeMap
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
class NamedNodeMap
|
14
|
+
|
15
|
+
=begin
|
16
|
+
=== Class Methods
|
17
|
+
|
18
|
+
--- NamedNodeMap.new(nodes = nil)
|
19
|
+
|
20
|
+
creates a new NamedNodeMap.
|
21
|
+
=end
|
22
|
+
def initialize(nodes = nil)
|
23
|
+
@nodes = {}
|
24
|
+
nodes.each do |node|
|
25
|
+
@nodes[node.nodeName] = node
|
26
|
+
end if nodes
|
27
|
+
end
|
28
|
+
|
29
|
+
=begin
|
30
|
+
=== Methods
|
31
|
+
|
32
|
+
--- NamedNodeMap#getNamedItem(name)
|
33
|
+
|
34
|
+
[DOM]
|
35
|
+
retrieves a node specified by name.
|
36
|
+
=end
|
37
|
+
## [DOM]
|
38
|
+
def getNamedItem(name)
|
39
|
+
@nodes[name]
|
40
|
+
end
|
41
|
+
|
42
|
+
=begin
|
43
|
+
--- NamedNodeMap#setNamedItem(node)
|
44
|
+
|
45
|
+
[DOM]
|
46
|
+
adds a node using its nodeName attribute.
|
47
|
+
=end
|
48
|
+
## [DOM]
|
49
|
+
def setNamedItem(node)
|
50
|
+
@nodes[node.nodeName] = node
|
51
|
+
end
|
52
|
+
|
53
|
+
=begin
|
54
|
+
--- NamedNodeMap#removeNamedItem(name)
|
55
|
+
|
56
|
+
[DOM]
|
57
|
+
removes a node specified by name.
|
58
|
+
=end
|
59
|
+
## [DOM]
|
60
|
+
def removeNamedItem(name)
|
61
|
+
ret = @nodes[name]
|
62
|
+
@nodes.delete(name)
|
63
|
+
ret
|
64
|
+
end
|
65
|
+
|
66
|
+
=begin
|
67
|
+
--- NamedNodeMap#item(index)
|
68
|
+
|
69
|
+
[DOM]
|
70
|
+
returns the index item in the map.
|
71
|
+
=end
|
72
|
+
## [DOM]
|
73
|
+
def item(index)
|
74
|
+
v = @nodes.to_a[index]
|
75
|
+
return v[1] if v
|
76
|
+
nil
|
77
|
+
end
|
78
|
+
|
79
|
+
=begin
|
80
|
+
--- NamedNodeMap#[](name)
|
81
|
+
|
82
|
+
returns nodes associated to name.
|
83
|
+
=end
|
84
|
+
def [](name)
|
85
|
+
@nodes[name]
|
86
|
+
end
|
87
|
+
|
88
|
+
=begin
|
89
|
+
--- NamedNodeMap#[]=(name, node)
|
90
|
+
|
91
|
+
sets node named name.
|
92
|
+
=end
|
93
|
+
def []=(name, node)
|
94
|
+
raise "parameter error" if node.nodeName != name
|
95
|
+
@nodes[name] = node
|
96
|
+
end
|
97
|
+
|
98
|
+
=begin
|
99
|
+
--- NamedNodeMap#each()
|
100
|
+
|
101
|
+
iterates over each pair of name and node(name, node) of the namedNodeMap.
|
102
|
+
=end
|
103
|
+
def each
|
104
|
+
@nodes.each do |key, value|
|
105
|
+
yield(value)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
=begin
|
110
|
+
--- NamedNodeMap#size()
|
111
|
+
|
112
|
+
[DOM]
|
113
|
+
returns the number of nodes in the map.
|
114
|
+
=end
|
115
|
+
## [DOM]
|
116
|
+
def size
|
117
|
+
@nodes.length
|
118
|
+
end
|
119
|
+
alias length size
|
120
|
+
|
121
|
+
## get nodeValues by names
|
122
|
+
## names ::= name ('|' name)*
|
123
|
+
def _getValues(names)
|
124
|
+
ret = []
|
125
|
+
names.split('|').each do |name|
|
126
|
+
if !@nodes[name].nil?
|
127
|
+
ret.push(@nodes[name].nodeValue)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
ret
|
131
|
+
end
|
132
|
+
|
133
|
+
## [DOM2]
|
134
|
+
## def getNamedItemNS(nsuri, localname); end
|
135
|
+
## def removeNamedItemNS(nsuri, localname); end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,587 @@
|
|
1
|
+
## -*- Ruby -*-
|
2
|
+
## XML::DOM
|
3
|
+
## 1998-2001 by yoshidam
|
4
|
+
##
|
5
|
+
|
6
|
+
require 'xml/dom2/domexception'
|
7
|
+
require 'xml/dom2/nodelist'
|
8
|
+
|
9
|
+
module XML
|
10
|
+
module DOM
|
11
|
+
|
12
|
+
=begin
|
13
|
+
== Class XML::DOM::Node
|
14
|
+
|
15
|
+
=end
|
16
|
+
class Node
|
17
|
+
## [DOM]
|
18
|
+
NODE_NODE = 0
|
19
|
+
ELEMENT_NODE = 1
|
20
|
+
ATTRIBUTE_NODE = 2
|
21
|
+
TEXT_NODE = 3
|
22
|
+
CDATA_SECTION_NODE = 4
|
23
|
+
ENTITY_REFERENCE_NODE = 5
|
24
|
+
ENTITY_NODE = 6
|
25
|
+
PROCESSING_INSTRUCTION_NODE = 7
|
26
|
+
COMMENT_NODE = 8
|
27
|
+
DOCUMENT_NODE = 9
|
28
|
+
DOCUMENT_TYPE_NODE = 10
|
29
|
+
DOCUMENT_FRAGMENT_NODE = 11
|
30
|
+
NOTATION_NODE = 12
|
31
|
+
|
32
|
+
## non-DOM
|
33
|
+
# NODE = 0
|
34
|
+
# ELEMENT = 1
|
35
|
+
# ATTRIBUTE = 2
|
36
|
+
# TEXT = 3
|
37
|
+
# CDATA_SECTION = 4
|
38
|
+
# ENTITY_REFERENCE = 5
|
39
|
+
# ENTITY = 6
|
40
|
+
# PI = 7
|
41
|
+
# PROCESSING_INSTRUCTION = 7
|
42
|
+
# COMMENT = 8
|
43
|
+
# DOCUMENT = 9
|
44
|
+
# DOCUMENT_TYPE = 10
|
45
|
+
# DOCUMENT_FRAGMENT = 11
|
46
|
+
# NOTATION = 12
|
47
|
+
|
48
|
+
=begin
|
49
|
+
=== Class Methods
|
50
|
+
|
51
|
+
--- Node.new(*children)
|
52
|
+
|
53
|
+
make a Node.
|
54
|
+
children is a Array of child, or sequence of child.
|
55
|
+
child is a String or Node.
|
56
|
+
|
57
|
+
=end
|
58
|
+
## new([child1, child2, ...]) or
|
59
|
+
## new(child1, child2, ...)
|
60
|
+
## child?: String or Node
|
61
|
+
def initialize(*children)
|
62
|
+
@ownerDocument = nil
|
63
|
+
@parent = nil
|
64
|
+
@children = nil
|
65
|
+
self.childNodes = children if children.length > 0
|
66
|
+
end
|
67
|
+
|
68
|
+
=begin
|
69
|
+
=== Methods
|
70
|
+
|
71
|
+
--- Node#parentNode
|
72
|
+
|
73
|
+
[DOM]
|
74
|
+
return parent node.
|
75
|
+
|
76
|
+
=end
|
77
|
+
## [DOM]
|
78
|
+
def parentNode
|
79
|
+
@parent
|
80
|
+
end
|
81
|
+
|
82
|
+
=begin
|
83
|
+
--- Node#parentNode=(p)
|
84
|
+
|
85
|
+
set node p as parent.
|
86
|
+
=end
|
87
|
+
|
88
|
+
def parentNode=(p)
|
89
|
+
@parent = p
|
90
|
+
end
|
91
|
+
|
92
|
+
=begin
|
93
|
+
--- Node#nodeType
|
94
|
+
|
95
|
+
[DOM]
|
96
|
+
return nodetype.
|
97
|
+
|
98
|
+
=end
|
99
|
+
## [DOM]
|
100
|
+
def nodeType
|
101
|
+
NODE_NODE
|
102
|
+
end
|
103
|
+
|
104
|
+
=begin
|
105
|
+
--- Node#nodeName
|
106
|
+
|
107
|
+
[DOM]
|
108
|
+
return nodename.
|
109
|
+
|
110
|
+
=end
|
111
|
+
## [DOM]
|
112
|
+
def nodeName
|
113
|
+
"#node"
|
114
|
+
end
|
115
|
+
|
116
|
+
# def nodeName=(p)
|
117
|
+
# @name = p
|
118
|
+
# end
|
119
|
+
|
120
|
+
=begin
|
121
|
+
--- Node#nodeValue
|
122
|
+
|
123
|
+
[DOM]
|
124
|
+
return nodevalue.
|
125
|
+
|
126
|
+
=end
|
127
|
+
## [DOM]
|
128
|
+
def nodeValue; nil; end
|
129
|
+
|
130
|
+
=begin
|
131
|
+
--- Node#nodeValue=(p)
|
132
|
+
|
133
|
+
[DOM]
|
134
|
+
set nodevalue as p.
|
135
|
+
=end
|
136
|
+
## [DOM]
|
137
|
+
def nodeValue=(p)
|
138
|
+
## no effect
|
139
|
+
end
|
140
|
+
|
141
|
+
=begin
|
142
|
+
--- Node#childNodes()
|
143
|
+
|
144
|
+
[DOM]
|
145
|
+
if method has block, apply block for children nodes.
|
146
|
+
without block, return children nodelist.
|
147
|
+
=end
|
148
|
+
## [DOM]
|
149
|
+
def childNodes
|
150
|
+
if iterator?
|
151
|
+
@children.each do |child|
|
152
|
+
yield(child)
|
153
|
+
end if @children
|
154
|
+
else
|
155
|
+
return @children if !@children.nil?
|
156
|
+
@children = NodeList.new
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def childNodes=(p)
|
161
|
+
if p.nil? || (p.is_a?(Array) && p.length == 0)
|
162
|
+
return
|
163
|
+
end
|
164
|
+
if @children.nil?
|
165
|
+
@children = NodeList.new
|
166
|
+
else
|
167
|
+
@children.to_a.clear
|
168
|
+
end
|
169
|
+
p.flatten!
|
170
|
+
p.each do |child|
|
171
|
+
if child.is_a?(String)
|
172
|
+
c = Text.new(child)
|
173
|
+
@children.push(c)
|
174
|
+
c.parentNode = self
|
175
|
+
elsif child.is_a?(Node)
|
176
|
+
@children.push(child)
|
177
|
+
child.parentNode = self
|
178
|
+
else
|
179
|
+
raise "parameter error"
|
180
|
+
end
|
181
|
+
end if p
|
182
|
+
end
|
183
|
+
|
184
|
+
=begin
|
185
|
+
--- Node#attributes
|
186
|
+
|
187
|
+
[DOM]
|
188
|
+
return attributes of node(but always return nil?).
|
189
|
+
=end
|
190
|
+
## [DOM]
|
191
|
+
def attributes
|
192
|
+
nil
|
193
|
+
end
|
194
|
+
|
195
|
+
## proper parameter type?
|
196
|
+
# def attributes=(p)
|
197
|
+
# end
|
198
|
+
|
199
|
+
=begin
|
200
|
+
--- Node#[]=(index, nodes)
|
201
|
+
|
202
|
+
set children node as nodes with []-style.
|
203
|
+
=end
|
204
|
+
def []=(index, nodes)
|
205
|
+
@children[index..index] = nodes
|
206
|
+
@children.each do |child|
|
207
|
+
child.parentNode = self
|
208
|
+
end if @children
|
209
|
+
end
|
210
|
+
|
211
|
+
=begin
|
212
|
+
--- Node#[](index)
|
213
|
+
|
214
|
+
get children node with []-style.
|
215
|
+
=end
|
216
|
+
def [](index)
|
217
|
+
@children[index]
|
218
|
+
end
|
219
|
+
|
220
|
+
=begin
|
221
|
+
--- Node#+(node)
|
222
|
+
|
223
|
+
concat node to Node.
|
224
|
+
=end
|
225
|
+
def +(node)
|
226
|
+
[self, node]
|
227
|
+
end
|
228
|
+
|
229
|
+
=begin
|
230
|
+
--- Node#to_s
|
231
|
+
|
232
|
+
returns the string representation of the Node.
|
233
|
+
=end
|
234
|
+
def to_s
|
235
|
+
@children.to_s
|
236
|
+
end
|
237
|
+
|
238
|
+
=begin
|
239
|
+
--- Node#dump(depth = 0)
|
240
|
+
|
241
|
+
dump the Node.
|
242
|
+
=end
|
243
|
+
def dump(depth = 0)
|
244
|
+
print ' ' * depth * 2
|
245
|
+
print nodeName + "\n"
|
246
|
+
@children.each do |child|
|
247
|
+
child.dump(depth + 1)
|
248
|
+
end if @children
|
249
|
+
end
|
250
|
+
|
251
|
+
=begin
|
252
|
+
--- Node#inspect()
|
253
|
+
|
254
|
+
returns the human-readable string representation.
|
255
|
+
=end
|
256
|
+
def inspect
|
257
|
+
"#<#{self.class}: #{self.nodeName}>"
|
258
|
+
end
|
259
|
+
|
260
|
+
=begin
|
261
|
+
--- Node#firstChild()
|
262
|
+
|
263
|
+
[DOM]
|
264
|
+
return the first child node.
|
265
|
+
=end
|
266
|
+
## [DOM]
|
267
|
+
def firstChild
|
268
|
+
return nil if !@children || @children.length == 0
|
269
|
+
return @children[0]
|
270
|
+
end
|
271
|
+
|
272
|
+
=begin
|
273
|
+
--- Node#lastChild()
|
274
|
+
|
275
|
+
[DOM]
|
276
|
+
return the last child node.
|
277
|
+
=end
|
278
|
+
## [DOM]
|
279
|
+
def lastChild
|
280
|
+
return nil if !@children || @children.length == 0
|
281
|
+
return @children[-1]
|
282
|
+
end
|
283
|
+
|
284
|
+
=begin
|
285
|
+
--- Node#previousSibling()
|
286
|
+
|
287
|
+
[DOM]
|
288
|
+
return the previous sibling node.
|
289
|
+
=end
|
290
|
+
## [DOM]
|
291
|
+
def previousSibling
|
292
|
+
return nil if !@parent
|
293
|
+
prev = nil
|
294
|
+
@parent.childNodes do |child|
|
295
|
+
return prev if child == self
|
296
|
+
prev = child
|
297
|
+
end
|
298
|
+
nil
|
299
|
+
end
|
300
|
+
|
301
|
+
=begin
|
302
|
+
--- Node#nextSibling()
|
303
|
+
|
304
|
+
[DOM]
|
305
|
+
return the next sibling node.
|
306
|
+
=end
|
307
|
+
## [DOM]
|
308
|
+
def nextSibling
|
309
|
+
return nil if !@parent
|
310
|
+
nexts = nil
|
311
|
+
@parent.childNodes.reverse.each do |child|
|
312
|
+
return nexts if child == self
|
313
|
+
nexts = child
|
314
|
+
end
|
315
|
+
nil
|
316
|
+
end
|
317
|
+
|
318
|
+
def _getChildIndex(node)
|
319
|
+
index = 0
|
320
|
+
@children.each do |child|
|
321
|
+
if child == node
|
322
|
+
return index
|
323
|
+
end
|
324
|
+
index += 1
|
325
|
+
end
|
326
|
+
nil
|
327
|
+
end
|
328
|
+
|
329
|
+
def _removeFromTree
|
330
|
+
parent = parentNode
|
331
|
+
if parent
|
332
|
+
parent.removeChild(self)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def _checkNode(node)
|
337
|
+
raise DOMException.new(DOMException::HIERARCHY_REQUEST_ERR)
|
338
|
+
end
|
339
|
+
|
340
|
+
def _insertNodes(index, node)
|
341
|
+
if node.nodeType == DOCUMENT_FRAGMENT_NODE
|
342
|
+
|
343
|
+
node.childNodes.to_a.each_with_index do |n, i|
|
344
|
+
if index == -1
|
345
|
+
_insertNodes(-1, n)
|
346
|
+
else
|
347
|
+
_insertNodes(index + i, n)
|
348
|
+
end
|
349
|
+
end
|
350
|
+
elsif node.is_a?(Node)
|
351
|
+
## to be checked
|
352
|
+
_checkNode(node)
|
353
|
+
node._removeFromTree
|
354
|
+
if index == -1
|
355
|
+
@children.push(node)
|
356
|
+
else
|
357
|
+
@children[index, 0] = node
|
358
|
+
end
|
359
|
+
node.parentNode = self
|
360
|
+
else
|
361
|
+
raise ArgumentError, "invalid value for Node"
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
def _removeNode(index, node)
|
366
|
+
@children[index, 1] = nil
|
367
|
+
node.parentNode = nil
|
368
|
+
end
|
369
|
+
|
370
|
+
# =begin
|
371
|
+
# --- Node#insertAfter(newChild, refChild)
|
372
|
+
#
|
373
|
+
# insert newChild into the node after refChild.
|
374
|
+
# =end
|
375
|
+
# def insertAfter(newChild, refChild)
|
376
|
+
# if @children.nil? || @children.length == 0
|
377
|
+
# raise DOMException.new(DOMException::NOT_FOUND_ERR)
|
378
|
+
# end
|
379
|
+
# index = _getChildIndex(refChild)
|
380
|
+
# raise DOMException.new(DOMException::NOT_FOUND_ERR) if index.nil?
|
381
|
+
# _insertNodes(index + 1, newChild)
|
382
|
+
# end
|
383
|
+
|
384
|
+
=begin
|
385
|
+
--- Node#insertBefore(newChild, refChild)
|
386
|
+
|
387
|
+
[DOM]
|
388
|
+
insert newChild into the node before refChild.
|
389
|
+
=end
|
390
|
+
## [DOM]
|
391
|
+
def insertBefore(newChild, refChild)
|
392
|
+
if @children.nil? || @children.length == 0
|
393
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR)
|
394
|
+
end
|
395
|
+
index = _getChildIndex(refChild)
|
396
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR) if !index
|
397
|
+
_insertNodes(index, newChild)
|
398
|
+
end
|
399
|
+
|
400
|
+
=begin
|
401
|
+
--- Node#replaceChild(newChild, oldChild)
|
402
|
+
|
403
|
+
[DOM]
|
404
|
+
replace the child node oldChild with newChild.
|
405
|
+
=end
|
406
|
+
## [DOM]
|
407
|
+
def replaceChild(newChild, oldChild)
|
408
|
+
if @children.nil? || @children.length == 0
|
409
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR)
|
410
|
+
end
|
411
|
+
index = _getChildIndex(oldChild)
|
412
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR) if !index
|
413
|
+
_removeNode(index, oldChild)
|
414
|
+
_insertNodes(index, newChild)
|
415
|
+
end
|
416
|
+
|
417
|
+
=begin
|
418
|
+
--- Node#removeChild(oldChild)
|
419
|
+
|
420
|
+
[DOM]
|
421
|
+
remove the children node oldChild.
|
422
|
+
=end
|
423
|
+
## [DOM]
|
424
|
+
def removeChild(oldChild)
|
425
|
+
if @children.nil? || @children.length == 0
|
426
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR)
|
427
|
+
end
|
428
|
+
index = _getChildIndex(oldChild)
|
429
|
+
raise DOMException.new(DOMException::NOT_FOUND_ERR) if !index
|
430
|
+
_removeNode(index, oldChild)
|
431
|
+
oldChild
|
432
|
+
end
|
433
|
+
|
434
|
+
=begin
|
435
|
+
--- Node#appendChild(newChild)
|
436
|
+
|
437
|
+
[DOM]
|
438
|
+
adds the node newChild to the end of the list of children of this node.
|
439
|
+
=end
|
440
|
+
## [DOM]
|
441
|
+
def appendChild(newChild)
|
442
|
+
@children = NodeList.new if !@children
|
443
|
+
_insertNodes(-1, newChild)
|
444
|
+
end
|
445
|
+
|
446
|
+
=begin
|
447
|
+
--- Node#hasChildNodes()
|
448
|
+
|
449
|
+
[DOM]
|
450
|
+
returns true if node has children, or return false if node has no children.
|
451
|
+
=end
|
452
|
+
## [DOM]
|
453
|
+
def hasChildNodes
|
454
|
+
!@children.nil? && @children.length > 0
|
455
|
+
end
|
456
|
+
|
457
|
+
=begin
|
458
|
+
--- Node#ownerDocument()
|
459
|
+
|
460
|
+
[DOM]
|
461
|
+
Document object associated with this node.
|
462
|
+
=end
|
463
|
+
## [DOM]
|
464
|
+
def ownerDocument; @ownerDocument; end
|
465
|
+
|
466
|
+
def ownerDocument=(document); @ownerDocument = document; end
|
467
|
+
|
468
|
+
=begin
|
469
|
+
--- Node#cloneNode()
|
470
|
+
|
471
|
+
[DOM]
|
472
|
+
return the copy of the Node.
|
473
|
+
=end
|
474
|
+
## [DOM]
|
475
|
+
def cloneNode(deep = true, *args)
|
476
|
+
ret = self.class.new(*args)
|
477
|
+
if (deep)
|
478
|
+
@children.each do |child|
|
479
|
+
ret.appendChild(child.cloneNode(true))
|
480
|
+
end
|
481
|
+
end if @children
|
482
|
+
ret
|
483
|
+
end
|
484
|
+
|
485
|
+
=begin
|
486
|
+
--- Node#trim(preserve = false)
|
487
|
+
|
488
|
+
trim extra whitespaces.
|
489
|
+
=end
|
490
|
+
## trim extra whitespaces
|
491
|
+
def trim(preserve = false)
|
492
|
+
return nil if @children.nil?
|
493
|
+
children = @children.to_a.dup
|
494
|
+
children.each do |child|
|
495
|
+
if !preserve && (child.nodeType == TEXT_NODE ||
|
496
|
+
child.nodeType == CDATA_SECTION_NODE)
|
497
|
+
if child.trim == ""
|
498
|
+
self.removeChild(child)
|
499
|
+
end
|
500
|
+
else
|
501
|
+
child.trim(preserve)
|
502
|
+
end
|
503
|
+
end
|
504
|
+
nil
|
505
|
+
end
|
506
|
+
|
507
|
+
|
508
|
+
## [DOM2]
|
509
|
+
def isSupported(feature, version)
|
510
|
+
if (feature =~ /^XML$/i || feature =~ /^Core$/i) &&
|
511
|
+
(version.nil? || version == "1.0" || version == "2.0")
|
512
|
+
return true
|
513
|
+
end
|
514
|
+
false
|
515
|
+
end
|
516
|
+
|
517
|
+
## [DOM2]
|
518
|
+
def namespaceURI; nil; end
|
519
|
+
|
520
|
+
## [DOM2]
|
521
|
+
def prefix; nil; end
|
522
|
+
|
523
|
+
## [DOM2]
|
524
|
+
def prefix=(prefix);
|
525
|
+
## no effect
|
526
|
+
end
|
527
|
+
|
528
|
+
## [DOM2]
|
529
|
+
def localname; nil; end
|
530
|
+
|
531
|
+
## [DOM2]
|
532
|
+
def hasAttributes(); false; end
|
533
|
+
|
534
|
+
|
535
|
+
include Enumerable
|
536
|
+
def each
|
537
|
+
sibstack = []
|
538
|
+
siblings = [ self ]
|
539
|
+
while true
|
540
|
+
if siblings.length == 0
|
541
|
+
break if sibstack.length == 0
|
542
|
+
siblings = sibstack.pop
|
543
|
+
next
|
544
|
+
end
|
545
|
+
node = siblings.shift
|
546
|
+
yield(node)
|
547
|
+
children = node.childNodes
|
548
|
+
if !children.nil?
|
549
|
+
sibstack.push(siblings)
|
550
|
+
siblings = children.to_a.dup
|
551
|
+
end
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
include Comparable
|
556
|
+
|
557
|
+
def ==(node)
|
558
|
+
equal?(node)
|
559
|
+
end
|
560
|
+
|
561
|
+
def <=>(node)
|
562
|
+
ancestors1 = [self]
|
563
|
+
ancestors2 = [node]
|
564
|
+
p = self
|
565
|
+
while p = p.parentNode
|
566
|
+
ancestors1.unshift(p)
|
567
|
+
end
|
568
|
+
p = node
|
569
|
+
while p = p.parentNode
|
570
|
+
ancestors2.unshift(p)
|
571
|
+
end
|
572
|
+
raise "different document" unless ancestors1[0].equal?(ancestors2[0])
|
573
|
+
ret = 0
|
574
|
+
i = 0
|
575
|
+
for i in 1...ancestors1.size
|
576
|
+
next if ancestors1[i].equal?(ancestors2[i])
|
577
|
+
return 1 if ancestors2[i].nil?
|
578
|
+
children = ancestors1[i - 1].childNodes.to_a
|
579
|
+
return children.index(ancestors1[i]) - children.index(ancestors2[i])
|
580
|
+
end
|
581
|
+
return -1 if ancestors2.size > i + 1
|
582
|
+
0
|
583
|
+
end
|
584
|
+
|
585
|
+
end
|
586
|
+
end
|
587
|
+
end
|