xmlparser 0.6.81

Sign up to get free protection for your applications and to get access to all the features.
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