/[suikacvs]/messaging/manakai/lib/Message/Markup/Atom.dis
Suika

Contents of /messaging/manakai/lib/Message/Markup/Atom.dis

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations) (download)
Fri May 19 11:02:11 2006 UTC (17 years, 11 months ago) by wakaba
Branch: MAIN
Changes since 1.3: +70 -3 lines
++ manakai/bin/ChangeLog	19 May 2006 11:00:59 -0000
2006-05-19  Wakaba  <wakaba@suika.fam.cx>

	* daf.pl (--load-module): New option.
	(--create-dtd-modules): New option.

++ manakai/lib/Message/Markup/ChangeLog	19 May 2006 11:01:40 -0000
2006-05-19  Wakaba  <wakaba@suika.fam.cx>

	* Atom.dis: Module definitions are added experimentally.

	* Makefile: Experimental rules are added.

++ manakai/lib/manakai/ChangeLog	19 May 2006 11:02:00 -0000
2006-05-19  Wakaba  <wakaba@suika.fam.cx>

	* DISMarkup.dis, XML.dis: Definitions are added.

	* daf-dtd-modules.pl: New script.

1 Module:
2 @QName: Markup|Atom
3 @enFN:
4 Atom DOM
5 @enDesc:
6 The <DFN::Atom DOM> is a language and platform independent
7 programming language interface to Atom 1.0 documents
8 built on the W3C Document Object Model (DOM). It defines
9 a number of interfaces that provide convenience
10 methods and attributes to process Atom 1.0 documents.
11
12 {TODO::
13 - Move descriptions below to somewhere.
14
15 - Formal definition for <IF::StaticNodeList> (reference
16 to Selectors API?) is necessary.
17 }
18
19 Some attributes are defined to contain a <IF::StaticNodeList>.
20 Multiple invocations for such an attribute don't have
21 to return exactly same object, even if no changes are made
22 on the underlying DOM structure.
23
24 {NOTE::
25 The equality of <IF::StaticNodeList> objects as per
26 the <M::Node.isEqualNode> method, however, is
27 preserved as long as the underlying DOM structure
28 and the configuration parameters are not changed.
29 }
30
31 Methods and attributes defined in this module does <EM::not>
32 support <IF::tx|EntityReference>s; for example, an element
33 node that is a child node of an entity reference node
34 that is a child node of another element node is <EM::not> considered
35 as a child element node of the other element node. As a
36 result, applications written using this module might ignore
37 parts of Atom documents unless they configures their XML
38 parser not to expose entity references in the result DOM tree.
39
40 @Namespace:
41 http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/Atom/
42
43 @DISCore:author: DISCore|Wakaba
44 @License: license|Perl+MPL
45 @Date:
46 $Date: 2006/05/13 05:40:58 $
47
48 @Require:
49 @@Module:
50 @@@QName: Markup|common
51 @@Module:
52 @@@QName: MDOM|TreeCore
53 @@@WithFor: ManakaiDOM|ManakaiDOMLatest
54 @@Module:
55 @@@WithFor: ManakaiDOM|ManakaiDOM
56 @@Module:
57 @@@WithFor: ManakaiDOM|ManakaiDOMLatest
58 @DefaultFor: ManakaiDOM|ManakaiDOMLatest
59
60 Namespace:
61 @atom:
62 http://www.w3.org/2005/Atom
63 @c:
64 http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#
65 @cfg:
66 http://suika.fam.cx/www/2006/dom-config/
67 @dis:
68 http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
69 @dlp:
70 http://suika.fam.cx/~wakaba/archive/2004/dis/Perl#
71 @doc:
72 http://suika.fam.cx/~wakaba/archive/2005/7/tutorial#
73 @d:
74 http://suika.fam.cx/~wakaba/archive/2004/dom/xdt#
75 @DOMMain:
76 http://suika.fam.cx/~wakaba/archive/2004/dom/main#
77 @dx:
78 http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#
79 @ecore:
80 http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/Core/
81 @f:
82 http://suika.fam.cx/~wakaba/archive/2004/dom/feature#
83 @fe:
84 http://suika.fam.cx/www/2006/feature/
85 @html:
86 http://www.w3.org/1999/xhtml
87 @idl:
88 http://suika.fam.cx/~wakaba/archive/2004/dis/IDL#
89 @kwd:
90 http://suika.fam.cx/~wakaba/archive/2005/rfc2119/
91 @lang:
92 http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#
93 @license:
94 http://suika.fam.cx/~wakaba/archive/2004/8/18/license#
95 @m12n:
96 http://suika.fam.cx/www/2006/05/m12n/
97 @ManakaiDOM:
98 http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#
99 @Markup:
100 http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup#
101 @mat:
102 http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/Atom/
103 @MDOM:
104 http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM.
105 @MDOMX:
106 http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception#
107 @mv:
108 http://suika.fam.cx/www/2006/05/mv/
109 @rel:
110 http://www.iana.org/assignments/relation/
111 @s:
112 http://suika.fam.cx/~wakaba/archive/2004/dis/Markup#
113 @tc:
114 http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/TreeCore/
115 @td:
116 http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Document/
117 @te:
118 http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/
119 @test:
120 http://suika.fam.cx/~wakaba/archive/2004/dis/Test#
121 @tx:
122 http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/
123 @urigen:
124 http://suika.fam.cx/~wakaba/archive/2005/manakai/URI/Generic/
125 @xml:
126 http://www.w3.org/XML/1998/namespace
127
128 ElementTypeBinding:
129 @Name: CODE
130 @ElementType:
131 dis:ResourceDef
132 @ShadowContent:
133 @@DISCore:resourceType: dlp|BlockCode
134 @@ForCheck: ManakaiDOM|ForClass
135
136 ElementTypeBinding:
137 @Name: Method
138 @ElementType:
139 dis:ResourceDef
140 @ShadowContent:
141 @@DISCore:resourceType: DISLang|Method
142 @@ForCheck: !=ManakaiDOM|ManakaiDOM
143
144 ElementTypeBinding:
145 @Name: Param
146 @ElementType:
147 dis:ResourceDef
148 @ShadowContent:
149 @@DISCore:resourceType: DISLang|MethodParameter
150
151 ElementTypeBinding:
152 @Name: Return
153 @ElementType:
154 dis:ResourceDef
155 @ShadowContent:
156 @@DISCore:resourceType: DISLang|MethodReturn
157
158 ElementTypeBinding:
159 @Name: Attr
160 @ElementType:
161 dis:ResourceDef
162 @ShadowContent:
163 @@DISCore:resourceType: DISLang|Attribute
164 @@ForCheck: !=ManakaiDOM|ManakaiDOM
165
166 ElementTypeBinding:
167 @Name: Get
168 @ElementType:
169 dis:ResourceDef
170 @ShadowContent:
171 @@DISCore:resourceType: DISLang|AttributeGet
172
173 ElementTypeBinding:
174 @Name: Set
175 @ElementType:
176 dis:ResourceDef
177 @ShadowContent:
178 @@DISCore:resourceType: DISLang|AttributeSet
179
180 ElementTypeBinding:
181 @Name: nullCase
182 @ElementType:
183 dis:ResourceDef
184 @ShadowContent:
185 @@DISCore:resourceType: ManakaiDOM|InCase
186 @@Value:
187 @@@is-null:1
188
189 ElementTypeBinding:
190 @Name: PerlDef
191 @ElementType:
192 dis:Def
193 @ShadowContent:
194 @@ContentType: lang|Perl
195 @@ForCheck: ManakaiDOM|ForClass
196
197 ElementTypeBinding:
198 @Name: PerlCDef
199 @ElementType:
200 dis:Def
201 @ShadowContent:
202 @@ContentType: lang|Perl
203
204 ElementTypeBinding:
205 @Name: enImplNote
206 @ElementType:
207 dis:ImplNote
208 @ShadowContent:
209 @@lang:en
210
211 ElementTypeBinding:
212 @Name: enFN
213 @ElementType:
214 dis:FullName
215 @ShadowContent:
216 @@lang:en
217
218 ElementTypeBinding:
219 @Name: IFClsETDef
220 @ElementType:
221 dis:ResourceDef
222 @ShadowContent:
223 @@DISCore:resourceType:
224 @@@@: dis|MultipleResource
225 @@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML
226 @@resourceFor: ManakaiDOM|ForIF
227 @@resourceFor: ManakaiDOM|ForClass
228 @@resourceFor: s|ForML
229 @@For: ManakaiDOM|ManakaiDOM
230
231 @@DISCore:resourceType:
232 @@@@: DISLang|Interface
233 @@@ForCheck: ManakaiDOM|ForIF
234
235 @@DISCore:resourceType:
236 @@@@: DISLang|Class
237 @@@ForCheck: ManakaiDOM|ForClass
238 @@Implement:
239 @@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF
240 @@@ContentType: DISCore|TFPQNames
241 @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM
242 @@Implement:
243 @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF
244 @@@ContentType: DISCore|TFPQNames
245 @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest
246
247 @@s:elementType:
248 @@@@: ||+||s|ForML
249 @@@ContentType: DISCore|TFPQNames
250 @@@DISCore:stopISARecursive:1
251
252 @@DISCore:resourceType:
253 @@@@: s|ElementType
254 @@@ForCheck: s|ForML
255
256 @@f:implements: AtomFeature10
257
258 ElementTypeBinding:
259 @Name: IFClsDef
260 @ElementType:
261 dis:ResourceDef
262 @ShadowContent:
263 @@DISCore:resourceType:
264 @@@@: dis|MultipleResource
265 @@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML
266 @@resourceFor: ManakaiDOM|ForIF
267 @@resourceFor: ManakaiDOM|ForClass
268 @@For: ManakaiDOM|ManakaiDOM
269
270 @@DISCore:resourceType:
271 @@@@: DISLang|Interface
272 @@@ForCheck: ManakaiDOM|ForIF
273
274 @@DISCore:resourceType:
275 @@@@: DISLang|Class
276 @@@ForCheck: ManakaiDOM|ForClass
277 @@Implement:
278 @@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF
279 @@@ContentType: DISCore|TFPQNames
280 @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM
281 @@Implement:
282 @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF
283 @@@ContentType: DISCore|TFPQNames
284 @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest
285
286 @@f:implements: AtomFeature10
287
288 ElementTypeBinding:
289 @Name: IFQName
290 @ElementType:
291 dis:QName
292 @ShadowContent:
293 @@ForCheck: ManakaiDOM|ForIF
294
295 ElementTypeBinding:
296 @Name: ClsQName
297 @ElementType:
298 dis:QName
299 @ShadowContent:
300 @@ForCheck: ManakaiDOM|ForClass
301
302 ElementTypeBinding:
303 @Name: ETRQName
304 @ElementType:
305 dis:QName
306 @ShadowContent:
307 @@ForCheck: s|ForML
308
309 ElementTypeBinding:
310 @Name: ETQName
311 @ElementType:
312 dis:AppName
313 @ShadowContent:
314 @@ForCheck: s|ForML
315 @@ContentType: DISCore|QName
316
317 ElementTypeBinding:
318 @Name: IFISA
319 @ElementType:
320 dis:ISA
321 @ShadowContent:
322 @@ForCheck: ManakaiDOM|ForIF
323
324 ElementTypeBinding:
325 @Name: ClsISA
326 @ElementType:
327 dis:ISA
328 @ShadowContent:
329 @@ForCheck: ManakaiDOM|ForClass
330
331 ElementTypeBinding:
332 @Name: disDef
333 @ElementType:
334 dis:Def
335 @ShadowContent:
336 @@ContentType:
337 lang:dis
338 @@ForCheck: ManakaiDOM|ForClass
339
340 ElementTypeBinding:
341 @Name: Code
342 @ElementType:
343 dis:ResourceDef
344 @ShadowContent:
345 @@DISCore:resourceType: dlp|InlineCode
346 @@ForCheck: ManakaiDOM|ForClass
347
348 ElementTypeBinding:
349 @Name: Test
350 @ElementType:
351 dis:ResourceDef
352 @ShadowContent:
353 @@DISCore:resourceType: test|StandaloneTest
354 @@ForCheck: ManakaiDOM|ForClass
355
356 ElementTypeBinding:
357 @Name: TestC
358 @ElementType:
359 dis:ResourceDef
360 @ShadowContent:
361 @@DISCore:resourceType: test|StandaloneTest
362
363 ResourceDef:
364 @QName: Document
365 @AliasFor: td|Document
366 @For: ManakaiDOM|DOM
367
368 ResourceDef:
369 @QName: Element
370 @AliasFor: te|Element
371 @For: ManakaiDOM|DOM
372
373 ResourceDef:
374 @QName: Attr
375 @AliasFor: te|Attr
376 @For: ManakaiDOM|DOM
377
378 ResourceDef:
379 @QName: DOMString
380 @AliasFor: DOMMain|DOMString
381 @For: ManakaiDOM|DOM
382
383 ResourceDef:
384 @QName: DOMURI
385 @AliasFor: ManakaiDOM|ManakaiDOMURI
386 @For: ManakaiDOM|DOM3
387
388 ResourceDef:
389 @QName: DOMTimeStamp
390 @AliasFor: DOMMain|DOMTimeStamp
391 @For: ManakaiDOM|DOM2
392
393 ResourceDef:
394 @QName: boolean
395 @AliasFor: idl|boolean||ManakaiDOM|all
396
397 ResourceDef:
398 @QName: Node
399 @AliasFor: tc|Node
400 @For: ManakaiDOM|ManakaiDOM
401
402 ResourceDef:
403 @QName: NodeList
404 @AliasFor: tc|NodeList
405 @For: ManakaiDOM|ManakaiDOM
406
407 ResourceDef:
408 @QName: StaticNodeList
409 @AliasFor: tc|StaticNodeList
410 @For: ManakaiDOM|ManakaiDOM
411
412 ElementTypeBinding:
413 @Name: enDesc
414 @ElementType:
415 dis:Description
416 @ShadowContent:
417 @@lang:en
418
419 ElementTypeBinding:
420 @Name: enLN
421 @ElementType:
422 mv:longName
423 @ShadowContent:
424 @@lang:en
425
426 ElementTypeBinding:
427 @Name: TrueCase
428 @ElementType:
429 dis:ResourceDef
430 @ShadowContent:
431 @@DISCore:resourceType:
432 ManakaiDOM:InCase
433 @@Value:
434 @@@@: 1
435 @@@ContentType: DISCore|Boolean
436 @@Type: idl|boolean||ManakaiDOM|all
437
438 ElementTypeBinding:
439 @Name: FalseCase
440 @ElementType:
441 dis:ResourceDef
442 @ShadowContent:
443 @@DISCore:resourceType:
444 ManakaiDOM:InCase
445 @@Value:
446 @@@@: 0
447 @@@ContentType: DISCore|Boolean
448 @@Type: idl|boolean||ManakaiDOM|all
449
450 ## -- Features
451
452 ElementTypeBinding:
453 @Name: FeatureDef
454 @ElementType:
455 dis:ResourceDef
456 @ShadowContent:
457 @@DISCore:resourceType: f|Feature
458 @@For: =ManakaiDOM|all
459
460 ElementTypeBinding:
461 @Name: FeatureVerDef
462 @ElementType:
463 dis:ResourceDef
464 @ShadowContent:
465 @@DISCore:resourceType: f|Feature
466
467 ElementTypeBinding:
468 @Name: featureQName
469 @ElementType:
470 f:name
471 @ShadowContent:
472 @@ContentType: DISCore|QName
473
474 FeatureDef:
475 @featureQName: fe|Atom
476 @QName: AtomFeature
477 @FeatureVerDef:
478 @@QName: AtomFeature10
479 @@Version: 1.0
480 @@f:instanceOf: AtomFeature
481 @@f:requires: tx|XMLFeature30
482 @@enDesc:
483 The Atom DOM, version 1.0.
484
485 ## -- Modules
486
487 ModuleSetDef:
488 @QName: Atom
489 @mv:id: atom
490 @enLN: Atom
491 @mv:version: 1.0
492 @mv:contains: AtomFeed
493 @mv:contains: AtomEntry
494 @mv:contains: AtomProperty
495
496 ModuleDef:
497 @QName: AtomFeed
498 @mv:id: feed
499 @enLN: Feed
500 @mv:contains: atom|feed
501
502 ModuleDef:
503 @QName: AtomEntry
504 @mv:id: entry
505 @enLN: Entry
506 @mv:contains: atom|entry
507
508 ModuleDef:
509 @QName: AtomProperty
510 @mv:id: prop
511 @enLN: Property
512 @mv:contains: atom|content
513 @mv:contains: atom|category
514 @mv:contains: atom|generator
515 @mv:contains: atom|source
516 @mv:contains: atom|link
517 @mv:contains: atom|author
518 @mv:contains: atom|published
519 @mv:contains: atom|updated
520 @mv:contains: atom|id
521 @mv:contains: atom|title
522 @mv:contains: atom|email
523 @mv:contains: atom|uri
524
525 ElementTypeBinding:
526 @Name: ModuleSetDef
527 @ElementType:
528 dis:ResourceDef
529 @ShadowContent:
530 @@DISCore:resourceType: mv|XMLDTDModuleSet
531 @@For: =ManakaiDOM|ManakaiDOMLatest
532
533 ElementTypeBinding:
534 @Name: ModuleDef
535 @ElementType:
536 dis:ResourceDef
537 @ShadowContent:
538 @@DISCore:resourceType: mv|XMLDTDModule
539 @@For: =ManakaiDOM|ManakaiDOMLatest
540
541 ## -- Implementation
542
543 IFClsDef:
544 @IFQName: AtomImplementation
545 @ClsQName: ManakaiAtomImplementation
546
547 @IFISA: c|DOMImplementation
548 @ClsISA: c|ManakaiDOMImplementation
549
550 @enDesc:
551 The <IF::AtomImplementation> interface provides convenience
552 methods to create Atom documents.
553
554 @f:provides: AtomFeature10
555
556 @Test:
557 @@QName: AtomImplementation.interface.test
558 @@PerlDef:
559 for my $interface (
560 <IFName::AtomImplementation>,
561 <IFName::AtomImplementation||ManakaiDOM|ManakaiDOM>,
562 <IFName::c|DOMImplementation>,
563 <IFName::urigen|URIImplementation>,
564 <IFName::f|MinimumImplementation>,
565 <IFName::f|GetFeature>,
566 ) {
567 $test->id ($interface);
568 $test->assert_true
569 (<Class::ManakaiAtomImplementation>->isa ($interface));
570 }
571 @Test:
572 @@QName: ImplementationRegistry.AtomImplementation.1.test
573 @@PerlDef:
574 require Message::Markup::Atom;
575 my $impl = $Message::DOM::ImplementationRegistry
576 ->get_implementation ({
577 <Q::fe|Atom> => '1.0',
578 });
579
580 $test->assert_isa ($impl, <IFName::AtomImplementation>);
581 @Test:
582 @@QName: ImplementationRegistry.AtomImplementation.2.test
583 @@PerlDef:
584 require Message::Markup::Atom;
585 my $impl = $Message::DOM::ImplementationRegistry
586 ->get_implementation ({
587 Core => '3.0',
588 <Q::fe|Atom> => '1.0',
589 });
590
591 $test->assert_isa ($impl, <IFName::AtomImplementation>);
592 @Test:
593 @@QName: ImplementationRegistry.AtomImplementation.3.test
594 @@PerlDef:
595 require Message::Markup::Atom;
596 my $impl = $Message::DOM::ImplementationRegistry
597 ->get_implementation ({
598 XML => '3.0',
599 <Q::fe|Atom> => '1.0',
600 });
601
602 $test->assert_isa ($impl, <IFName::AtomImplementation>);
603
604 @Method:
605 @@Name: createAtomFeedDocument
606 @@enDesc:
607 Creates an Atom Feed Document object.
608 @@Param:
609 @@@Name: id
610 @@@Type: DOMString
611 @@@actualType: DOMURI
612 @@@enDesc:
613 The <XE::atom|id> of the feed.
614 @@Param:
615 @@@Name: title
616 @@@Type: DOMString
617 @@@enDesc:
618 The <XE::atom|title> of the feed.
619 @@@nullCase:
620 @@@@enDesc:
621 The implementation <kwd:MUST> treate <DOM::null>
622 as if an empty string is specified.
623 @@Param:
624 @@@Name: lang
625 @@@Type: DOMString
626 @@@enDesc:
627 The default natural language of the feed.
628 @@@nullCase:
629 @@@@enDesc:
630 The implementation <kwd:MUST> treate <DOM::null>
631 as if an empty string is specified.
632 @@Return:
633 @@@Type: AtomFeedDocument
634 @@@enDesc:
635 The newly created Atom Feed Document.
636
637 {P:: The returned object <kwd:MUST> be a <IF::Document> node
638 with attributes:
639
640 - <A::Node.childNodes>::: A <IF::NodeList> containing
641 a new <XE::atom|feed> element node.
642
643 - <A::Document.xmlVersion>::: <XML::1.0>.
644
645 }
646
647 {P:: The newly created <XE::atom|feed> element node <kwd:MUST>
648 have attributes set as:
649
650 - <A::Node.attributes>::: A <IF::NamedNodeMap> that contains
651 at least a new <XA::xml|lang>
652 attribute node.
653
654 - <A::Node.childNodes>::: A <IF::NodeList> containing
655 a new <XE::atom|id> element node,
656 a new <XE::atom|title> element node, and
657 a new <XE::atom|updated> element node
658 in any order.
659
660 }
661
662 {P:: The newly created <XA::xml|lang> attribute node <kwd:MUST>
663 have attributes set as:
664
665 - <A::Node.nodeValue>::: <P::lang>.
666
667 - <A::Attr.specified>::: <DOM::true>.
668
669 }
670
671 {P:: The newly created <XE::atom|id> element node <kwd:MUST>
672 have attributes set as:
673
674 - <A::Node.textContent>::: <P::id>.
675
676 }
677
678 {P:: The newly created <XE::atom|title> element node <kwd:MUST>
679 have attributes set as:
680
681 - <A::Node.textContent>::: <P::title>.
682
683 }
684
685 The <XA::type> attribute node <kwd:MUST-NOT> be attached
686 to the <XE::atom|title> element node.
687
688 {P:: The newly created <XE::atom|updated> element node <kwd:MUST>
689 have attributes set as:
690
691 - <A::Node.textContent>::: A uppercase RFC 3339 <CODE::date-time>
692 representation of the time when the method is invoked.
693 The implementation <kwd:MAY> align its timezone to
694 that of the environment in which the method is invoked.
695
696 }
697 @@@PerlDef:
698 __DEEP{
699 $r = $self-><M::c|DOMImplementation.createDocument>
700 (<Q::atom|>, 'feed');
701 $r-><AS::Document.xmlVersion> ('1.0');
702
703 my $feede = $r-><AG::Document.documentElement>;
704 $feede-><AS::Node.manakaiLanguage> (defined $lang ? $lang : '');
705
706 $feede-><AS::AtomFeedElement.id> ($id);
707
708 my $titlee = $r-><M::Document.createElementNS> (<Q::atom|>, 'title');
709 $titlee-><AS::Node.textContent> (defined $title ? $title : '');
710 $feede-><M::Node.appendChild> ($titlee);
711
712 my $updatede = $r-><M::Document.createElementNS>
713 (<Q::atom|>, 'updated');
714 $updatede-><AS::AtomDateConstruct.value> (scalar time);
715 $feede-><M::Node.appendChild> ($updatede);
716 }__;
717
718 @@Test:
719 @@@QName: AtomImplementation.createAtomFeedDocument.test
720 @@@PerlDef:
721 my $impl;
722 __CODE{tc|createImplForTest:: $impl => $impl}__;
723 $impl = $impl->get_feature (<Q::fe|Atom> => '1.0');
724
725 my $doc = $impl-><M::AtomImplementation.createAtomFeedDocument>
726 ('about:id', 'feed title', 'en');
727
728 $test->id ('document.interface');
729 $test->assert_isa ($doc, <IFName::Document>);
730
731 $test->id ('document.xmlVersion');
732 $test->assert_equals ($doc-><AG::Document.xmlVersion>, '1.0');
733
734 my $feed = $doc-><AG::Document.documentElement>;
735
736 $test->id ('feed.namespaceURI');
737 $test->assert_equals ($feed-><AG::Node.namespaceURI>, <Q::atom|>);
738
739 $test->id ('feed.localName');
740 $test->assert_equals ($feed-><AG::Node.localName>, 'feed');
741
742 $test->id ('feed.lang');
743 $test->assert_equals ($feed-><M::Element.getAttributeNS>
744 (<Q::xml|>, 'lang'),
745 'en');
746
747 my $id;
748 my $title;
749 my $updated;
750
751 for my $cn (@{$feed-><AG::Node.childNodes>}) {
752 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
753 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
754 if ($cn-><AG::Node.localName> eq 'id') {
755 $id = $cn;
756 } elsif ($cn-><AG::Node.localName> eq 'title') {
757 $title = $cn;
758 } elsif ($cn-><AG::Node.localName> eq 'updated') {
759 $updated = $cn;
760 }
761 }
762 }
763
764 $test->id ('id');
765 $test->assert_not_null ($id);
766
767 $test->id ('id.value');
768 $test->assert_equals ($id-><AG::Node.textContent>, 'about:id');
769
770 $test->id ('title');
771 $test->assert_not_null ($title);
772
773 $test->id ('title.value');
774 $test->assert_equals ($title-><AG::Node.textContent>, 'feed title');
775
776 $test->id ('title.type');
777 $test->assert_null ($title-><M::Element.getAttributeNS> (null, 'type'));
778
779 $test->id ('updated');
780 $test->assert_not_null ($updated);
781
782 $test->id ('updated.value');
783 $test->assert_num_not_equals
784 (actual_value => $updated-><AG::AtomDateConstruct.value>,
785 expected_value => 0);
786
787 @Method:
788 @@Name: createAtomEntryDocument
789 @@enDesc:
790 Creates an Atom Entry Document object.
791 @@Param:
792 @@@Name: id
793 @@@Type: DOMString
794 @@@actualType: DOMURI
795 @@@enDesc:
796 The <XE::atom|id> of the entry.
797 @@Param:
798 @@@Name: title
799 @@@Type: DOMString
800 @@@enDesc:
801 The <XE::atom|title> of the entry.
802 @@@nullCase:
803 @@@@enDesc:
804 The implementation <kwd:MUST> treate <DOM::null>
805 as if an empty string is specified.
806 @@Param:
807 @@@Name: lang
808 @@@Type: DOMString
809 @@@enDesc:
810 The natural language of the entry.
811 @@@nullCase:
812 @@@@enDesc:
813 The implementation <kwd:MUST> treate <DOM::null>
814 as if an empty string is specified.
815 @@Return:
816 @@@Type: AtomEntryDocument
817 @@@enDesc:
818 The newly created Atom Entry Document.
819
820 {P:: The returned object <kwd:MUST> be a <IF::Document> node
821 with attributes:
822
823 - <A::Node.childNodes>::: A <IF::NodeList> containing
824 a new <XE::atom|entry> element node.
825
826 - <A::Document.xmlVersion>::: <XML::1.0>.
827
828 }
829
830 {P:: The newly created <XE::atom|entry> element node <kwd:MUST>
831 have attributes set as:
832
833 - <A::Node.attributes>::: A <IF::NamedNodeMap> that contains
834 at least a new <XA::xml|lang>
835 attribute node.
836
837 - <A::Node.childNodes>::: A <IF::NodeList> containing
838 a new <XE::atom|id> element node,
839 a new <XE::atom|title> element node, and
840 a new <XE::atom|updated> element node
841 in any order.
842
843 }
844
845 {P:: The newly created <XA::xml|lang> attribute node <kwd:MUST>
846 have attributes set as:
847
848 - <A::Node.nodeValue>::: <P::lang>.
849
850 - <A::Attr.specified>::: <DOM::true>.
851
852 }
853
854 {P:: The newly created <XE::atom|id> element node <kwd:MUST>
855 have attributes set as:
856
857 - <A::Node.textContent>::: <P::id>.
858
859 }
860
861 {P:: The newly created <XE::atom|title> element node <kwd:MUST>
862 have attributes set as:
863
864 - <A::Node.textContent>::: <P::title>.
865
866 }
867
868 The <XA::type> attribute node <kwd:MUST-NOT> be attached
869 to the <XE::atom|title> element node.
870
871 {P:: The newly created <XE::atom|updated> element node <kwd:MUST>
872 have attributes set as:
873
874 - <A::Node.textContent>::: A uppercase RFC 3339 <CODE::date-time>
875 representation of the time when the method is invoked.
876 The implementation <kwd:MAY> align its timezone to
877 that of the environment in which the method is invoked.
878
879 }
880 @@@PerlDef:
881 __DEEP{
882 $r = $self-><M::c|DOMImplementation.createDocument>
883 (<Q::atom|>, 'entry');
884 $r-><AS::Document.xmlVersion> ('1.0');
885
886 my $feede = $r-><AG::Document.documentElement>;
887 $feede-><AS::Node.manakaiLanguage> (defined $lang ? $lang : '');
888
889 $feede-><AS::AtomFeedElement.id> ($id);
890
891 my $titlee = $r-><M::Document.createElementNS> (<Q::atom|>, 'title');
892 $titlee-><AS::Node.textContent> (defined $title ? $title : '');
893 $feede-><M::Node.appendChild> ($titlee);
894
895 my $updatede = $r-><M::Document.createElementNS>
896 (<Q::atom|>, 'updated');
897 $updatede-><AS::AtomDateConstruct.value> (scalar time);
898 $feede-><M::Node.appendChild> ($updatede);
899 }__;
900
901 @@Test:
902 @@@QName: AtomImplementation.createAtomEntryDocument.test
903 @@@PerlDef:
904 my $impl;
905 __CODE{tc|createImplForTest:: $impl => $impl}__;
906 $impl = $impl->get_feature (<Q::fe|Atom> => '1.0');
907
908 my $doc = $impl-><M::AtomImplementation.createAtomEntryDocument>
909 ('about:id', 'entry title', 'en');
910
911 $test->id ('document.interface');
912 $test->assert_isa ($doc, <IFName::Document>);
913
914 $test->id ('document.xmlVersion');
915 $test->assert_equals ($doc-><AG::Document.xmlVersion>, '1.0');
916
917 my $feed = $doc-><AG::Document.documentElement>;
918
919 $test->id ('feed.namespaceURI');
920 $test->assert_equals ($feed-><AG::Node.namespaceURI>, <Q::atom|>);
921
922 $test->id ('feed.localName');
923 $test->assert_equals ($feed-><AG::Node.localName>, 'entry');
924
925 $test->id ('feed.lang');
926 $test->assert_equals ($feed-><M::Element.getAttributeNS>
927 (<Q::xml|>, 'lang'),
928 'en');
929
930 my $id;
931 my $title;
932 my $updated;
933
934 for my $cn (@{$feed-><AG::Node.childNodes>}) {
935 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
936 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
937 if ($cn-><AG::Node.localName> eq 'id') {
938 $id = $cn;
939 } elsif ($cn-><AG::Node.localName> eq 'title') {
940 $title = $cn;
941 } elsif ($cn-><AG::Node.localName> eq 'updated') {
942 $updated = $cn;
943 }
944 }
945 }
946
947 $test->id ('id');
948 $test->assert_not_null ($id);
949
950 $test->id ('id.value');
951 $test->assert_equals ($id-><AG::Node.textContent>, 'about:id');
952
953 $test->id ('title');
954 $test->assert_not_null ($title);
955
956 $test->id ('title.value');
957 $test->assert_equals ($title-><AG::Node.textContent>, 'entry title');
958
959 $test->id ('title.type');
960 $test->assert_null ($title-><M::Element.getAttributeNS> (null, 'type'));
961
962 $test->id ('updated');
963 $test->assert_not_null ($updated);
964
965 $test->id ('updated.value');
966 $test->assert_num_not_equals
967 (actual_value => $updated-><AG::AtomDateConstruct.value>,
968 expected_value => 0);
969
970 @enImplNote:
971 @@ddid: imt
972 @@@:
973 {ISSUE::
974 The <CODE::contentType> attribute of the created document
975 should be set to <CODE::application/atom+xml>?
976 }
977
978 @CODE:
979 @@QName: returnChildElement
980 @@enDesc:
981 {P:: The algorithm to <DFN::return <VAR::element-type> child
982 element> of the element node <VAR::E> is defined as:
983
984 = If <VAR::E> contains one or more child element node
985 whose element type is <VAR::element-type>,
986 it <kwd:MUST> return the first such element node
987 in document order.
988
989 {OLI:: Otherwise,
990
991 {OLI:: If the <cfg::cfg|create-child-element> configuration
992 parameter is set to <DOM::true>,
993
994 = Create an element node <VAR::N> whose element type
995 is <VAR::element-type>.
996
997 = Append <VAR::N> to <VAR::E> as if the <M::Node.appendChild>
998 method were called for <VAR::E> with its parameter
999 set to <VAR::N>. Note that this might throw an exception.
1000
1001 = Then, <VAR::N> <kwd:MUST> be returned.
1002
1003 }
1004
1005 = Otherwise, <DOM::null> <kwd:MUST> be returned.
1006
1007 }
1008
1009 }
1010 @@PerlDef:
1011 __DEEP{
1012 E: {
1013 no warnings 'uninitialized';
1014 for my $__el (@{$node-><AG::Node.childNodes>}) {
1015 if ($__el-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1016 $__el-><AG::Node.localName> eq $localName and
1017 $__el-><AG::Node.namespaceURI> eq $namespaceURI) {
1018 $r = $__el;
1019 last E;
1020 }
1021 }
1022
1023 my $od = $node-><AG::Node.ownerDocument>;
1024 if ($od-><AG::Document.domConfig>
1025 -><M::CFG.getParameter> (<Q::cfg|create-child-element>)) {
1026 $r = $od-><M::Document.createElementNS> ($namespaceURI, $localName);
1027 $node-><M::Node.appendChild> ($r);
1028 }
1029 } # E
1030 }__;
1031
1032 @CODE:
1033 @@QName: returnChildElementList
1034 @@enDesc:
1035 {P:: The algorithm to <DFN::return <VAR::element-type> child
1036 element list> of the element node <VAR::E> is defined as:
1037
1038 = Creates an empty <IF::StaticNodeList> object <VAR::L>
1039 that is <EM::not> read-only.
1040
1041 = For each child element node of <VAR::E>,
1042 add that element node to <VAR::L> in document order
1043 if its element type is <VAR::element-type>.
1044
1045 = Returns <VAR::E>.
1046
1047 }
1048 @@PerlDef:
1049 __DEEP{
1050 no warnings 'uninitialized';
1051 __CODE{tc|createStaticNodeList:: $r => $r}__;
1052 for my $__el (@{$node-><AG::Node.childNodes>}) {
1053 if ($__el-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1054 $__el-><AG::Node.localName> eq $localName and
1055 $__el-><AG::Node.namespaceURI> eq $namespaceURI) {
1056 push @{$r}, $__el;
1057 }
1058 }
1059 }__;
1060
1061 @CODE:
1062 @@QName: getReflectStringValue
1063 @@enDesc:
1064 {P:: If a DOM attribute is defined to <DFN::reflect the string value
1065 of the <VAR::element-type> child element> of the node <VAR::E>,
1066 the getter of the attribute <kwd:MUST> return the value
1067 defined by the algorithm:
1068
1069 = If the <VAR::E> contains a child element node <VAR::C> whose element
1070 type is <VAR::element-type>, it <kwd:MUST> return
1071 the <A::Node.textContent> value of the <VAR::C>.
1072
1073 = Otherwise, it <kwd:MUST> return <DOM::null>.
1074
1075 }
1076 @@PerlDef:
1077 __DEEP{
1078 E: {
1079 no warnings 'uninitialized';
1080 for my $__cn (@{$node-><AG::Node.childNodes>}) {
1081 if ($__cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1082 $__cn-><AG::Node.localName> eq $localName and
1083 $__cn-><AG::Node.namespaceURI> eq $namespaceURI) {
1084 $r = $__cn-><AG::Node.textContent>;
1085 last E;
1086 }
1087 }
1088 $r = null;
1089 } # E
1090 }__;
1091
1092 @CODE:
1093 @@QName: setReflectStringValue
1094 @@enDesc:
1095 {P:: If a DOM attribute is defined to <DFN::reflect the string value
1096 of the <VAR::element-type> child element> of the node <VAR::E>,
1097 the setter of the attribute <kwd:MUST> modify the node as
1098 defined by the algorithm:
1099
1100 = If the given value is <DOM::null>, any child elements
1101 whose element types are <VAR::element-type> <kwd:MUST>
1102 be removed from the list of child nodes.
1103
1104 = Otherwise, if there is no <VAR::element-type> child element
1105 node in the child node list of the <VAR::E>, it
1106 <kwd:MUST> create an element node whose element type
1107 is <VAR::element-type>, append it to the <VAR::E> as
1108 if the <M::Node.appendChild> method were invoked, and
1109 set the <A::Node.textContent> of the newly created
1110 element node to the given value.
1111
1112 = Otherwise, it <kwd:MUST> set the <A::Node.textContent>
1113 of the first <VAR::element-type> child element node
1114 in the child node list of the <VAR::E> to the given value.
1115
1116 }
1117
1118 {NOTE::
1119 It might throw an exception.
1120 }
1121 @@PerlDef:
1122 __DEEP{
1123 no warnings 'uninitialized';
1124 if (defined $given) {
1125 my $__target;
1126 E: {
1127 for my $__cl (@{$node-><AG::Node.childNodes>}) {
1128 if ($__cl-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1129 $__cl-><AG::Node.localName> eq $localName and
1130 $__cl-><AG::Node.namespaceURI> eq $namespaceURI) {
1131 $__target = $__cl;
1132 last E;
1133 }
1134 }
1135
1136 $__target = $node-><AG::Node.ownerDocument>
1137 -><M::Document.createElementNS>
1138 ($namespaceURI, $localName);
1139 $node-><M::Node.appendChild> ($__target);
1140 } # E
1141
1142 $__target-><AS::Node.textContent> ($given);
1143 } else {
1144 my @__remove;
1145 for my $__cl (@{$node-><AG::Node.childNodes>}) {
1146 if ($__cl-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1147 $__cl-><AG::Node.localName> eq $localName and
1148 $__cl-><AG::Node.namespaceURI> eq $namespaceURI) {
1149 push @__remove, $__cl;
1150 }
1151 }
1152 $node-><M::Node.removeChild> ($_) for @__remove;
1153 }
1154 }__;
1155
1156 @CODE:
1157 @@QName: getReflectAttrStringValue
1158 @@enDesc:
1159 {P:: If a DOM attribute is defined to <DFN::reflect the string value
1160 of the <VAR::attr-name> attribute> of the node <VAR::E>,
1161 the getter of the attribute <kwd:MUST> return the value
1162 defined by the algorithm:
1163
1164 = If the <VAR::E> contains an attribute node <VAR::A> whose name
1165 is <VAR::attr-name>, it <kwd:MUST> return
1166 the <A::Node.nodeValue> of the <VAR::A>.
1167
1168 = If a default value is explicitly defined
1169 where this algorithm is referenced, it <kwd:MUST>
1170 return the default value.
1171
1172 = Otherwise, it <kwd:MUST> return <DOM::null>.
1173
1174 }
1175 @@PerlDef:
1176 __DEEP{
1177 E: {
1178 $r = $node-><M::Element.getAttributeNS> ($namespaceURI, $localName);
1179 last E if defined $r;
1180
1181 $r = $defaultValue;
1182 } # E
1183 }__;
1184
1185 @CODE:
1186 @@QName: setReflectAttrStringValue
1187 @@enDesc:
1188 {P:: If a DOM attribute is defined to <DFN::reflect the string value
1189 of the <VAR::attr-name> attribute> of the node <VAR::E>,
1190 the setter of the attribute <kwd:MUST> modify the node as
1191 defined by the algorithm:
1192
1193 = If the given value is <DOM::null>, it <kwd:MUST>
1194 remove the <VAR::attr-name> attribute node, if any,
1195 from the list of attribute nodes of <VAR::E>.
1196
1197 = Otherwise, it <kwd:MUST> set the <VAR::attr-name>
1198 attribute node value to the given value as if
1199 the <M::Element.setAttributeNS> method were invoked.
1200
1201 }
1202
1203 {NOTE::
1204 It might throw an exception.
1205 }
1206 @@PerlDef:
1207 __DEEP{
1208 if (defined $given) {
1209 $node-><M::Element.setAttributeNS> ($namespaceURI, $localName, $given);
1210 } else {
1211 $node-><M::Element.removeAttributeNS> ($namespaceURI, $localName);
1212 }
1213 }__;
1214
1215 @CODE:
1216 @@QName: getReflectURIValue
1217 @@enDesc:
1218 {P:: If a DOM attribute is defined to <DFN::reflect the URI value
1219 of the <VAR::element-type> child element> of the node <VAR::E>,
1220 the getter of the attribute <kwd:MUST> return the value
1221 defined by the algorithm:
1222
1223 = Get the string <VAR::S> that would be returned
1224 if the DOM attribute <I::reflects the string value
1225 of the <VAR::element-type> child element> of the <VAR::E>.
1226
1227 = If the <VAR::S> is <DOM::null>, it <kwd:MUST> return
1228 <DOM::null>.
1229
1230 = Otherwise, if the <A::Node.baseURI> of the node
1231 from which the <VAR::S> comes is <DOM::null>,
1232 it <kwd:MUST> return the <VAR::S>.
1233
1234 = Otherwise, a string that would be returned by the
1235 <M::urigen|URIReference.getAbsoluteReference>
1236 method on a <IF::urigen|URIReference> object whose
1237 <A::urigen|URIReference.uriReference> value
1238 equals to <A::Node.textContent> with the <CODE::base> parameter
1239 set to the <A::Node.baseURI> of the node
1240 from which the <VAR::S> comes and the <CODE::nonStrict>
1241 parameter set to <DOM::false>.
1242
1243 }
1244 @@PerlDef:
1245 __DEEP{
1246 E: {
1247 no warnings 'uninitialized';
1248 for my $__cn (@{$node-><AG::Node.childNodes>}) {
1249 if ($__cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1250 $__cn-><AG::Node.localName> eq $localName and
1251 $__cn-><AG::Node.namespaceURI> eq $namespaceURI) {
1252 my $__ref_buri = $__cn-><AG::Node.baseURI>;
1253 if (defined $__ref_buri) {
1254 $r = $node-><AG::Node.ownerDocument>
1255 -><AG::Document.implementation>
1256 -><M::urigen|URIImplementation.createURIReference>
1257 ($__cn-><AG::Node.textContent>)
1258 -><M::urigen|URIReference.getAbsoluteReference>
1259 ($__ref_buri)
1260 -><AG::urigen|URIReference.uriReference>;
1261 } else {
1262 $r = $__cn-><AG::Node.textContent>;
1263 }
1264 last E;
1265 }
1266 }
1267 $r = null;
1268 } # E
1269 }__;
1270
1271 @CODE:
1272 @@QName: setReflectURIValue
1273 @@enDesc:
1274 If a DOM attribute is defined to <DFN::reflect the URI value
1275 of the <VAR::element-type> child element> of the node <VAR::E>,
1276 the setter of the attribute <kwd:MUST> modify the node as
1277 if the DOM attribute <I::reflects the string value of
1278 the <VAR::element-type> child element> of the <VAR::E>.
1279
1280 {NOTE::
1281 It might throw an exception.
1282 }
1283 @@PerlDef:
1284 __CODE{setReflectStringValue}__;
1285
1286 @CODE:
1287 @@QName: getReflectAttrURIValue
1288 @@enDesc:
1289 {P:: If a DOM attribute is defined to <DFN::reflect the URI value
1290 of the <VAR::attr-name> attribute> of the node <VAR::E>,
1291 the getter of the attribute <kwd:MUST> return the value
1292 defined by the algorithm:
1293
1294 = Get the string <VAR::S> that would be returned
1295 if the DOM attribute <I::reflects the string value
1296 of the <VAR::attr-name> attribute> of the <VAR::E>.
1297
1298 = If the <VAR::S> is <DOM::null>, it <kwd:MUST> return
1299 <DOM::null>.
1300
1301 = Otherwise, if the <A::Node.baseURI> of the node
1302 from which the <VAR::S> comes is <DOM::null>,
1303 it <kwd:MUST> return the <VAR::S>.
1304
1305 = Otherwise, a string that would be returned by the
1306 <M::urigen|URIReference.getAbsoluteReference>
1307 method on a <IF::urigen|URIReference> object whose
1308 <A::urigen|URIReference.uriReference> value
1309 equals to <A::Node.textContent> with the <CODE::base> parameter
1310 set to the <A::Node.baseURI> of the node
1311 from which the <VAR::S> comes and the <CODE::nonStrict>
1312 parameter set to <DOM::false>.
1313
1314 }
1315 @@PerlDef:
1316 __DEEP{
1317 my $__attr = $node-><M::Element.getAttributeNodeNS>
1318 ($namespaceURI, $localName);
1319 if (defined $__attr) {
1320 my $__attr_base = $__attr-><AG::Node.baseURI>;
1321 if (defined $__attr_base) {
1322 $r = $node-><AG::Node.ownerDocument>
1323 -><AG::Document.implementation>
1324 -><M::urigen|URIImplementation.createURIReference>
1325 ($__attr-><AG::Node.nodeValue>)
1326 -><M::urigen|URIReference.getAbsoluteReference>
1327 ($__attr_base)
1328 -><AG::urigen|URIReference.uriReference>;
1329 } else {
1330 $r = $__attr-><AG::Node.nodeValue>;
1331 }
1332 } else {
1333 $r = null;
1334 }
1335 }__;
1336
1337 @CODE:
1338 @@QName: setReflectAttrURIValue
1339 @@enDesc:
1340 If a DOM attribute is defined to <DFN::reflect the URI value
1341 of the <VAR::attr-name> attribute> of the node <VAR::E>,
1342 the setter of the DOM attribute <kwd:MUST> modify the node as
1343 if the DOM attribute <I::reflects the string value of
1344 the <VAR::attr-name> attribute> of the <VAR::E>.
1345
1346 {NOTE::
1347 It might throw an exception.
1348 }
1349 @@PerlDef:
1350 __CODE{setReflectAttrStringValue}__;
1351
1352 @enImplNote:
1353 @@ddid: datereflect
1354 @@@:
1355 {ISSUE::
1356 <QUOTE::reflecting Date child element> attribute should
1357 be provided for published and created?
1358 }
1359 ##AtomImplementation
1360
1361 IFClsDef:
1362 @IFQName: AtomDocument
1363 @ClsQName: ManakaiAtomDocument
1364
1365 @IFISA: Document
1366 @ClsISA: td|ManakaiDOMDocument
1367
1368 @s:rootElementType: AnyAtomElement||ManakaiDOM|all
1369
1370 @enDesc:
1371 If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1372 is supported, a <IF::Document> object whose <A::Document.documentElement>'s
1373 <A::Node.namespaceURI>, if any, is <URI^^DISCore|QName::atom|> at least
1374 at the time of creation <kwd:MUST> also
1375 implement the <IF::AtomDocument> interface. Other
1376 <IF:Document> objects <kwd:MAY> also implement
1377 the <IF::AtomDocument> interface.
1378
1379 @Test:
1380 @@QName: createDocument.AtomDocument.test
1381 @@PerlDef:
1382 my $impl;
1383 __CODE{tc|createImplForTest:: $impl => $impl}__;
1384
1385 my $doc = $impl-><M::c|DOMImplementation.createDocument>
1386 (<Q::atom|>, 'unknown');
1387
1388 $test->id ('interface');
1389 $test->assert_isa ($doc, <IFName::AtomDocument>);
1390 ##AtomDocument
1391
1392 IFClsDef:
1393 @IFQName: AtomFeedDocument
1394 @ClsQName: ManakaiFeedEntryDocument
1395
1396 @IFISA: AtomDocument
1397 @ClsISA: ManakaiAtomDocument
1398
1399 @s:rootElementType:
1400 @@@: atom|feed
1401 @@DISCore:stopISARecursive: 1
1402
1403 @enDesc:
1404 The <IF::AtomFeedDocument> interface provides convenience
1405 methods and attributes for an Atom
1406 Feed Document, i.e. representation of an Atom feed.
1407
1408 If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1409 is supported, a <IF::Document> object whose <A::Document.documentElement>'s
1410 element type, if any, is <XE::atom|feed> at least at
1411 the time of creation <kwd:MUST> also
1412 implement the <IF::AtomFeedDocument> interface. Other
1413 <IF::Document> objects <kwd:MAY> also implement
1414 the <IF::AtomFeedDocument> interface.
1415
1416 @Test:
1417 @@QName: createDocument.AtomFeedDocument.test
1418 @@PerlDef:
1419 my $impl;
1420 __CODE{tc|createImplForTest:: $impl => $impl}__;
1421
1422 my $doc = $impl-><M::c|DOMImplementation.createDocument>
1423 (<Q::atom|>, 'feed');
1424
1425 $test->id ('interface');
1426 $test->assert_isa ($doc, <IFName::AtomFeedDocument>);
1427 ##AtomFeedDocument
1428
1429 IFClsDef:
1430 @IFQName: AtomEntryDocument
1431 @ClsQName: ManakaiAtomEntryDocument
1432
1433 @IFISA: AtomDocument
1434 @ClsISA: ManakaiAtomDocument
1435
1436 @s:rootElementType:
1437 @@@: atom|entry
1438 @@DISCore:stopISARecursive: 1
1439
1440 @enDesc:
1441 The <IF::AtomEntryDocument> interface provides convenience
1442 methods and attributes for an Atom
1443 Entry Document, i.e. exactly one Atom entry, outside
1444 of the context of an Atom feed.
1445
1446 If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1447 is supported, a <IF::Document> object whose <A::Document.documentElement>'s
1448 element type, if any, is <XE::atom|entry> at least at
1449 the time of the creation <kwd:MUST> also
1450 implement the <IF::AtomEntryDocument> interface. Other
1451 <IF::Document> objects <kwd:MAY> also implement
1452 the <IF::AtomEntryDocument> interface.
1453
1454 @Test:
1455 @@QName: createDocument.AtomEntryDocument.test
1456 @@PerlDef:
1457 my $impl;
1458 __CODE{tc|createImplForTest:: $impl => $impl}__;
1459
1460 my $doc = $impl-><M::c|DOMImplementation.createDocument>
1461 (<Q::atom|>, 'entry');
1462
1463 $test->id ('interface');
1464 $test->assert_isa ($doc, <IFName::AtomEntryDocument>);
1465 ##AtomEntryDocument
1466
1467 IFClsDef:
1468 @IFQName: AtomElement
1469 @ClsQName: ManakaiAtomElement
1470
1471 @IFISA: Element
1472 @ClsISA: te|ManakaiDOMElement
1473
1474 @s:elementType: AnyAtomElement||ManakaiDOM|all
1475
1476 @enDesc:
1477 The <IF::AtomElement> interface provides convenience
1478 methods and attributes for Atom elements.
1479
1480 If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1481 is supported, an <IF::Element> object whose namespace URI
1482 is <URI^^DIS|QName::atom|> <kwd:MUST> also implement
1483 the <IF::AtomElement> interface. Other <IF::Element> objects
1484 <kwd:MAY> also implement the <IF::AtomElement> interface.
1485
1486 @enImplNote:
1487 @@ddid: todo
1488 @@@:
1489 {TODO::
1490 Need <CODE::xmllang> and <CODE::xmlbase> attributes
1491 from SVG?
1492 }
1493
1494 @Test:
1495 @@QName: AtomElement.interface.test
1496 @@PerlDef:
1497 for my $interface (
1498 <IFName::AtomElement>,
1499 <IFName::AtomElement||ManakaiDOM|ManakaiDOM>,
1500 <IFName::Element>,
1501 <IFName::Node>,
1502 <IFName::f|GetFeature>,
1503 ) {
1504 $test->id ($interface);
1505 $test->assert_true (<Class::ManakaiAtomElement>->isa ($interface));
1506 }
1507 @Test:
1508 @@QName: createElementNS.AtomElement.test
1509 @@PerlDef:
1510 my $doc;
1511 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
1512
1513 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'unknown');
1514 $test->assert_isa ($el, <IFName::AtomElement>);
1515 ##AtomElement
1516
1517 ResourceDef:
1518 @QName: AnyAtomElement
1519 @DISCore:resourceType: s|AnyElementInNS
1520 @AppName:
1521 @@@: atom|*
1522 @@ContentType: DISCore|QName
1523 @ForCheck: =ManakaiDOM|all
1524
1525 IFClsDef:
1526 @IFQName: AtomTextConstruct
1527 @ClsQName: ManakaiAtomTextConstruct
1528
1529 @IFISA: AtomElement
1530 @ClsISA: ManakaiAtomElement
1531
1532 @enDesc:
1533 The <IF::AtomTextConstruct> interface provides convenience
1534 methods and attributes for <IF::Element> nodes
1535 classfied to the Text constructs. Other <IF::Element>
1536 objects <kwd:MAY> also implement the <IF::AtomTextConstruct>
1537 interface.
1538
1539 A Text construct contains human-readable text, usually in
1540 small quantities. The content of Text constructs is
1541 Language-Sensitive.
1542
1543 @Attr:
1544 @@Name: type
1545 @@enDesc:
1546 The <XA::type> attribute of the element.
1547
1548 It <kwd:MUST> <I::reflect the string value
1549 of the <XA::type> attribute> of the node. The
1550 default value <kwd:MUST> be <CODE::text>.
1551 @@Type: DOMString
1552 @@Get:
1553 @@@nullCase:
1554 @@@@enDesc:
1555 If the algorithm returns <DOM::null>.
1556 @@@PerlDef:
1557 __CODE{getReflectAttrStringValue::
1558 $node => $self,
1559 $namespaceURI => {null},
1560 $localName => 'type',
1561 $r => $r,
1562 $defaultValue => 'text',
1563 }__;
1564 @@Set:
1565 @@@nullCase:
1566 @@@@enDesc:
1567 Removes the attribute.
1568 @@@NodeReadOnlyError:
1569 @@@PerlDef:
1570 __CODE{setReflectAttrStringValue::
1571 $node => $self,
1572 $namespaceURI => {null},
1573 $localName => 'type',
1574 $given => $given,
1575 }__;
1576
1577 @Attr:
1578 @@Name: container
1579 @@enDesc:
1580 The container element that contains the actual content
1581 of the construct.
1582 @@Type: Element
1583 @@Get:
1584 @@@enDesc:
1585 If the <A::AtomTextConstruct.type> is <CODE::xhtml>,
1586 the getter <kwd:MUST> <I::return the <XE::html|div> child element>.
1587 Otherwise, the object itself <kwd:MUST> be returned.
1588 @@@nullCase:
1589 @@@@enDesc:
1590 If the <A::AtomTextConstruct.type> is <CODE::xhtml>
1591 and the algorithm returns <DOM::null>.
1592 @@@NodeReadOnlyError:
1593 @@@PerlDef:
1594 __DEEP{
1595 my $type = $self-><AG::AtomTextConstruct.type>;
1596 if ($type eq 'xhtml') {
1597 __CODE{returnChildElement::
1598 $node => $self,
1599 $namespaceURI => {<Q::html|>},
1600 $localName => 'div',
1601 $r => $r,
1602 }__;
1603 } else {
1604 $r = $self;
1605 }
1606 }__;
1607
1608 @@Test:
1609 @@@QName: AtomTextConstruct.container.test
1610 @@@PerlDef:
1611 my $doc;
1612 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
1613
1614 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'title');
1615
1616 $test->id ('no');
1617 $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $el);
1618
1619 $test->id ('text');
1620 $el-><AS::AtomTextConstruct.type> ('text');
1621 $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $el);
1622
1623 $test->id ('html');
1624 $el-><AS::AtomTextConstruct.type> ('html');
1625 $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $el);
1626
1627 $test->id ('xhtml');
1628 $el-><AS::AtomTextConstruct.type> ('xhtml');
1629 $test->assert_null ($el-><AG::AtomTextConstruct.container>);
1630
1631 $doc-><AG::Document.domConfig>
1632 -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
1633 my $con = $el-><AG::AtomTextConstruct.container>;
1634
1635 $test->id ('xhtml.create');
1636 $test->assert_not_equals ($con, $el);
1637
1638 $test->id ('xhtml.namespaceURI');
1639 $test->assert_equals ($con-><AG::Node.namespaceURI>, <Q::html|>);
1640
1641 $test->id ('xhtml.localName');
1642 $test->assert_equals ($con-><AG::Node.localName>, 'div');
1643
1644 $test->id ('xhtml.parentNode');
1645 $test->assert_equals ($con-><AG::Node.parentNode>, $el);
1646
1647 $test->id ('xhtml.2');
1648 $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $con);
1649 ##AtomTextConstruct
1650
1651 IFClsDef:
1652 @IFQName: AtomPersonConstruct
1653 @ClsQName: ManakaiAtomPersonConstruct
1654
1655 @IFISA: AtomElement
1656 @ClsISA: ManakaiAtomElement
1657
1658 @enDesc:
1659 The <IF::AtomPersonConstruct> interface provides convenience
1660 methods and attributes for <IF::Element> nodes
1661 classfied to the Person constructs. Other <IF::Element>
1662 objects <kwd:MAY> also implement the <IF::AtomPersonConstruct>
1663 interface.
1664
1665 A Person construct is an element that describes a person,
1666 corporation, or similar entity.
1667
1668 @Attr:
1669 @@Name: name
1670 @@enDesc:
1671 The <XE::atom|name> value of the feed.
1672
1673 It <kwd:MUST> <I::reflect the string value
1674 of the <XE::atom|name> child element> of the node.
1675 @@Type: DOMString
1676 @@Get:
1677 @@@nullCase:
1678 @@@@enDesc:
1679 If the algorithm returns <DOM::null>.
1680 @@@NodeReadOnlyError:
1681 @@@PerlDef:
1682 __CODE{getReflectStringValue::
1683 $node => $self,
1684 $namespaceURI => {<Q::atom|>},
1685 $localName => 'name',
1686 $r => $r,
1687 }__;
1688 @@Set:
1689 @@@nullCase:
1690 @@@@enDesc:
1691 Removes the value.
1692 @@@NodeReadOnlyError:
1693 @@@PerlDef:
1694 __CODE{setReflectStringValue::
1695 $node => $self,
1696 $namespaceURI => {<Q::atom|>},
1697 $localName => 'name',
1698 $given => $given,
1699 }__;
1700
1701 @Attr:
1702 @@Name: nameElement
1703 @@enDesc:
1704 The <XE::atom|name> child element of the node.
1705 @@Type: AtomElement
1706 @@Get:
1707 @@@enDesc:
1708 It <kwd:MUST> <I::return a <XE::atom|name> child element>
1709 of the node.
1710 @@@nullCase:
1711 @@@@enDesc:
1712 If the algorithm returns <DOM::null>.
1713 @@@NodeReadOnlyError:
1714 @@@PerlDef:
1715 __CODE{returnChildElement::
1716 $node => $self,
1717 $namespaceURI => {<Q::atom|>},
1718 $localName => 'name',
1719 $r => $r,
1720 }__;
1721
1722 @Attr:
1723 @@Name: uri
1724 @@enDesc:
1725 The <XE::atom|uri> value of the feed.
1726
1727 It <kwd:MUST> <I::reflect the URI value
1728 of the <XE::atom|uri> child element> of the node.
1729 @@Type: DOMString
1730 @@actualType: DOMURI
1731 @@Get:
1732 @@@nullCase:
1733 @@@@enDesc:
1734 If the algorithm returns <DOM::null>.
1735 @@@NodeReadOnlyError:
1736 @@@PerlDef:
1737 __CODE{getReflectURIValue::
1738 $node => $self,
1739 $namespaceURI => {<Q::atom|>},
1740 $localName => 'uri',
1741 $r => $r,
1742 }__;
1743 @@Set:
1744 @@@nullCase:
1745 @@@@enDesc:
1746 Removes the value.
1747 @@@NodeReadOnlyError:
1748 @@@PerlDef:
1749 __CODE{setReflectURIValue::
1750 $node => $self,
1751 $namespaceURI => {<Q::atom|>},
1752 $localName => 'uri',
1753 $given => $given,
1754 }__;
1755
1756 @Attr:
1757 @@Name: email
1758 @@enDesc:
1759 The <XE::atom|email> value of the feed.
1760
1761 It <kwd:MUST> <I::reflect the string value
1762 of the <XE::atom|email> child element> of the node.
1763 @@Type: DOMString
1764 @@Get:
1765 @@@nullCase:
1766 @@@@enDesc:
1767 If the algorithm returns <DOM::null>.
1768 @@@NodeReadOnlyError:
1769 @@@PerlDef:
1770 __CODE{getReflectStringValue::
1771 $node => $self,
1772 $namespaceURI => {<Q::atom|>},
1773 $localName => 'email',
1774 $r => $r,
1775 }__;
1776 @@Set:
1777 @@@nullCase:
1778 @@@@enDesc:
1779 Removes the value.
1780 @@@NodeReadOnlyError:
1781 @@@PerlDef:
1782 __CODE{setReflectStringValue::
1783 $node => $self,
1784 $namespaceURI => {<Q::atom|>},
1785 $localName => 'email',
1786 $given => $given,
1787 }__;
1788 ##AtomPersonConstruct
1789
1790 IFClsDef:
1791 @IFQName: AtomDateConstruct
1792 @ClsQName: ManakaiAtomDateConstruct
1793
1794 @IFISA: AtomElement
1795 @ClsISA: ManakaiAtomElement
1796
1797 @enDesc:
1798 The <IF::AtomDateConstruct> interface provides convenience
1799 methods and attributes for <IF::Element> nodes
1800 classfied to the Date constructs. Other <IF::Element>
1801 objects <kwd:MAY> also implement the <IF::AtomDateConstruct>
1802 interface.
1803
1804 A Date construct is an element whose content is a date that
1805 conforms to the uppercase version of the RFC 3339 format.
1806
1807 @Attr:
1808 @@Name: value
1809 @@enDesc:
1810 The date value of the node.
1811
1812 {ISSUE::
1813
1814 - Out of range of platform DOMTimeStamp type
1815
1816 - Errorous xsd:dateTime
1817
1818 - Leap seconds
1819
1820 - Timezone
1821
1822 - Precision
1823
1824 }
1825 @@Type: DOMTimeStamp
1826 @@Get:
1827 @@@enDesc:
1828 {TODO:: Define
1829 }
1830 @@@PerlDef:
1831 my $value = $self-><AG::Node.textContent>;
1832 if ($value =~ /\A(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)(\.\d+)?
1833 (?:Z|([+-]\d+):(\d+))\z/x) {
1834 require Time::Local;
1835 $r = Time::Local::timegm_nocheck
1836 ($6, defined $8 ? $8 > 0 ? $5 - $9 : $5 + $9 : $5,
1837 defined $8 ? $4 - $8 : $4, $3, $2-1, $1-1900);
1838 $r += "0$7" if defined $7;
1839 } else {
1840 $r = 0;
1841 }
1842 @@Set:
1843 @@@enDesc:
1844 {TODO:: Define
1845 }
1846 @@@NodeReadOnlyError:
1847 @@@PerlDef:
1848 __DEEP{
1849 my @value = gmtime (int ($given / 1));
1850 my $value = sprintf '%04d-%02d-%02dT%02d:%02d:%02d',
1851 $value[5] + 1900, $value[4] + 1,
1852 $value[3], $value[2], $value[1], $value[0];
1853 my $f = $given % 1;
1854 $value .= substr (''.$f, 1) if $f;
1855 $value .= 'Z';
1856 $self-><AS::Node.textContent> ($value);
1857 }__;
1858
1859 @enImplNote:
1860 @@ddid: todo
1861 @@@:
1862 {TODO::
1863 Access to components, especially timezone and -00:00.
1864 }
1865 ##AtomDateConstruct
1866
1867 IFClsETDef:
1868 @IFQName: AtomFeedElement
1869 @ETQName: atom|feed
1870 @ETRQName: atom|feed
1871 @ClsQName: ManakaiAtomFeedElement
1872
1873 @IFISA: AtomElement
1874 @ClsISA: ManakaiAtomElement
1875
1876 @enDesc:
1877 The <XE::atom|feed> element is the document element
1878 of an Atom Feed Document.
1879
1880 {ISSUE::
1881 <XE::atom|entry> children <kwd:MUST> be placed after
1882 any other elements. Attributes creating children
1883 should insert them before any entries?
1884 }
1885
1886 @Attr:
1887 @@Name: authorElements
1888 @@enDesc:
1889 A static list of <XE::atom|author> child elements of the node.
1890 @@Type: StaticNodeList
1891 @@Get:
1892 @@@enDesc:
1893 It <kwd:MUST> <I::return a <XE::atom|author> child element list>
1894 of the node.
1895 @@@PerlDef:
1896 __CODE{returnChildElementList::
1897 $node => $self,
1898 $namespaceURI => {<Q::atom|>},
1899 $localName => 'author',
1900 $r => $r,
1901 }__;
1902
1903 @@Test:
1904 @@@QName: AtomFeedElement.authorElements.empty.test
1905 @@@PerlDef:
1906 my $doc;
1907 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
1908
1909 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
1910
1911 my $list = $el-><AG::AtomFeedElement.authorElements>;
1912
1913 $test->id ('interface');
1914 $test->assert_isa ($list, <IFName::StaticNodeList>);
1915
1916 $test->id ('length');
1917 $test->assert_num_equals
1918 (actual_value => 0+@{$list}, expected_value => 0);
1919
1920 $test->id ('readOnly');
1921 $test->assert_false ($list-><AG::NodeList.manakaiReadOnly>);
1922 @@Test:
1923 @@@QName: AtomFeedElement.authorElements.two.test
1924 @@@PerlDef:
1925 my $doc;
1926 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
1927
1928 my $e1 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
1929 my $a1 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'author');
1930 $e1-><M::Node.appendChild> ($a1);
1931 my $a2 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'author');
1932 $e1-><M::Node.appendChild> ($a2);
1933
1934 my $list = $e1-><AG::AtomFeedElement.authorElements>;
1935 my $a3 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'author');
1936 $e1-><M::Node.appendChild> ($a3);
1937
1938 $test->id ('length');
1939 $test->assert_num_equals
1940 (actual_value => 0+@{$list}, expected_value => 2);
1941
1942 $test->id (0);
1943 $test->assert_equals ($list->[0], $a1);
1944
1945 $test->id (1);
1946 $test->assert_equals ($list->[1], $a2);
1947
1948 @Attr:
1949 @@Name: categoryElements
1950 @@enDesc:
1951 A static list of <XE::atom|category> child elements of the node.
1952 @@Type: StaticNodeList
1953 @@Get:
1954 @@@enDesc:
1955 It <kwd:MUST> <I::return a <XE::atom|category> child element list>
1956 of the node.
1957 @@@PerlDef:
1958 __CODE{returnChildElementList::
1959 $node => $self,
1960 $namespaceURI => {<Q::atom|>},
1961 $localName => 'category',
1962 $r => $r,
1963 }__;
1964
1965 @Attr:
1966 @@Name: contributorElements
1967 @@enDesc:
1968 A static list of <XE::atom|contributor> child elements of the node.
1969 @@Type: StaticNodeList
1970 @@Get:
1971 @@@enDesc:
1972 It <kwd:MUST> <I::return a <XE::atom|contributor> child element list>
1973 of the node.
1974 @@@PerlDef:
1975 __CODE{returnChildElementList::
1976 $node => $self,
1977 $namespaceURI => {<Q::atom|>},
1978 $localName => 'contributor',
1979 $r => $r,
1980 }__;
1981
1982 @Attr:
1983 @@Name: generatorElement
1984 @@enDesc:
1985 The <XE::atom|generator> child element of the node.
1986 @@Type: AtomGeneratorElement
1987 @@Get:
1988 @@@enDesc:
1989 It <kwd:MUST> <I::return a <XE::atom|generator> child element>
1990 of the node.
1991 @@@nullCase:
1992 @@@@enDesc:
1993 If the algorithm returns <DOM::null>.
1994 @@@NodeReadOnlyError:
1995 @@@PerlDef:
1996 __CODE{returnChildElement::
1997 $node => $self,
1998 $namespaceURI => {<Q::atom|>},
1999 $localName => 'generator',
2000 $r => $r,
2001 }__;
2002
2003 @@Test:
2004 @@@QName: AtomFeedElement.generatorElement.test
2005 @@@PerlDef:
2006 my $doc;
2007 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2008
2009 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2010
2011 $test->id ('no');
2012 $test->assert_null ($el-><AG::AtomFeedElement.generatorElement>);
2013
2014 $doc-><AG::Document.domConfig>
2015 -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
2016 my $ge = $el-><AG::AtomFeedElement.generatorElement>;
2017
2018 $test->id ('create.interface');
2019 $test->assert_isa ($ge, <IFName::Element>);
2020
2021 $test->id ('create.namespaceURI');
2022 $test->assert_equals ($ge-><AG::Node.namespaceURI>, <Q::atom|>);
2023
2024 $test->id ('create.localName');
2025 $test->assert_equals ($ge-><AG::Node.localName>, 'generator');
2026
2027 $test->id ('has');
2028 my $ge2 = $el-><AG::AtomFeedElement.generatorElement>;
2029 $test->assert_equals ($ge2, $ge);
2030
2031 $test->id ('multiple');
2032 $el-><M::Node.appendChild>
2033 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'generator'));
2034 my $ge3 = $el-><AG::AtomFeedElement.generatorElement>;
2035 $test->assert_equals ($ge3, $ge);
2036
2037 @Attr:
2038 @@Name: icon
2039 @@enDesc:
2040 The <XE::atom|icon> value of the feed.
2041
2042 It <kwd:MUST> <I::reflect the URI value
2043 of the <XE::atom|icon> child element> of the node.
2044 @@Type: DOMString
2045 @@actualType: DOMURI
2046 @@Get:
2047 @@@nullCase:
2048 @@@@enDesc:
2049 If the algorithm returns <DOM::null>.
2050 @@@NodeReadOnlyError:
2051 @@@PerlDef:
2052 __CODE{getReflectURIValue::
2053 $node => $self,
2054 $namespaceURI => {<Q::atom|>},
2055 $localName => 'icon',
2056 $r => $r,
2057 }__;
2058 @@Set:
2059 @@@nullCase:
2060 @@@@enDesc:
2061 Removes the value.
2062 @@@NodeReadOnlyError:
2063 @@@PerlDef:
2064 __CODE{setReflectURIValue::
2065 $node => $self,
2066 $namespaceURI => {<Q::atom|>},
2067 $localName => 'icon',
2068 $given => $given,
2069 }__;
2070
2071 @@Test:
2072 @@@QName: AtomFeedElement.icon.test
2073 @@@PerlDef:
2074 my $doc;
2075 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2076
2077 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2078
2079 $test->id ('default');
2080 $test->assert_null ($el-><AG::AtomFeedElement.icon>);
2081
2082 $test->id ('set');
2083 $el-><AS::AtomFeedElement.icon> ('http://example.com/');
2084 $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2085 'http://example.com/');
2086
2087 $test->id ('relative');
2088 $el-><AS::AtomFeedElement.icon> ('favicon.ico');
2089 $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2090 'favicon.ico');
2091
2092 $test->id ('relative.base');
2093 $el-><M::Element.setAttributeNS> (<Q::xml:>, 'xml:base',
2094 'http://www.example.com/');
2095 $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2096 'http://www.example.com/favicon.ico');
2097
2098 $test->id ('multiple');
2099 $el-><M::Node.appendChild>
2100 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'icon'))
2101 -><AS::Node.textContent> ('/default.ico'); # ignored
2102 $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2103 'http://www.example.com/favicon.ico');
2104
2105 $test->id ('remove');
2106 $el-><AS::AtomFeedElement.icon> (null);
2107 $test->assert_null ($el-><AG::AtomFeedElement.icon>);
2108
2109 @Attr:
2110 @@Name: id
2111 @@enDesc:
2112 The <XE::atom|id> value of the feed.
2113
2114 It <kwd:MUST> <I::reflect the string value
2115 of the <XE::atom|id> child element> of the node.
2116 @@Type: DOMString
2117 @@actualType: DOMURI
2118 @@Get:
2119 @@@nullCase:
2120 @@@@enDesc:
2121 If the algorithm returns <DOM::null>.
2122 @@@NodeReadOnlyError:
2123 @@@PerlDef:
2124 __CODE{getReflectStringValue::
2125 $node => $self,
2126 $namespaceURI => {<Q::atom|>},
2127 $localName => 'id',
2128 $r => $r,
2129 }__;
2130 @@Set:
2131 @@@nullCase:
2132 @@@@enDesc:
2133 Removes the value.
2134 @@@NodeReadOnlyError:
2135 @@@PerlDef:
2136 __CODE{setReflectStringValue::
2137 $node => $self,
2138 $namespaceURI => {<Q::atom|>},
2139 $localName => 'id',
2140 $given => $given,
2141 }__;
2142
2143 @@Test:
2144 @@@QName: AtomFeedElement.id.test
2145 @@@PerlDef:
2146 my $doc;
2147 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2148
2149 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2150
2151 $test->id ('default');
2152 $test->assert_null ($el-><AG::AtomFeedElement.id>);
2153
2154 $test->id ('set');
2155 $el-><AS::AtomFeedElement.id> ('http://example.com/');
2156 $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2157 'http://example.com/');
2158
2159 $test->id ('relative');
2160 $el-><AS::AtomFeedElement.id> ('favicon.ico');
2161 $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2162 'favicon.ico');
2163
2164 $test->id ('relative.base');
2165 $el-><M::Element.setAttributeNS> (<Q::xml:>, 'xml:base',
2166 'http://www.example.com/');
2167 $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2168 'favicon.ico');
2169
2170 $test->id ('multiple');
2171 $el-><M::Node.appendChild>
2172 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'id'))
2173 -><AS::Node.textContent> ('/default.ico'); # ignored
2174 $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2175 'favicon.ico');
2176
2177 $test->id ('remove');
2178 $el-><AS::AtomFeedElement.id> (null);
2179 $test->assert_null ($el-><AG::AtomFeedElement.id>);
2180
2181 @Attr:
2182 @@Name: linkElements
2183 @@enDesc:
2184 A static list of <XE::atom|link> child elements of the node.
2185 @@Type: StaticNodeList
2186 @@Get:
2187 @@@enDesc:
2188 It <kwd:MUST> <I::return a <XE::atom|link> child element list>
2189 of the node.
2190 @@@PerlDef:
2191 __CODE{returnChildElementList::
2192 $node => $self,
2193 $namespaceURI => {<Q::atom|>},
2194 $localName => 'link',
2195 $r => $r,
2196 }__;
2197
2198 @Attr:
2199 @@Name: logo
2200 @@enDesc:
2201 The <XE::atom|logo> value of the feed.
2202
2203 It <kwd:MUST> <I::reflect the URI value
2204 of the <XE::atom|logo> child element> of the node.
2205 @@Type: DOMString
2206 @@actualType: DOMURI
2207 @@Get:
2208 @@@nullCase:
2209 @@@@enDesc:
2210 If the algorithm returns <DOM::null>.
2211 @@@NodeReadOnlyError:
2212 @@@PerlDef:
2213 __CODE{getReflectURIValue::
2214 $node => $self,
2215 $namespaceURI => {<Q::atom|>},
2216 $localName => 'logo',
2217 $r => $r,
2218 }__;
2219 @@Set:
2220 @@@nullCase:
2221 @@@@enDesc:
2222 Removes the value.
2223 @@@NodeReadOnlyError:
2224 @@@PerlDef:
2225 __CODE{setReflectURIValue::
2226 $node => $self,
2227 $namespaceURI => {<Q::atom|>},
2228 $localName => 'logo',
2229 $given => $given,
2230 }__;
2231
2232 @Attr:
2233 @@Name: rightsElement
2234 @@enDesc:
2235 The <XE::atom|rights> child element of the node.
2236 @@Type: AtomRightsElement
2237 @@Get:
2238 @@@enDesc:
2239 It <kwd:MUST> <I::return a <XE::atom|rights> child element>
2240 of the node.
2241 @@@nullCase:
2242 @@@@enDesc:
2243 If the algorithm returns <DOM::null>.
2244 @@@NodeReadOnlyError:
2245 @@@PerlDef:
2246 __CODE{returnChildElement::
2247 $node => $self,
2248 $namespaceURI => {<Q::atom|>},
2249 $localName => 'rights',
2250 $r => $r,
2251 }__;
2252
2253 @Attr:
2254 @@Name: subtitleElement
2255 @@enDesc:
2256 The <XE::atom|subtitle> child element of the node.
2257 @@Type: AtomSubtitleElement
2258 @@Get:
2259 @@@enDesc:
2260 It <kwd:MUST> <I::return a <XE::atom|subtitle> child element>
2261 of the node.
2262 @@@nullCase:
2263 @@@@enDesc:
2264 If the algorithm returns <DOM::null>.
2265 @@@NodeReadOnlyError:
2266 @@@PerlDef:
2267 __CODE{returnChildElement::
2268 $node => $self,
2269 $namespaceURI => {<Q::atom|>},
2270 $localName => 'subtitle',
2271 $r => $r,
2272 }__;
2273
2274 @Attr:
2275 @@Name: titleElement
2276 @@enDesc:
2277 The <XE::atom|title> child element of the node.
2278 @@Type: AtomTitleElement
2279 @@Get:
2280 @@@enDesc:
2281 It <kwd:MUST> <I::return a <XE::atom|title> child element>
2282 of the node.
2283 @@@nullCase:
2284 @@@@enDesc:
2285 If the algorithm returns <DOM::null>.
2286 @@@NodeReadOnlyError:
2287 @@@PerlDef:
2288 __CODE{returnChildElement::
2289 $node => $self,
2290 $namespaceURI => {<Q::atom|>},
2291 $localName => 'title',
2292 $r => $r,
2293 }__;
2294
2295 @Attr:
2296 @@Name: updatedElement
2297 @@enDesc:
2298 The <XE::atom|updated> child element of the node.
2299 @@Type: AtomUpdatedElement
2300 @@Get:
2301 @@@enDesc:
2302 It <kwd:MUST> <I::return a <XE::atom|updated> child element>
2303 of the node.
2304 @@@nullCase:
2305 @@@@enDesc:
2306 If the algorithm returns <DOM::null>.
2307 @@@NodeReadOnlyError:
2308 @@@PerlDef:
2309 __CODE{returnChildElement::
2310 $node => $self,
2311 $namespaceURI => {<Q::atom|>},
2312 $localName => 'updated',
2313 $r => $r,
2314 }__;
2315
2316 @Attr:
2317 @@Name: entryElements
2318 @@enDesc:
2319 A static list of <XE::atom|entry> child elements of the node.
2320 @@Type: StaticNodeList
2321 @@Get:
2322 @@@enDesc:
2323 It <kwd:MUST> <I::return a <XE::atom|entry> child element list>
2324 of the node.
2325 @@@PerlDef:
2326 __CODE{returnChildElementList::
2327 $node => $self,
2328 $namespaceURI => {<Q::atom|>},
2329 $localName => 'entry',
2330 $r => $r,
2331 }__;
2332
2333 @Method:
2334 @@Name: getEntryElementById
2335 @@enDesc:
2336 Returns an <XE::atom|entry> node selected by its <XE::atom|id>.
2337 @@Param:
2338 @@@Name: idArg
2339 @@@Type: DOMString
2340 @@@actualType: DOMURI
2341 @@@enDesc:
2342 The identifier of the entry.
2343 @@Return:
2344 @@@Type: AtomEntryElement
2345 @@@enDesc:
2346 The <XE::atom|entry> element whose identifier equals to
2347 <P::id>.
2348
2349 It <kwd:MUST> return the first child element node in document
2350 order whose element type is <XE::atom|entry> and
2351 whose first child element node in document order
2352 with element type <XE::atom|id> has <A::Node.textContent>
2353 equals to <P::id>, if any, or <DOM::null>.
2354 @@@nullCase:
2355 @@@@enDesc:
2356 If no matching element.
2357 @@@PerlDef:
2358 E: {
2359 no warnings 'uninitialized';
2360 for my $cn (@{$self-><AG::Node.childNodes>}) {
2361 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2362 $cn-><AG::Node.localName> eq 'entry' and
2363 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2364 if ($cn-><AG::AtomEntryElement.id> eq $idArg) {
2365 $r = $cn;
2366 last E;
2367 }
2368 }
2369 }
2370 } # E
2371
2372 @Method:
2373 @@Name: addNewEntry
2374 @@enDesc:
2375 Creates an <XA::atom|entry> element node and
2376 appends to the node.
2377 @@Param:
2378 @@@Name: id
2379 @@@Type: DOMString
2380 @@@actualType: DOMURI
2381 @@@enDesc:
2382 The <XE::atom|id> of the entry.
2383 @@Param:
2384 @@@Name: title
2385 @@@Type: DOMString
2386 @@@enDesc:
2387 The <XE::atom|title> of the entry.
2388 @@@nullCase:
2389 @@@@enDesc:
2390 The implementation <kwd:MUST> treate <DOM::null>
2391 as if an empty string is specified.
2392 @@Param:
2393 @@@Name: lang
2394 @@@Type: DOMString
2395 @@@enDesc:
2396 The natural language of the entry.
2397 @@@nullCase:
2398 @@@@enDesc:
2399 No explicit language specification is added.
2400 @@Return:
2401 @@@Type: AtomEntryElement
2402 @@@enDesc:
2403 The newly created <XE::atom|entry> element.
2404
2405 {P:: The newly created <XE::atom|entry> element node <kwd:MUST>
2406 have attributes set as:
2407
2408 - <A::Node.attributes>::: A <IF::NamedNodeMap> that contains
2409 at least a new <XA::xml|lang>
2410 attribute node except when
2411 the <P::lang> parameter is set
2412 to <DOM::null>.
2413
2414 - <A::Node.childNodes>::: A <IF::NodeList> containing
2415 a new <XE::atom|id> element node,
2416 a new <XE::atom|title> element node, and
2417 a new <XE::atom|updated> element node
2418 in any order.
2419
2420 }
2421
2422 This element node <kwd:MUST> be appended to the node
2423 as if the <M::Node.appendChild> method were invoked
2424 on the node and <kwd:MUST> be returned by the method.
2425 Note that an exception might be thrown during this course.
2426
2427 {P:: The <XA::xml|lang> attribute node, if created, <kwd:MUST>
2428 have attributes set as:
2429
2430 - <A::Node.nodeValue>::: <P::lang>.
2431
2432 - <A::Attr.specified>::: <DOM::true>.
2433
2434 }
2435
2436 {P:: The newly created <XE::atom|id> element node <kwd:MUST>
2437 have attributes set as:
2438
2439 - <A::Node.textContent>::: <P::id>.
2440
2441 }
2442
2443 {P:: The newly created <XE::atom|title> element node <kwd:MUST>
2444 have attributes set as:
2445
2446 - <A::Node.textContent>::: <P::title>.
2447
2448 }
2449
2450 The <XA::type> attribute node <kwd:MUST-NOT> be attached
2451 to the <XE::atom|title> element node.
2452
2453 {P:: The newly created <XE::atom|updated> element node <kwd:MUST>
2454 have attributes set as:
2455
2456 - <A::Node.textContent>::: A uppercase RFC 3339 <CODE::date-time>
2457 representation of the time when the method is invoked.
2458 The implementation <kwd:MAY> align its timezone to
2459 that of the environment in which the method is invoked.
2460
2461 }
2462 @@@PerlDef:
2463 __DEEP{
2464 my $od = $self-><AG::Node.ownerDocument>;
2465
2466 $r = $od-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2467 $r-><AS::Node.manakaiLanguage> ($lang) if defined $lang;
2468
2469 $r-><AS::AtomFeedElement.id> ($id);
2470
2471 my $titlee = $od-><M::Document.createElementNS> (<Q::atom|>, 'title');
2472 $titlee-><AS::Node.textContent> (defined $title ? $title : '');
2473 $r-><M::Node.appendChild> ($titlee);
2474
2475 my $updatede = $od-><M::Document.createElementNS>
2476 (<Q::atom|>, 'updated');
2477 $updatede-><AS::AtomDateConstruct.value> (scalar time);
2478 $r-><M::Node.appendChild> ($updatede);
2479 }__;
2480
2481 @@Test:
2482 @@@QName: AtomFeedElement.addNewEntry.1.test
2483 @@@PerlDef:
2484 my $doc;
2485 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2486
2487 my $feed = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2488
2489 my $ent = $feed-><M::AtomFeedElement.addNewEntry>
2490 ('about:id', 'entry title', 'en');
2491
2492 $test->id ('entry.interface');
2493 $test->assert_isa ($ent, <IFName::AtomEntryElement>);
2494
2495 $test->id ('entry.namespaceURI');
2496 $test->assert_equals ($ent-><AG::Node.namespaceURI>, <Q::atom|>);
2497
2498 $test->id ('entry.localName');
2499 $test->assert_equals ($ent-><AG::Node.localName>, 'entry');
2500
2501 $test->id ('entry.lang');
2502 $test->assert_equals ($ent-><M::Element.getAttributeNS>
2503 (<Q::xml|>, 'lang'),
2504 'en');
2505
2506 my $id;
2507 my $title;
2508 my $updated;
2509
2510 for my $cn (@{$ent-><AG::Node.childNodes>}) {
2511 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2512 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2513 if ($cn-><AG::Node.localName> eq 'id') {
2514 $id = $cn;
2515 } elsif ($cn-><AG::Node.localName> eq 'title') {
2516 $title = $cn;
2517 } elsif ($cn-><AG::Node.localName> eq 'updated') {
2518 $updated = $cn;
2519 }
2520 }
2521 }
2522
2523 $test->id ('id');
2524 $test->assert_not_null ($id);
2525
2526 $test->id ('id.value');
2527 $test->assert_equals ($id-><AG::Node.textContent>, 'about:id');
2528
2529 $test->id ('title');
2530 $test->assert_not_null ($title);
2531
2532 $test->id ('title.value');
2533 $test->assert_equals ($title-><AG::Node.textContent>, 'entry title');
2534
2535 $test->id ('title.type');
2536 $test->assert_null ($title-><M::Element.getAttributeNS> (null, 'type'));
2537
2538 $test->id ('updated');
2539 $test->assert_not_null ($updated);
2540
2541 $test->id ('updated.value');
2542 $test->assert_num_not_equals
2543 (actual_value => $updated-><AG::AtomDateConstruct.value>,
2544 expected_value => 0);
2545 @@Test:
2546 @@@QName: AtomFeedElement.addNewEntry.2.test
2547 @@@enDesc:
2548 <DOM::null> <CODE::lang>.
2549 @@@PerlDef:
2550 my $doc;
2551 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2552
2553 my $feed = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2554
2555 my $ent = $feed-><M::AtomFeedElement.addNewEntry>
2556 ('about:id', 'entry title', null);
2557
2558 $test->id ('entry.lang');
2559 $test->assert_null ($ent-><M::Element.getAttributeNS>
2560 (<Q::xml|>, 'lang'));
2561 ##AtomFeedElement
2562
2563 IFClsETDef:
2564 @IFQName: AtomEntryElement
2565 @ETQName: atom|entry
2566 @ETRQName: atom|entry
2567 @ClsQName: ManakaiAtomEntryElement
2568
2569 @IFISA: AtomElement
2570 @ClsISA: ManakaiAtomElement
2571
2572 @enDesc:
2573 The <XE::atom|entry> element represents an individual
2574 entry, acting as a container for metadata and data
2575 associated with the entry.
2576
2577 @Attr:
2578 @@Name: authorElements
2579 @@enDesc:
2580 A static list of <XE::atom|author> child elements of the node.
2581 @@Type: StaticNodeList
2582 @@Get:
2583 @@@enDesc:
2584 It <kwd:MUST> <I::return a <XE::atom|author> child element list>
2585 of the node.
2586 @@@disDef:
2587 @@@@dlp:cloneCode: ManakaiAtomFeedElement.authorElements.get
2588
2589 @Attr:
2590 @@Name: entryAuthorElements
2591 @@enDesc:
2592 A static list of <XE::atom|author> elements for the node.
2593 @@Type: StaticNodeList
2594 @@Get:
2595 @@@enDesc:
2596 = If the node contains one or more <XE::atom|author>
2597 element node in its child node list, then it
2598 <kwd:MUST> return a <IF::StaticNodeList> that
2599 would be returned by the <A::AtomEntryElement.authorElements>
2600 attribute of the node.
2601
2602 = Otherwise, if the node contains a <XE::atom|source>
2603 element node in its child node list, then it
2604 <kwd:MUST> return a <IF::StaticNodeList> that
2605 would be returned by the <A::AtomSourceElement.authorElements>
2606 attribute of that node, unless its <A::NodeList.length>
2607 is zero.
2608
2609 = Otherwise, if the <A::Node.parentNode> of the
2610 node is a <XE::atom|feed> element node, then
2611 it <kwd:MUST> return a <IF::StaticNodeList> that
2612 would be returned by the <A::AtomFeedElement.authorElements>
2613 attribute of that node.
2614
2615 = Otherwise, it <kwd:MUST> return a <IF::StaticNodeList>
2616 whose <A::NodeList.length> is zero.
2617 @@@PerlDef:
2618 __DEEP{
2619 E: {
2620 no warnings 'uninitialized';
2621 __CODE{tc|createStaticNodeList:: $r => $r}__;
2622
2623 my $source;
2624 for my $cn (@{$self-><AG::Node.childNodes>}) {
2625 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2626 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2627 if ($cn-><AG::Node.localName> eq 'author') {
2628 push @{$r}, $cn;
2629 } elsif ($cn-><AG::Node.localName> eq 'source') {
2630 $source = $cn;
2631 }
2632 }
2633 }
2634 last E unless @{$r} == 0;
2635
2636 if (defined $source) {
2637 $r = $source-><AG::AtomSourceElement.authorElements>;
2638 }
2639 last E unless @{$r} == 0;
2640
2641 my $parent = $self-><AG::Node.parentNode>;
2642 if (defined $parent and
2643 $parent-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2644 $parent-><AG::Node.namespaceURI> eq <Q::atom|> and
2645 $parent-><AG::Node.localName> eq 'feed') {
2646 $r = $parent-><AG::AtomFeedElement.authorElements>;
2647 }
2648 } # E
2649 }__;
2650
2651 @@Test:
2652 @@@QName: AtomEntryElement.entryAuthorElements.1.test
2653 @@@PerlDef:
2654 my $doc;
2655 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2656
2657 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2658
2659
2660 $test->id ('empty');
2661 my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2662 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0);
2663
2664 $test->id ('one');
2665 $el-><M::Node.appendChild>
2666 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2667 $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2668 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 1);
2669
2670 $test->id ('source');
2671 for ($el-><M::Node.appendChild>
2672 ($doc-><M::Document.createElementNS>
2673 (<Q::atom|>, 'source'))) {
2674 $_-><M::Node.appendChild>
2675 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2676 $_-><M::Node.appendChild>
2677 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2678 }
2679 $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2680 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 1);
2681
2682 $test->id ('parent');
2683 for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
2684 $_-><M::Node.appendChild>
2685 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2686 $_-><M::Node.appendChild>
2687 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2688 $_-><M::Node.appendChild>
2689 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2690 $_-><M::Node.appendChild> ($el);
2691 }
2692 $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2693 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 1);
2694 @@Test:
2695 @@@QName: AtomEntryElement.entryAuthorElements.2.test
2696 @@@PerlDef:
2697 my $doc;
2698 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2699
2700 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2701
2702 $test->id ('source');
2703 for ($el-><M::Node.appendChild>
2704 ($doc-><M::Document.createElementNS>
2705 (<Q::atom|>, 'source'))) {
2706 $_-><M::Node.appendChild>
2707 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2708 $_-><M::Node.appendChild>
2709 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2710 }
2711 my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2712 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 2);
2713
2714 $test->id ('parent');
2715 for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
2716 $_-><M::Node.appendChild>
2717 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2718 $_-><M::Node.appendChild>
2719 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2720 $_-><M::Node.appendChild>
2721 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2722 $_-><M::Node.appendChild> ($el);
2723 }
2724 $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2725 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 2);
2726 @@Test:
2727 @@@QName: AtomEntryElement.entryAuthorElements.3.test
2728 @@@PerlDef:
2729 my $doc;
2730 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2731
2732 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2733
2734 $test->id ('source');
2735 for ($el-><M::Node.appendChild>
2736 ($doc-><M::Document.createElementNS>
2737 (<Q::atom|>, 'source'))) {
2738 # empty
2739 }
2740 my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2741 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0);
2742
2743 $test->id ('parent');
2744 for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
2745 $_-><M::Node.appendChild>
2746 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2747 $_-><M::Node.appendChild>
2748 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2749 $_-><M::Node.appendChild>
2750 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2751 $_-><M::Node.appendChild> ($el);
2752 }
2753 $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2754 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 3);
2755 @@Test:
2756 @@@QName: AtomEntryElement.entryAuthorElements.4.test
2757 @@@PerlDef:
2758 my $doc;
2759 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2760
2761 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2762
2763 $test->id ('parent');
2764 for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
2765 $_-><M::Node.appendChild>
2766 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2767 $_-><M::Node.appendChild>
2768 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2769 $_-><M::Node.appendChild>
2770 ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
2771 $_-><M::Node.appendChild> ($el);
2772 }
2773 my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
2774 $test->assert_num_equals (actual_value => 0+@$list, expected_value => 3);
2775
2776 @Attr:
2777 @@Name: categoryElements
2778 @@enDesc:
2779 A static list of <XE::atom|category> child elements of the node.
2780 @@Type: StaticNodeList
2781 @@Get:
2782 @@@enDesc:
2783 It <kwd:MUST> <I::return a <XE::atom|category> child element list>
2784 of the node.
2785 @@@disDef:
2786 @@@@dlp:cloneCode: ManakaiAtomFeedElement.categoryElements.get
2787
2788 @Attr:
2789 @@Name: contentElement
2790 @@enDesc:
2791 The <XE::atom|content> child element of the node.
2792 @@Type: AtomContentElement
2793 @@Get:
2794 @@@enDesc:
2795 It <kwd:MUST> <I::return a <XE::atom|content> child element>
2796 of the node.
2797 @@@nullCase:
2798 @@@@enDesc:
2799 If the algorithm returns <DOM::null>.
2800 @@@NodeReadOnlyError:
2801 @@@PerlDef:
2802 __CODE{returnChildElement::
2803 $node => $self,
2804 $namespaceURI => {<Q::atom|>},
2805 $localName => 'content',
2806 $r => $r,
2807 }__;
2808
2809 @Attr:
2810 @@Name: contributorElements
2811 @@enDesc:
2812 A static list of <XE::atom|contributor> child elements of the node.
2813 @@Type: StaticNodeList
2814 @@Get:
2815 @@@enDesc:
2816 It <kwd:MUST> <I::return a <XE::atom|contributor> child element list>
2817 of the node.
2818 @@@disDef:
2819 @@@@dlp:cloneCode: ManakaiAtomFeedElement.contributorElements.get
2820
2821 @Attr:
2822 @@Name: id
2823 @@enDesc:
2824 The <XE::atom|id> value of the feed.
2825
2826 It <kwd:MUST> <I::reflect the string value
2827 of the <XE::atom|id> child element> of the node.
2828 @@Type: DOMString
2829 @@actualType: DOMURI
2830 @@Get:
2831 @@@nullCase:
2832 @@@@enDesc:
2833 If the algorithm returns <DOM::null>.
2834 @@@NodeReadOnlyError:
2835 @@@disDef:
2836 @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.get
2837 @@Set:
2838 @@@nullCase:
2839 @@@@enDesc:
2840 Removes the value.
2841 @@@NodeReadOnlyError:
2842 @@@disDef:
2843 @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.set
2844
2845 @Attr:
2846 @@Name: linkElements
2847 @@enDesc:
2848 A static list of <XE::atom|link> child elements of the node.
2849 @@Type: StaticNodeList
2850 @@Get:
2851 @@@enDesc:
2852 It <kwd:MUST> <I::return a <XE::atom|link> child element list>
2853 of the node.
2854 @@@disDef:
2855 @@@@dlp:cloneCode: ManakaiAtomFeedElement.linkElements.get
2856
2857 @Attr:
2858 @@Name: publishedElement
2859 @@enDesc:
2860 The <XE::atom|published> child element of the node.
2861 @@Type: AtomPublishedElement
2862 @@Get:
2863 @@@enDesc:
2864 It <kwd:MUST> <I::return a <XE::atom|published> child element>
2865 of the node.
2866 @@@nullCase:
2867 @@@@enDesc:
2868 If the algorithm returns <DOM::null>.
2869 @@@NodeReadOnlyError:
2870 @@@PerlDef:
2871 __CODE{returnChildElement::
2872 $node => $self,
2873 $namespaceURI => {<Q::atom|>},
2874 $localName => 'published',
2875 $r => $r,
2876 }__;
2877
2878 @Attr:
2879 @@Name: rightsElement
2880 @@enDesc:
2881 The <XE::atom|rights> child element of the node.
2882 @@Type: AtomRightsElement
2883 @@Get:
2884 @@@enDesc:
2885 It <kwd:MUST> <I::return a <XE::atom|rights> child element>
2886 of the node.
2887 @@@nullCase:
2888 @@@@enDesc:
2889 If the algorithm returns <DOM::null>.
2890 @@@NodeReadOnlyError:
2891 @@@disDef:
2892 @@@@dlp:cloneCode: ManakaiAtomFeedElement.rightsElement.get
2893
2894 @Attr:
2895 @@Name: entryRightsElement
2896 @@enDesc:
2897 The <XE::atom|rights> element for the node.
2898 @@Type: AtomRightsElement
2899 @@Get:
2900 @@@enDesc:
2901 = If the node contains a <XE::atom|rights>
2902 element node in its child node list, then it
2903 <kwd:MUST> return the first such a node in document order.
2904
2905 = Otherwise, if the <A::Node.parentNode> of the
2906 node is a <XE::atom|feed> element node, then
2907 it <kwd:MUST> return an <IF::AtomRightsElement>
2908 that would be returned by the <A::AtomFeedElement.rightsElement>
2909 attribute of that node, except when it is <DOM::null>.
2910
2911 {OLI:: Otherwise,
2912
2913 {OLI:: If the <cfg::cfg|create-child-element> configuration
2914 parameter is set to <DOM::true>,
2915
2916 = Create an element node <VAR::N> whose element type
2917 is <XE::atom|rights>.
2918
2919 = Append <VAR::N> to this node as if the <M::Node.appendChild>
2920 method were called for the node with its parameter
2921 set to <VAR::N>. Note that this might throw an exception.
2922
2923 = Then, <VAR::N> <kwd:MUST> be returned.
2924
2925 }
2926
2927 = Otherwise, it <kwd:MUST> return <DOM::null>.
2928 }
2929 @@@nullCase:
2930 @@@@enDesc:
2931 If the algorithm returns <DOM::null>.
2932 @@@NodeReadOnlyError:
2933 @@@PerlDef:
2934 __DEEP{
2935 E: {
2936 no warnings 'uninitialized';
2937 for my $cn (@{$self-><AG::Node.childNodes>}) {
2938 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2939 $cn-><AG::Node.localName> eq 'rights' and
2940 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2941 $r = $cn;
2942 last E;
2943 }
2944 }
2945
2946 my $parent = $self-><AG::Node.parentNode>;
2947 if (defined $parent and
2948 $parent-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2949 $parent-><AG::Node.namespaceURI> eq <Q::atom|> and
2950 $parent-><AG::Node.localName> eq 'feed') {
2951 for my $cn (@{$parent-><AG::Node.childNodes>}) {
2952 if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2953 $cn-><AG::Node.localName> eq 'rights' and
2954 $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2955 $r = $cn;
2956 last E;
2957 }
2958 }
2959 }
2960
2961 my $od = $self-><AG::Node.ownerDocument>;
2962 if ($od-><AG::Document.domConfig>
2963 -><M::CFG.getParameter> (<Q::cfg|create-child-element>)) {
2964 $r = $od-><M::Document.createElementNS> (<Q::atom|>, 'rights');
2965 $self-><M::Node.appendChild> ($r);
2966 }
2967 } # E
2968 }__;
2969
2970 @@Test:
2971 @@@QName: AtomEntryElement.entryRightsElement.1.test
2972 @@@PerlDef:
2973 my $doc;
2974 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2975
2976 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2977
2978 $test->id ('no');
2979 my $rights = $el-><AG::AtomEntryElement.entryRightsElement>;
2980 $test->assert_null ($rights);
2981
2982 $doc-><AG::Document.domConfig>
2983 -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
2984
2985 $rights = $el-><AG::AtomEntryElement.entryRightsElement>;
2986
2987 $test->id ('created.namespaceURI');
2988 $test->assert_equals ($rights-><AG::Node.namespaceURI>, <Q::atom|>);
2989
2990 $test->id ('created.localName');
2991 $test->assert_equals ($rights-><AG::Node.localName>, 'rights');
2992
2993 $test->id ('created.parentNode');
2994 $test->assert_equals ($rights-><AG::Node.parentNode>, $el);
2995
2996 $test->id ('get');
2997 my $rights2 = $el-><AG::AtomEntryElement.entryRightsElement>;
2998 $test->assert_equals ($rights2, $rights);
2999 @@Test:
3000 @@@QName: AtomEntryElement.entryRightsElement.2.test
3001 @@@PerlDef:
3002 my $doc;
3003 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3004
3005 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3006
3007 my $feed = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
3008 $feed-><M::Node.appendChild> ($el);
3009 my $rights = $doc-><M::Document.createElementNS> (<Q::atom|>, 'rights');
3010 $feed-><M::Node.appendChild> ($rights);
3011
3012 $test->id ('get');
3013 my $rights2 = $el-><AG::AtomEntryElement.entryRightsElement>;
3014 $test->assert_equals ($rights2, $rights);
3015
3016 @Attr:
3017 @@Name: sourceElement
3018 @@enDesc:
3019 The <XE::atom|source> child element of the node.
3020 @@Type: AtomSourceElement
3021 @@Get:
3022 @@@enDesc:
3023 It <kwd:MUST> <I::return a <XE::atom|source> child element>
3024 of the node.
3025 @@@nullCase:
3026 @@@@enDesc:
3027 If the algorithm returns <DOM::null>.
3028 @@@NodeReadOnlyError:
3029 @@@PerlDef:
3030 __CODE{returnChildElement::
3031 $node => $self,
3032 $namespaceURI => {<Q::atom|>},
3033 $localName => 'source',
3034 $r => $r,
3035 }__;
3036
3037 @Attr:
3038 @@Name: summaryElement
3039 @@enDesc:
3040 The <XE::atom|summary> child element of the node.
3041 @@Type: AtomSummaryElement
3042 @@Get:
3043 @@@enDesc:
3044 It <kwd:MUST> <I::return a <XE::atom|summary> child element>
3045 of the node.
3046 @@@nullCase:
3047 @@@@enDesc:
3048 If the algorithm returns <DOM::null>.
3049 @@@NodeReadOnlyError:
3050 @@@PerlDef:
3051 __CODE{returnChildElement::
3052 $node => $self,
3053 $namespaceURI => {<Q::atom|>},
3054 $localName => 'summary',
3055 $r => $r,
3056 }__;
3057
3058 @Attr:
3059 @@Name: titleElement
3060 @@enDesc:
3061 The <XE::atom|title> child element of the node.
3062 @@Type: AtomTitleElement
3063 @@Get:
3064 @@@enDesc:
3065 It <kwd:MUST> <I::return a <XE::atom|title> child element>
3066 of the node.
3067 @@@nullCase:
3068 @@@@enDesc:
3069 If the algorithm returns <DOM::null>.
3070 @@@NodeReadOnlyError:
3071 @@@disDef:
3072 @@@@dlp:cloneCode: ManakaiAtomFeedElement.titleElement.get
3073
3074 @Attr:
3075 @@Name: updatedElement
3076 @@enDesc:
3077 The <XE::atom|updated> child element of the node.
3078 @@Type: AtomUpdatedElement
3079 @@Get:
3080 @@@enDesc:
3081 It <kwd:MUST> <I::return a <XE::atom|updated> child element>
3082 of the node.
3083 @@@nullCase:
3084 @@@@enDesc:
3085 If the algorithm returns <DOM::null>.
3086 @@@NodeReadOnlyError:
3087 @@@disDef:
3088 @@@@dlp:cloneCode: ManakaiAtomFeedElement.updatedElement.get
3089 ##AtomEntryElement
3090
3091 IFClsETDef:
3092 @IFQName: AtomContentElement
3093 @ETQName: atom|content
3094 @ClsQName: ManakaiAtomContentElement
3095
3096 @IFISA: AtomElement
3097 @ClsISA: ManakaiAtomElement
3098
3099 @enDesc:
3100 The <XE::atom|content> element either contains or links to
3101 the content of the entry.
3102
3103 @Attr:
3104 @@Name: type
3105 @@enDesc:
3106 The type of the element.
3107
3108 It <kwd:MUST> <I::reflect the string value
3109 of the <XA::type> attribute> of the node. It default
3110 value <kwd:MUST> be <CODE::text> if and only if
3111 there is no <XA::src> attribute on the node.
3112 @@Type: DOMString
3113 @@Get:
3114 @@@nullCase:
3115 @@@@enDesc:
3116 If the algorithm returns <DOM::null>.
3117 @@@PerlDef:
3118 __CODE{getReflectAttrStringValue::
3119 $node => $self,
3120 $namespaceURI => {null},
3121 $localName => 'type',
3122 $r => $r,
3123 $defaultValue => {
3124 $self-><M::Element.hasAttributeNS> (null, 'src') ? null : 'text'
3125 },
3126 }__;
3127 @@Set:
3128 @@@nullCase:
3129 @@@@enDesc:
3130 Removes the attribute.
3131 @@@NodeReadOnlyError:
3132 @@@PerlDef:
3133 __CODE{setReflectAttrStringValue::
3134 $node => $self,
3135 $namespaceURI => {null},
3136 $localName => 'type',
3137 $given => $given,
3138 }__;
3139
3140 @@Test:
3141 @@@QName: AtomContentElement.type.test
3142 @@@PerlDef:
3143 my $doc;
3144 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3145
3146 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3147
3148 $test->id ('default.no.src');
3149 $test->assert_equals ($el-><AG::AtomContentElement.type>, 'text');
3150
3151 $test->id ('default.src');
3152 $el-><AS::AtomContentElement.src> ('http://atom.example/');
3153 $test->assert_null ($el-><AG::AtomContentElement.type>);
3154
3155 $test->id ('set.xhtml');
3156 $el-><AS::AtomContentElement.type> ('xhtml');
3157 $test->assert_equals ($el-><AG::AtomContentElement.type>, 'xhtml');
3158
3159 $test->id ('set.imt');
3160 $el-><AS::AtomContentElement.type> ('application/xml');
3161 $test->assert_equals ($el-><AG::AtomContentElement.type>,
3162 'application/xml');
3163
3164 $test->id ('remove');
3165 $el-><AS::AtomContentElement.type> (null);
3166 $test->assert_null ($el-><AG::AtomContentElement.type>);
3167
3168 @Attr:
3169 @@Name: src
3170 @@enDesc:
3171 The source of the remote content of the element.
3172
3173 It <kwd:MUST> <I::reflect the string value
3174 of the <XA::src> attribute> of the node.
3175 @@Type: DOMString
3176 @@Type: DOMURI
3177 @@Get:
3178 @@@nullCase:
3179 @@@@enDesc:
3180 If the algorithm returns <DOM::null>.
3181 @@@PerlDef:
3182 __CODE{getReflectAttrURIValue::
3183 $node => $self,
3184 $namespaceURI => {null},
3185 $localName => 'src',
3186 $r => $r,
3187 $defaultValue => {null},
3188 }__;
3189 @@Set:
3190 @@@nullCase:
3191 @@@@enDesc:
3192 Removes the attribute.
3193 @@@NodeReadOnlyError:
3194 @@@PerlDef:
3195 __CODE{setReflectAttrURIValue::
3196 $node => $self,
3197 $namespaceURI => {null},
3198 $localName => 'src',
3199 $given => $given,
3200 }__;
3201
3202 @@Test:
3203 @@@QName: AtomContentElement.src.test
3204 @@@PerlDef:
3205 my $doc;
3206 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3207
3208 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3209
3210 $test->id ('default');
3211 $test->assert_null ($el-><AG::AtomContentElement.src>);
3212
3213 $test->id ('set');
3214 $el-><AS::AtomContentElement.src> ('http://atom.example/');
3215 $test->assert_equals ($el-><AG::AtomContentElement.src>,
3216 'http://atom.example/');
3217
3218 $test->id ('set.relative');
3219 $el-><AS::AtomContentElement.src> ('atom');
3220 $test->assert_equals ($el-><AG::AtomContentElement.src>, 'atom');
3221
3222 $test->id ('set.relative.base');
3223 $el-><M::Element.setAttributeNS> (<Q::xml|>, 'xml:base',
3224 'http://atom.example/');
3225 $test->assert_equals ($el-><AG::AtomContentElement.src>,
3226 'http://atom.example/atom');
3227
3228 $test->id ('remove');
3229 $el-><AS::AtomContentElement.src> (null);
3230 $test->assert_null ($el-><AG::AtomContentElement.src>);
3231
3232 @Attr:
3233 @@Name: container
3234 @@enDesc:
3235 The container element that contains the actual content for the node.
3236 @@Type: Element
3237 @@Get:
3238 @@@enDesc:
3239 - If the <A::AtomContentElement.type> is <CODE::xhtml>,
3240 it <kwd:MUST> <I::return the <XE::html|div> child element>.
3241
3242 - Otherwise, if the <A::AtomContentElement.src> is <DOM::null>,
3243 it <kwd:MUST> return <DOM::null>.
3244
3245 - Otherwise, it <kwd:MUST> return the node itself.
3246 @@@nullCase:
3247 @@@@enDesc:
3248 If the algorithm returns <DOM::null>.
3249 @@@NodeReadOnlyError:
3250 @@@PerlDef:
3251 __DEEP{
3252 my $type = $self-><AG::AtomContentElement.type>;
3253 if (defined $type and $type eq 'xhtml') {
3254 __UNDEEP{
3255 __CODE{returnChildElement::
3256 $node => $self,
3257 $namespaceURI => {<Q::html|>},
3258 $localName => 'div',
3259 $r => $r,
3260 }__;
3261 }__;
3262 } elsif (not $self-><M::Element.hasAttributeNS> (null, 'src')) {
3263 $r = $self;
3264 }
3265 }__;
3266
3267 @@Test:
3268 @@@QName: AtomContentElement.container.1.test
3269 @@@PerlDef:
3270 my $doc;
3271 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3272
3273 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3274
3275 $test->id ('no');
3276 $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3277
3278 $test->id ('application/smil');
3279 $el-><AS::AtomContentElement.type> ('application/smil');
3280 $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3281
3282 $test->id ('text');
3283 $el-><AS::AtomContentElement.type> ('text');
3284 $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3285
3286 $test->id ('html');
3287 $el-><AS::AtomContentElement.type> ('html');
3288 $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3289
3290 $test->id ('xhtml');
3291 $el-><AS::AtomContentElement.type> ('xhtml');
3292 $test->assert_null ($el-><AG::AtomContentElement.container>);
3293
3294 $doc-><AG::Document.domConfig>
3295 -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
3296 my $con = $el-><AG::AtomContentElement.container>;
3297
3298 $test->id ('xhtml.create');
3299 $test->assert_not_equals ($con, $el);
3300
3301 $test->id ('xhtml.namespaceURI');
3302 $test->assert_equals ($con-><AG::Node.namespaceURI>, <Q::html|>);
3303
3304 $test->id ('xhtml.localName');
3305 $test->assert_equals ($con-><AG::Node.localName>, 'div');
3306
3307 $test->id ('xhtml.parentNode');
3308 $test->assert_equals ($con-><AG::Node.parentNode>, $el);
3309
3310 $test->id ('xhtml.2');
3311 $test->assert_equals ($el-><AG::AtomContentElement.container>, $con);
3312 @@Test:
3313 @@@QName: AtomContentElement.container.2.test
3314 @@@enDesc:
3315 With <XA::src>.
3316 @@@PerlDef:
3317 my $doc;
3318 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3319
3320 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3321
3322 $el-><AS::AtomContentElement.src> ('http://www.example.com/');
3323
3324 $test->id ('no');
3325 $test->assert_null ($el-><AG::AtomContentElement.container>);
3326
3327 $test->id ('application/smil');
3328 $el-><AS::AtomContentElement.type> ('application/smil');
3329 $test->assert_null ($el-><AG::AtomContentElement.container>);
3330
3331 @enImplNote:
3332 @@ddid: base64
3333 @@@:
3334 {TODO::
3335 Access to Base64'ed content is necessary.
3336 }
3337 ##AtomContentElement
3338
3339 IFClsETDef:
3340 @IFQName: AtomAuthorElement
3341 @ETQName: atom|author
3342 @ClsQName: ManakaiAtomAuthorElement
3343
3344 @IFISA: AtomPersonConstruct
3345 @ClsISA: ManakaiAtomPersonConstruct
3346
3347 @enDesc:
3348 The <XE::atom|author> element is a Person construct that
3349 indicates the author of the entry or feed.
3350 ##AtomAuthorElement
3351
3352 IFClsETDef:
3353 @IFQName: AtomCategoryElement
3354 @ETQName: atom|category
3355 @ClsQName: ManakaiAtomCategoryElement
3356
3357 @IFISA: AtomElement
3358 @ClsISA: ManakaiAtomElement
3359
3360 @enDesc:
3361 The <XE::atom|category> element conveys information abut
3362 a category associated with an entry or feed.
3363
3364 @Attr:
3365 @@Name: term
3366 @@enDesc:
3367 The <XA::term> attribute of the element.
3368
3369 It <kwd:MUST> <I::reflect the string value
3370 of the <XA::term> attribute> of the node.
3371 @@Type: DOMString
3372 @@Get:
3373 @@@nullCase:
3374 @@@@enDesc:
3375 If the algorithm returns <DOM::null>.
3376 @@@PerlDef:
3377 __CODE{getReflectAttrStringValue::
3378 $node => $self,
3379 $namespaceURI => {null},
3380 $localName => 'term',
3381 $r => $r,
3382 $defaultValue => {null},
3383 }__;
3384 @@Set:
3385 @@@nullCase:
3386 @@@@enDesc:
3387 Removes the attribute.
3388 @@@NodeReadOnlyError:
3389 @@@PerlDef:
3390 __CODE{setReflectAttrStringValue::
3391 $node => $self,
3392 $namespaceURI => {null},
3393 $localName => 'term',
3394 $given => $given,
3395 }__;
3396
3397 @Attr:
3398 @@Name: scheme
3399 @@enDesc:
3400 The categorization scheme of the element.
3401
3402 It <kwd:MUST> <I::reflect the URI value
3403 of the <XA::scheme> attribute> of the node.
3404 @@Type: DOMString
3405 @@Type: DOMURI
3406 @@Get:
3407 @@@nullCase:
3408 @@@@enDesc:
3409 If the algorithm returns <DOM::null>.
3410 @@@PerlDef:
3411 __CODE{getReflectAttrURIValue::
3412 $node => $self,
3413 $namespaceURI => {null},
3414 $localName => 'scheme',
3415 $r => $r,
3416 $defaultValue => {null},
3417 }__;
3418 @@Set:
3419 @@@nullCase:
3420 @@@@enDesc:
3421 Removes the attribute.
3422 @@@NodeReadOnlyError:
3423 @@@PerlDef:
3424 __CODE{setReflectAttrURIValue::
3425 $node => $self,
3426 $namespaceURI => {null},
3427 $localName => 'scheme',
3428 $given => $given,
3429 }__;
3430
3431 @Attr:
3432 @@Name: label
3433 @@enDesc:
3434 The <XA::label> attribute of the element.
3435
3436 It <kwd:MUST> <I::reflect the string value
3437 of the <XA::label> attribute> of the node.
3438 @@Type: DOMString
3439 @@Get:
3440 @@@nullCase:
3441 @@@@enDesc:
3442 If the algorithm returns <DOM::null>.
3443 @@@PerlDef:
3444 __CODE{getReflectAttrStringValue::
3445 $node => $self,
3446 $namespaceURI => {null},
3447 $localName => 'label',
3448 $r => $r,
3449 $defaultValue => {null},
3450 }__;
3451 @@Set:
3452 @@@nullCase:
3453 @@@@enDesc:
3454 Removes the attribute.
3455 @@@NodeReadOnlyError:
3456 @@@PerlDef:
3457 __CODE{setReflectAttrStringValue::
3458 $node => $self,
3459 $namespaceURI => {null},
3460 $localName => 'label',
3461 $given => $given,
3462 }__;
3463 ##AtomCategoryElement
3464
3465 IFClsETDef:
3466 @IFQName: AtomContributorElement
3467 @ETQName: atom|contributor
3468 @ClsQName: ManakaiAtomContributorElement
3469
3470 @IFISA: AtomPersonConstruct
3471 @ClsISA: ManakaiAtomPersonConstruct
3472
3473 @enDesc:
3474 The <XE::atom|contributor> element is a Person construct that
3475 indicates a person or other entity who contributed to the entry
3476 or feed.
3477 ##AtomContributorElement
3478
3479 IFClsETDef:
3480 @IFQName: AtomGeneratorElement
3481 @ETQName: atom|generator
3482 @ClsQName: ManakaiAtomGeneratorElement
3483
3484 @IFISA: AtomElement
3485 @ClsISA: ManakaiAtomElement
3486
3487 @enDesc:
3488 The <XE::atom|generator> element identifies the agent used
3489 to generate a feed.
3490
3491 @Attr:
3492 @@Name: uri
3493 @@enDesc:
3494 The URI attribute of the element.
3495
3496 It <kwd:MUST> <I::reflect the URI value
3497 of the <XA::uri> attribute> of the node.
3498 @@Type: DOMString
3499 @@Type: DOMURI
3500 @@Get:
3501 @@@nullCase:
3502 @@@@enDesc:
3503 If the algorithm returns <DOM::null>.
3504 @@@PerlDef:
3505 __CODE{getReflectAttrURIValue::
3506 $node => $self,
3507 $namespaceURI => {null},
3508 $localName => 'uri',
3509 $r => $r,
3510 $defaultValue => {null},
3511 }__;
3512 @@Set:
3513 @@@nullCase:
3514 @@@@enDesc:
3515 Removes the attribute.
3516 @@@NodeReadOnlyError:
3517 @@@PerlDef:
3518 __CODE{setReflectAttrURIValue::
3519 $node => $self,
3520 $namespaceURI => {null},
3521 $localName => 'uri',
3522 $given => $given,
3523 }__;
3524
3525 @Attr:
3526 @@Name: version
3527 @@enDesc:
3528 The <XA::version> attribute of the element.
3529
3530 It <kwd:MUST> <I::reflect the string value
3531 of the <XA::version> attribute> of the node.
3532 @@Type: DOMString
3533 @@Get:
3534 @@@nullCase:
3535 @@@@enDesc:
3536 If the algorithm returns <DOM::null>.
3537 @@@PerlDef:
3538 __CODE{getReflectAttrStringValue::
3539 $node => $self,
3540 $namespaceURI => {null},
3541 $localName => 'version',
3542 $r => $r,
3543 $defaultValue => {null},
3544 }__;
3545 @@Set:
3546 @@@nullCase:
3547 @@@@enDesc:
3548 Removes the attribute.
3549 @@@NodeReadOnlyError:
3550 @@@PerlDef:
3551 __CODE{setReflectAttrStringValue::
3552 $node => $self,
3553 $namespaceURI => {null},
3554 $localName => 'version',
3555 $given => $given,
3556 }__;
3557 ##AtomGeneratorElement
3558
3559 IFClsETDef:
3560 @IFQName: AtomLinkElement
3561 @ETQName: atom|link
3562 @ClsQName: ManakaiAtomLinkElement
3563
3564 @IFISA: AtomElement
3565 @ClsISA: ManakaiAtomElement
3566
3567 @enDesc:
3568 The <XE::atom|link> element defines a reference from an entry
3569 or feed to a Web resource.
3570
3571 @Attr:
3572 @@Name: href
3573 @@enDesc:
3574 The <XA::href> attribute of the element.
3575
3576 It <kwd:MUST> <I::reflect the URI value
3577 of the <XA::href> attribute> of the node.
3578 @@Type: DOMString
3579 @@Type: DOMURI
3580 @@Get:
3581 @@@nullCase:
3582 @@@@enDesc:
3583 If the algorithm returns <DOM::null>.
3584 @@@PerlDef:
3585 __CODE{getReflectAttrURIValue::
3586 $node => $self,
3587 $namespaceURI => {null},
3588 $localName => 'href',
3589 $r => $r,
3590 $defaultValue => {null},
3591 }__;
3592 @@Set:
3593 @@@nullCase:
3594 @@@@enDesc:
3595 Removes the attribute.
3596 @@@NodeReadOnlyError:
3597 @@@PerlDef:
3598 __CODE{setReflectAttrURIValue::
3599 $node => $self,
3600 $namespaceURI => {null},
3601 $localName => 'href',
3602 $given => $given,
3603 }__;
3604
3605 @Attr:
3606 @@Name: rel
3607 @@enDesc:
3608 The <XA::rel> attribute of the element.
3609
3610 It <kwd:MUST> <I::reflect the string value
3611 of the <XA::rel> attribute> of the node, with
3612 a few exceptions. The default value <kwd:MUST>
3613 be <URI^DISCore|QName::rel|alternate>.
3614 @@Type: DOMString
3615 @@Get:
3616 @@@enDesc:
3617 If the algorithm returns a string that does not contain
3618 any <CHAR::COLON> character, the string
3619 <URI^DISCore|QName::rel|> <kwd:MUST> be prepended
3620 for the return value of the getter.
3621 @@@PerlDef:
3622 __CODE{getReflectAttrStringValue::
3623 $node => $self,
3624 $namespaceURI => {null},
3625 $localName => 'rel',
3626 $r => $r,
3627 $defaultValue => {<Q::rel|alternate>},
3628 }__;
3629 if (defined $r and index ($r, ':') == -1) {
3630 $r = <Q::rel|> . $r;
3631 }
3632 @@Set:
3633 @@@enDesc:
3634 If the given value starts with <URI^DISCore|QName::rel|> (by
3635 simple character-by-character comparison), such substring
3636 <kwd:MUST> be removed for the purpose of the setter algorithm,
3637 if and only if the result string is not empty and does contain
3638 none of <CHAR::COLON>, <CHAR::SOLIDUS>, <CHAR::QUESTION MARK>,
3639 and <CHAR::NUMBER SIGN>.
3640 @@@nullCase:
3641 @@@@enDesc:
3642 Removes the attribute.
3643 @@@NodeReadOnlyError:
3644 @@@PerlDef:
3645 if (defined $given) {
3646 $given =~ s[\Ahttp://www.iana.org/assignments/relation/([^:/?#]+)\z]
3647 [$1];
3648 }
3649 __CODE{setReflectAttrStringValue::
3650 $node => $self,
3651 $namespaceURI => {null},
3652 $localName => 'rel',
3653 $given => $given,
3654 }__;
3655
3656 @@Test:
3657 @@@QName: AtomLinkElement.rel.test
3658 @@@PerlDef:
3659 my $doc;
3660 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3661
3662 my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
3663
3664 $test->id ('default');
3665 $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
3666 <Q::rel|alternate>);
3667
3668 $test->id ('set');
3669 $el-><AS::AtomLinkElement.rel> ('http://www.example.com/');
3670 $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
3671 'http://www.example.com/');
3672
3673 $test->id ('set.self');
3674 $el-><AS::AtomLinkElement.rel> ('self');
3675 $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
3676 <Q::rel|self>);
3677
3678 $test->id ('set.qrelated');
3679 $el-><AS::AtomLinkElement.rel> (<Q::rel|related>);
3680 $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
3681 <Q::rel|related>);
3682
3683 $test->id ('remove');
3684 $el-><AS::AtomLinkElement.rel> (null);
3685 $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
3686 <Q::rel|alternate>);
3687
3688 @Attr:
3689 @@Name: type
3690 @@enDesc:
3691 The <XA::type> attribute of the element.
3692
3693 It <kwd:MUST> <I::reflect the string value
3694 of the <XA::type> attribute> of the node.
3695 @@Type: DOMString
3696 @@Get:
3697 @@@nullCase:
3698 @@@@enDesc:
3699 If the algorithm returns <DOM::null>.
3700 @@@PerlDef:
3701 __CODE{getReflectAttrStringValue::
3702 $node => $self,
3703 $namespaceURI => {null},
3704 $localName => 'type',
3705 $r => $r,
3706 $defaultValue => {null},
3707 }__;
3708 @@Set:
3709 @@@nullCase:
3710 @@@@enDesc:
3711 Removes the attribute.
3712 @@@NodeReadOnlyError:
3713 @@@PerlDef:
3714 __CODE{setReflectAttrStringValue::
3715 $node => $self,
3716 $namespaceURI => {null},
3717 $localName => 'type',
3718 $given => $given,
3719 }__;
3720
3721 @Attr:
3722 @@Name: hreflang
3723 @@enDesc:
3724 The <XA::hreflang> attribute of the element.
3725
3726 It <kwd:MUST> <I::reflect the string value
3727 of the <XA::hreflang> attribute> of the node.
3728 @@Type: DOMString
3729 @@Get:
3730 @@@nullCase:
3731 @@@@enDesc:
3732 If the algorithm returns <DOM::null>.
3733 @@@PerlDef:
3734 __CODE{getReflectAttrStringValue::
3735 $node => $self,
3736 $namespaceURI => {null},
3737 $localName => 'hreflang',
3738 $r => $r,
3739 $defaultValue => {null},
3740 }__;
3741 @@Set:
3742 @@@nullCase:
3743 @@@@enDesc:
3744 Removes the attribute.
3745 @@@NodeReadOnlyError:
3746 @@@PerlDef:
3747 __CODE{setReflectAttrStringValue::
3748 $node => $self,
3749 $namespaceURI => {null},
3750 $localName => 'hreflang',
3751 $given => $given,
3752 }__;
3753
3754 @Attr:
3755 @@Name: title
3756 @@enDesc:
3757 The <XA::title> attribute of the element.
3758
3759 It <kwd:MUST> <I::reflect the string value
3760 of the <XA::title> attribute> of the node.
3761 @@Type: DOMString
3762 @@Get:
3763 @@@nullCase:
3764 @@@@enDesc:
3765 If the algorithm returns <DOM::null>.
3766 @@@PerlDef:
3767 __CODE{getReflectAttrStringValue::
3768 $node => $self,
3769 $namespaceURI => {null},
3770 $localName => 'title',
3771 $r => $r,
3772 $defaultValue => {null},
3773 }__;
3774 @@Set:
3775 @@@nullCase:
3776 @@@@enDesc:
3777 Removes the attribute.
3778 @@@NodeReadOnlyError:
3779 @@@PerlDef:
3780 __CODE{setReflectAttrStringValue::
3781 $node => $self,
3782 $namespaceURI => {null},
3783 $localName => 'title',
3784 $given => $given,
3785 }__;
3786
3787 @Attr:
3788 @@Name: length
3789 @@enDesc:
3790 The <XA::length> attribute of the element.
3791
3792 It <kwd:MUST> <I::reflect the string value
3793 of the <XA::length> attribute> of the node.
3794 @@Type: DOMString
3795 @@Get:
3796 @@@nullCase:
3797 @@@@enDesc:
3798 If the algorithm returns <DOM::null>.
3799 @@@PerlDef:
3800 __CODE{getReflectAttrStringValue::
3801 $node => $self,
3802 $namespaceURI => {null},
3803 $localName => 'length',
3804 $r => $r,
3805 $defaultValue => {null},
3806 }__;
3807 @@Set:
3808 @@@nullCase:
3809 @@@@enDesc:
3810 Removes the attribute.
3811 @@@NodeReadOnlyError:
3812 @@@PerlDef:
3813 __CODE{setReflectAttrStringValue::
3814 $node => $self,
3815 $namespaceURI => {null},
3816 $localName => 'length',
3817 $given => $given,
3818 }__;
3819 ##AtomLinkElement
3820
3821 IFClsETDef:
3822 @IFQName: AtomPublishedElement
3823 @ETQName: atom|published
3824 @ClsQName: ManakaiAtomPublishedElement
3825
3826 @IFISA: AtomDateConstruct
3827 @ClsISA: ManakaiAtomDateConstruct
3828
3829 @enDesc:
3830 The <XE::atom|published> element is a Date construct
3831 indicating an instant in time associated with an
3832 event early in the life cycle of the entry.
3833
3834 Typically, <XE::atom|published> will be associated with
3835 the initial creation or first availability of the resouce.
3836 ##AtomPublishedElement
3837
3838 IFClsETDef:
3839 @IFQName: AtomRightsElement
3840 @ETQName: atom|rights
3841 @ClsQName: ManakaiAtomRightsElement
3842
3843 @IFISA: AtomTextConstruct
3844 @ClsISA: ManakaiAtomTextConstruct
3845
3846 @enDesc:
3847 The <XE::atom|rights> element is a Text construct
3848 that conveys information about rights held in and
3849 over an entry or feed.
3850 ##AtomRightsElement
3851
3852 IFClsETDef:
3853 @IFQName: AtomSourceElement
3854 @ETQName: atom|source
3855 @ClsQName: ManakaiAtomSourceElement
3856
3857 @IFISA: AtomElement
3858 @ClsISA: ManakaiAtomElement
3859
3860 @Attr:
3861 @@Name: authorElements
3862 @@enDesc:
3863 A static list of <XE::atom|author> child elements of the node.
3864 @@Type: StaticNodeList
3865 @@Get:
3866 @@@enDesc:
3867 It <kwd:MUST> <I::return a <XE::atom|author> child element list>
3868 of the node.
3869 @@@disDef:
3870 @@@@dlp:cloneCode: ManakaiAtomFeedElement.authorElements.get
3871
3872 @Attr:
3873 @@Name: categoryElements
3874 @@enDesc:
3875 A static list of <XE::atom|category> child elements of the node.
3876 @@Type: StaticNodeList
3877 @@Get:
3878 @@@enDesc:
3879 It <kwd:MUST> <I::return a <XE::atom|category> child element list>
3880 of the node.
3881 @@@disDef:
3882 @@@@dlp:cloneCode: ManakaiAtomFeedElement.categoryElements.get
3883
3884 @Attr:
3885 @@Name: contributorElements
3886 @@enDesc:
3887 A static list of <XE::atom|contributor> child elements of the node.
3888 @@Type: StaticNodeList
3889 @@Get:
3890 @@@enDesc:
3891 It <kwd:MUST> <I::return a <XE::atom|contributor> child element list>
3892 of the node.
3893 @@@disDef:
3894 @@@@dlp:cloneCode: ManakaiAtomFeedElement.contributorElements.get
3895
3896 @Attr:
3897 @@Name: generatorElement
3898 @@enDesc:
3899 The <XE::atom|generator> child element of the node.
3900 @@Type: AtomGeneratorElement
3901 @@Get:
3902 @@@enDesc:
3903 It <kwd:MUST> <I::return a <XE::atom|generator> child element>
3904 of the node.
3905 @@@nullCase:
3906 @@@@enDesc:
3907 If the algorithm returns <DOM::null>.
3908 @@@NodeReadOnlyError:
3909 @@@disDef:
3910 @@@@dlp:cloneCode: ManakaiAtomFeedElement.generatorElement.get
3911
3912 @Attr:
3913 @@Name: icon
3914 @@enDesc:
3915 The <XE::atom|icon> value of the node.
3916
3917 It <kwd:MUST> <I::reflect the URI value
3918 of the <XE::atom|icon> child element> of the node.
3919 @@Type: DOMString
3920 @@actualType: DOMURI
3921 @@Get:
3922 @@@nullCase:
3923 @@@@enDesc:
3924 If the algorithm returns <DOM::null>.
3925 @@@NodeReadOnlyError:
3926 @@@disDef:
3927 @@@@dlp:cloneCode: ManakaiAtomFeedElement.icon.get
3928 @@Set:
3929 @@@nullCase:
3930 @@@@enDesc:
3931 Removes the value.
3932 @@@NodeReadOnlyError:
3933 @@@disDef:
3934 @@@@dlp:cloneCode: ManakaiAtomFeedElement.icon.set
3935
3936 @Attr:
3937 @@Name: id
3938 @@enDesc:
3939 The <XE::atom|id> value of the node.
3940
3941 It <kwd:MUST> <I::reflect the string value
3942 of the <XE::atom|id> child element> of the node.
3943 @@Type: DOMString
3944 @@actualType: DOMURI
3945 @@Get:
3946 @@@nullCase:
3947 @@@@enDesc:
3948 If the algorithm returns <DOM::null>.
3949 @@@NodeReadOnlyError:
3950 @@@disDef:
3951 @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.get
3952 @@Set:
3953 @@@nullCase:
3954 @@@@enDesc:
3955 Removes the value.
3956 @@@NodeReadOnlyError:
3957 @@@disDef:
3958 @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.set
3959
3960 @Attr:
3961 @@Name: linkElements
3962 @@enDesc:
3963 A static list of <XE::atom|link> child elements of the node.
3964 @@Type: StaticNodeList
3965 @@Get:
3966 @@@enDesc:
3967 It <kwd:MUST> <I::return a <XE::atom|link> child element list>
3968 of the node.
3969 @@@disDef:
3970 @@@@dlp:cloneCode: ManakaiAtomFeedElement.linkElements.get
3971
3972 @Attr:
3973 @@Name: logo
3974 @@enDesc:
3975 The <XE::atom|logo> value of the node.
3976
3977 It <kwd:MUST> <I::reflect the URI value
3978 of the <XE::atom|logo> child element> of the node.
3979 @@Type: DOMString
3980 @@actualType: DOMURI
3981 @@Get:
3982 @@@nullCase:
3983 @@@@enDesc:
3984 If the algorithm returns <DOM::null>.
3985 @@@NodeReadOnlyError:
3986 @@@disDef:
3987 @@@@dlp:cloneCode: ManakaiAtomFeedElement.logo.get
3988 @@Set:
3989 @@@nullCase:
3990 @@@@enDesc:
3991 Removes the value.
3992 @@@NodeReadOnlyError:
3993 @@@disDef:
3994 @@@@dlp:cloneCode: ManakaiAtomFeedElement.logo.set
3995
3996 @Attr:
3997 @@Name: rightsElement
3998 @@enDesc:
3999 The <XE::atom|rights> child element of the node.
4000 @@Type: AtomRightsElement
4001 @@Get:
4002 @@@enDesc:
4003 It <kwd:MUST> <I::return a <XE::atom|rights> child element>
4004 of the node.
4005 @@@nullCase:
4006 @@@@enDesc:
4007 If the algorithm returns <DOM::null>.
4008 @@@NodeReadOnlyError:
4009 @@@disDef:
4010 @@@@dlp:cloneCode: ManakaiAtomFeedElement.rightsElement.get
4011
4012 @Attr:
4013 @@Name: subtitleElement
4014 @@enDesc:
4015 The <XE::atom|subtitle> child element of the node.
4016 @@Type: AtomSubtitleElement
4017 @@Get:
4018 @@@enDesc:
4019 It <kwd:MUST> <I::return a <XE::atom|subtitle> child element>
4020 of the node.
4021 @@@nullCase:
4022 @@@@enDesc:
4023 If the algorithm returns <DOM::null>.
4024 @@@NodeReadOnlyError:
4025 @@@disDef:
4026 @@@@dlp:cloneCode: ManakaiAtomFeedElement.subtitleElement.get
4027
4028 @Attr:
4029 @@Name: titleElement
4030 @@enDesc:
4031 The <XE::atom|title> child element of the node.
4032 @@Type: AtomTitleElement
4033 @@Get:
4034 @@@enDesc:
4035 It <kwd:MUST> <I::return a <XE::atom|title> child element>
4036 of the node.
4037 @@@nullCase:
4038 @@@@enDesc:
4039 If the algorithm returns <DOM::null>.
4040 @@@NodeReadOnlyError:
4041 @@@disDef:
4042 @@@@dlp:cloneCode: ManakaiAtomFeedElement.titleElement.get
4043
4044 @Attr:
4045 @@Name: updatedElement
4046 @@enDesc:
4047 The <XE::atom|updated> child element of the node.
4048 @@Type: AtomUpdatedElement
4049 @@Get:
4050 @@@enDesc:
4051 It <kwd:MUST> <I::return a <XE::atom|updated> child element>
4052 of the node.
4053 @@@nullCase:
4054 @@@@enDesc:
4055 If the algorithm returns <DOM::null>.
4056 @@@NodeReadOnlyError:
4057 @@@disDef:
4058 @@@@dlp:cloneCode: ManakaiAtomFeedElement.updatedElement.get
4059 ##AtomSourceElement
4060
4061 IFClsETDef:
4062 @IFQName: AtomSubtitleElement
4063 @ETQName: atom|subtitle
4064 @ClsQName: ManakaiAtomSubtitleElement
4065
4066 @IFISA: AtomTextConstruct
4067 @ClsISA: ManakaiAtomTextConstruct
4068
4069 @enDesc:
4070 The <XE::atom|subtitle> element is a Text construct
4071 that conveys a human-readable description or subtitle for a feed.
4072 ##AtomSubtitleElement
4073
4074 IFClsETDef:
4075 @IFQName: AtomSummaryElement
4076 @ETQName: atom|summary
4077 @ClsQName: ManakaiAtomSummaryElement
4078
4079 @IFISA: AtomTextConstruct
4080 @ClsISA: ManakaiAtomTextConstruct
4081
4082 @enDesc:
4083 The <XE::atom|summary> element is a Text construct
4084 that conveys a short summary, abstract, or excerpt of an entry.
4085 ##AtomSummaryElement
4086
4087 IFClsETDef:
4088 @IFQName: AtomTitleElement
4089 @ETQName: atom|title
4090 @ClsQName: ManakaiAtomTitleElement
4091
4092 @IFISA: AtomTextConstruct
4093 @ClsISA: ManakaiAtomTextConstruct
4094
4095 @enDesc:
4096 The <XE::atom|title> element is a Text construct
4097 that conveys a human-readable title for an entry or feed.
4098 ##AtomTitleElement
4099
4100 IFClsETDef:
4101 @IFQName: AtomUpdatedElement
4102 @ETQName: atom|updated
4103 @ClsQName: ManakaiAtomUpdatedElement
4104
4105 @IFISA: AtomDateConstruct
4106 @ClsISA: ManakaiAtomDateConstruct
4107
4108 @enDesc:
4109 The <XE::atom|updated> element is a Date construct
4110 indicating the most recent instant in time when an
4111 entry or feed was modified in a way the publisher considers
4112 significant.
4113 ##AtomPublishedElement
4114
4115 ElementTypeBinding:
4116 @Name: NodeReadOnlyError
4117 @ElementType:
4118 dx:raises
4119 @ShadowContent:
4120 @@@: MDOMX|NOMOD_THIS
4121 @@Description:
4122 @@@lang:en
4123 @@@@:
4124 If the node or a descendant of it, which
4125 is to be modified, is read-only.
4126
4127 ## -- Configuration Parameters
4128
4129 boolCParam:
4130 @QName: cfg|create-child-element
4131 @tc:nodeStemKey:
4132 @@@: ccldel
4133 @@ForCheck: =ManakaiDOM|all
4134 @c:targetType: tc|Document
4135 @IsSupportRequired:1
4136 @TrueCase:
4137 @@c:isSupported:1
4138 @@enDesc:
4139 If the parameter is set to <DOM::true>, some DOM attributes
4140 that returns an element will create a child element
4141 when there is no element that met the condition defined
4142 for that DOM attribute.
4143 @FalseCase:
4144 @@c:isSupported:1
4145 @@IsSupportRequired:1
4146 @@IsDefault:1
4147 @@enDesc:
4148 If the parameter is set to <DOM::true>, some DOM attributes
4149 that returns an element will <EM::not> create a child element
4150 even when there is no element that met the condition defined
4151 for that DOM attribute.
4152 @TestC:
4153 @@QName: cfg.create-child-element.set.test
4154 @@PerlCDef:
4155 my $doc;
4156 __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4157
4158 my $cfg = $doc-><AG::Document.domConfig>;
4159 my $cp = <Q::cfg|create-child-element>;
4160
4161 $test->id ('default');
4162 $test->assert_false ($cfg-><M::CFG.getParameter> ($cp));
4163
4164 $test->id ('set.f.to.t');
4165 $cfg-><M::CFG.setParameter> ($cp => true);
4166 $test->assert_true ($cfg-><M::CFG.getParameter> ($cp));
4167
4168 $test->id ('set.t.to.f');
4169 $cfg-><M::CFG.setParameter> ($cp => false);
4170 $test->assert_false ($cfg-><M::CFG.getParameter> ($cp));
4171
4172 $cfg-><M::CFG.setParameter> ($cp => true);
4173
4174 $test->id ('reset');
4175 $cfg-><M::CFG.setParameter> ($cp => null);
4176 $test->assert_false ($cfg-><M::CFG.getParameter> ($cp));
4177
4178 ResourceDef:
4179 @QName: CFG
4180 @AliasFor: c|DOMConfiguration
4181 @For: ManakaiDOM|DOM3
4182
4183 ElementTypeBinding:
4184 @Name: boolCParam
4185 @ElementType:
4186 dis:ResourceDef
4187 @ShadowContent:
4188 @@DISCore:resourceType:
4189 @@@@: c|DOMConfigurationParameter
4190 @@@For: ManakaiDOM|DOM
4191 @@DISCore:resourceType:
4192 @@@@: DISCore|Property
4193 @@@For: =ManakaiDOM|all
4194 @@For: ManakaiDOM|DOM3
4195 @@For: =ManakaiDOM|all
4196 @@Type: idl|boolean||ManakaiDOM|all

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24