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.
Files changed (52) hide show
  1. data/MANIFEST +112 -0
  2. data/README +697 -0
  3. data/README.ja +789 -0
  4. data/Rakefile +34 -0
  5. data/ext/encoding.h +91 -0
  6. data/ext/xmlparser/mkrf_conf.rb +28 -0
  7. data/ext/xmlparser/xmlparser.c +2226 -0
  8. data/lib/sax.rb +1 -0
  9. data/lib/saxdriver.rb +1 -0
  10. data/lib/wget.rb +47 -0
  11. data/lib/xml/dom/builder-ja.rb +58 -0
  12. data/lib/xml/dom/builder.rb +310 -0
  13. data/lib/xml/dom/core.rb +3276 -0
  14. data/lib/xml/dom/digest.rb +94 -0
  15. data/lib/xml/dom/visitor.rb +182 -0
  16. data/lib/xml/dom2/attr.rb +213 -0
  17. data/lib/xml/dom2/cdatasection.rb +76 -0
  18. data/lib/xml/dom2/characterdata.rb +177 -0
  19. data/lib/xml/dom2/comment.rb +81 -0
  20. data/lib/xml/dom2/core.rb +19 -0
  21. data/lib/xml/dom2/document.rb +317 -0
  22. data/lib/xml/dom2/documentfragment.rb +82 -0
  23. data/lib/xml/dom2/documenttype.rb +102 -0
  24. data/lib/xml/dom2/dombuilder.rb +277 -0
  25. data/lib/xml/dom2/dombuilderfilter.rb +12 -0
  26. data/lib/xml/dom2/domentityresolver.rb +13 -0
  27. data/lib/xml/dom2/domentityresolverimpl.rb +37 -0
  28. data/lib/xml/dom2/domexception.rb +95 -0
  29. data/lib/xml/dom2/domimplementation.rb +61 -0
  30. data/lib/xml/dom2/dominputsource.rb +29 -0
  31. data/lib/xml/dom2/element.rb +533 -0
  32. data/lib/xml/dom2/entity.rb +110 -0
  33. data/lib/xml/dom2/entityreference.rb +107 -0
  34. data/lib/xml/dom2/namednodemap.rb +138 -0
  35. data/lib/xml/dom2/node.rb +587 -0
  36. data/lib/xml/dom2/nodelist.rb +231 -0
  37. data/lib/xml/dom2/notation.rb +86 -0
  38. data/lib/xml/dom2/processinginstruction.rb +155 -0
  39. data/lib/xml/dom2/text.rb +128 -0
  40. data/lib/xml/dom2/xpath.rb +398 -0
  41. data/lib/xml/encoding-ja.rb +42 -0
  42. data/lib/xml/parser.rb +13 -0
  43. data/lib/xml/parserns.rb +236 -0
  44. data/lib/xml/sax.rb +353 -0
  45. data/lib/xml/saxdriver.rb +370 -0
  46. data/lib/xml/xpath.rb +3284 -0
  47. data/lib/xml/xpath.ry +2352 -0
  48. data/lib/xmldigest.rb +1 -0
  49. data/lib/xmltree.rb +1 -0
  50. data/lib/xmltreebuilder.rb +1 -0
  51. data/lib/xmltreevisitor.rb +1 -0
  52. 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