| 1 |
wakaba |
1.1 |
Module: |
| 2 |
|
|
@QName: MDOM|TreeStore |
| 3 |
|
|
@enFN: |
| 4 |
|
|
DOM Tree Store Module |
| 5 |
|
|
@enDesc: |
| 6 |
|
|
The manakai DOM Tree Store Module provides a simple |
| 7 |
|
|
storable representation of a DOM subtree. |
| 8 |
|
|
|
| 9 |
|
|
@Namespace: |
| 10 |
wakaba |
1.2 |
http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/TreeStore/ |
| 11 |
wakaba |
1.1 |
|
| 12 |
|
|
@DISCore:author: DISCore|Wakaba |
| 13 |
|
|
@License: license|Perl+MPL |
| 14 |
|
|
@Date: |
| 15 |
wakaba |
1.2 |
$Date: 2006/04/02 12:14:43 $ |
| 16 |
wakaba |
1.1 |
|
| 17 |
|
|
@Require: |
| 18 |
|
|
@@Module: |
| 19 |
|
|
@@@QName: MDOM|TreeCore |
| 20 |
|
|
@@@WithFor: ManakaiDOM|ManakaiDOMLatest |
| 21 |
|
|
@@Module: |
| 22 |
|
|
@@@WithFor: ManakaiDOM|ManakaiDOM |
| 23 |
|
|
@@Module: |
| 24 |
|
|
@@@WithFor: ManakaiDOM|ManakaiDOMLatest |
| 25 |
|
|
@DefaultFor: ManakaiDOM|ManakaiDOMLatest |
| 26 |
|
|
|
| 27 |
|
|
Namespace: |
| 28 |
|
|
@c: |
| 29 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core# |
| 30 |
|
|
@cfg: |
| 31 |
|
|
http://suika.fam.cx/www/2006/dom-config/ |
| 32 |
|
|
@dis: |
| 33 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-- |
| 34 |
|
|
@doc: |
| 35 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/7/tutorial# |
| 36 |
|
|
@d: |
| 37 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dom/xdt# |
| 38 |
|
|
@DOMMain: |
| 39 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dom/main# |
| 40 |
|
|
@dx: |
| 41 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException# |
| 42 |
|
|
@dxm: |
| 43 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dis/XML# |
| 44 |
|
|
@ecore: |
| 45 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/Core/ |
| 46 |
|
|
@ev: |
| 47 |
|
|
http://www.w3.org/2001/xml-events |
| 48 |
|
|
@f: |
| 49 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dom/feature# |
| 50 |
|
|
@fe: |
| 51 |
|
|
http://suika.fam.cx/www/2006/feature/ |
| 52 |
|
|
@idl: |
| 53 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dis/IDL# |
| 54 |
|
|
@infoset: |
| 55 |
|
|
http://www.w3.org/2001/04/infoset# |
| 56 |
|
|
@kwd: |
| 57 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/rfc2119/ |
| 58 |
|
|
@lang: |
| 59 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/18/lang# |
| 60 |
|
|
@license: |
| 61 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/18/license# |
| 62 |
|
|
@ManakaiDOM: |
| 63 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom# |
| 64 |
|
|
@ManakaiDOMCore: |
| 65 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/mdom-core# |
| 66 |
|
|
@MDOM: |
| 67 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM. |
| 68 |
|
|
@MDOMX: |
| 69 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception# |
| 70 |
|
|
@mg: |
| 71 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Grove/ |
| 72 |
|
|
@null: |
| 73 |
|
|
http://suika.fam.cx/~wakaba/-temp/2003/09/27/null |
| 74 |
|
|
@rdf: |
| 75 |
|
|
http://www.w3.org/1999/02/22-rdf-syntax-ns# |
| 76 |
|
|
@rdfs: |
| 77 |
|
|
http://www.w3.org/2000/01/rdf-schema# |
| 78 |
|
|
@sw010: |
| 79 |
|
|
urn:x-suika-fam-cx:markup:suikawiki:0:10: |
| 80 |
|
|
@t: |
| 81 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dom/tree# |
| 82 |
|
|
@tc: |
| 83 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/TreeCore/ |
| 84 |
|
|
@td: |
| 85 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Document/ |
| 86 |
|
|
@te: |
| 87 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/ |
| 88 |
|
|
@test: |
| 89 |
|
|
http://suika.fam.cx/~wakaba/archive/2004/dis/Test# |
| 90 |
|
|
@tst: |
| 91 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/TreeStore/ |
| 92 |
|
|
@tx: |
| 93 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/ |
| 94 |
|
|
@urigen: |
| 95 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/URI/Generic/ |
| 96 |
|
|
@Util: |
| 97 |
|
|
http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/ |
| 98 |
|
|
@xml: |
| 99 |
|
|
http://www.w3.org/XML/1998/namespace |
| 100 |
|
|
@xml-dtd: |
| 101 |
|
|
http://www.w3.org/TR/REC-xml |
| 102 |
|
|
@xmlns: |
| 103 |
|
|
http://www.w3.org/2000/xmlns/ |
| 104 |
|
|
|
| 105 |
|
|
ElementTypeBinding: |
| 106 |
|
|
@Name: CODE |
| 107 |
|
|
@ElementType: |
| 108 |
|
|
dis:ResourceDef |
| 109 |
|
|
@ShadowContent: |
| 110 |
|
|
@@DISCore:resourceType: DISPerl|BlockCode |
| 111 |
|
|
@@ForCheck: ManakaiDOM|ForClass |
| 112 |
|
|
|
| 113 |
|
|
ElementTypeBinding: |
| 114 |
|
|
@Name: Method |
| 115 |
|
|
@ElementType: |
| 116 |
|
|
dis:ResourceDef |
| 117 |
|
|
@ShadowContent: |
| 118 |
|
|
@@rdf:type: DISLang|Method |
| 119 |
|
|
@@ForCheck: !=ManakaiDOM|ManakaiDOM |
| 120 |
|
|
|
| 121 |
|
|
ElementTypeBinding: |
| 122 |
|
|
@Name: Param |
| 123 |
|
|
@ElementType: |
| 124 |
|
|
dis:ResourceDef |
| 125 |
|
|
@ShadowContent: |
| 126 |
|
|
@@rdf:type: DISLang|MethodParameter |
| 127 |
|
|
|
| 128 |
|
|
ElementTypeBinding: |
| 129 |
|
|
@Name: Return |
| 130 |
|
|
@ElementType: |
| 131 |
|
|
dis:ResourceDef |
| 132 |
|
|
@ShadowContent: |
| 133 |
|
|
@@rdf:type: DISLang|MethodReturn |
| 134 |
|
|
|
| 135 |
|
|
ElementTypeBinding: |
| 136 |
|
|
@Name: nullCase |
| 137 |
|
|
@ElementType: |
| 138 |
|
|
dis:ResourceDef |
| 139 |
|
|
@ShadowContent: |
| 140 |
|
|
@@rdf:type: |
| 141 |
|
|
ManakaiDOM:InCase |
| 142 |
|
|
@@Value: |
| 143 |
|
|
@@@is-null:1 |
| 144 |
|
|
|
| 145 |
|
|
ElementTypeBinding: |
| 146 |
|
|
@Name: IFQName |
| 147 |
|
|
@ElementType: |
| 148 |
|
|
dis:QName |
| 149 |
|
|
@ShadowContent: |
| 150 |
|
|
@@ForCheck: ManakaiDOM|ForIF |
| 151 |
|
|
|
| 152 |
|
|
ElementTypeBinding: |
| 153 |
|
|
@Name: ClsQName |
| 154 |
|
|
@ElementType: |
| 155 |
|
|
dis:QName |
| 156 |
|
|
@ShadowContent: |
| 157 |
|
|
@@ForCheck: ManakaiDOM|ForClass |
| 158 |
|
|
|
| 159 |
|
|
ElementTypeBinding: |
| 160 |
|
|
@Name: IFISA |
| 161 |
|
|
@ElementType: |
| 162 |
|
|
dis:ISA |
| 163 |
|
|
@ShadowContent: |
| 164 |
|
|
@@ForCheck: ManakaiDOM|ForIF |
| 165 |
|
|
|
| 166 |
|
|
ElementTypeBinding: |
| 167 |
|
|
@Name: ClsISA |
| 168 |
|
|
@ElementType: |
| 169 |
|
|
dis:ISA |
| 170 |
|
|
@ShadowContent: |
| 171 |
|
|
@@ForCheck: ManakaiDOM|ForClass |
| 172 |
|
|
|
| 173 |
|
|
## -- Features |
| 174 |
|
|
|
| 175 |
|
|
ElementTypeBinding: |
| 176 |
|
|
@Name: FeatureDef |
| 177 |
|
|
@ElementType: |
| 178 |
|
|
dis:ResourceDef |
| 179 |
|
|
@ShadowContent: |
| 180 |
|
|
@@rdf:type: f|Feature |
| 181 |
|
|
@@For: =ManakaiDOM|all |
| 182 |
|
|
|
| 183 |
|
|
ElementTypeBinding: |
| 184 |
|
|
@Name: FeatureVerDef |
| 185 |
|
|
@ElementType: |
| 186 |
|
|
dis:ResourceDef |
| 187 |
|
|
@ShadowContent: |
| 188 |
|
|
@@rdf:type: f|Feature |
| 189 |
|
|
|
| 190 |
|
|
ElementTypeBinding: |
| 191 |
|
|
@Name: featureQName |
| 192 |
|
|
@ElementType: |
| 193 |
|
|
f:name |
| 194 |
|
|
@ShadowContent: |
| 195 |
|
|
@@ContentType: DISCore|QName |
| 196 |
|
|
|
| 197 |
|
|
FeatureDef: |
| 198 |
|
|
@QName: TSFeature |
| 199 |
|
|
@featureQName: fe|TreeStore |
| 200 |
|
|
@FeatureVerDef: |
| 201 |
|
|
@@QName: TSFeature30 |
| 202 |
|
|
@@f:instanceOf: d|Feature |
| 203 |
|
|
@@Version: 3.0 |
| 204 |
|
|
@@f:requires: c|CoreFeature30 |
| 205 |
|
|
@@f:requires: tx|XMLFeature30 |
| 206 |
|
|
|
| 207 |
|
|
ElementTypeBinding: |
| 208 |
|
|
@Name: IFClsDef |
| 209 |
|
|
@ElementType: |
| 210 |
|
|
dis:ResourceDef |
| 211 |
|
|
@ShadowContent: |
| 212 |
|
|
@@DISCore:resourceType: |
| 213 |
|
|
@@@@: dis|MultipleResource |
| 214 |
|
|
@@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass |
| 215 |
|
|
@@resourceFor: ManakaiDOM|ForIF |
| 216 |
|
|
@@resourceFor: |
| 217 |
|
|
@@@@: ManakaiDOM|ForClass |
| 218 |
|
|
@@@ForCheck: ManakaiDOM|ManakaiDOMLatest |
| 219 |
|
|
@@For: ManakaiDOM|DOM1 |
| 220 |
|
|
@@For: =ManakaiDOM|ManakaiDOM |
| 221 |
|
|
|
| 222 |
|
|
@@DISCore:resourceType: |
| 223 |
|
|
@@@@: DISLang|Interface |
| 224 |
|
|
@@@ForCheck: ManakaiDOM|ForIF |
| 225 |
|
|
|
| 226 |
|
|
@@DISCore:resourceType: |
| 227 |
|
|
@@@@: DISLang|Class |
| 228 |
|
|
@@@ForCheck: ManakaiDOM|ForClass |
| 229 |
|
|
@@Implement: |
| 230 |
|
|
@@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF |
| 231 |
|
|
@@@ContentType: DISCore|TFPQNames |
| 232 |
|
|
@@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM |
| 233 |
|
|
@@Implement: |
| 234 |
|
|
@@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF |
| 235 |
|
|
@@@ContentType: DISCore|TFPQNames |
| 236 |
|
|
@@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest |
| 237 |
|
|
|
| 238 |
|
|
ElementTypeBinding: |
| 239 |
|
|
@Name: Test |
| 240 |
|
|
@ElementType: |
| 241 |
|
|
dis:ResourceDef |
| 242 |
|
|
@ShadowContent: |
| 243 |
|
|
@@DISCore:resourceType: test|StandaloneTest |
| 244 |
|
|
@@ForCheck: ManakaiDOM|ForClass |
| 245 |
|
|
|
| 246 |
|
|
## -- Implementation |
| 247 |
|
|
|
| 248 |
|
|
IFClsDef: |
| 249 |
|
|
@IFQName: DOMImplementationTreeStore |
| 250 |
|
|
@ClsQName: ManakaiDOMImplementationTreeStore |
| 251 |
|
|
|
| 252 |
|
|
@IFISA: c|DOMImplementation |
| 253 |
|
|
@ClsISA: c|ManakaiDOMImplementation |
| 254 |
|
|
|
| 255 |
|
|
@f:provides: TSFeature30 |
| 256 |
|
|
|
| 257 |
|
|
@Test: |
| 258 |
|
|
@@QName: ImplementationRegistry.getImplementation.1.test |
| 259 |
|
|
@@PerlDef: |
| 260 |
|
|
my $impl = $Message::DOM::ImplementationRegistry |
| 261 |
|
|
->get_implementation ({<Q::fe|TreeStore> => '3.0'}); |
| 262 |
|
|
|
| 263 |
|
|
$test->id ('DOMImplementationTreeStore'); |
| 264 |
|
|
$test->assert_isa ($impl, <IFName::DOMImplementationTreeStore>); |
| 265 |
|
|
|
| 266 |
|
|
$test->id ('DOMImplementationTree'); |
| 267 |
|
|
$test->assert_isa ($impl, <IFName::c|DOMImplementation>); |
| 268 |
|
|
@Test: |
| 269 |
|
|
@@QName: ImplementationRegistry.getImplementation.2.test |
| 270 |
|
|
@@PerlDef: |
| 271 |
|
|
my $impl = $Message::DOM::ImplementationRegistry |
| 272 |
|
|
->get_implementation ({<Q::fe|TreeStore> => '3.0', |
| 273 |
|
|
Core => '3.0'}); |
| 274 |
|
|
|
| 275 |
|
|
$test->id ('DOMImplementationTreeStore'); |
| 276 |
|
|
$test->assert_isa ($impl, <IFName::DOMImplementationTreeStore>); |
| 277 |
|
|
|
| 278 |
|
|
$test->id ('DOMImplementationTree'); |
| 279 |
|
|
$test->assert_isa ($impl, <IFName::c|DOMImplementation>); |
| 280 |
|
|
@Test: |
| 281 |
|
|
@@QName: DOMImplementation.getFeature.1.test |
| 282 |
|
|
@@PerlDef: |
| 283 |
|
|
my $impl; |
| 284 |
|
|
__CODE{tc|createImplForTest:: $impl => $impl}__; |
| 285 |
|
|
|
| 286 |
|
|
my $gf = $impl->get_feature (<Q::fe|TreeStore> => '3.0'); |
| 287 |
|
|
|
| 288 |
|
|
$test->id ('DOMImplementationTreeStore'); |
| 289 |
|
|
$test->assert_isa ($gf, <IFName::DOMImplementationTreeStore>); |
| 290 |
|
|
|
| 291 |
|
|
$test->id ('DOMImplementationTree'); |
| 292 |
|
|
$test->assert_isa ($gf, <IFName::c|DOMImplementation>); |
| 293 |
|
|
|
| 294 |
|
|
@CODE: |
| 295 |
|
|
@@QName: tst|createImplForTest |
| 296 |
|
|
@@PerlDef: |
| 297 |
|
|
$impl = <Class::ManakaiDOMImplementationTreeStore>->_new; |
| 298 |
|
|
|
| 299 |
|
|
@Method: |
| 300 |
|
|
@@Name: createStorableObjectFromNode |
| 301 |
|
|
@@enDesc: |
| 302 |
|
|
Creates a storable representation of the <IF::tc|Node> |
| 303 |
|
|
and its subtree. |
| 304 |
|
|
@@Param: |
| 305 |
|
|
@@@Name: in |
| 306 |
|
|
@@@Type: tc|Node |
| 307 |
|
|
@@@enDesc: |
| 308 |
|
|
The original <IF::tc|Node> to convert. |
| 309 |
|
|
@@Return: |
| 310 |
|
|
@@@Type: StorableObject |
| 311 |
|
|
@@@enDesc: |
| 312 |
|
|
A storable representation of the <P::in> node. |
| 313 |
|
|
@@@dx:raises: |
| 314 |
|
|
@@@@@: c|CLONE_NODE_TYPE_NOT_SUPPORTED_ERR |
| 315 |
|
|
@@@@enDesc: |
| 316 |
|
|
If the <P::in> node is of type other than |
| 317 |
|
|
<IF::td|Document>, <IF::td|DocumentFragment>, |
| 318 |
|
|
<IF::te|Element>, <IF::te|Attr>, |
| 319 |
|
|
<IF::tc|Text>, or <IF::tx|CDATASection>. |
| 320 |
|
|
@@@PerlDef: |
| 321 |
|
|
if ({ |
| 322 |
|
|
<C::tc|Node.DOCUMENT_NODE> => true, |
| 323 |
|
|
<C::tc|Node.DOCUMENT_FRAGMENT_NODE> => true, |
| 324 |
|
|
<C::tc|Node.ELEMENT_NODE> => true, |
| 325 |
|
|
<C::tc|Node.ATTRIBUTE_NODE> => true, |
| 326 |
|
|
<C::tc|Node.TEXT_NODE> => true, |
| 327 |
|
|
<C::tc|Node.CDATA_SECTION_NODE> => true, |
| 328 |
|
|
}->{$in-><AG::tc|Node.nodeType>}) { |
| 329 |
|
|
my @target = ([$in, # node |
| 330 |
|
|
null]); # origin |
| 331 |
|
|
|
| 332 |
|
|
while (@target) { |
| 333 |
|
|
my $target = shift @target; |
| 334 |
|
|
my $tnt = $target->[0]-><AG::tc|Node.nodeType>; |
| 335 |
|
|
if ($tnt == <C::tc|Node.ELEMENT_NODE>) { |
| 336 |
|
|
my $v = {}; |
| 337 |
|
|
|
| 338 |
|
|
my $pv; |
| 339 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 340 |
|
|
$r => $pv, |
| 341 |
|
|
$prop => {<H::infoset|namespaceName>}, |
| 342 |
|
|
$ref => {$target->[0]}, |
| 343 |
|
|
}__; |
| 344 |
|
|
$v->{namespace_uri} = $pv if defined $pv; |
| 345 |
|
|
|
| 346 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 347 |
|
|
$r => $pv, |
| 348 |
|
|
$prop => {<H::infoset|localName>}, |
| 349 |
|
|
$ref => {$target->[0]}, |
| 350 |
|
|
}__; |
| 351 |
|
|
$v->{local_name} = $pv; |
| 352 |
|
|
|
| 353 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 354 |
|
|
$r => $pv, |
| 355 |
|
|
$prop => {<H::infoset|prefix>}, |
| 356 |
|
|
$ref => {$target->[0]}, |
| 357 |
|
|
}__; |
| 358 |
|
|
$v->{prefix} = $pv if defined $pv; |
| 359 |
|
|
|
| 360 |
|
|
for (@{$target->[0]-><AG::tc|Node.childNodes>}) { |
| 361 |
|
|
push @target, [$_, $v]; |
| 362 |
|
|
} |
| 363 |
|
|
for (@{$target->[0]-><AG::tc|Node.attributes>}) { |
| 364 |
|
|
push @target, [$_, $v]; |
| 365 |
|
|
} |
| 366 |
|
|
if (defined $target->[1]) { |
| 367 |
|
|
push @{$target->[1]->{child_nodes} ||= []}, $v; |
| 368 |
|
|
} else { |
| 369 |
|
|
$r = $v unless defined $r; |
| 370 |
|
|
} |
| 371 |
|
|
} elsif ($tnt == <C::tc|Node.ATTRIBUTE_NODE>) { |
| 372 |
|
|
my $v = { |
| 373 |
|
|
value => \ $target->[0]-><AG::te|Attr.value>, |
| 374 |
|
|
}; |
| 375 |
|
|
|
| 376 |
|
|
my $pv; |
| 377 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 378 |
|
|
$r => $pv, |
| 379 |
|
|
$prop => {<H::infoset|namespaceName>}, |
| 380 |
|
|
$ref => {$target->[0]}, |
| 381 |
|
|
}__; |
| 382 |
|
|
$v->{namespace_uri} = $pv if defined $pv; |
| 383 |
|
|
|
| 384 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 385 |
|
|
$r => $pv, |
| 386 |
|
|
$prop => {<H::infoset|localName>}, |
| 387 |
|
|
$ref => {$target->[0]}, |
| 388 |
|
|
}__; |
| 389 |
|
|
$v->{local_name} = $pv; |
| 390 |
|
|
|
| 391 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 392 |
|
|
$r => $pv, |
| 393 |
|
|
$prop => {<H::infoset|prefix>}, |
| 394 |
|
|
$ref => {$target->[0]}, |
| 395 |
|
|
}__; |
| 396 |
|
|
$v->{prefix} = $pv if defined $pv; |
| 397 |
|
|
|
| 398 |
|
|
if (defined $target->[1]) { |
| 399 |
|
|
push @{$target->[1]->{attributes} ||= []}, $v; |
| 400 |
|
|
} else { |
| 401 |
|
|
$r = $v unless defined $r; |
| 402 |
|
|
} |
| 403 |
|
|
} elsif ($tnt == <C::tc|Node.TEXT_NODE> or |
| 404 |
|
|
$tnt == <C::tc|Node.CDATA_SECTION_NODE>) { |
| 405 |
|
|
my $v = {}; |
| 406 |
|
|
__CODE{mg|getNodeStemPropValue||ManakaiDOM|all:: |
| 407 |
|
|
$r => {$v->{data}}, |
| 408 |
|
|
$prop => {<H::infoset|content>}, |
| 409 |
|
|
$ref => {$target->[0]}, |
| 410 |
|
|
}__; |
| 411 |
|
|
|
| 412 |
|
|
if (defined $target->[1]) { |
| 413 |
|
|
push @{$target->[1]->{child_nodes} ||= []}, $v; |
| 414 |
|
|
} else { |
| 415 |
|
|
$r = $v unless defined $r; |
| 416 |
|
|
} |
| 417 |
|
|
} elsif ($tnt == <C::tc|Node.DOCUMENT_NODE>) { |
| 418 |
|
|
my $v = { |
| 419 |
|
|
xml_version => $target->[0]-><AG::td|Document.xmlVersion>, |
| 420 |
|
|
}; |
| 421 |
|
|
|
| 422 |
|
|
for (@{$target->[0]-><AG::tc|Node.childNodes>}) { |
| 423 |
|
|
push @target, [$_, $v]; |
| 424 |
|
|
} |
| 425 |
|
|
$r = $v unless defined $r; |
| 426 |
|
|
} elsif ($tnt == <C::tc|Node.DOCUMENT_FRAGMENT_NODE>) { |
| 427 |
|
|
my $v = {}; |
| 428 |
|
|
|
| 429 |
|
|
for (@{$target->[0]-><AG::tc|Node.childNodes>}) { |
| 430 |
|
|
push @target, [$_, $v]; |
| 431 |
|
|
} |
| 432 |
|
|
$r = $v unless defined $r; |
| 433 |
|
|
} elsif ($tnt == <C::tc|Node.ENTITY_REFERENCE_NODE>) { |
| 434 |
|
|
for (@{$target->[0]-><AG::tc|Node.childNodes>}) { |
| 435 |
|
|
push @target, [$_, $target->[1]]; |
| 436 |
|
|
} |
| 437 |
|
|
} |
| 438 |
|
|
} |
| 439 |
|
|
} else { |
| 440 |
|
|
__EXCEPTION{c|CLONE_NODE_TYPE_NOT_SUPPORTED_ERR:: |
| 441 |
|
|
MDOMX|param-name => 'in', |
| 442 |
|
|
c|node => {$in}, |
| 443 |
|
|
}__; |
| 444 |
|
|
} |
| 445 |
|
|
|
| 446 |
|
|
@Method: |
| 447 |
|
|
@@Name: createNodeFromStorableObject |
| 448 |
|
|
@@enDesc: |
| 449 |
|
|
Creates a <IF::tc|Node> and its subtree from a storable representation. |
| 450 |
|
|
@@Param: |
| 451 |
|
|
@@@Name: in |
| 452 |
|
|
@@@Type: StorableObject |
| 453 |
|
|
@@@enDesc: |
| 454 |
|
|
The original node storable representation to convert. |
| 455 |
|
|
@@Param: |
| 456 |
|
|
@@@Name: od |
| 457 |
|
|
@@@Type: td|Document |
| 458 |
|
|
@@@enDesc: |
| 459 |
|
|
The owner document to which the generated nodes |
| 460 |
|
|
belong. If the top-level <P::in> object represents |
| 461 |
|
|
a document, this parameter <kwd:MUST> be ignored. |
| 462 |
|
|
@@@nullCase: |
| 463 |
|
|
@@@@enDesc: |
| 464 |
|
|
A new empty <IF::td|Document> is created. If the top-level |
| 465 |
|
|
<P::in> object represents a document, the created <IF::td|Document> |
| 466 |
|
|
<kwd:MUST> be modified so that it represents that document. |
| 467 |
|
|
@@Return: |
| 468 |
|
|
@@@Type: tc|Node |
| 469 |
|
|
@@@enDesc: |
| 470 |
|
|
A <IF::tc|Node> created from the top-level <P::in> object. |
| 471 |
|
|
@@@PerlDef: |
| 472 |
|
|
__DEEP{ |
| 473 |
|
|
$od = $self-><M::c|DOMImplementation.createDocument>; |
| 474 |
|
|
my $orig_strict = $od-><AG::td|Document.strictErrorChecking>; |
| 475 |
|
|
$od-><AS::td|Document.strictErrorChecking> (false); |
| 476 |
|
|
|
| 477 |
|
|
my @target = ([$in, |
| 478 |
|
|
null, # parent node |
| 479 |
|
|
null]); # owner element |
| 480 |
|
|
while (@target) { |
| 481 |
|
|
my $target = shift @target; |
| 482 |
|
|
if (defined $target->[0]->{local_name}) { |
| 483 |
|
|
if (defined $target->[0]->{value}) { |
| 484 |
|
|
# Attribute |
| 485 |
|
|
my $node = $od-><M::td|Document.createAttributeNS> |
| 486 |
|
|
($target->[0]->{namespace_uri}, |
| 487 |
|
|
[$target->[0]->{prefix}, |
| 488 |
|
|
$target->[0]->{local_name}]); |
| 489 |
|
|
$node-><M::tc|Node.manakaiAppendText> ($target->[0]->{value}); |
| 490 |
|
|
if (defined $target->[2]) { |
| 491 |
|
|
$target->[2]-><M::te|Element.setAttributeNodeNS> ($node); |
| 492 |
|
|
} else { |
| 493 |
|
|
$r = $node unless defined $r; |
| 494 |
|
|
} |
| 495 |
|
|
} else { |
| 496 |
|
|
# Element |
| 497 |
|
|
my $node = $od-><M::td|Document.createElementNS> |
| 498 |
|
|
($target->[0]->{namespace_uri}, |
| 499 |
|
|
[$target->[0]->{prefix}, |
| 500 |
|
|
$target->[0]->{local_name}]); |
| 501 |
|
|
for (@{ref $target->[0]->{child_nodes} eq 'ARRAY' |
| 502 |
|
|
? $target->[0]->{child_nodes} : []}) { |
| 503 |
|
|
push @target, [$_, $node]; |
| 504 |
|
|
} |
| 505 |
|
|
for (@{ref $target->[0]->{attributes} eq 'ARRAY' |
| 506 |
|
|
? $target->[0]->{attributes} : []}) { |
| 507 |
|
|
push @target, [$_, null, $node]; |
| 508 |
|
|
} |
| 509 |
|
|
if (defined $target->[1]) { |
| 510 |
|
|
$target->[1]-><M::tc|Node.appendChild> ($node); |
| 511 |
|
|
} else { |
| 512 |
|
|
$r = $node unless defined $r; |
| 513 |
|
|
} |
| 514 |
|
|
} |
| 515 |
|
|
} elsif (defined $target->[0]->{data}) { |
| 516 |
|
|
# Text |
| 517 |
|
|
if (defined $target->[1]) { |
| 518 |
|
|
$target->[1]-><M::tc|Node.manakaiAppendText> |
| 519 |
|
|
($target->[0]->{data}); |
| 520 |
|
|
} elsif (not defined $r) { |
| 521 |
|
|
$r = $od-><M::td|Document.createTextNode> (''); |
| 522 |
|
|
$r-><M::tc|Node.manakaiAppendText> ($target->[0]->{data}); |
| 523 |
|
|
} |
| 524 |
|
|
} elsif (defined $target->[0]->{xml_version}) { |
| 525 |
|
|
# Document |
| 526 |
|
|
my $node = $self-><M::c|DOMImplementation.createDocument>; |
| 527 |
|
|
$node-><AS::td|Document.strictErrorChecking> (false); |
| 528 |
|
|
$node-><AG::td|Document.domConfig> |
| 529 |
|
|
-><M::c|DOMConfiguration.setParameter> |
| 530 |
|
|
(<Q::cfg|strict-document-children> => false); |
| 531 |
|
|
$node-><AS::td|Document.xmlVersion> ($target->[0]->{xml_version}); |
| 532 |
|
|
for (@{ref $target->[0]->{child_nodes} eq 'ARRAY' |
| 533 |
|
|
? $target->[0]->{child_nodes} : []}) { |
| 534 |
|
|
push @target, [$_, $node]; |
| 535 |
|
|
} |
| 536 |
|
|
unless (defined $r) { |
| 537 |
|
|
$r = $node; |
| 538 |
|
|
$od = $node; |
| 539 |
|
|
$orig_strict = true; |
| 540 |
|
|
} |
| 541 |
|
|
} else { |
| 542 |
|
|
# Document fragment |
| 543 |
|
|
unless (defined $r) { |
| 544 |
|
|
$r = $od-><M::td|Document.createDocumentFragment>; |
| 545 |
|
|
for (@{ref $target->[0]->{child_nodes} eq 'ARRAY' |
| 546 |
|
|
? $target->[0]->{child_nodes} : []}) { |
| 547 |
|
|
push @target, [$_, $r]; |
| 548 |
|
|
} |
| 549 |
|
|
} |
| 550 |
|
|
} |
| 551 |
|
|
} |
| 552 |
|
|
$od-><AS::td|Document.strictErrorChecking> ($orig_strict); |
| 553 |
|
|
if ($r-><AG::tc|Node.nodeType> == <C::tc|Node.DOCUMENT_NODE>) { |
| 554 |
|
|
$r-><AG::td|Document.domConfig> |
| 555 |
|
|
-><M::c|DOMConfiguration.setParameter> |
| 556 |
|
|
(<Q::cfg|strict-document-children> => null); |
| 557 |
|
|
} |
| 558 |
|
|
}__; |
| 559 |
|
|
|
| 560 |
|
|
@Test: |
| 561 |
|
|
@@QName: TreeStore.1.test |
| 562 |
|
|
@@enDesc: |
| 563 |
|
|
A non-NS element. |
| 564 |
|
|
@@PerlDef: |
| 565 |
|
|
my $impl; |
| 566 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 567 |
|
|
|
| 568 |
|
|
my $doc = $impl->create_document; |
| 569 |
|
|
|
| 570 |
|
|
my $e1 = $doc->create_element_ns (null, 'element'); |
| 571 |
|
|
|
| 572 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 573 |
|
|
|
| 574 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 575 |
|
|
|
| 576 |
|
|
$test->assert_num_equals |
| 577 |
|
|
(actual_value => $e3, |
| 578 |
|
|
expected_value => $e1); |
| 579 |
|
|
@Test: |
| 580 |
|
|
@@QName: TreeStore.2.test |
| 581 |
|
|
@@enDesc: |
| 582 |
|
|
An NS element. |
| 583 |
|
|
@@PerlDef: |
| 584 |
|
|
my $impl; |
| 585 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 586 |
|
|
|
| 587 |
|
|
my $doc = $impl->create_document; |
| 588 |
|
|
|
| 589 |
|
|
my $e1 = $doc->create_element_ns ('about:', 'a:element'); |
| 590 |
|
|
|
| 591 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 592 |
|
|
|
| 593 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 594 |
|
|
|
| 595 |
|
|
$test->assert_num_equals |
| 596 |
|
|
(actual_value => $e3, |
| 597 |
|
|
expected_value => $e1); |
| 598 |
|
|
@Test: |
| 599 |
|
|
@@QName: TreeStore.3.test |
| 600 |
|
|
@@enDesc: |
| 601 |
|
|
A non-NS attribute. |
| 602 |
|
|
@@PerlDef: |
| 603 |
|
|
my $impl; |
| 604 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 605 |
|
|
|
| 606 |
|
|
my $doc = $impl->create_document; |
| 607 |
|
|
|
| 608 |
|
|
my $e1 = $doc->create_attribute_ns (null, 'element'); |
| 609 |
|
|
$e1->value ('attr value'); |
| 610 |
|
|
|
| 611 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 612 |
|
|
|
| 613 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 614 |
|
|
|
| 615 |
|
|
$test->assert_num_equals |
| 616 |
|
|
(actual_value => $e3, |
| 617 |
|
|
expected_value => $e1); |
| 618 |
|
|
@Test: |
| 619 |
|
|
@@QName: TreeStore.4.test |
| 620 |
|
|
@@enDesc: |
| 621 |
|
|
An NS attribute. |
| 622 |
|
|
@@PerlDef: |
| 623 |
|
|
my $impl; |
| 624 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 625 |
|
|
|
| 626 |
|
|
my $doc = $impl->create_document; |
| 627 |
|
|
|
| 628 |
|
|
my $e1 = $doc->create_attribute_ns ('about:', 'a:element'); |
| 629 |
|
|
$e1->value ('attr value'); |
| 630 |
|
|
|
| 631 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 632 |
|
|
|
| 633 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 634 |
|
|
|
| 635 |
|
|
$test->assert_num_equals |
| 636 |
|
|
(actual_value => $e3, |
| 637 |
|
|
expected_value => $e1); |
| 638 |
|
|
@Test: |
| 639 |
|
|
@@QName: TreeStore.5.test |
| 640 |
|
|
@@enDesc: |
| 641 |
|
|
A text. |
| 642 |
|
|
@@PerlDef: |
| 643 |
|
|
my $impl; |
| 644 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 645 |
|
|
|
| 646 |
|
|
my $doc = $impl->create_document; |
| 647 |
|
|
|
| 648 |
|
|
my $e1 = $doc->create_text_node ('text value'); |
| 649 |
|
|
|
| 650 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 651 |
|
|
|
| 652 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 653 |
|
|
|
| 654 |
|
|
$test->assert_num_equals |
| 655 |
|
|
(actual_value => $e3, |
| 656 |
|
|
expected_value => $e1); |
| 657 |
|
|
@Test: |
| 658 |
|
|
@@QName: TreeStore.6.test |
| 659 |
|
|
@@enDesc: |
| 660 |
|
|
A cdata section. |
| 661 |
|
|
@@PerlDef: |
| 662 |
|
|
my $impl; |
| 663 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 664 |
|
|
|
| 665 |
|
|
my $doc = $impl->create_document; |
| 666 |
|
|
|
| 667 |
|
|
my $e1 = $doc->create_cdata_section ('text value'); |
| 668 |
|
|
|
| 669 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 670 |
|
|
|
| 671 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 672 |
|
|
|
| 673 |
|
|
$test->id ('nodeType'); |
| 674 |
|
|
$test->assert_num_equals |
| 675 |
|
|
(actual_value => $e3->node_type, |
| 676 |
|
|
expected_value => <C::tc|Node.TEXT_NODE>); |
| 677 |
|
|
|
| 678 |
|
|
$test->id ('nodeValue'); |
| 679 |
|
|
$test->assert_equals |
| 680 |
|
|
($e3->node_value, $e1->node_value); |
| 681 |
|
|
@Test: |
| 682 |
|
|
@@QName: TreeStore.7.test |
| 683 |
|
|
@@enDesc: |
| 684 |
|
|
A document. |
| 685 |
|
|
@@PerlDef: |
| 686 |
|
|
my $impl; |
| 687 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 688 |
|
|
|
| 689 |
|
|
my $doc = $impl->create_document; |
| 690 |
|
|
|
| 691 |
|
|
my $e1 = $doc; |
| 692 |
|
|
|
| 693 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 694 |
|
|
|
| 695 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 696 |
|
|
|
| 697 |
|
|
$test->assert_num_equals |
| 698 |
|
|
(actual_value => $e3, |
| 699 |
|
|
expected_value => $e1); |
| 700 |
|
|
@Test: |
| 701 |
|
|
@@QName: TreeStore.8.test |
| 702 |
|
|
@@enDesc: |
| 703 |
|
|
A document fragment. |
| 704 |
|
|
@@PerlDef: |
| 705 |
|
|
my $impl; |
| 706 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 707 |
|
|
|
| 708 |
|
|
my $doc = $impl->create_document; |
| 709 |
|
|
|
| 710 |
|
|
my $e1 = $doc->create_document_fragment; |
| 711 |
|
|
|
| 712 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 713 |
|
|
|
| 714 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 715 |
|
|
|
| 716 |
|
|
$test->assert_num_equals |
| 717 |
|
|
(actual_value => $e3, |
| 718 |
|
|
expected_value => $e1); |
| 719 |
|
|
@Test: |
| 720 |
|
|
@@QName: TreeStore.9.test |
| 721 |
|
|
@@enDesc: |
| 722 |
|
|
A nesting element. |
| 723 |
|
|
@@PerlDef: |
| 724 |
|
|
my $impl; |
| 725 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 726 |
|
|
|
| 727 |
|
|
my $doc = $impl->create_document; |
| 728 |
|
|
|
| 729 |
|
|
my $e1 = $doc->create_element_ns (null, 'el1'); |
| 730 |
|
|
$e1->append_child ($doc->create_element_ns (null, 'el2')); |
| 731 |
|
|
|
| 732 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 733 |
|
|
|
| 734 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 735 |
|
|
|
| 736 |
|
|
$test->assert_num_equals |
| 737 |
|
|
(actual_value => $e3, |
| 738 |
|
|
expected_value => $e1); |
| 739 |
|
|
@Test: |
| 740 |
|
|
@@QName: TreeStore.10.test |
| 741 |
|
|
@@enDesc: |
| 742 |
|
|
A nesting element with text. |
| 743 |
|
|
@@PerlDef: |
| 744 |
|
|
my $impl; |
| 745 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 746 |
|
|
|
| 747 |
|
|
my $doc = $impl->create_document; |
| 748 |
|
|
|
| 749 |
|
|
my $e1 = $doc->create_element_ns (null, 'el1'); |
| 750 |
|
|
$e1->manakai_append_text ('text value'); |
| 751 |
|
|
$e1->append_child ($doc->create_element_ns (null, 'el2')); |
| 752 |
|
|
|
| 753 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 754 |
|
|
|
| 755 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 756 |
|
|
|
| 757 |
|
|
$test->assert_num_equals |
| 758 |
|
|
(actual_value => $e3, |
| 759 |
|
|
expected_value => $e1); |
| 760 |
|
|
@Test: |
| 761 |
|
|
@@QName: TreeStore.12.test |
| 762 |
|
|
@@enDesc: |
| 763 |
|
|
An element with attributes. |
| 764 |
|
|
@@PerlDef: |
| 765 |
|
|
my $impl; |
| 766 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 767 |
|
|
|
| 768 |
|
|
my $doc = $impl->create_document; |
| 769 |
|
|
|
| 770 |
|
|
my $e1 = $doc->create_element_ns (null, 'el1'); |
| 771 |
|
|
$e1->set_attribute (a => 'b'); |
| 772 |
|
|
$e1->set_attribute_ns ('about:', 'b:c', 'd'); |
| 773 |
|
|
|
| 774 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 775 |
|
|
|
| 776 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 777 |
|
|
|
| 778 |
|
|
$test->assert_num_equals |
| 779 |
|
|
(actual_value => $e3, |
| 780 |
|
|
expected_value => $e1); |
| 781 |
|
|
@Test: |
| 782 |
|
|
@@QName: TreeStore.13.test |
| 783 |
|
|
@@enDesc: |
| 784 |
|
|
A document with element. |
| 785 |
|
|
@@PerlDef: |
| 786 |
|
|
my $impl; |
| 787 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 788 |
|
|
|
| 789 |
|
|
my $doc = $impl->create_document; |
| 790 |
|
|
|
| 791 |
|
|
my $e1 = $doc; |
| 792 |
|
|
$doc->append_child ($doc->create_element_ns (null, 'el1')); |
| 793 |
|
|
|
| 794 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 795 |
|
|
|
| 796 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 797 |
|
|
|
| 798 |
|
|
$test->assert_num_equals |
| 799 |
|
|
(actual_value => $e3, |
| 800 |
|
|
expected_value => $e1); |
| 801 |
|
|
@Test: |
| 802 |
|
|
@@QName: TreeStore.14.test |
| 803 |
|
|
@@enDesc: |
| 804 |
|
|
A document fragment with element. |
| 805 |
|
|
@@PerlDef: |
| 806 |
|
|
my $impl; |
| 807 |
|
|
__CODE{tst|createImplForTest:: $impl => $impl}__; |
| 808 |
|
|
|
| 809 |
|
|
my $doc = $impl->create_document; |
| 810 |
|
|
|
| 811 |
|
|
my $e1 = $doc->create_document_fragment; |
| 812 |
|
|
$e1->append_child ($doc->create_element_ns (null, 'el1')); |
| 813 |
|
|
|
| 814 |
|
|
my $e2 = $impl->create_storable_object_from_node ($e1); |
| 815 |
|
|
|
| 816 |
|
|
my $e3 = $impl->create_node_from_storable_object ($e2); |
| 817 |
|
|
|
| 818 |
|
|
$test->assert_num_equals |
| 819 |
|
|
(actual_value => $e3, |
| 820 |
|
|
expected_value => $e1); |
| 821 |
|
|
##DOMImplementationTreeStore |
| 822 |
|
|
|
| 823 |
|
|
ResourceDef: |
| 824 |
|
|
@QName: StorableObject |
| 825 |
|
|
@AliasFor: DOMMain|DOMObject |
| 826 |
|
|
@For: ManakaiDOM|DOM3 |
| 827 |
|
|
|
| 828 |
|
|
ElementTypeBinding: |
| 829 |
|
|
@Name: enDesc |
| 830 |
|
|
@ElementType: |
| 831 |
|
|
dis:Description |
| 832 |
|
|
@ShadowContent: |
| 833 |
|
|
@@lang:en |
| 834 |
|
|
|
| 835 |
|
|
ElementTypeBinding: |
| 836 |
|
|
@Name: enImplNote |
| 837 |
|
|
@ElementType: |
| 838 |
|
|
dis:ImplNote |
| 839 |
|
|
@ShadowContent: |
| 840 |
|
|
@@lang:en |
| 841 |
|
|
|
| 842 |
|
|
ElementTypeBinding: |
| 843 |
|
|
@Name: enFN |
| 844 |
|
|
@ElementType: |
| 845 |
|
|
dis:FullName |
| 846 |
|
|
@ShadowContent: |
| 847 |
|
|
@@lang:en |
| 848 |
|
|
|
| 849 |
|
|
ElementTypeBinding: |
| 850 |
|
|
@Name: PerlDef |
| 851 |
|
|
@ElementType: |
| 852 |
|
|
dis:Def |
| 853 |
|
|
@ShadowContent: |
| 854 |
|
|
@@ContentType: |
| 855 |
|
|
lang:Perl |
| 856 |
|
|
@@ForCheck: ManakaiDOM|ForClass |