vcdom 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/lib/vcdom/attr.rb +70 -0
  2. data/lib/vcdom/attr_node_map.rb +30 -0
  3. data/lib/vcdom/attr_ns.rb +38 -0
  4. data/lib/vcdom/character_data.rb +22 -0
  5. data/lib/vcdom/child.rb +53 -0
  6. data/lib/vcdom/document.rb +126 -0
  7. data/lib/vcdom/element.rb +332 -0
  8. data/lib/vcdom/element_ns.rb +44 -0
  9. data/lib/vcdom/node.rb +278 -0
  10. data/lib/vcdom/node_list.rb +32 -0
  11. data/lib/vcdom/parent.rb +126 -0
  12. data/lib/vcdom/text.rb +23 -0
  13. data/lib/vcdom/xml_parser.rb +368 -0
  14. data/lib/vcdom/xml_serializer.rb +55 -0
  15. metadata +48 -81
  16. data/History.txt +0 -4
  17. data/Manifest.txt +0 -34
  18. data/PostInstall.txt +0 -7
  19. data/README.rdoc +0 -51
  20. data/Rakefile +0 -26
  21. data/lib/vcdom/minidom/attr.rb +0 -139
  22. data/lib/vcdom/minidom/attr_ns.rb +0 -47
  23. data/lib/vcdom/minidom/cdata_section.rb +0 -34
  24. data/lib/vcdom/minidom/character_data.rb +0 -263
  25. data/lib/vcdom/minidom/comment.rb +0 -34
  26. data/lib/vcdom/minidom/document.rb +0 -245
  27. data/lib/vcdom/minidom/dom_exception.rb +0 -51
  28. data/lib/vcdom/minidom/dom_implementation.rb +0 -214
  29. data/lib/vcdom/minidom/element.rb +0 -512
  30. data/lib/vcdom/minidom/element_ns.rb +0 -42
  31. data/lib/vcdom/minidom/mini_parser.rb +0 -9
  32. data/lib/vcdom/minidom/mini_serializer.rb +0 -118
  33. data/lib/vcdom/minidom/minidom_standard_error.rb +0 -9
  34. data/lib/vcdom/minidom/mod_child_node.rb +0 -51
  35. data/lib/vcdom/minidom/mod_elements_getter.rb +0 -49
  36. data/lib/vcdom/minidom/mod_namespaceuri_manageable.rb +0 -152
  37. data/lib/vcdom/minidom/mod_parent_node.rb +0 -307
  38. data/lib/vcdom/minidom/named_node_map_attr.rb +0 -277
  39. data/lib/vcdom/minidom/node.rb +0 -178
  40. data/lib/vcdom/minidom/node_list.rb +0 -41
  41. data/lib/vcdom/minidom/text.rb +0 -77
  42. data/lib/vcdom/minidom/xml_reg_exp.rb +0 -39
  43. data/lib/vcdom/minidom.rb +0 -9
  44. data/lib/vcdom.rb +0 -6
  45. data/script/console +0 -10
  46. data/script/destroy +0 -14
  47. data/script/generate +0 -14
  48. data/test/test_helper.rb +0 -3
  49. data/test/test_vcdom.rb +0 -11
@@ -1,9 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- module VCDOM
4
- module MiniDOM
5
- class MiniDOMStandardError < StandardError
6
-
7
- end
8
- end
9
- end
@@ -1,51 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require "vcdom/minidom/mod_parent_node"
4
-
5
- module VCDOM
6
- module MiniDOM
7
- module ModChildNode
8
-
9
- # Attr, Document, DocumentFragment, Entity, Notation 以外のクラスに Mixed-in される
10
-
11
- include ModParentNode::ParentNodeManageable
12
-
13
- # parentNode of type Node, readonly
14
- # The parent of this node.
15
- # All nodes, except Attr, Document, DocumentFragment, Entity, and Notation may
16
- # have a parent.
17
- # However, if a node has just been created and not yet added to the tree,
18
- # or if it has been removed from the tree, this is null.
19
- def parent_node
20
- return @parent_node
21
- end
22
-
23
- # previousSibling of type Node, readonly
24
- # The node immediately preceding this node.
25
- # If there is no such node, this returns null.
26
- def previous_sibling
27
- if ! @parent_node.nil? then
28
- if idx = @parent_node.get_index_of( self ) then
29
- return @parent_node.child_nodes.item( idx - 1 )
30
- end
31
- end
32
- return nil
33
- end
34
- # nextSibling of type Node, readonly
35
- # The node immediately following this node. If there is no such node, this returns null.
36
- def next_sibling
37
- if ! @parent_node.nil? then
38
- if idx = @parent_node.get_index_of( self ) then
39
- return @parent_node.child_nodes.item( idx + 1 )
40
- end
41
- end
42
- return nil
43
- end
44
-
45
- def init_mod_child_node()
46
- @parent_node = nil
47
- end
48
-
49
- end
50
- end
51
- end
@@ -1,49 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require "vcdom/minidom/node_list"
4
-
5
- module VCDOM
6
- module MiniDOM
7
- module ModElementsGetter
8
-
9
- # Document, Element に Mixed-in
10
-
11
- def get_elements_by_tagname( tagname )
12
- list = []
13
- _add_matched_descendant_elems_to_list( self, list, tagname )
14
- return NodeList.new( list )
15
- end
16
-
17
- def get_elements_by_tagname_ns( namespace_uri, local_name )
18
- list = []
19
- _add_matched_descendant_elems_to_list_ns( self, list, namespace_uri, local_name )
20
- return NodeList.new( list )
21
- end
22
-
23
- private
24
- def _add_matched_descendant_elems_to_list( elem, list, tagname )
25
- elem.child_nodes.each do |item|
26
- if item.node_type == Node::ELEMENT_NODE and
27
- ( tagname == '*' or item.tagname == tagname ) then
28
- list << item
29
- end
30
- _add_matched_descendant_elems_to_list( item, list, tagname )
31
- end
32
- end
33
- def _add_matched_descendant_elems_to_list_ns( elem, list, namespace_uri, local_name )
34
- elem.child_nodes.each do |item|
35
- if item.node_type == Node::ELEMENT_NODE then
36
- if namespace_uri == '*' or ( namespace_uri.nil? and item.namespace_uri.nil? ) or
37
- namespace_uri == item.namespace_uri then
38
- if local_name == '*' or local_name == item.local_name then
39
- list << item
40
- end
41
- end
42
- end
43
- _add_matched_descendant_elems_to_list_ns( item, list, namespace_uri, local_name )
44
- end
45
- end
46
-
47
- end
48
- end
49
- end
@@ -1,152 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- module VCDOM
4
- module MiniDOM
5
- module ModNamespaceURIManageable
6
-
7
- # namespaceURI of type DOMString, readonly, introduced in DOM Level 2
8
- # The namespace URI of this node, or null if it is unspecified (see XML Namespaces).
9
- # This is not a computed value that is the result of a namespace lookup based on
10
- # an examination of the namespace declarations in scope.
11
- # It is merely the namespace URI given at creation time.
12
- # For nodes of any type other than ELEMENT_NODE and ATTRIBUTE_NODE and
13
- # nodes created with a DOM Level 1 method, such as Document.createElement(),
14
- # this is always null.
15
- #
16
- # Note: Per the Namespaces in XML Specification [XML Namespaces] an attribute
17
- # does not inherit its namespace from the element it is attached to.
18
- # If an attribute is not explicitly given a namespace, it simply has
19
- # no namespace.
20
- def namespace_uri
21
- return @namespace_uri
22
- end
23
-
24
- # localName of type DOMString, readonly, introduced in DOM Level 2
25
- # Returns the local part of the qualified name of this node.
26
- # For nodes of any type other than ELEMENT_NODE and ATTRIBUTE_NODE and nodes
27
- # created with a DOM Level 1 method, such as Document.createElement(),
28
- # this is always null.
29
- def local_name
30
- qname_arr = self.node_name.split(/:/u)
31
- return qname_arr[-1]
32
- end
33
-
34
- # prefix of type DOMString, introduced in DOM Level 2
35
- # The namespace prefix of this node, or null if it is unspecified.
36
- # #=> このノードの名前空間接頭辞, または null (指定されていない場合) です.
37
- # When it is defined to be null, setting it has no effect, including if the node is read-only.
38
- # #=> null と明示されている場合, およびノードが読み取り専用の場合は, 値の代入は何の効果もありません.
39
- # Note that setting this attribute, when permitted, changes the nodeName attribute,
40
- # which holds the qualified name, as well as the tagName and name attributes of the Element
41
- # and Attr interfaces, when applicable.
42
- # #=> (代入可能な場合に) 値の代入を行うと, nodeName 属性 (qualified name を保持している) が変化します.
43
- # #=> Element インターフェイスの tagName 属性や Attr インターフェイスの name 属性も同様です. (それらに応用可能な場合)
44
- # Setting the prefix to null makes it unspecified, setting it to an empty string is implementation dependent.
45
- # Note also that changing the prefix of an attribute that is known to have a default value,
46
- # does not make a new attribute with the default value and the original prefix appear,
47
- # since the namespaceURI and localName do not change.
48
- # For nodes of any type other than ELEMENT_NODE and ATTRIBUTE_NODE and nodes created
49
- # with a DOM Level 1 method, such as createElement from the Document interface, this is always null.
50
- #
51
- # Exceptions on setting
52
- # DOMException
53
- # INVALID_CHARACTER_ERR:
54
- # Raised if the specified prefix contains an illegal character according to the XML version
55
- # in use specified in the Document.xmlVersion attribute.
56
- # NO_MODIFICATION_ALLOWED_ERR:
57
- # Raised if this node is readonly.
58
- # NAMESPACE_ERR:
59
- # Raised if the specified prefix is malformed per the Namespaces in XML specification,
60
- # if the namespaceURI of this node is null, if the specified prefix is "xml" and
61
- # the namespaceURI of this node is different from "http://www.w3.org/XML/1998/namespace",
62
- # if this node is an attribute and the specified prefix is "xmlns" and
63
- # the namespaceURI of this node is different from "http://www.w3.org/2000/xmlns/",
64
- # or if this node is an attribute and the qualifiedName of this node is "xmlns" [XML Namespaces].
65
- def prefix
66
- qname_arr = self.node_name.split(/:/u)
67
- return qname_arr[-2]
68
- end
69
- def prefix=( value )
70
- if self.is_readonly then
71
- raise DOMException.new( DOMException::NO_MODIFICATION_ALLOWED_ERR,
72
- 'This node is readonly.' )
73
- end
74
- unless value.nil? or value.is_a? String then
75
- begin
76
- value = value.to_str()
77
- rescue
78
- raise TypeError.new( 'The argument value must be String object or nil.' )
79
- end
80
- end
81
- if value.nil? or value.length == 0 then
82
- self.node_name = self.local_name
83
- end
84
- if XMLRegExp::NCNAME =~ value then
85
- if self.namespace_uri.nil? then
86
- raise DOMException.new( DOMException::NAMESPACE_ERR,
87
- 'The namespace URI of this node is null, so an prefix can\'t be set.' )
88
- end
89
- if value == "xml" and self.namespace_uri != "http://www.w3.org/XML/1998/namespace" then
90
- raise DOMException.new( DOMException::NAMESPACE_ERR,
91
- 'The specified prefix is "xml" and the namespace URI of this node is different from "http://www.w3.org/XML/1998/namespace"' )
92
- end
93
- if self.node_type == Node::ATTRIBUTE_NODE then
94
- if value == 'xmlns' and self.namespace_uri != "http://www.w3.org/2000/xmlns/" then
95
- raise DOMException.new( DOMException::NAMESPACE_ERR,
96
- 'The specified prefix is "xmlns" and the namespaceURI of this node is different from "http://www.w3.org/2000/xmlns/".' )
97
- end
98
- if self.node_name == 'xmlns' then
99
- raise DOMException.new( DOMException::NAMESPACE_ERR,
100
- 'The qualifiedName of this node is "xmlns".' )
101
- end
102
- end
103
- self.tagname = value + ':' + self.local_name
104
- else
105
- raise DOMException.new( DOMException::INVALID_CHARACTER_ERR,
106
- 'The specified prefix "' + value + '" contains an illegal character.' )
107
- end
108
- end
109
-
110
- def init_mod_namespaceuri_manageable( namespace_uri, qualified_name )
111
- # namespace_uri が空文字列であるならば, nil として扱う
112
- @namespace_uri = ( namespace_uri == '' ? nil : namespace_uri )
113
- if /\A([^:]+)(?::([^:]+))?\Z/u =~ qualified_name then
114
- name_prefix = ( $2.nil? ? nil : $1 )
115
- else
116
- # the qualified name is malformed
117
- raise DOMException.new( DOMException::NAMESPACE_ERR,
118
- 'The qualified name "' + qualified_name + '" is malformed.' )
119
- end
120
- if ! name_prefix.nil? then
121
- if @namespace_uri.nil? then
122
- # the qualified name has a prefix and the namespace URI is null
123
- raise DOMException.new( DOMException::NAMESPACE_ERR,
124
- 'The qualified name "' + qualified_name + '" has a prefix, but the namespace URI is null.' )
125
- end
126
- if name_prefix == 'xml' and @namespace_uri != "http://www.w3.org/XML/1998/namespace" then
127
- raise DOMException.new( DOMException::NAMESPACE_ERR,
128
- 'The qualified name has a prefix "xml", but the namespace URI is different from "http://www.w3.org/XML/1998/namespace".' )
129
- end
130
- if name_prefix == 'xmlns' and @namespace_uri != "http://www.w3.org/2000/xmlns/" then
131
- raise DOMException.new( DOMException::NAMESPACE_ERR,
132
- 'The qualified name has a prefix "xmlns", but the namespace URI is different from "http://www.w3.org/2000/xmlns/".' )
133
- end
134
- if name_prefix != 'xmlns' and @namespace_uri == "http://www.w3.org/2000/xmlns/" then
135
- raise DOMException.new( DOMException::NAMESPACE_ERR,
136
- 'The namespace URI is "http://www.w3.org/2000/xmlns/", but the prefix of the qualified name is not "xmlns".' )
137
- end
138
- else
139
- if qualified_name == 'xmlns' and @namespace_uri != "http://www.w3.org/2000/xmlns/" then
140
- raise DOMException.new( DOMException::NAMESPACE_ERR,
141
- 'The qualified name is "xmlns", but the namespace URI is different from "http://www.w3.org/2000/xmlns/".' )
142
- end
143
- if qualified_name != 'xmlns' and @namespace_uri == "http://www.w3.org/2000/xmlns/" then
144
- raise DOMException.new( DOMException::NAMESPACE_ERR,
145
- 'The namespace URI is "http://www.w3.org/2000/xmlns/", but the qualified name is not "xmlns".' )
146
- end
147
- end
148
- end
149
-
150
- end
151
- end
152
- end
@@ -1,307 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require "vcdom/minidom/node_list"
4
-
5
- module VCDOM
6
- module MiniDOM
7
- module ModParentNode
8
-
9
- # Document, DocumentFragment, EntityReference, Element, Attr, Entity に
10
- # Mixed-in される
11
-
12
- module ParentNodeManageable
13
- protected
14
- def parent_node=( pn )
15
- @parent_node = pn
16
- end
17
- def get_index_of( child_node )
18
- @child_nodes.each_index do |index|
19
- if @child_nodes[index].equal? child_node then
20
- return index
21
- end
22
- end
23
- return nil
24
- end
25
- end
26
-
27
- include ParentNodeManageable
28
-
29
- # childNodes of type NodeList, readonly
30
- # A NodeList that contains all children of this node. If there are no children, this is a NodeList containing no nodes.
31
- def child_nodes; return @child_nodes_wrapper end
32
-
33
- # firstChild of type Node, readonly
34
- # The first child of this node. If there is no such node, this returns null.
35
- def first_child; return @child_nodes[0] end
36
-
37
- # lastChild of type Node, readonly
38
- # The last child of this node. If there is no such node, this returns null.
39
- def last_child; return @child_nodes[-1] end
40
-
41
- # hasChildNodes
42
- #
43
- # Returns whether this node has any children.
44
- #
45
- # Return Value
46
- # boolean
47
- # Returns true if this node has any children, false otherwise.
48
- # No Parameters
49
- # No Exceptions
50
- def has_child_nodes()
51
- return ( @child_nodes.length > 0 ) ? true : false
52
- end
53
-
54
- # textContent of type DOMString, introduced in DOM Level 3
55
- #
56
- # This attribute returns the text content of this node and its descendants.
57
- # When it is defined to be null, setting it has no effect.
58
- # On setting, any possible children this node may have are removed and,
59
- # if it the new string is not empty or null, replaced by a single Text node
60
- # containing the string this attribute is set to.
61
- # On getting, no serialization is performed, the returned string does not
62
- # contain any markup. No whitespace normalization is performed and the
63
- # returned string does not contain the white spaces in element content
64
- # (see the attribute Text.isElementContentWhitespace).
65
- # Similarly, on setting, no parsing is performed either, the input string
66
- # is taken as pure textual content.
67
- #
68
- # The string returned is made of the text content of this node depending on
69
- # its type, as defined below:
70
- #
71
- # Node type Content
72
- # ---------------------------------------------------
73
- # ELEMENT_NODE, ATTRIBUTE_NODE, concatenation of the textContent attribute value
74
- # ENTITY_NODE, of every child node, excluding COMMENT_NODE and
75
- # ENTITY_REFERENCE_NODE, PROCESSING_INSTRUCTION_NODE nodes. This is the
76
- # DOCUMENT_FRAGMENT_NODE empty string if the node has no children.
77
- #
78
- # Exceptions on setting
79
- # DOMException
80
- # NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
81
- # Exceptions on retrieval
82
- # DOMException
83
- # DOMSTRING_SIZE_ERR: Raised when it would return more characters
84
- # than fit in a DOMString variable on the implementation platform.
85
- #
86
- # Document node でオーバーライド
87
- def text_content
88
- value = String.new()
89
- @child_nodes.each do |node|
90
- case node.node_type
91
- when Node::COMMENT_NODE, Node::PROCESSING_INSTRUCTION_NODE then
92
- # do nothing
93
- else
94
- value << node.text_content
95
- end
96
- end
97
- return value
98
- end
99
- def text_content=( value )
100
- if self.is_readonly then
101
- raise DOMException.new( NO_MODIFICATION_ALLOWED_ERR, 'This node is readonly.' )
102
- end
103
- while self.has_child_nodes do
104
- self.remove_child( self.first_child )
105
- end
106
- unless value.nil? or value.length == 0 then
107
- self.append_child( self.owner_document.create_text_node( value ) )
108
- end
109
- end
110
-
111
- # appendChild modified in DOM Level 3
112
- #
113
- # Adds the node newChild to the end of the list of children of this node.
114
- # If the newChild is already in the tree, it is first removed.
115
- #
116
- # Parameters
117
- # newChild of type Node
118
- # The node to add.
119
- # If it is a DocumentFragment object, the entire contents of the document fragment are moved
120
- # into the child list of this node
121
- # Return Value
122
- # Node
123
- # The node added.
124
- # Exceptions
125
- # DOMException
126
- # HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not
127
- # allow children of the type of the newChild node, or if the
128
- # node to append is one of this node's ancestors or this node
129
- # itself, or if this node is of type Document and the DOM
130
- # application attempts to append a second DocumentType or
131
- # Element node.
132
- # #=> newNode がこのノードの子になれない nodeType である場合や, newNode がこのノードの先祖である場合や自分自身
133
- # #=> である場合, また, もしこのノードのタイプが Document で 2 つ目の DocumentType や Element を追加しようとした場合など
134
- # #=> にこの例外が発生する.
135
- # WRONG_DOCUMENT_ERR: Raised if newChild was created from a different
136
- # document than the one that created this node.
137
- # (DOMImplementation より
138
- # WRONG_DOCUMENT_ERR: Raised if doctype has already been used with a different
139
- # document or was created from a different implementation.
140
- # NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or if the
141
- # previous parent of the node being inserted is readonly.
142
- # NOT_SUPPORTED_ERR: if the newChild node is a child of the Document node, this exception might
143
- # be raised if the DOM implementation doesn't support the removal of the DocumentType
144
- # child or Element child.
145
- def append_child( new_child )
146
- new_child_list = []
147
- if new_child.node_type == Node::DOCUMENT_FRAGMENT_NODE then
148
- while new_child.has_child_nodes do
149
- new_child_list << new_child.remove_child( new_child.first_child )
150
- end
151
- else
152
- new_child_list << new_child
153
- end
154
- new_child_list.each do |nc|
155
- # Hierarchy request err のチェック
156
- begin
157
- check_hierarchy( nc )
158
- rescue => err
159
- raise err
160
- end
161
- # Wrong document err のチェック
162
- cdoc = ( self.owner_document or self )
163
- if nc.node_type != Node::DOCUMENT_TYPE_NODE then
164
- if nc.owner_document != cdoc then
165
- raise DOMException.new( DOMException::WRONG_DOCUMENT_ERR,
166
- 'The new child was created from a different document than the one that created this node.' )
167
- end
168
- end
169
- end
170
- new_child_list.each do |nc|
171
- # 親が居る場合, まず取り除く
172
- if ! nc.parent_node.nil? then
173
- nc.parent_node.remove_child( nc )
174
- end
175
- @child_nodes << nc
176
- nc.parent_node = self
177
- end
178
- #$stdout << "ModParentNode#append_child: " << new_child << "\n"
179
- #$stdout << "ModParentNode#append_child: " << new_child.node_name << "\n"
180
- return new_child
181
- end
182
-
183
- # insertBefore modified in DOM Level 3
184
- #
185
- # Inserts the node newChild before the existing child node refChild. If refChild is null,
186
- # insert newChild at the end of the list of children.
187
- # If newChild is a DocumentFragment object, all of its children are inserted, in the same
188
- # order, before refChild. If the newChild is already in the tree, it is first removed.
189
- #
190
- # Note: Inserting a node before itself is implementation dependent.
191
- #
192
- # Parameters
193
- # newChild of type Node
194
- # The node to insert.
195
- # refChild of type Node
196
- # The reference node, i.e., the node before which the new node must be inserted.
197
- # Return Value
198
- # Node
199
- # The node being inserted.
200
- # Exceptions
201
- # DOMException
202
- # HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not allow children
203
- # of the type of the newChild node, or if the node to insert is one of this node's
204
- # ancestors or this node itself, or if this node is of type Document and the DOM
205
- # application attempts to insert a second DocumentType or Element node.
206
- # WRONG_DOCUMENT_ERR: Raised if newChild was created from a different document than the
207
- # one that created this node.
208
- # NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or if the parent of the node
209
- # being inserted is readonly.
210
- # NOT_FOUND_ERR: Raised if refChild is not a child of this node.
211
- # NOT_SUPPORTED_ERR: if this node is of type Document, this exception might be raised if the
212
- # DOM implementation doesn't support the insertion of a DocumentType or Element node.
213
- def insert_before( new_child, ref_child )
214
- # aRefChild の index 取得. なければ例外発生
215
- ( idx = @child_nodes.index( ref_child ) )\
216
- or raise DOMException.new( DOMException::NOT_FOUND_ERR, "NOT_FOUND_ERR" )
217
- # 追加処理
218
- return add_child_at( idx, new_child )
219
- end
220
-
221
- # removeChild modified in DOM Level 3
222
- #
223
- # Removes the child node indicated by oldChild from the list of children, and returns it.
224
- #
225
- # Parameters
226
- # oldChild of type Node
227
- # The node being removed.
228
- # Return Value
229
- # Node
230
- # The node removed.
231
- # Exceptions
232
- # DOMException
233
- # NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
234
- # NOT_FOUND_ERR: Raised if oldChild is not a child of this node.
235
- # NOT_SUPPORTED_ERR: if this node is of type Document, this exception
236
- # might be raised if the DOM implementation doesn't support
237
- # the removal of the DocumentType child or the Element child.
238
- def remove_child( old_child )
239
- # aOldChild の index を取得. 子ノードに含まれなければ例外発生
240
- ( idx = get_index_of( old_child ) ) or
241
- raise DOMException.new( DOMException::NOT_FOUND_ERR, "The old child is not a child of this node." )
242
- # 削除
243
- @child_nodes.delete_at( idx )
244
- old_child.parent_node = nil
245
- return old_child
246
- end
247
-
248
- # replaceChild modified in DOM Level 3
249
- #
250
- # Replaces the child node oldChild with newChild in the list of children, and returns the oldChild node.
251
- # #=> 子ノードのうち、oldChild を newChild で置き換え、oldChild を返す.
252
- # If newChild is a DocumentFragment object, oldChild is replaced by all of the DocumentFragment children,
253
- # which are inserted in the same order.
254
- # #=> もし newChild が DocumentFragment オブジェクトならば, oldChild は newChild の全ての子をそのままの順で置き換えられる.
255
- # If the newChild is already in the tree, it is first removed.
256
- # #=> もし newChild が既に DOM 木の中に存在するならば, まず最初に取り除かれる.
257
- #
258
- # Note: Replacing a node with itself is implementation dependent.
259
- # #=> Note: 自分自身を自分自身で置き換えようとしたときの動作は, 実装に依存する.
260
- #
261
- # Parameters
262
- # newChild of type Node
263
- # The new node to put in the child list.
264
- # oldChild of type Node
265
- # The node being replaced in the list.
266
- # Return Value
267
- # Node
268
- # The node replaced.
269
- # Exceptions
270
- # DOMException
271
- # HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not allow children of the type
272
- # of the newChild node, or if the node to put in is one of this node's ancestors or this
273
- # node itself, or if this node is of type Document and the result of the replacement
274
- # operation would add a second DocumentType or Element on the Document node.
275
- # WRONG_DOCUMENT_ERR: Raised if newChild was created from a different document than the one that
276
- # created this node.
277
- # NO_MODIFICATION_ALLOWED_ERR: Raised if this node or the parent of the new node is readonly.
278
- # NOT_FOUND_ERR: Raised if oldChild is not a child of this node.
279
- # NOT_SUPPORTED_ERR: if this node is of type Document, this exception might be raised if the DOM
280
- # implementation doesn't support the replacement of the DocumentType child or Element child.
281
- def replace_child( new_child, old_child )
282
- # 未実装
283
- end
284
-
285
- private
286
- # サブクラスでオーバーライドしなければならない
287
- def check_hierarchy( new_child, is_overrided = false )
288
- raise "The internal error in VCDOM::MiniDOM is occured." unless is_overrided
289
- # new_child が自分の先祖でないかどうかのチェック
290
- elem = self
291
- while ! elem.nil? do
292
- if elem.equal? new_child then
293
- raise DOMException.new( DOMException::HIERARCHY_REQUEST_ERR,
294
- 'The node to append is one of this node\'s ancestors or this node itself.' )
295
- end
296
- elem = elem.parent_node
297
- end
298
- end
299
-
300
- def init_mod_parent_node()
301
- @child_nodes = []
302
- @child_nodes_wrapper = NodeList.new( @child_nodes )
303
- end
304
-
305
- end
306
- end
307
- end