/[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.22 - (hide annotations) (download)
Sat Dec 30 08:27:49 2006 UTC (17 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.21: +7 -40 lines
++ manakai/bin/ChangeLog	30 Dec 2006 06:47:17 -0000
2006-12-30  Wakaba  <wakaba@suika.fam.cx>

	* idl2dis.pl: Removed.

++ manakai/lib/Message/Markup/ChangeLog	30 Dec 2006 08:26:03 -0000
	* Atom.dis, SuikaWiki.dis, H2H.dis: |WithFor|
	and |DefaultFor| properties are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Util/ChangeLog	30 Dec 2006 08:26:59 -0000
	* PerlCode.dis: |WithFor| and |DefaultFor| are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/DOM/ChangeLog	30 Dec 2006 08:25:38 -0000
        GenericLS.dis, TreeCore.dis, DOMString.dis,
        XML.dis, Element.dis, Document.dis, TreeStore,dis,
        Traversal.dis, XDoctype.dis, XMLParser.dis, DOMLS.dis,
        SimpleLS.dis, DOMMain.dis, XDP.dis: |WithFor| specifications
	and |DefaultFor|s are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

	* CharacterData.dis, DOMCore.dis, DOMFeature.dis,
++ manakai/lib/Message/URI/ChangeLog	30 Dec 2006 08:26:32 -0000
	* Generic.dis: |WithFor| and |DefaultFor| are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Charset/ChangeLog	30 Dec 2006 08:24:04 -0000
	* Encode.dis (Require): |WithFor| specifications are removed.
	(DefaultFor): Removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/manakai/ChangeLog	30 Dec 2006 07:46:56 -0000
2006-12-30  Wakaba  <wakaba@suika.fam.cx>

	* dis.pl: Removed.

1 wakaba 1.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 wakaba 1.22 $Date: 2006/12/30 04:42:55 $
47 wakaba 1.1
48     @Require:
49     @@Module:
50     @@@QName: Markup|common
51     @@Module:
52     @@@QName: MDOM|TreeCore
53     @@Module:
54 wakaba 1.11 @@@QName: DISlib|DISMarkup
55 wakaba 1.1
56     Namespace:
57     @atom:
58     http://www.w3.org/2005/Atom
59     @c:
60     http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#
61     @cfg:
62     http://suika.fam.cx/www/2006/dom-config/
63 wakaba 1.11 @DISlib:
64     http://suika.fam.cx/~wakaba/archive/2004/dis/
65 wakaba 1.1 @dis:
66     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
67 wakaba 1.4 @dlp:
68     http://suika.fam.cx/~wakaba/archive/2004/dis/Perl#
69 wakaba 1.1 @d:
70     http://suika.fam.cx/~wakaba/archive/2004/dom/xdt#
71     @DOMMain:
72     http://suika.fam.cx/~wakaba/archive/2004/dom/main#
73 wakaba 1.15 @domperl:
74     http://suika.fam.cx/~wakaba/archive/2006/dom/perl/
75 wakaba 1.1 @dx:
76     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#
77 wakaba 1.9 @dxm:
78     http://suika.fam.cx/~wakaba/archive/2004/dis/XML#
79 wakaba 1.1 @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     @ManakaiDOM:
96     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#
97     @Markup:
98     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup#
99     @MDOM:
100     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM.
101     @MDOMX:
102     http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception#
103 wakaba 1.4 @mv:
104     http://suika.fam.cx/www/2006/05/mv/
105 wakaba 1.1 @rel:
106     http://www.iana.org/assignments/relation/
107     @s:
108     http://suika.fam.cx/~wakaba/archive/2004/dis/Markup#
109     @tc:
110     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/TreeCore/
111     @td:
112     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Document/
113     @te:
114     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/
115     @test:
116     http://suika.fam.cx/~wakaba/archive/2004/dis/Test#
117 wakaba 1.14 @thr:
118     http://purl.org/syndication/thread/1.0
119 wakaba 1.1 @tx:
120     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/
121     @urigen:
122     http://suika.fam.cx/~wakaba/archive/2005/manakai/URI/Generic/
123     @xml:
124     http://www.w3.org/XML/1998/namespace
125    
126     ElementTypeBinding:
127     @Name: CODE
128     @ElementType:
129     dis:ResourceDef
130     @ShadowContent:
131     @@DISCore:resourceType: dlp|BlockCode
132     @@ForCheck: ManakaiDOM|ForClass
133    
134     ElementTypeBinding:
135     @Name: Method
136     @ElementType:
137     dis:ResourceDef
138     @ShadowContent:
139     @@DISCore:resourceType: DISLang|Method
140    
141     ElementTypeBinding:
142     @Name: Param
143     @ElementType:
144     dis:ResourceDef
145     @ShadowContent:
146     @@DISCore:resourceType: DISLang|MethodParameter
147    
148     ElementTypeBinding:
149     @Name: Return
150     @ElementType:
151     dis:ResourceDef
152     @ShadowContent:
153     @@DISCore:resourceType: DISLang|MethodReturn
154    
155     ElementTypeBinding:
156     @Name: Attr
157     @ElementType:
158     dis:ResourceDef
159     @ShadowContent:
160     @@DISCore:resourceType: DISLang|Attribute
161    
162     ElementTypeBinding:
163 wakaba 1.6 @Name: ATTR
164     @ElementType:
165     dis:ResourceDef
166     @ShadowContent:
167     @@DISCore:resourceType:
168     @@@@: DISLang|Attribute
169     @@@ForCheck: ManakaiDOM|ForIF
170     @@DISCore:resourceType:
171     @@@@: DISLang|Attribute
172     @@@ForCheck: ManakaiDOM|ForClass
173     @@DISCore:resourceType:
174 wakaba 1.7 @@@@: mv|AttributeType
175 wakaba 1.6 @@@ForCheck: s|ForML
176    
177     ElementTypeBinding:
178 wakaba 1.1 @Name: Get
179     @ElementType:
180     dis:ResourceDef
181     @ShadowContent:
182     @@DISCore:resourceType: DISLang|AttributeGet
183    
184     ElementTypeBinding:
185     @Name: Set
186     @ElementType:
187     dis:ResourceDef
188     @ShadowContent:
189     @@DISCore:resourceType: DISLang|AttributeSet
190    
191     ElementTypeBinding:
192     @Name: nullCase
193     @ElementType:
194     dis:ResourceDef
195     @ShadowContent:
196     @@DISCore:resourceType: ManakaiDOM|InCase
197     @@Value:
198     @@@is-null:1
199    
200     ElementTypeBinding:
201     @Name: PerlDef
202     @ElementType:
203     dis:Def
204     @ShadowContent:
205     @@ContentType: lang|Perl
206     @@ForCheck: ManakaiDOM|ForClass
207    
208     ElementTypeBinding:
209     @Name: PerlCDef
210     @ElementType:
211     dis:Def
212     @ShadowContent:
213     @@ContentType: lang|Perl
214    
215     ElementTypeBinding:
216     @Name: enImplNote
217     @ElementType:
218     dis:ImplNote
219     @ShadowContent:
220     @@lang:en
221    
222     ElementTypeBinding:
223     @Name: enFN
224     @ElementType:
225     dis:FullName
226     @ShadowContent:
227     @@lang:en
228    
229     ElementTypeBinding:
230     @Name: IFClsETDef
231     @ElementType:
232     dis:ResourceDef
233     @ShadowContent:
234     @@DISCore:resourceType:
235     @@@@: dis|MultipleResource
236     @@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML
237     @@resourceFor: ManakaiDOM|ForIF
238     @@resourceFor: ManakaiDOM|ForClass
239     @@resourceFor: s|ForML
240    
241     @@DISCore:resourceType:
242     @@@@: DISLang|Interface
243     @@@ForCheck: ManakaiDOM|ForIF
244    
245     @@DISCore:resourceType:
246     @@@@: DISLang|Class
247     @@@ForCheck: ManakaiDOM|ForClass
248 wakaba 1.21
249 wakaba 1.1 @@Implement:
250 wakaba 1.22 @@@@: ||+||ManakaiDOM|ForIF
251 wakaba 1.1 @@@ContentType: DISCore|TFPQNames
252 wakaba 1.22 @@@ForCheck: ManakaiDOM|ForClass
253 wakaba 1.1
254     @@s:elementType:
255     @@@@: ||+||s|ForML
256     @@@ContentType: DISCore|TFPQNames
257     @@@DISCore:stopISARecursive:1
258    
259     @@DISCore:resourceType:
260     @@@@: s|ElementType
261     @@@ForCheck: s|ForML
262    
263     ElementTypeBinding:
264     @Name: IFClsDef
265     @ElementType:
266     dis:ResourceDef
267     @ShadowContent:
268     @@DISCore:resourceType:
269     @@@@: dis|MultipleResource
270     @@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML
271     @@resourceFor: ManakaiDOM|ForIF
272     @@resourceFor: ManakaiDOM|ForClass
273    
274     @@DISCore:resourceType:
275     @@@@: DISLang|Interface
276     @@@ForCheck: ManakaiDOM|ForIF
277    
278     @@DISCore:resourceType:
279     @@@@: DISLang|Class
280     @@@ForCheck: ManakaiDOM|ForClass
281 wakaba 1.21
282 wakaba 1.1 @@Implement:
283 wakaba 1.22 @@@@: ||+||ManakaiDOM|ForIF
284 wakaba 1.1 @@@ContentType: DISCore|TFPQNames
285 wakaba 1.22 @@@ForCheck: ManakaiDOM|ForClass
286 wakaba 1.1
287     ElementTypeBinding:
288 wakaba 1.6 @Name: IFClsConstructDef
289     @ElementType:
290     dis:ResourceDef
291     @ShadowContent:
292     @@DISCore:resourceType:
293     @@@@: dis|MultipleResource
294 wakaba 1.7 @@@ForCheck:
295     !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML !mv|ForCM !mv|ForAG
296 wakaba 1.6 @@resourceFor: ManakaiDOM|ForIF
297     @@resourceFor: ManakaiDOM|ForClass
298     @@resourceFor: mv|ForCM
299     @@resourceFor: mv|ForAG
300    
301     @@DISCore:resourceType:
302     @@@@: DISLang|Interface
303     @@@ForCheck: ManakaiDOM|ForIF
304    
305     @@DISCore:resourceType:
306     @@@@: DISLang|Class
307     @@@ForCheck: ManakaiDOM|ForClass
308 wakaba 1.21
309 wakaba 1.6 @@Implement:
310 wakaba 1.22 @@@@: ||+||ManakaiDOM|ForIF
311 wakaba 1.6 @@@ContentType: DISCore|TFPQNames
312 wakaba 1.22 @@@ForCheck: ManakaiDOM|ForClass
313 wakaba 1.6
314     @@DISCore:resourceType:
315     @@@@: mv|AttributeTypeGroup
316     @@@ForCheck: mv|ForAG
317    
318     @@DISCore:resourceType:
319     @@@@: mv|ElementContentModel
320     @@@ForCheck: mv|ForCM
321    
322    
323     ElementTypeBinding:
324 wakaba 1.1 @Name: IFQName
325     @ElementType:
326     dis:QName
327     @ShadowContent:
328     @@ForCheck: ManakaiDOM|ForIF
329    
330     ElementTypeBinding:
331     @Name: ClsQName
332     @ElementType:
333     dis:QName
334     @ShadowContent:
335     @@ForCheck: ManakaiDOM|ForClass
336    
337     ElementTypeBinding:
338     @Name: ETRQName
339     @ElementType:
340     dis:QName
341     @ShadowContent:
342     @@ForCheck: s|ForML
343    
344     ElementTypeBinding:
345     @Name: ETQName
346     @ElementType:
347     dis:AppName
348     @ShadowContent:
349     @@ForCheck: s|ForML
350     @@ContentType: DISCore|QName
351    
352     ElementTypeBinding:
353 wakaba 1.6 @Name: CMQName
354     @ElementType:
355     dis:QName
356     @ShadowContent:
357     @@ForCheck: mv|ForCM
358    
359     ElementTypeBinding:
360     @Name: CMName
361     @ElementType:
362     mv:elementContentModelName
363     @ShadowContent:
364     @@ForCheck: mv|ForCM
365    
366     ElementTypeBinding:
367     @Name: AGQName
368     @ElementType:
369     dis:QName
370     @ShadowContent:
371     @@ForCheck: mv|ForAG
372    
373     ElementTypeBinding:
374     @Name: AGName
375     @ElementType:
376     mv:attributeTypeGroupName
377     @ShadowContent:
378     @@ForCheck: mv|ForAG
379    
380     ElementTypeBinding:
381 wakaba 1.1 @Name: IFISA
382     @ElementType:
383     dis:ISA
384     @ShadowContent:
385     @@ForCheck: ManakaiDOM|ForIF
386    
387     ElementTypeBinding:
388     @Name: ClsISA
389     @ElementType:
390     dis:ISA
391     @ShadowContent:
392     @@ForCheck: ManakaiDOM|ForClass
393    
394     ElementTypeBinding:
395     @Name: disDef
396     @ElementType:
397     dis:Def
398     @ShadowContent:
399     @@ContentType:
400     lang:dis
401     @@ForCheck: ManakaiDOM|ForClass
402    
403     ElementTypeBinding:
404     @Name: Code
405     @ElementType:
406     dis:ResourceDef
407     @ShadowContent:
408     @@DISCore:resourceType: dlp|InlineCode
409     @@ForCheck: ManakaiDOM|ForClass
410    
411     ElementTypeBinding:
412     @Name: Test
413     @ElementType:
414     dis:ResourceDef
415     @ShadowContent:
416     @@DISCore:resourceType: test|StandaloneTest
417     @@ForCheck: ManakaiDOM|ForClass
418    
419     ElementTypeBinding:
420     @Name: TestC
421     @ElementType:
422     dis:ResourceDef
423     @ShadowContent:
424     @@DISCore:resourceType: test|StandaloneTest
425    
426     ResourceDef:
427     @QName: Document
428     @AliasFor: td|Document
429    
430     ResourceDef:
431     @QName: Element
432     @AliasFor: te|Element
433    
434     ResourceDef:
435     @QName: Attr
436     @AliasFor: te|Attr
437    
438     ResourceDef:
439     @QName: DOMString
440     @AliasFor: DOMMain|DOMString
441    
442     ResourceDef:
443     @QName: DOMURI
444     @AliasFor: ManakaiDOM|ManakaiDOMURI
445    
446     ResourceDef:
447     @QName: DOMTimeStamp
448     @AliasFor: DOMMain|DOMTimeStamp
449    
450     ResourceDef:
451     @QName: boolean
452     @AliasFor: idl|boolean||ManakaiDOM|all
453    
454     ResourceDef:
455     @QName: Node
456     @AliasFor: tc|Node
457    
458     ResourceDef:
459     @QName: NodeList
460     @AliasFor: tc|NodeList
461    
462     ResourceDef:
463     @QName: StaticNodeList
464     @AliasFor: tc|StaticNodeList
465    
466     ElementTypeBinding:
467     @Name: enDesc
468     @ElementType:
469     dis:Description
470     @ShadowContent:
471     @@lang:en
472    
473     ElementTypeBinding:
474 wakaba 1.4 @Name: enLN
475     @ElementType:
476     mv:longName
477     @ShadowContent:
478     @@lang:en
479    
480     ElementTypeBinding:
481 wakaba 1.1 @Name: TrueCase
482     @ElementType:
483     dis:ResourceDef
484     @ShadowContent:
485     @@DISCore:resourceType:
486     ManakaiDOM:InCase
487     @@Value:
488     @@@@: 1
489     @@@ContentType: DISCore|Boolean
490     @@Type: idl|boolean||ManakaiDOM|all
491    
492     ElementTypeBinding:
493     @Name: FalseCase
494     @ElementType:
495     dis:ResourceDef
496     @ShadowContent:
497     @@DISCore:resourceType:
498     ManakaiDOM:InCase
499     @@Value:
500     @@@@: 0
501     @@@ContentType: DISCore|Boolean
502     @@Type: idl|boolean||ManakaiDOM|all
503    
504     ## -- Features
505    
506     ElementTypeBinding:
507     @Name: FeatureDef
508     @ElementType:
509     dis:ResourceDef
510     @ShadowContent:
511     @@DISCore:resourceType: f|Feature
512     @@For: =ManakaiDOM|all
513    
514     ElementTypeBinding:
515     @Name: FeatureVerDef
516     @ElementType:
517     dis:ResourceDef
518     @ShadowContent:
519     @@DISCore:resourceType: f|Feature
520    
521     ElementTypeBinding:
522     @Name: featureQName
523     @ElementType:
524     f:name
525     @ShadowContent:
526     @@ContentType: DISCore|QName
527    
528     FeatureDef:
529     @featureQName: fe|Atom
530     @QName: AtomFeature
531     @FeatureVerDef:
532     @@QName: AtomFeature10
533     @@Version: 1.0
534     @@f:instanceOf: AtomFeature
535     @@f:requires: tx|XMLFeature30
536     @@enDesc:
537     The Atom DOM, version 1.0.
538 wakaba 1.4
539 wakaba 1.14 FeatureDef:
540     @featureQName: fe|AtomThreading
541     @QName: AtomThreadingFeature
542     @FeatureVerDef:
543     @@QName: AtomThreadingFeature10
544     @@Version: 1.0
545     @@f:instanceOf: AtomThreadingFeature
546     @@f:requires: fe|AtomFeature10
547     @@enDesc:
548     The Atom Threading Extension DOM, version 1.0.
549    
550 wakaba 1.4 ## -- Modules
551    
552     ModuleSetDef:
553     @QName: Atom
554     @enLN: Atom
555     @mv:version: 1.0
556 wakaba 1.7 @mv:contains: AtomDatatypes
557     @mv:contains: AtomProperties
558     @mv:contains: AtomEntry
559 wakaba 1.4 @mv:contains: AtomFeed
560 wakaba 1.10 @mv:contains: AtomQName
561    
562 wakaba 1.11 @mv:targetNamespace: atom|
563     @mv:defaultNamespacePrefix: atom
564 wakaba 1.13 @mv:systemIdentifierBaseURI: \
565 wakaba 1.4
566     ModuleDef:
567     @QName: AtomFeed
568     @mv:id: feed
569     @enLN: Feed
570 wakaba 1.8 @mv:contains: feed-prop
571 wakaba 1.4 @mv:contains: atom|feed
572    
573     ModuleDef:
574     @QName: AtomEntry
575     @mv:id: entry
576     @enLN: Entry
577 wakaba 1.8 @mv:contains: entry-prop
578 wakaba 1.4 @mv:contains: atom|entry
579    
580     ModuleDef:
581 wakaba 1.6 @QName: AtomProperties
582     @mv:id: props
583     @enLN: Properties
584 wakaba 1.4 @mv:contains: atom|content
585 wakaba 1.8 @mv:contains: atom|contributor
586 wakaba 1.4 @mv:contains: atom|category
587     @mv:contains: atom|generator
588     @mv:contains: atom|link
589     @mv:contains: atom|author
590     @mv:contains: atom|published
591     @mv:contains: atom|updated
592 wakaba 1.8 @mv:contains: atom|icon
593 wakaba 1.4 @mv:contains: atom|id
594 wakaba 1.8 @mv:contains: atom|logo
595     @mv:contains: atom|rights
596     @mv:contains: atom|subtitle
597     @mv:contains: atom|summary
598 wakaba 1.4 @mv:contains: atom|title
599 wakaba 1.8 @mv:contains: source-prop
600     @mv:contains: atom|source
601 wakaba 1.6
602     ModuleDef:
603     @QName: AtomDatatypes
604     @mv:id: datatypes
605     @enLN: Datatypes
606 wakaba 1.7
607     @mv:contains: atomNCName
608     @mv:contains: atomMediaType
609     @mv:contains: atomLanguageTag
610     @mv:contains: atomUri
611 wakaba 1.9 @mv:contains: atomUriCM
612 wakaba 1.7 @mv:contains: atomEmailAddress
613 wakaba 1.9 @mv:contains: atomEmailAddressCM
614 wakaba 1.7
615 wakaba 1.8 @mv:contains: undefinedAttributes
616 wakaba 1.9 @mv:contains: undefinedContent
617 wakaba 1.7 @mv:contains: atomCommonAttributes
618    
619 wakaba 1.8 @mv:contains: simpleExtensionElements
620     @mv:contains: structuredExtensionElements
621     @mv:contains: extensionElements
622    
623 wakaba 1.6 @mv:contains: TextAG
624     @mv:contains: TextCM
625 wakaba 1.8
626     @mv:contains: atom|name
627     @mv:contains: atom|email
628     @mv:contains: atom|uri
629 wakaba 1.6 @mv:contains: PersonAG
630 wakaba 1.8 @mv:contains: person-prop
631 wakaba 1.6 @mv:contains: PersonCM
632 wakaba 1.8
633 wakaba 1.6 @mv:contains: DateAG
634     @mv:contains: DateCM
635 wakaba 1.10
636     ResourceDef:
637     @QName: AtomQName
638     @enLN: Qualified Names
639     @mv:id: qname
640     @DISCore:resourceType: mv|XMLDTDQNameModule
641    
642     @mv:contains: Atom
643 wakaba 1.13
644     ResourceDef:
645     @QName: Atom10
646     @enLN: Atom 1.0
647     @mv:id: atom10
648     @DISCore:resourceType: mv|XMLDTDDriver
649    
650     @mv:refers: Atom
651    
652     @mv:refers: AtomQName
653     @mv:refers: AtomDatatypes
654     @mv:refers: AtomProperties
655     @mv:refers: AtomEntry
656     @mv:refers: AtomFeed
657 wakaba 1.4
658     ElementTypeBinding:
659     @Name: ModuleSetDef
660     @ElementType:
661     dis:ResourceDef
662     @ShadowContent:
663     @@DISCore:resourceType: mv|XMLDTDModuleSet
664    
665     ElementTypeBinding:
666     @Name: ModuleDef
667     @ElementType:
668     dis:ResourceDef
669     @ShadowContent:
670     @@DISCore:resourceType: mv|XMLDTDModule
671 wakaba 1.1
672     ## -- Implementation
673    
674     IFClsDef:
675     @IFQName: AtomImplementation
676     @ClsQName: ManakaiAtomImplementation
677    
678 wakaba 1.15 @domperl:implementedByObjectsOf: c|DOMImplementation
679     @domperl:classImplementedByObjectsOf: c|ManakaiDOMImplementation
680 wakaba 1.1
681     @enDesc:
682     The <IF::AtomImplementation> interface provides convenience
683     methods to create Atom documents.
684    
685     @f:provides: AtomFeature10
686 wakaba 1.14 @f:implements: AtomFeature10
687 wakaba 1.1
688     @Test:
689     @@QName: AtomImplementation.interface.test
690     @@PerlDef:
691     for my $interface (
692     <IFName::AtomImplementation>,
693     <IFName::c|DOMImplementation>,
694     <IFName::f|GetFeature>,
695     ) {
696     $test->id ($interface);
697     $test->assert_true
698 wakaba 1.17 (<Class::c|ManakaiDOMImplementation>->isa ($interface));
699 wakaba 1.1 }
700     @Test:
701     @@QName: ImplementationRegistry.AtomImplementation.1.test
702     @@PerlDef:
703     require Message::Markup::Atom;
704     my $impl = $Message::DOM::ImplementationRegistry
705 wakaba 1.19 ->get_dom_implementation ({
706 wakaba 1.1 <Q::fe|Atom> => '1.0',
707     });
708    
709     $test->assert_isa ($impl, <IFName::AtomImplementation>);
710     @Test:
711     @@QName: ImplementationRegistry.AtomImplementation.2.test
712     @@PerlDef:
713     require Message::Markup::Atom;
714     my $impl = $Message::DOM::ImplementationRegistry
715 wakaba 1.19 ->get_dom_implementation ({
716 wakaba 1.1 Core => '3.0',
717     <Q::fe|Atom> => '1.0',
718     });
719    
720     $test->assert_isa ($impl, <IFName::AtomImplementation>);
721     @Test:
722     @@QName: ImplementationRegistry.AtomImplementation.3.test
723     @@PerlDef:
724     require Message::Markup::Atom;
725     my $impl = $Message::DOM::ImplementationRegistry
726 wakaba 1.19 ->get_dom_implementation ({
727 wakaba 1.1 XML => '3.0',
728     <Q::fe|Atom> => '1.0',
729     });
730    
731     $test->assert_isa ($impl, <IFName::AtomImplementation>);
732    
733     @Method:
734     @@Name: createAtomFeedDocument
735     @@enDesc:
736     Creates an Atom Feed Document object.
737     @@Param:
738     @@@Name: id
739     @@@Type: DOMString
740     @@@actualType: DOMURI
741     @@@enDesc:
742     The <XE::atom|id> of the feed.
743     @@Param:
744     @@@Name: title
745     @@@Type: DOMString
746     @@@enDesc:
747     The <XE::atom|title> of the feed.
748     @@@nullCase:
749     @@@@enDesc:
750     The implementation <kwd:MUST> treate <DOM::null>
751     as if an empty string is specified.
752     @@Param:
753     @@@Name: lang
754     @@@Type: DOMString
755     @@@enDesc:
756     The default natural language of the feed.
757     @@@nullCase:
758     @@@@enDesc:
759     The implementation <kwd:MUST> treate <DOM::null>
760     as if an empty string is specified.
761     @@Return:
762 wakaba 1.18 @@@Type: AtomDocument
763 wakaba 1.1 @@@enDesc:
764     The newly created Atom Feed Document.
765    
766     {P:: The returned object <kwd:MUST> be a <IF::Document> node
767     with attributes:
768    
769     - <A::Node.childNodes>::: A <IF::NodeList> containing
770     a new <XE::atom|feed> element node.
771    
772     - <A::Document.xmlVersion>::: <XML::1.0>.
773    
774     }
775    
776     {P:: The newly created <XE::atom|feed> element node <kwd:MUST>
777     have attributes set as:
778    
779     - <A::Node.attributes>::: A <IF::NamedNodeMap> that contains
780     at least a new <XA::xml|lang>
781     attribute node.
782    
783     - <A::Node.childNodes>::: A <IF::NodeList> containing
784     a new <XE::atom|id> element node,
785     a new <XE::atom|title> element node, and
786     a new <XE::atom|updated> element node
787     in any order.
788    
789     }
790    
791     {P:: The newly created <XA::xml|lang> attribute node <kwd:MUST>
792     have attributes set as:
793    
794     - <A::Node.nodeValue>::: <P::lang>.
795    
796     - <A::Attr.specified>::: <DOM::true>.
797    
798     }
799    
800     {P:: The newly created <XE::atom|id> element node <kwd:MUST>
801     have attributes set as:
802    
803     - <A::Node.textContent>::: <P::id>.
804    
805     }
806    
807     {P:: The newly created <XE::atom|title> element node <kwd:MUST>
808     have attributes set as:
809    
810     - <A::Node.textContent>::: <P::title>.
811    
812     }
813    
814     The <XA::type> attribute node <kwd:MUST-NOT> be attached
815     to the <XE::atom|title> element node.
816    
817     {P:: The newly created <XE::atom|updated> element node <kwd:MUST>
818     have attributes set as:
819    
820     - <A::Node.textContent>::: A uppercase RFC 3339 <CODE::date-time>
821     representation of the time when the method is invoked.
822     The implementation <kwd:MAY> align its timezone to
823     that of the environment in which the method is invoked.
824    
825     }
826     @@@PerlDef:
827     __DEEP{
828     $r = $self-><M::c|DOMImplementation.createDocument>
829     (<Q::atom|>, 'feed');
830     $r-><AS::Document.xmlVersion> ('1.0');
831    
832     my $feede = $r-><AG::Document.documentElement>;
833     $feede-><AS::Node.manakaiLanguage> (defined $lang ? $lang : '');
834    
835     $feede-><AS::AtomFeedElement.id> ($id);
836    
837     my $titlee = $r-><M::Document.createElementNS> (<Q::atom|>, 'title');
838     $titlee-><AS::Node.textContent> (defined $title ? $title : '');
839     $feede-><M::Node.appendChild> ($titlee);
840    
841     my $updatede = $r-><M::Document.createElementNS>
842     (<Q::atom|>, 'updated');
843     $updatede-><AS::AtomDateConstruct.value> (scalar time);
844     $feede-><M::Node.appendChild> ($updatede);
845     }__;
846    
847     @@Test:
848     @@@QName: AtomImplementation.createAtomFeedDocument.test
849     @@@PerlDef:
850     my $impl;
851     __CODE{tc|createImplForTest:: $impl => $impl}__;
852     $impl = $impl->get_feature (<Q::fe|Atom> => '1.0');
853    
854     my $doc = $impl-><M::AtomImplementation.createAtomFeedDocument>
855     ('about:id', 'feed title', 'en');
856    
857     $test->id ('document.interface');
858     $test->assert_isa ($doc, <IFName::Document>);
859    
860     $test->id ('document.xmlVersion');
861     $test->assert_equals ($doc-><AG::Document.xmlVersion>, '1.0');
862    
863     my $feed = $doc-><AG::Document.documentElement>;
864    
865     $test->id ('feed.namespaceURI');
866     $test->assert_equals ($feed-><AG::Node.namespaceURI>, <Q::atom|>);
867    
868     $test->id ('feed.localName');
869     $test->assert_equals ($feed-><AG::Node.localName>, 'feed');
870    
871     $test->id ('feed.lang');
872     $test->assert_equals ($feed-><M::Element.getAttributeNS>
873     (<Q::xml|>, 'lang'),
874     'en');
875    
876     my $id;
877     my $title;
878     my $updated;
879    
880     for my $cn (@{$feed-><AG::Node.childNodes>}) {
881     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
882     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
883     if ($cn-><AG::Node.localName> eq 'id') {
884     $id = $cn;
885     } elsif ($cn-><AG::Node.localName> eq 'title') {
886     $title = $cn;
887     } elsif ($cn-><AG::Node.localName> eq 'updated') {
888     $updated = $cn;
889     }
890     }
891     }
892    
893     $test->id ('id');
894     $test->assert_not_null ($id);
895    
896     $test->id ('id.value');
897     $test->assert_equals ($id-><AG::Node.textContent>, 'about:id');
898    
899     $test->id ('title');
900     $test->assert_not_null ($title);
901    
902     $test->id ('title.value');
903     $test->assert_equals ($title-><AG::Node.textContent>, 'feed title');
904    
905     $test->id ('title.type');
906     $test->assert_null ($title-><M::Element.getAttributeNS> (null, 'type'));
907    
908     $test->id ('updated');
909     $test->assert_not_null ($updated);
910    
911     $test->id ('updated.value');
912     $test->assert_num_not_equals
913     (actual_value => $updated-><AG::AtomDateConstruct.value>,
914     expected_value => 0);
915    
916     @Method:
917     @@Name: createAtomEntryDocument
918     @@enDesc:
919     Creates an Atom Entry Document object.
920     @@Param:
921     @@@Name: id
922     @@@Type: DOMString
923     @@@actualType: DOMURI
924     @@@enDesc:
925     The <XE::atom|id> of the entry.
926     @@Param:
927     @@@Name: title
928     @@@Type: DOMString
929     @@@enDesc:
930     The <XE::atom|title> of the entry.
931     @@@nullCase:
932     @@@@enDesc:
933     The implementation <kwd:MUST> treate <DOM::null>
934     as if an empty string is specified.
935     @@Param:
936     @@@Name: lang
937     @@@Type: DOMString
938     @@@enDesc:
939     The natural language of the entry.
940     @@@nullCase:
941     @@@@enDesc:
942     The implementation <kwd:MUST> treate <DOM::null>
943     as if an empty string is specified.
944     @@Return:
945 wakaba 1.18 @@@Type: AtomDocument
946 wakaba 1.1 @@@enDesc:
947     The newly created Atom Entry Document.
948    
949     {P:: The returned object <kwd:MUST> be a <IF::Document> node
950     with attributes:
951    
952     - <A::Node.childNodes>::: A <IF::NodeList> containing
953     a new <XE::atom|entry> element node.
954    
955     - <A::Document.xmlVersion>::: <XML::1.0>.
956    
957     }
958    
959     {P:: The newly created <XE::atom|entry> element node <kwd:MUST>
960     have attributes set as:
961    
962     - <A::Node.attributes>::: A <IF::NamedNodeMap> that contains
963     at least a new <XA::xml|lang>
964     attribute node.
965    
966     - <A::Node.childNodes>::: A <IF::NodeList> containing
967     a new <XE::atom|id> element node,
968     a new <XE::atom|title> element node, and
969     a new <XE::atom|updated> element node
970     in any order.
971    
972     }
973    
974     {P:: The newly created <XA::xml|lang> attribute node <kwd:MUST>
975     have attributes set as:
976    
977     - <A::Node.nodeValue>::: <P::lang>.
978    
979     - <A::Attr.specified>::: <DOM::true>.
980    
981     }
982    
983     {P:: The newly created <XE::atom|id> element node <kwd:MUST>
984     have attributes set as:
985    
986     - <A::Node.textContent>::: <P::id>.
987    
988     }
989    
990     {P:: The newly created <XE::atom|title> element node <kwd:MUST>
991     have attributes set as:
992    
993     - <A::Node.textContent>::: <P::title>.
994    
995     }
996    
997     The <XA::type> attribute node <kwd:MUST-NOT> be attached
998     to the <XE::atom|title> element node.
999    
1000     {P:: The newly created <XE::atom|updated> element node <kwd:MUST>
1001     have attributes set as:
1002    
1003     - <A::Node.textContent>::: A uppercase RFC 3339 <CODE::date-time>
1004     representation of the time when the method is invoked.
1005     The implementation <kwd:MAY> align its timezone to
1006     that of the environment in which the method is invoked.
1007    
1008     }
1009     @@@PerlDef:
1010     __DEEP{
1011     $r = $self-><M::c|DOMImplementation.createDocument>
1012     (<Q::atom|>, 'entry');
1013     $r-><AS::Document.xmlVersion> ('1.0');
1014    
1015     my $feede = $r-><AG::Document.documentElement>;
1016     $feede-><AS::Node.manakaiLanguage> (defined $lang ? $lang : '');
1017    
1018     $feede-><AS::AtomFeedElement.id> ($id);
1019    
1020     my $titlee = $r-><M::Document.createElementNS> (<Q::atom|>, 'title');
1021     $titlee-><AS::Node.textContent> (defined $title ? $title : '');
1022     $feede-><M::Node.appendChild> ($titlee);
1023    
1024     my $updatede = $r-><M::Document.createElementNS>
1025     (<Q::atom|>, 'updated');
1026     $updatede-><AS::AtomDateConstruct.value> (scalar time);
1027     $feede-><M::Node.appendChild> ($updatede);
1028     }__;
1029    
1030     @@Test:
1031     @@@QName: AtomImplementation.createAtomEntryDocument.test
1032     @@@PerlDef:
1033     my $impl;
1034     __CODE{tc|createImplForTest:: $impl => $impl}__;
1035     $impl = $impl->get_feature (<Q::fe|Atom> => '1.0');
1036    
1037     my $doc = $impl-><M::AtomImplementation.createAtomEntryDocument>
1038     ('about:id', 'entry title', 'en');
1039    
1040     $test->id ('document.interface');
1041     $test->assert_isa ($doc, <IFName::Document>);
1042    
1043     $test->id ('document.xmlVersion');
1044     $test->assert_equals ($doc-><AG::Document.xmlVersion>, '1.0');
1045    
1046     my $feed = $doc-><AG::Document.documentElement>;
1047    
1048     $test->id ('feed.namespaceURI');
1049     $test->assert_equals ($feed-><AG::Node.namespaceURI>, <Q::atom|>);
1050    
1051     $test->id ('feed.localName');
1052     $test->assert_equals ($feed-><AG::Node.localName>, 'entry');
1053    
1054     $test->id ('feed.lang');
1055     $test->assert_equals ($feed-><M::Element.getAttributeNS>
1056     (<Q::xml|>, 'lang'),
1057     'en');
1058    
1059     my $id;
1060     my $title;
1061     my $updated;
1062    
1063     for my $cn (@{$feed-><AG::Node.childNodes>}) {
1064     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1065     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
1066     if ($cn-><AG::Node.localName> eq 'id') {
1067     $id = $cn;
1068     } elsif ($cn-><AG::Node.localName> eq 'title') {
1069     $title = $cn;
1070     } elsif ($cn-><AG::Node.localName> eq 'updated') {
1071     $updated = $cn;
1072     }
1073     }
1074     }
1075    
1076     $test->id ('id');
1077     $test->assert_not_null ($id);
1078    
1079     $test->id ('id.value');
1080     $test->assert_equals ($id-><AG::Node.textContent>, 'about:id');
1081    
1082     $test->id ('title');
1083     $test->assert_not_null ($title);
1084    
1085     $test->id ('title.value');
1086     $test->assert_equals ($title-><AG::Node.textContent>, 'entry title');
1087    
1088     $test->id ('title.type');
1089     $test->assert_null ($title-><M::Element.getAttributeNS> (null, 'type'));
1090    
1091     $test->id ('updated');
1092     $test->assert_not_null ($updated);
1093    
1094     $test->id ('updated.value');
1095     $test->assert_num_not_equals
1096     (actual_value => $updated-><AG::AtomDateConstruct.value>,
1097     expected_value => 0);
1098    
1099     @enImplNote:
1100     @@ddid: imt
1101     @@@:
1102     {ISSUE::
1103     The <CODE::contentType> attribute of the created document
1104     should be set to <CODE::application/atom+xml>?
1105     }
1106    
1107     @CODE:
1108     @@QName: returnChildElement
1109     @@enDesc:
1110     {P:: The algorithm to <DFN::return <VAR::element-type> child
1111     element> of the element node <VAR::E> is defined as:
1112    
1113     = If <VAR::E> contains one or more child element node
1114     whose element type is <VAR::element-type>,
1115     it <kwd:MUST> return the first such element node
1116     in document order.
1117    
1118     {OLI:: Otherwise,
1119    
1120     {OLI:: If the <cfg::cfg|create-child-element> configuration
1121     parameter is set to <DOM::true>,
1122    
1123     = Create an element node <VAR::N> whose element type
1124     is <VAR::element-type>.
1125    
1126     = Append <VAR::N> to <VAR::E> as if the <M::Node.appendChild>
1127     method were called for <VAR::E> with its parameter
1128     set to <VAR::N>. Note that this might throw an exception.
1129    
1130     = Then, <VAR::N> <kwd:MUST> be returned.
1131    
1132     }
1133    
1134     = Otherwise, <DOM::null> <kwd:MUST> be returned.
1135    
1136     }
1137    
1138     }
1139     @@PerlDef:
1140     __DEEP{
1141     E: {
1142     no warnings 'uninitialized';
1143     for my $__el (@{$node-><AG::Node.childNodes>}) {
1144     if ($__el-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1145     $__el-><AG::Node.localName> eq $localName and
1146     $__el-><AG::Node.namespaceURI> eq $namespaceURI) {
1147     $r = $__el;
1148     last E;
1149     }
1150     }
1151    
1152     my $od = $node-><AG::Node.ownerDocument>;
1153     if ($od-><AG::Document.domConfig>
1154     -><M::CFG.getParameter> (<Q::cfg|create-child-element>)) {
1155     $r = $od-><M::Document.createElementNS> ($namespaceURI, $localName);
1156     $node-><M::Node.appendChild> ($r);
1157     }
1158     } # E
1159     }__;
1160    
1161     @CODE:
1162     @@QName: returnChildElementList
1163     @@enDesc:
1164     {P:: The algorithm to <DFN::return <VAR::element-type> child
1165     element list> of the element node <VAR::E> is defined as:
1166    
1167     = Creates an empty <IF::StaticNodeList> object <VAR::L>
1168     that is <EM::not> read-only.
1169    
1170     = For each child element node of <VAR::E>,
1171     add that element node to <VAR::L> in document order
1172     if its element type is <VAR::element-type>.
1173    
1174     = Returns <VAR::E>.
1175    
1176     }
1177     @@PerlDef:
1178     __DEEP{
1179     no warnings 'uninitialized';
1180     __CODE{tc|createStaticNodeList:: $r => $r}__;
1181     for my $__el (@{$node-><AG::Node.childNodes>}) {
1182     if ($__el-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1183     $__el-><AG::Node.localName> eq $localName and
1184     $__el-><AG::Node.namespaceURI> eq $namespaceURI) {
1185     push @{$r}, $__el;
1186     }
1187     }
1188     }__;
1189    
1190     @CODE:
1191     @@QName: getReflectStringValue
1192     @@enDesc:
1193     {P:: If a DOM attribute is defined to <DFN::reflect the string value
1194     of the <VAR::element-type> child element> of the node <VAR::E>,
1195     the getter of the attribute <kwd:MUST> return the value
1196     defined by the algorithm:
1197    
1198     = If the <VAR::E> contains a child element node <VAR::C> whose element
1199     type is <VAR::element-type>, it <kwd:MUST> return
1200     the <A::Node.textContent> value of the <VAR::C>.
1201    
1202     = Otherwise, it <kwd:MUST> return <DOM::null>.
1203    
1204     }
1205     @@PerlDef:
1206     __DEEP{
1207     E: {
1208     no warnings 'uninitialized';
1209     for my $__cn (@{$node-><AG::Node.childNodes>}) {
1210     if ($__cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1211     $__cn-><AG::Node.localName> eq $localName and
1212     $__cn-><AG::Node.namespaceURI> eq $namespaceURI) {
1213     $r = $__cn-><AG::Node.textContent>;
1214     last E;
1215     }
1216     }
1217     $r = null;
1218     } # E
1219     }__;
1220    
1221     @CODE:
1222     @@QName: setReflectStringValue
1223     @@enDesc:
1224     {P:: If a DOM attribute is defined to <DFN::reflect the string value
1225     of the <VAR::element-type> child element> of the node <VAR::E>,
1226     the setter of the attribute <kwd:MUST> modify the node as
1227     defined by the algorithm:
1228    
1229     = If the given value is <DOM::null>, any child elements
1230     whose element types are <VAR::element-type> <kwd:MUST>
1231     be removed from the list of child nodes.
1232    
1233     = Otherwise, if there is no <VAR::element-type> child element
1234     node in the child node list of the <VAR::E>, it
1235     <kwd:MUST> create an element node whose element type
1236     is <VAR::element-type>, append it to the <VAR::E> as
1237     if the <M::Node.appendChild> method were invoked, and
1238     set the <A::Node.textContent> of the newly created
1239     element node to the given value.
1240    
1241     = Otherwise, it <kwd:MUST> set the <A::Node.textContent>
1242     of the first <VAR::element-type> child element node
1243     in the child node list of the <VAR::E> to the given value.
1244    
1245     }
1246    
1247     {NOTE::
1248     It might throw an exception.
1249     }
1250     @@PerlDef:
1251     __DEEP{
1252     no warnings 'uninitialized';
1253     if (defined $given) {
1254     my $__target;
1255     E: {
1256     for my $__cl (@{$node-><AG::Node.childNodes>}) {
1257     if ($__cl-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1258     $__cl-><AG::Node.localName> eq $localName and
1259     $__cl-><AG::Node.namespaceURI> eq $namespaceURI) {
1260     $__target = $__cl;
1261     last E;
1262     }
1263     }
1264    
1265     $__target = $node-><AG::Node.ownerDocument>
1266     -><M::Document.createElementNS>
1267     ($namespaceURI, $localName);
1268     $node-><M::Node.appendChild> ($__target);
1269     } # E
1270    
1271     $__target-><AS::Node.textContent> ($given);
1272     } else {
1273     my @__remove;
1274     for my $__cl (@{$node-><AG::Node.childNodes>}) {
1275     if ($__cl-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1276     $__cl-><AG::Node.localName> eq $localName and
1277     $__cl-><AG::Node.namespaceURI> eq $namespaceURI) {
1278     push @__remove, $__cl;
1279     }
1280     }
1281     $node-><M::Node.removeChild> ($_) for @__remove;
1282     }
1283     }__;
1284    
1285     @CODE:
1286     @@QName: getReflectAttrStringValue
1287     @@enDesc:
1288     {P:: If a DOM attribute is defined to <DFN::reflect the string value
1289     of the <VAR::attr-name> attribute> of the node <VAR::E>,
1290     the getter of the attribute <kwd:MUST> return the value
1291     defined by the algorithm:
1292    
1293     = If the <VAR::E> contains an attribute node <VAR::A> whose name
1294     is <VAR::attr-name>, it <kwd:MUST> return
1295     the <A::Node.nodeValue> of the <VAR::A>.
1296    
1297     = If a default value is explicitly defined
1298     where this algorithm is referenced, it <kwd:MUST>
1299     return the default value.
1300    
1301     = Otherwise, it <kwd:MUST> return <DOM::null>.
1302    
1303     }
1304     @@PerlDef:
1305     __DEEP{
1306     E: {
1307     $r = $node-><M::Element.getAttributeNS> ($namespaceURI, $localName);
1308     last E if defined $r;
1309    
1310     $r = $defaultValue;
1311     } # E
1312     }__;
1313    
1314     @CODE:
1315     @@QName: setReflectAttrStringValue
1316     @@enDesc:
1317     {P:: If a DOM attribute is defined to <DFN::reflect the string value
1318     of the <VAR::attr-name> attribute> of the node <VAR::E>,
1319     the setter of the attribute <kwd:MUST> modify the node as
1320     defined by the algorithm:
1321    
1322     = If the given value is <DOM::null>, it <kwd:MUST>
1323     remove the <VAR::attr-name> attribute node, if any,
1324     from the list of attribute nodes of <VAR::E>.
1325    
1326     = Otherwise, it <kwd:MUST> set the <VAR::attr-name>
1327     attribute node value to the given value as if
1328     the <M::Element.setAttributeNS> method were invoked.
1329    
1330     }
1331    
1332     {NOTE::
1333     It might throw an exception.
1334     }
1335     @@PerlDef:
1336     __DEEP{
1337     if (defined $given) {
1338     $node-><M::Element.setAttributeNS> ($namespaceURI, $localName, $given);
1339     } else {
1340     $node-><M::Element.removeAttributeNS> ($namespaceURI, $localName);
1341     }
1342     }__;
1343    
1344     @CODE:
1345     @@QName: getReflectURIValue
1346     @@enDesc:
1347     {P:: If a DOM attribute is defined to <DFN::reflect the URI value
1348     of the <VAR::element-type> child element> of the node <VAR::E>,
1349     the getter of the attribute <kwd:MUST> return the value
1350     defined by the algorithm:
1351    
1352     = Get the string <VAR::S> that would be returned
1353     if the DOM attribute <I::reflects the string value
1354     of the <VAR::element-type> child element> of the <VAR::E>.
1355    
1356     = If the <VAR::S> is <DOM::null>, it <kwd:MUST> return
1357     <DOM::null>.
1358    
1359     = Otherwise, if the <A::Node.baseURI> of the node
1360     from which the <VAR::S> comes is <DOM::null>,
1361     it <kwd:MUST> return the <VAR::S>.
1362    
1363     = Otherwise, a string that would be returned by the
1364     <M::urigen|URIReference.getAbsoluteReference>
1365     method on a <IF::urigen|URIReference> object whose
1366     <A::urigen|URIReference.uriReference> value
1367     equals to <A::Node.textContent> with the <CODE::base> parameter
1368     set to the <A::Node.baseURI> of the node
1369     from which the <VAR::S> comes and the <CODE::nonStrict>
1370     parameter set to <DOM::false>.
1371    
1372     }
1373     @@PerlDef:
1374     __DEEP{
1375     E: {
1376     no warnings 'uninitialized';
1377     for my $__cn (@{$node-><AG::Node.childNodes>}) {
1378     if ($__cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
1379     $__cn-><AG::Node.localName> eq $localName and
1380     $__cn-><AG::Node.namespaceURI> eq $namespaceURI) {
1381     my $__ref_buri = $__cn-><AG::Node.baseURI>;
1382     if (defined $__ref_buri) {
1383     $r = $node-><AG::Node.ownerDocument>
1384     -><AG::Document.implementation>
1385     -><M::urigen|URIImplementation.createURIReference>
1386     ($__cn-><AG::Node.textContent>)
1387     -><M::urigen|URIReference.getAbsoluteReference>
1388     ($__ref_buri)
1389     -><AG::urigen|URIReference.uriReference>;
1390     } else {
1391     $r = $__cn-><AG::Node.textContent>;
1392     }
1393     last E;
1394     }
1395     }
1396     $r = null;
1397     } # E
1398     }__;
1399    
1400     @CODE:
1401     @@QName: setReflectURIValue
1402     @@enDesc:
1403     If a DOM attribute is defined to <DFN::reflect the URI value
1404     of the <VAR::element-type> child element> of the node <VAR::E>,
1405     the setter of the attribute <kwd:MUST> modify the node as
1406     if the DOM attribute <I::reflects the string value of
1407     the <VAR::element-type> child element> of the <VAR::E>.
1408    
1409     {NOTE::
1410     It might throw an exception.
1411     }
1412     @@PerlDef:
1413     __CODE{setReflectStringValue}__;
1414    
1415     @CODE:
1416     @@QName: getReflectAttrURIValue
1417     @@enDesc:
1418     {P:: If a DOM attribute is defined to <DFN::reflect the URI value
1419     of the <VAR::attr-name> attribute> of the node <VAR::E>,
1420     the getter of the attribute <kwd:MUST> return the value
1421     defined by the algorithm:
1422    
1423     = Get the string <VAR::S> that would be returned
1424     if the DOM attribute <I::reflects the string value
1425     of the <VAR::attr-name> attribute> of the <VAR::E>.
1426    
1427     = If the <VAR::S> is <DOM::null>, it <kwd:MUST> return
1428     <DOM::null>.
1429    
1430     = Otherwise, if the <A::Node.baseURI> of the node
1431     from which the <VAR::S> comes is <DOM::null>,
1432     it <kwd:MUST> return the <VAR::S>.
1433    
1434     = Otherwise, a string that would be returned by the
1435     <M::urigen|URIReference.getAbsoluteReference>
1436     method on a <IF::urigen|URIReference> object whose
1437     <A::urigen|URIReference.uriReference> value
1438     equals to <A::Node.textContent> with the <CODE::base> parameter
1439     set to the <A::Node.baseURI> of the node
1440     from which the <VAR::S> comes and the <CODE::nonStrict>
1441     parameter set to <DOM::false>.
1442    
1443     }
1444     @@PerlDef:
1445     __DEEP{
1446     my $__attr = $node-><M::Element.getAttributeNodeNS>
1447     ($namespaceURI, $localName);
1448     if (defined $__attr) {
1449     my $__attr_base = $__attr-><AG::Node.baseURI>;
1450     if (defined $__attr_base) {
1451     $r = $node-><AG::Node.ownerDocument>
1452     -><AG::Document.implementation>
1453     -><M::urigen|URIImplementation.createURIReference>
1454     ($__attr-><AG::Node.nodeValue>)
1455     -><M::urigen|URIReference.getAbsoluteReference>
1456     ($__attr_base)
1457     -><AG::urigen|URIReference.uriReference>;
1458     } else {
1459     $r = $__attr-><AG::Node.nodeValue>;
1460     }
1461     } else {
1462     $r = null;
1463     }
1464     }__;
1465    
1466     @CODE:
1467     @@QName: setReflectAttrURIValue
1468     @@enDesc:
1469     If a DOM attribute is defined to <DFN::reflect the URI value
1470     of the <VAR::attr-name> attribute> of the node <VAR::E>,
1471     the setter of the DOM attribute <kwd:MUST> modify the node as
1472     if the DOM attribute <I::reflects the string value of
1473     the <VAR::attr-name> attribute> of the <VAR::E>.
1474    
1475     {NOTE::
1476     It might throw an exception.
1477     }
1478     @@PerlDef:
1479     __CODE{setReflectAttrStringValue}__;
1480    
1481     @enImplNote:
1482     @@ddid: datereflect
1483     @@@:
1484     {ISSUE::
1485     <QUOTE::reflecting Date child element> attribute should
1486     be provided for published and created?
1487     }
1488 wakaba 1.14
1489     @CODE:
1490     @@QName: getReflectAttrNonNegativeIntegerValue
1491     @@enDesc:
1492     {P:: If a DOM attribute is defined to <DFN::reflect the
1493     non-negative integer value of the <VAR::attr-name> attribute>
1494     of the node <VAR::E>, the getter of the attribute <kwd:MUST>
1495     return the value defined by the algorithm:
1496    
1497     {OLI:: If the <VAR::E> contains an attribute node <VAR::A> whose name
1498     is <VAR::attr-name>:
1499    
1500     = If the <A::Node.nodeValue> of the <VAR::A> is
1501     one or more sequence of digits (<CHAR::DIGIT ZERO>,
1502     <CHAR::DIGIT ONE>, ..., <CHAR::DIGIT NINE>) optionally
1503     preceding by a <CHAR::PLUS SIGN>, then
1504     the attribute getter <kwd:MUST> return a value
1505     by interpreting the <A::Node.nodeValue> of the <VAR::A>
1506     as a decimal number.
1507    
1508     }
1509    
1510     = If a default value is explicitly defined
1511     where this algorithm is referenced, it <kwd:MUST>
1512     return the default value.
1513    
1514     = Otherwise, it <kwd:MUST> return a binding-specific
1515     default value, if it is defined by the specification
1516     of the binding, or <DOM::-1>.
1517    
1518     }
1519    
1520     {NOTE::
1521     In Atom Threading Extension <SRC::RFC 4685>,
1522     the <CHAR::PLUS SIGN> and leading <CHAR::DIGIT ZERO>s
1523     are prohibitted.
1524     }
1525     @@PerlDef:
1526     __DEEP{
1527     E: {
1528     $r = $node-><M::Element.getAttributeNS> ($namespaceURI, $localName);
1529     if (defined $r) {
1530     if ($r =~ /\A\+?([0-9]+)\z/) {
1531     $r = 0+$1;
1532     last E;
1533     }
1534     }
1535    
1536     $r = $defaultValue;
1537     $r = -1 unless defined $r;
1538     } # E
1539     }__;
1540    
1541     @CODE:
1542     @@QName: setReflectAttrNonNegativeIntegerValue
1543     @@enDesc:
1544     {P:: If a DOM attribute is defined to <DFN::reflect the
1545     non-negative integer value
1546     of the <VAR::attr-name> attribute> of the node <VAR::E>,
1547     the setter of the attribute <kwd:MUST> modify the node as
1548     defined by the algorithm:
1549    
1550     = If the given value is <DOM::-1> or one of binding-specific
1551     default values, if any, as defined by the specification
1552     of the binding, it <kwd:MUST>
1553     remove the <VAR::attr-name> attribute node, if any,
1554     from the list of attribute nodes of <VAR::E>.
1555    
1556     = Otherwise, it <kwd:MUST> set the <VAR::attr-name>
1557     attribute node value to a string representation
1558     of the given value as if
1559     the <M::Element.setAttributeNS> method were invoked.
1560     The string representation <kwd:MUST> be a decimal
1561     number consist of one or more sequence of digits
1562     (<CHAR::DIGIT ZERO>, <CHAR::DIGIT ONE>, ..., <CHAR::DIGIT NINE>)
1563     <EM::without> any leading <CHAR::DIGIT ZERO>.
1564     The <CHAR::PLUS SIGN> <kwd:MUST> be omitted.
1565    
1566     }
1567    
1568     {NOTE::
1569     It might throw an exception.
1570     }
1571     @@PerlDef:
1572     __DEEP{
1573     if (defined $given and $given >= 0) {
1574     $node-><M::Element.setAttributeNS>
1575     ($namespaceURI, $localName, 0+$given);
1576     } else {
1577     $node-><M::Element.removeAttributeNS> ($namespaceURI, $localName);
1578     }
1579     }__;
1580 wakaba 1.1 ##AtomImplementation
1581    
1582     IFClsDef:
1583     @IFQName: AtomDocument
1584     @ClsQName: ManakaiAtomDocument
1585    
1586 wakaba 1.15 @domperl:implementedByObjectsOf: Document
1587     @domperl:classImplementedByObjectsOf: td|ManakaiDOMDocument
1588 wakaba 1.1
1589 wakaba 1.14 @f:implements: AtomFeature10
1590 wakaba 1.1
1591     @enDesc:
1592     If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1593     is supported, a <IF::Document> object whose <A::Document.documentElement>'s
1594     <A::Node.namespaceURI>, if any, is <URI^^DISCore|QName::atom|> at least
1595     at the time of creation <kwd:MUST> also
1596     implement the <IF::AtomDocument> interface. Other
1597     <IF:Document> objects <kwd:MAY> also implement
1598     the <IF::AtomDocument> interface.
1599    
1600     @Test:
1601     @@QName: createDocument.AtomDocument.test
1602     @@PerlDef:
1603     my $impl;
1604     __CODE{tc|createImplForTest:: $impl => $impl}__;
1605    
1606     my $doc = $impl-><M::c|DOMImplementation.createDocument>
1607     (<Q::atom|>, 'unknown');
1608    
1609     $test->id ('interface');
1610     $test->assert_isa ($doc, <IFName::AtomDocument>);
1611     ##AtomDocument
1612    
1613 wakaba 1.7 AGDef:
1614     @QName: atomCommonAttributes
1615     @enFN: common attributes
1616     @mv:attributeTypeGroupName: common
1617 wakaba 1.13
1618     @mv:refers: Atom
1619 wakaba 1.7
1620     @ATDef:
1621     @@mv:attributeTypeName: xml|base
1622     @@mv:attributeValueType: atomUri
1623    
1624     @ATDef:
1625     @@mv:attributeTypeName: xml|lang
1626     @@mv:attributeValueType: atomLanguageTag
1627    
1628 wakaba 1.8 @mv:refers: undefinedAttributes
1629 wakaba 1.7 ##atomCommonAttributes
1630    
1631     STDef:
1632     @QName: atomNCName
1633     @mv:datatypeEntityName: NCName
1634     #subsetOf: xsd|string
1635     #minLength, pattern
1636    
1637     STDef:
1638     @QName: atomMediaType
1639     @mv:datatypeEntityName: MediaType
1640     #subsetOf xsd|string
1641     # pattern
1642    
1643     STDef:
1644     @QName: atomLanguageTag
1645     @mv:datatypeEntityName: LangaugeTag
1646     #subsetOf: xsd|string
1647     #pattern
1648    
1649     STDef:
1650     @QName: atomUri
1651     @mv:datatypeEntityName: URI
1652     #aliasfor text
1653 wakaba 1.9 STCDef:
1654     @QName: atomUriCM
1655     @mv:elementContentModelName: URI
1656     @cm: (dxm|PCDATA||ManakaiDOM|all)*
1657 wakaba 1.7
1658     STDef:
1659     @QName: atomEmailAddress
1660     @mv:datatypeEntityName: EmailAddress
1661     #subsetOf xsd|string
1662     #pattern
1663 wakaba 1.9 STCDef:
1664     @QName: atomEmailAddressCM
1665     @mv:elementContentModelName: EmailAddress
1666     @cm: (dxm|PCDATA||ManakaiDOM|all)*
1667 wakaba 1.7
1668     ElementTypeBinding:
1669     @Name: AGDef
1670     @ElementType:
1671     dis:ResourceDef
1672     @ShadowContent:
1673     @@DISCore:resourceType: mv|AttributeTypeGroup
1674    
1675     ElementTypeBinding:
1676     @Name: ATDef
1677     @ElementType:
1678     dis:ResourceDef
1679     @ShadowContent:
1680     @@DISCore:resourceType: mv|AttributeType
1681    
1682     ElementTypeBinding:
1683 wakaba 1.8 @Name: ECDef
1684     @ElementType:
1685     dis:ResourceDef
1686     @ShadowContent:
1687     @@DISCore:resourceType: mv|ElementTypeClass
1688    
1689     ElementTypeBinding:
1690     @Name: EMDef
1691     @ElementType:
1692     dis:ResourceDef
1693     @ShadowContent:
1694     @@DISCore:resourceType: mv|ElementTypeClassMix
1695    
1696     ElementTypeBinding:
1697 wakaba 1.7 @Name: STDef
1698     @ElementType:
1699     dis:ResourceDef
1700     @ShadowContent:
1701     @@DISCore:resourceType: mv|XMLDTDDatatypeEntity
1702    
1703 wakaba 1.9 ElementTypeBinding:
1704     @Name: STCDef
1705     @ElementType:
1706     dis:ResourceDef
1707     @ShadowContent:
1708     @@DISCore:resourceType: mv|ElementContentModel
1709    
1710 wakaba 1.1 IFClsDef:
1711     @IFQName: AtomElement
1712     @ClsQName: ManakaiAtomElement
1713    
1714     @IFISA: Element
1715     @ClsISA: te|ManakaiDOMElement
1716    
1717 wakaba 1.14 @f:implements: AtomFeature10
1718 wakaba 1.1 @s:elementType: AnyAtomElement||ManakaiDOM|all
1719    
1720     @enDesc:
1721     The <IF::AtomElement> interface provides convenience
1722     methods and attributes for Atom elements.
1723    
1724     If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1725     is supported, an <IF::Element> object whose namespace URI
1726     is <URI^^DIS|QName::atom|> <kwd:MUST> also implement
1727     the <IF::AtomElement> interface. Other <IF::Element> objects
1728     <kwd:MAY> also implement the <IF::AtomElement> interface.
1729    
1730     @enImplNote:
1731     @@ddid: todo
1732     @@@:
1733     {TODO::
1734     Need <CODE::xmllang> and <CODE::xmlbase> attributes
1735     from SVG?
1736     }
1737    
1738     @Test:
1739     @@QName: AtomElement.interface.test
1740     @@PerlDef:
1741     for my $interface (
1742     <IFName::AtomElement>,
1743     <IFName::Element>,
1744     <IFName::Node>,
1745     <IFName::f|GetFeature>,
1746     ) {
1747     $test->id ($interface);
1748     $test->assert_true (<Class::ManakaiAtomElement>->isa ($interface));
1749     }
1750     @Test:
1751     @@QName: createElementNS.AtomElement.test
1752     @@PerlDef:
1753     my $doc;
1754     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
1755    
1756     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'unknown');
1757     $test->assert_isa ($el, <IFName::AtomElement>);
1758     ##AtomElement
1759    
1760     ResourceDef:
1761     @QName: AnyAtomElement
1762     @DISCore:resourceType: s|AnyElementInNS
1763     @AppName:
1764     @@@: atom|*
1765     @@ContentType: DISCore|QName
1766     @ForCheck: =ManakaiDOM|all
1767    
1768 wakaba 1.9 ElementTypeBinding:
1769     @Name: cm
1770     @ElementType:
1771     mv:elementContentModel
1772     @ShadowContent:
1773     @@ContentType: lang|dcmodel
1774    
1775 wakaba 1.6 IFClsConstructDef:
1776 wakaba 1.1 @IFQName: AtomTextConstruct
1777     @ClsQName: ManakaiAtomTextConstruct
1778 wakaba 1.6 @AGQName: TextAG
1779     @AGName: text
1780     @CMQName: TextCM
1781     @CMName: text
1782 wakaba 1.1
1783     @IFISA: AtomElement
1784     @ClsISA: ManakaiAtomElement
1785    
1786 wakaba 1.14 @f:implements: AtomFeature10
1787 wakaba 1.10 @mv:refers: atomCommonAttributes
1788    
1789 wakaba 1.9 @cm:
1790     dxm|ANY||ManakaiDOM|all
1791     @enImplNote:
1792     @@ddid:cm
1793     @@@:
1794     {TODO::
1795     (dxm|PCDATA||ManakaiDOM|all | html|div)*
1796     }
1797    
1798 wakaba 1.1 @enDesc:
1799     The <IF::AtomTextConstruct> interface provides convenience
1800     methods and attributes for <IF::Element> nodes
1801     classfied to the Text constructs. Other <IF::Element>
1802     objects <kwd:MAY> also implement the <IF::AtomTextConstruct>
1803     interface.
1804    
1805     A Text construct contains human-readable text, usually in
1806 wakaba 1.7 small quantities. The content of a Text construct is
1807 wakaba 1.1 Language-Sensitive.
1808    
1809 wakaba 1.6 @ATTR:
1810 wakaba 1.1 @@Name: type
1811     @@enDesc:
1812     The <XA::type> attribute of the element.
1813    
1814     It <kwd:MUST> <I::reflect the string value
1815     of the <XA::type> attribute> of the node. The
1816     default value <kwd:MUST> be <CODE::text>.
1817     @@Type: DOMString
1818     @@Get:
1819     @@@nullCase:
1820     @@@@enDesc:
1821     If the algorithm returns <DOM::null>.
1822     @@@PerlDef:
1823     __CODE{getReflectAttrStringValue::
1824     $node => $self,
1825     $namespaceURI => {null},
1826     $localName => 'type',
1827     $r => $r,
1828     $defaultValue => 'text',
1829     }__;
1830     @@Set:
1831     @@@nullCase:
1832     @@@@enDesc:
1833     Removes the attribute.
1834     @@@NodeReadOnlyError:
1835     @@@PerlDef:
1836     __CODE{setReflectAttrStringValue::
1837     $node => $self,
1838     $namespaceURI => {null},
1839     $localName => 'type',
1840     $given => $given,
1841     }__;
1842    
1843     @Attr:
1844     @@Name: container
1845     @@enDesc:
1846     The container element that contains the actual content
1847     of the construct.
1848     @@Type: Element
1849     @@Get:
1850     @@@enDesc:
1851     If the <A::AtomTextConstruct.type> is <CODE::xhtml>,
1852     the getter <kwd:MUST> <I::return the <XE::html|div> child element>.
1853     Otherwise, the object itself <kwd:MUST> be returned.
1854     @@@nullCase:
1855     @@@@enDesc:
1856     If the <A::AtomTextConstruct.type> is <CODE::xhtml>
1857     and the algorithm returns <DOM::null>.
1858     @@@NodeReadOnlyError:
1859     @@@PerlDef:
1860     __DEEP{
1861     my $type = $self-><AG::AtomTextConstruct.type>;
1862     if ($type eq 'xhtml') {
1863     __CODE{returnChildElement::
1864     $node => $self,
1865     $namespaceURI => {<Q::html|>},
1866     $localName => 'div',
1867     $r => $r,
1868     }__;
1869     } else {
1870     $r = $self;
1871     }
1872     }__;
1873    
1874     @@Test:
1875     @@@QName: AtomTextConstruct.container.test
1876     @@@PerlDef:
1877     my $doc;
1878     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
1879    
1880     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'title');
1881    
1882     $test->id ('no');
1883     $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $el);
1884    
1885     $test->id ('text');
1886     $el-><AS::AtomTextConstruct.type> ('text');
1887     $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $el);
1888    
1889     $test->id ('html');
1890     $el-><AS::AtomTextConstruct.type> ('html');
1891     $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $el);
1892    
1893     $test->id ('xhtml');
1894     $el-><AS::AtomTextConstruct.type> ('xhtml');
1895     $test->assert_null ($el-><AG::AtomTextConstruct.container>);
1896    
1897     $doc-><AG::Document.domConfig>
1898     -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
1899     my $con = $el-><AG::AtomTextConstruct.container>;
1900    
1901     $test->id ('xhtml.create');
1902     $test->assert_not_equals ($con, $el);
1903    
1904     $test->id ('xhtml.namespaceURI');
1905     $test->assert_equals ($con-><AG::Node.namespaceURI>, <Q::html|>);
1906    
1907     $test->id ('xhtml.localName');
1908     $test->assert_equals ($con-><AG::Node.localName>, 'div');
1909    
1910     $test->id ('xhtml.parentNode');
1911     $test->assert_equals ($con-><AG::Node.parentNode>, $el);
1912    
1913     $test->id ('xhtml.2');
1914     $test->assert_equals ($el-><AG::AtomTextConstruct.container>, $con);
1915     ##AtomTextConstruct
1916    
1917 wakaba 1.6 IFClsConstructDef:
1918 wakaba 1.1 @IFQName: AtomPersonConstruct
1919     @ClsQName: ManakaiAtomPersonConstruct
1920 wakaba 1.6 @AGQName: PersonAG
1921     @AGName: person
1922     @CMQName: PersonCM
1923     @CMName: person
1924 wakaba 1.1
1925     @IFISA: AtomElement
1926     @ClsISA: ManakaiAtomElement
1927    
1928 wakaba 1.14 @f:implements: AtomFeature10
1929 wakaba 1.10 @mv:refers: atomCommonAttributes
1930    
1931 wakaba 1.9 @cm:
1932     (person-prop+)
1933    
1934 wakaba 1.1 @enDesc:
1935     The <IF::AtomPersonConstruct> interface provides convenience
1936     methods and attributes for <IF::Element> nodes
1937     classfied to the Person constructs. Other <IF::Element>
1938     objects <kwd:MAY> also implement the <IF::AtomPersonConstruct>
1939     interface.
1940    
1941     A Person construct is an element that describes a person,
1942     corporation, or similar entity.
1943    
1944     @Attr:
1945     @@Name: name
1946     @@enDesc:
1947     The <XE::atom|name> value of the feed.
1948    
1949     It <kwd:MUST> <I::reflect the string value
1950     of the <XE::atom|name> child element> of the node.
1951     @@Type: DOMString
1952     @@Get:
1953     @@@nullCase:
1954     @@@@enDesc:
1955     If the algorithm returns <DOM::null>.
1956     @@@NodeReadOnlyError:
1957     @@@PerlDef:
1958     __CODE{getReflectStringValue::
1959     $node => $self,
1960     $namespaceURI => {<Q::atom|>},
1961     $localName => 'name',
1962     $r => $r,
1963     }__;
1964     @@Set:
1965     @@@nullCase:
1966     @@@@enDesc:
1967     Removes the value.
1968     @@@NodeReadOnlyError:
1969     @@@PerlDef:
1970     __CODE{setReflectStringValue::
1971     $node => $self,
1972     $namespaceURI => {<Q::atom|>},
1973     $localName => 'name',
1974     $given => $given,
1975     }__;
1976    
1977     @Attr:
1978     @@Name: nameElement
1979     @@enDesc:
1980     The <XE::atom|name> child element of the node.
1981 wakaba 1.7 @@Type: AtomNameElement
1982 wakaba 1.1 @@Get:
1983     @@@enDesc:
1984     It <kwd:MUST> <I::return a <XE::atom|name> child element>
1985     of the node.
1986     @@@nullCase:
1987     @@@@enDesc:
1988     If the algorithm returns <DOM::null>.
1989     @@@NodeReadOnlyError:
1990     @@@PerlDef:
1991     __CODE{returnChildElement::
1992     $node => $self,
1993     $namespaceURI => {<Q::atom|>},
1994     $localName => 'name',
1995     $r => $r,
1996     }__;
1997    
1998     @Attr:
1999     @@Name: uri
2000     @@enDesc:
2001     The <XE::atom|uri> value of the feed.
2002    
2003     It <kwd:MUST> <I::reflect the URI value
2004     of the <XE::atom|uri> child element> of the node.
2005     @@Type: DOMString
2006     @@actualType: DOMURI
2007     @@Get:
2008     @@@nullCase:
2009     @@@@enDesc:
2010     If the algorithm returns <DOM::null>.
2011     @@@NodeReadOnlyError:
2012     @@@PerlDef:
2013     __CODE{getReflectURIValue::
2014     $node => $self,
2015     $namespaceURI => {<Q::atom|>},
2016     $localName => 'uri',
2017     $r => $r,
2018     }__;
2019     @@Set:
2020     @@@nullCase:
2021     @@@@enDesc:
2022     Removes the value.
2023     @@@NodeReadOnlyError:
2024     @@@PerlDef:
2025     __CODE{setReflectURIValue::
2026     $node => $self,
2027     $namespaceURI => {<Q::atom|>},
2028     $localName => 'uri',
2029     $given => $given,
2030     }__;
2031    
2032     @Attr:
2033     @@Name: email
2034     @@enDesc:
2035     The <XE::atom|email> value of the feed.
2036    
2037     It <kwd:MUST> <I::reflect the string value
2038     of the <XE::atom|email> child element> of the node.
2039     @@Type: DOMString
2040     @@Get:
2041     @@@nullCase:
2042     @@@@enDesc:
2043     If the algorithm returns <DOM::null>.
2044     @@@NodeReadOnlyError:
2045     @@@PerlDef:
2046     __CODE{getReflectStringValue::
2047     $node => $self,
2048     $namespaceURI => {<Q::atom|>},
2049     $localName => 'email',
2050     $r => $r,
2051     }__;
2052     @@Set:
2053     @@@nullCase:
2054     @@@@enDesc:
2055     Removes the value.
2056     @@@NodeReadOnlyError:
2057     @@@PerlDef:
2058     __CODE{setReflectStringValue::
2059     $node => $self,
2060     $namespaceURI => {<Q::atom|>},
2061     $localName => 'email',
2062     $given => $given,
2063     }__;
2064     ##AtomPersonConstruct
2065    
2066 wakaba 1.8 ECDef:
2067     @QName: person-prop
2068     @mv:elementTypeClassName: person-prop
2069     @mv:refers: atom|name
2070     @mv:refers: atom|uri
2071     @mv:refers: atom|email
2072     @mv:refers: extensionElements
2073    
2074 wakaba 1.6 IFClsConstructDef:
2075 wakaba 1.1 @IFQName: AtomDateConstruct
2076     @ClsQName: ManakaiAtomDateConstruct
2077 wakaba 1.6 @AGQName: DateAG
2078     @AGName: date
2079     @CMQName: DateCM
2080     @CMName: date
2081 wakaba 1.1
2082     @IFISA: AtomElement
2083     @ClsISA: ManakaiAtomElement
2084    
2085 wakaba 1.14 @f:implements: AtomFeature10
2086 wakaba 1.10 @mv:refers: atomCommonAttributes
2087    
2088 wakaba 1.9 @cm:
2089     (dxm|PCDATA||ManakaiDOM|all)*
2090     @enImplNote:
2091     @@ddid: cm
2092     @@@:
2093     {TODO::
2094     xsd|dateTime
2095     }
2096    
2097 wakaba 1.1 @enDesc:
2098     The <IF::AtomDateConstruct> interface provides convenience
2099     methods and attributes for <IF::Element> nodes
2100     classfied to the Date constructs. Other <IF::Element>
2101     objects <kwd:MAY> also implement the <IF::AtomDateConstruct>
2102     interface.
2103    
2104     A Date construct is an element whose content is a date that
2105     conforms to the uppercase version of the RFC 3339 format.
2106    
2107     @Attr:
2108     @@Name: value
2109     @@enDesc:
2110     The date value of the node.
2111    
2112     {ISSUE::
2113    
2114     - Out of range of platform DOMTimeStamp type
2115    
2116     - Errorous xsd:dateTime
2117    
2118     - Leap seconds
2119    
2120     - Timezone
2121    
2122     - Precision
2123    
2124     }
2125     @@Type: DOMTimeStamp
2126     @@Get:
2127     @@@enDesc:
2128     {TODO:: Define
2129     }
2130     @@@PerlDef:
2131     my $value = $self-><AG::Node.textContent>;
2132     if ($value =~ /\A(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)(\.\d+)?
2133     (?:Z|([+-]\d+):(\d+))\z/x) {
2134     require Time::Local;
2135     $r = Time::Local::timegm_nocheck
2136     ($6, defined $8 ? $8 > 0 ? $5 - $9 : $5 + $9 : $5,
2137     defined $8 ? $4 - $8 : $4, $3, $2-1, $1-1900);
2138     $r += "0$7" if defined $7;
2139     } else {
2140     $r = 0;
2141     }
2142     @@Set:
2143     @@@enDesc:
2144     {TODO:: Define
2145     }
2146     @@@NodeReadOnlyError:
2147     @@@PerlDef:
2148     __DEEP{
2149     my @value = gmtime (int ($given / 1));
2150     my $value = sprintf '%04d-%02d-%02dT%02d:%02d:%02d',
2151     $value[5] + 1900, $value[4] + 1,
2152     $value[3], $value[2], $value[1], $value[0];
2153     my $f = $given % 1;
2154     $value .= substr (''.$f, 1) if $f;
2155     $value .= 'Z';
2156     $self-><AS::Node.textContent> ($value);
2157     }__;
2158    
2159     @enImplNote:
2160     @@ddid: todo
2161     @@@:
2162     {TODO::
2163     Access to components, especially timezone and -00:00.
2164     }
2165     ##AtomDateConstruct
2166    
2167 wakaba 1.8 ECDef:
2168     @QName: feed-prop
2169     @mv:elementTypeClassName: feed-prop
2170     @mv:refers: atom|author
2171     @mv:refers: atom|category
2172     @mv:refers: atom|contributor
2173     @mv:refers: atom|generator
2174     @mv:refers: atom|icon
2175     @mv:refers: atom|id
2176     @mv:refers: atom|link
2177     @mv:refers: atom|logo
2178     @mv:refers: atom|rights
2179     @mv:refers: atom|subtitle
2180     @mv:refers: atom|title
2181     @mv:refers: atom|updated
2182     @mv:refers: extensionElements
2183    
2184 wakaba 1.1 IFClsETDef:
2185     @IFQName: AtomFeedElement
2186     @ETQName: atom|feed
2187     @ETRQName: atom|feed
2188     @ClsQName: ManakaiAtomFeedElement
2189    
2190     @IFISA: AtomElement
2191     @ClsISA: ManakaiAtomElement
2192    
2193 wakaba 1.14 @f:implements: AtomFeature10
2194 wakaba 1.10 @mv:refers: atomCommonAttributes
2195    
2196 wakaba 1.9 @cm:
2197     (feed-prop+, atom|entry*)
2198    
2199 wakaba 1.1 @enDesc:
2200     The <XE::atom|feed> element is the document element
2201     of an Atom Feed Document.
2202 wakaba 1.3
2203     {ISSUE::
2204     <XE::atom|entry> children <kwd:MUST> be placed after
2205     any other elements. Attributes creating children
2206     should insert them before any entries?
2207     }
2208 wakaba 1.1
2209     @Attr:
2210     @@Name: authorElements
2211     @@enDesc:
2212     A static list of <XE::atom|author> child elements of the node.
2213     @@Type: StaticNodeList
2214     @@Get:
2215     @@@enDesc:
2216     It <kwd:MUST> <I::return a <XE::atom|author> child element list>
2217     of the node.
2218     @@@PerlDef:
2219     __CODE{returnChildElementList::
2220     $node => $self,
2221     $namespaceURI => {<Q::atom|>},
2222     $localName => 'author',
2223     $r => $r,
2224     }__;
2225    
2226     @@Test:
2227     @@@QName: AtomFeedElement.authorElements.empty.test
2228     @@@PerlDef:
2229     my $doc;
2230     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2231    
2232     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2233    
2234     my $list = $el-><AG::AtomFeedElement.authorElements>;
2235    
2236     $test->id ('interface');
2237     $test->assert_isa ($list, <IFName::StaticNodeList>);
2238    
2239     $test->id ('length');
2240     $test->assert_num_equals
2241     (actual_value => 0+@{$list}, expected_value => 0);
2242    
2243     $test->id ('readOnly');
2244     $test->assert_false ($list-><AG::NodeList.manakaiReadOnly>);
2245     @@Test:
2246     @@@QName: AtomFeedElement.authorElements.two.test
2247     @@@PerlDef:
2248     my $doc;
2249     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2250    
2251     my $e1 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2252     my $a1 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'author');
2253     $e1-><M::Node.appendChild> ($a1);
2254     my $a2 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'author');
2255     $e1-><M::Node.appendChild> ($a2);
2256    
2257     my $list = $e1-><AG::AtomFeedElement.authorElements>;
2258     my $a3 = $doc-><M::Document.createElementNS> (<Q::atom|>, 'author');
2259     $e1-><M::Node.appendChild> ($a3);
2260    
2261     $test->id ('length');
2262     $test->assert_num_equals
2263     (actual_value => 0+@{$list}, expected_value => 2);
2264    
2265     $test->id (0);
2266     $test->assert_equals ($list->[0], $a1);
2267    
2268     $test->id (1);
2269     $test->assert_equals ($list->[1], $a2);
2270    
2271     @Attr:
2272     @@Name: categoryElements
2273     @@enDesc:
2274     A static list of <XE::atom|category> child elements of the node.
2275     @@Type: StaticNodeList
2276     @@Get:
2277     @@@enDesc:
2278     It <kwd:MUST> <I::return a <XE::atom|category> child element list>
2279     of the node.
2280     @@@PerlDef:
2281     __CODE{returnChildElementList::
2282     $node => $self,
2283     $namespaceURI => {<Q::atom|>},
2284     $localName => 'category',
2285     $r => $r,
2286     }__;
2287    
2288     @Attr:
2289     @@Name: contributorElements
2290     @@enDesc:
2291     A static list of <XE::atom|contributor> child elements of the node.
2292     @@Type: StaticNodeList
2293     @@Get:
2294     @@@enDesc:
2295     It <kwd:MUST> <I::return a <XE::atom|contributor> child element list>
2296     of the node.
2297     @@@PerlDef:
2298     __CODE{returnChildElementList::
2299     $node => $self,
2300     $namespaceURI => {<Q::atom|>},
2301     $localName => 'contributor',
2302     $r => $r,
2303     }__;
2304    
2305     @Attr:
2306     @@Name: generatorElement
2307     @@enDesc:
2308     The <XE::atom|generator> child element of the node.
2309     @@Type: AtomGeneratorElement
2310     @@Get:
2311     @@@enDesc:
2312     It <kwd:MUST> <I::return a <XE::atom|generator> child element>
2313     of the node.
2314     @@@nullCase:
2315     @@@@enDesc:
2316     If the algorithm returns <DOM::null>.
2317     @@@NodeReadOnlyError:
2318     @@@PerlDef:
2319     __CODE{returnChildElement::
2320     $node => $self,
2321     $namespaceURI => {<Q::atom|>},
2322     $localName => 'generator',
2323     $r => $r,
2324     }__;
2325    
2326     @@Test:
2327     @@@QName: AtomFeedElement.generatorElement.test
2328     @@@PerlDef:
2329     my $doc;
2330     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2331    
2332     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2333    
2334     $test->id ('no');
2335     $test->assert_null ($el-><AG::AtomFeedElement.generatorElement>);
2336    
2337     $doc-><AG::Document.domConfig>
2338     -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
2339     my $ge = $el-><AG::AtomFeedElement.generatorElement>;
2340    
2341     $test->id ('create.interface');
2342     $test->assert_isa ($ge, <IFName::Element>);
2343    
2344     $test->id ('create.namespaceURI');
2345     $test->assert_equals ($ge-><AG::Node.namespaceURI>, <Q::atom|>);
2346    
2347     $test->id ('create.localName');
2348     $test->assert_equals ($ge-><AG::Node.localName>, 'generator');
2349    
2350     $test->id ('has');
2351     my $ge2 = $el-><AG::AtomFeedElement.generatorElement>;
2352     $test->assert_equals ($ge2, $ge);
2353    
2354     $test->id ('multiple');
2355     $el-><M::Node.appendChild>
2356     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'generator'));
2357     my $ge3 = $el-><AG::AtomFeedElement.generatorElement>;
2358     $test->assert_equals ($ge3, $ge);
2359    
2360     @Attr:
2361     @@Name: icon
2362     @@enDesc:
2363     The <XE::atom|icon> value of the feed.
2364    
2365     It <kwd:MUST> <I::reflect the URI value
2366     of the <XE::atom|icon> child element> of the node.
2367     @@Type: DOMString
2368     @@actualType: DOMURI
2369     @@Get:
2370     @@@nullCase:
2371     @@@@enDesc:
2372     If the algorithm returns <DOM::null>.
2373     @@@NodeReadOnlyError:
2374     @@@PerlDef:
2375     __CODE{getReflectURIValue::
2376     $node => $self,
2377     $namespaceURI => {<Q::atom|>},
2378     $localName => 'icon',
2379     $r => $r,
2380     }__;
2381     @@Set:
2382     @@@nullCase:
2383     @@@@enDesc:
2384     Removes the value.
2385     @@@NodeReadOnlyError:
2386     @@@PerlDef:
2387     __CODE{setReflectURIValue::
2388     $node => $self,
2389     $namespaceURI => {<Q::atom|>},
2390     $localName => 'icon',
2391     $given => $given,
2392     }__;
2393    
2394     @@Test:
2395     @@@QName: AtomFeedElement.icon.test
2396     @@@PerlDef:
2397     my $doc;
2398     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2399    
2400     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2401    
2402     $test->id ('default');
2403     $test->assert_null ($el-><AG::AtomFeedElement.icon>);
2404    
2405     $test->id ('set');
2406     $el-><AS::AtomFeedElement.icon> ('http://example.com/');
2407     $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2408     'http://example.com/');
2409    
2410     $test->id ('relative');
2411     $el-><AS::AtomFeedElement.icon> ('favicon.ico');
2412     $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2413     'favicon.ico');
2414    
2415     $test->id ('relative.base');
2416     $el-><M::Element.setAttributeNS> (<Q::xml:>, 'xml:base',
2417     'http://www.example.com/');
2418     $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2419     'http://www.example.com/favicon.ico');
2420    
2421     $test->id ('multiple');
2422     $el-><M::Node.appendChild>
2423     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'icon'))
2424     -><AS::Node.textContent> ('/default.ico'); # ignored
2425     $test->assert_equals ($el-><AG::AtomFeedElement.icon>,
2426     'http://www.example.com/favicon.ico');
2427    
2428     $test->id ('remove');
2429     $el-><AS::AtomFeedElement.icon> (null);
2430     $test->assert_null ($el-><AG::AtomFeedElement.icon>);
2431    
2432     @Attr:
2433     @@Name: id
2434     @@enDesc:
2435     The <XE::atom|id> value of the feed.
2436    
2437     It <kwd:MUST> <I::reflect the string value
2438     of the <XE::atom|id> child element> of the node.
2439     @@Type: DOMString
2440     @@actualType: DOMURI
2441     @@Get:
2442     @@@nullCase:
2443     @@@@enDesc:
2444     If the algorithm returns <DOM::null>.
2445     @@@NodeReadOnlyError:
2446     @@@PerlDef:
2447     __CODE{getReflectStringValue::
2448     $node => $self,
2449     $namespaceURI => {<Q::atom|>},
2450     $localName => 'id',
2451     $r => $r,
2452     }__;
2453     @@Set:
2454     @@@nullCase:
2455     @@@@enDesc:
2456     Removes the value.
2457     @@@NodeReadOnlyError:
2458     @@@PerlDef:
2459     __CODE{setReflectStringValue::
2460     $node => $self,
2461     $namespaceURI => {<Q::atom|>},
2462     $localName => 'id',
2463     $given => $given,
2464     }__;
2465    
2466     @@Test:
2467     @@@QName: AtomFeedElement.id.test
2468     @@@PerlDef:
2469     my $doc;
2470     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2471    
2472     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2473    
2474     $test->id ('default');
2475     $test->assert_null ($el-><AG::AtomFeedElement.id>);
2476    
2477     $test->id ('set');
2478     $el-><AS::AtomFeedElement.id> ('http://example.com/');
2479     $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2480     'http://example.com/');
2481    
2482     $test->id ('relative');
2483     $el-><AS::AtomFeedElement.id> ('favicon.ico');
2484     $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2485     'favicon.ico');
2486    
2487     $test->id ('relative.base');
2488     $el-><M::Element.setAttributeNS> (<Q::xml:>, 'xml:base',
2489     'http://www.example.com/');
2490     $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2491     'favicon.ico');
2492    
2493     $test->id ('multiple');
2494     $el-><M::Node.appendChild>
2495     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'id'))
2496     -><AS::Node.textContent> ('/default.ico'); # ignored
2497     $test->assert_equals ($el-><AG::AtomFeedElement.id>,
2498     'favicon.ico');
2499    
2500     $test->id ('remove');
2501     $el-><AS::AtomFeedElement.id> (null);
2502     $test->assert_null ($el-><AG::AtomFeedElement.id>);
2503    
2504     @Attr:
2505     @@Name: linkElements
2506     @@enDesc:
2507     A static list of <XE::atom|link> child elements of the node.
2508     @@Type: StaticNodeList
2509     @@Get:
2510     @@@enDesc:
2511     It <kwd:MUST> <I::return a <XE::atom|link> child element list>
2512     of the node.
2513     @@@PerlDef:
2514     __CODE{returnChildElementList::
2515     $node => $self,
2516     $namespaceURI => {<Q::atom|>},
2517     $localName => 'link',
2518     $r => $r,
2519     }__;
2520    
2521     @Attr:
2522     @@Name: logo
2523     @@enDesc:
2524     The <XE::atom|logo> value of the feed.
2525    
2526     It <kwd:MUST> <I::reflect the URI value
2527     of the <XE::atom|logo> child element> of the node.
2528     @@Type: DOMString
2529     @@actualType: DOMURI
2530     @@Get:
2531     @@@nullCase:
2532     @@@@enDesc:
2533     If the algorithm returns <DOM::null>.
2534     @@@NodeReadOnlyError:
2535     @@@PerlDef:
2536     __CODE{getReflectURIValue::
2537     $node => $self,
2538     $namespaceURI => {<Q::atom|>},
2539     $localName => 'logo',
2540     $r => $r,
2541     }__;
2542     @@Set:
2543     @@@nullCase:
2544     @@@@enDesc:
2545     Removes the value.
2546     @@@NodeReadOnlyError:
2547     @@@PerlDef:
2548     __CODE{setReflectURIValue::
2549     $node => $self,
2550     $namespaceURI => {<Q::atom|>},
2551     $localName => 'logo',
2552     $given => $given,
2553     }__;
2554    
2555     @Attr:
2556     @@Name: rightsElement
2557     @@enDesc:
2558     The <XE::atom|rights> child element of the node.
2559     @@Type: AtomRightsElement
2560     @@Get:
2561     @@@enDesc:
2562     It <kwd:MUST> <I::return a <XE::atom|rights> child element>
2563     of the node.
2564     @@@nullCase:
2565     @@@@enDesc:
2566     If the algorithm returns <DOM::null>.
2567     @@@NodeReadOnlyError:
2568     @@@PerlDef:
2569     __CODE{returnChildElement::
2570     $node => $self,
2571     $namespaceURI => {<Q::atom|>},
2572     $localName => 'rights',
2573     $r => $r,
2574     }__;
2575    
2576     @Attr:
2577     @@Name: subtitleElement
2578     @@enDesc:
2579     The <XE::atom|subtitle> child element of the node.
2580     @@Type: AtomSubtitleElement
2581     @@Get:
2582     @@@enDesc:
2583     It <kwd:MUST> <I::return a <XE::atom|subtitle> child element>
2584     of the node.
2585     @@@nullCase:
2586     @@@@enDesc:
2587     If the algorithm returns <DOM::null>.
2588     @@@NodeReadOnlyError:
2589     @@@PerlDef:
2590     __CODE{returnChildElement::
2591     $node => $self,
2592     $namespaceURI => {<Q::atom|>},
2593     $localName => 'subtitle',
2594     $r => $r,
2595     }__;
2596    
2597     @Attr:
2598     @@Name: titleElement
2599     @@enDesc:
2600     The <XE::atom|title> child element of the node.
2601     @@Type: AtomTitleElement
2602     @@Get:
2603     @@@enDesc:
2604     It <kwd:MUST> <I::return a <XE::atom|title> child element>
2605     of the node.
2606     @@@nullCase:
2607     @@@@enDesc:
2608     If the algorithm returns <DOM::null>.
2609     @@@NodeReadOnlyError:
2610     @@@PerlDef:
2611     __CODE{returnChildElement::
2612     $node => $self,
2613     $namespaceURI => {<Q::atom|>},
2614     $localName => 'title',
2615     $r => $r,
2616     }__;
2617    
2618     @Attr:
2619     @@Name: updatedElement
2620     @@enDesc:
2621     The <XE::atom|updated> child element of the node.
2622     @@Type: AtomUpdatedElement
2623     @@Get:
2624     @@@enDesc:
2625     It <kwd:MUST> <I::return a <XE::atom|updated> child element>
2626     of the node.
2627     @@@nullCase:
2628     @@@@enDesc:
2629     If the algorithm returns <DOM::null>.
2630     @@@NodeReadOnlyError:
2631     @@@PerlDef:
2632     __CODE{returnChildElement::
2633     $node => $self,
2634     $namespaceURI => {<Q::atom|>},
2635     $localName => 'updated',
2636     $r => $r,
2637     }__;
2638    
2639     @Attr:
2640     @@Name: entryElements
2641     @@enDesc:
2642     A static list of <XE::atom|entry> child elements of the node.
2643     @@Type: StaticNodeList
2644     @@Get:
2645     @@@enDesc:
2646     It <kwd:MUST> <I::return a <XE::atom|entry> child element list>
2647     of the node.
2648     @@@PerlDef:
2649     __CODE{returnChildElementList::
2650     $node => $self,
2651     $namespaceURI => {<Q::atom|>},
2652     $localName => 'entry',
2653     $r => $r,
2654     }__;
2655    
2656     @Method:
2657     @@Name: getEntryElementById
2658     @@enDesc:
2659     Returns an <XE::atom|entry> node selected by its <XE::atom|id>.
2660     @@Param:
2661     @@@Name: idArg
2662     @@@Type: DOMString
2663     @@@actualType: DOMURI
2664     @@@enDesc:
2665     The identifier of the entry.
2666     @@Return:
2667     @@@Type: AtomEntryElement
2668     @@@enDesc:
2669     The <XE::atom|entry> element whose identifier equals to
2670     <P::id>.
2671    
2672     It <kwd:MUST> return the first child element node in document
2673     order whose element type is <XE::atom|entry> and
2674     whose first child element node in document order
2675     with element type <XE::atom|id> has <A::Node.textContent>
2676     equals to <P::id>, if any, or <DOM::null>.
2677     @@@nullCase:
2678     @@@@enDesc:
2679     If no matching element.
2680     @@@PerlDef:
2681     E: {
2682     no warnings 'uninitialized';
2683     for my $cn (@{$self-><AG::Node.childNodes>}) {
2684     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2685     $cn-><AG::Node.localName> eq 'entry' and
2686     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2687     if ($cn-><AG::AtomEntryElement.id> eq $idArg) {
2688     $r = $cn;
2689     last E;
2690     }
2691     }
2692     }
2693     } # E
2694    
2695     @Method:
2696     @@Name: addNewEntry
2697     @@enDesc:
2698     Creates an <XA::atom|entry> element node and
2699     appends to the node.
2700     @@Param:
2701     @@@Name: id
2702     @@@Type: DOMString
2703     @@@actualType: DOMURI
2704     @@@enDesc:
2705     The <XE::atom|id> of the entry.
2706     @@Param:
2707     @@@Name: title
2708     @@@Type: DOMString
2709     @@@enDesc:
2710     The <XE::atom|title> of the entry.
2711     @@@nullCase:
2712     @@@@enDesc:
2713     The implementation <kwd:MUST> treate <DOM::null>
2714     as if an empty string is specified.
2715     @@Param:
2716     @@@Name: lang
2717     @@@Type: DOMString
2718     @@@enDesc:
2719     The natural language of the entry.
2720     @@@nullCase:
2721     @@@@enDesc:
2722     No explicit language specification is added.
2723     @@Return:
2724     @@@Type: AtomEntryElement
2725     @@@enDesc:
2726     The newly created <XE::atom|entry> element.
2727    
2728     {P:: The newly created <XE::atom|entry> element node <kwd:MUST>
2729     have attributes set as:
2730    
2731     - <A::Node.attributes>::: A <IF::NamedNodeMap> that contains
2732     at least a new <XA::xml|lang>
2733     attribute node except when
2734     the <P::lang> parameter is set
2735     to <DOM::null>.
2736    
2737     - <A::Node.childNodes>::: A <IF::NodeList> containing
2738     a new <XE::atom|id> element node,
2739     a new <XE::atom|title> element node, and
2740     a new <XE::atom|updated> element node
2741     in any order.
2742    
2743     }
2744    
2745     This element node <kwd:MUST> be appended to the node
2746     as if the <M::Node.appendChild> method were invoked
2747     on the node and <kwd:MUST> be returned by the method.
2748     Note that an exception might be thrown during this course.
2749    
2750     {P:: The <XA::xml|lang> attribute node, if created, <kwd:MUST>
2751     have attributes set as:
2752    
2753     - <A::Node.nodeValue>::: <P::lang>.
2754    
2755     - <A::Attr.specified>::: <DOM::true>.
2756    
2757     }
2758    
2759     {P:: The newly created <XE::atom|id> element node <kwd:MUST>
2760     have attributes set as:
2761    
2762     - <A::Node.textContent>::: <P::id>.
2763    
2764     }
2765    
2766     {P:: The newly created <XE::atom|title> element node <kwd:MUST>
2767     have attributes set as:
2768    
2769     - <A::Node.textContent>::: <P::title>.
2770    
2771     }
2772    
2773     The <XA::type> attribute node <kwd:MUST-NOT> be attached
2774     to the <XE::atom|title> element node.
2775    
2776     {P:: The newly created <XE::atom|updated> element node <kwd:MUST>
2777     have attributes set as:
2778    
2779     - <A::Node.textContent>::: A uppercase RFC 3339 <CODE::date-time>
2780     representation of the time when the method is invoked.
2781     The implementation <kwd:MAY> align its timezone to
2782     that of the environment in which the method is invoked.
2783    
2784     }
2785     @@@PerlDef:
2786     __DEEP{
2787     my $od = $self-><AG::Node.ownerDocument>;
2788    
2789     $r = $od-><M::Document.createElementNS> (<Q::atom|>, 'entry');
2790     $r-><AS::Node.manakaiLanguage> ($lang) if defined $lang;
2791    
2792     $r-><AS::AtomFeedElement.id> ($id);
2793    
2794     my $titlee = $od-><M::Document.createElementNS> (<Q::atom|>, 'title');
2795     $titlee-><AS::Node.textContent> (defined $title ? $title : '');
2796     $r-><M::Node.appendChild> ($titlee);
2797    
2798     my $updatede = $od-><M::Document.createElementNS>
2799     (<Q::atom|>, 'updated');
2800     $updatede-><AS::AtomDateConstruct.value> (scalar time);
2801     $r-><M::Node.appendChild> ($updatede);
2802 wakaba 1.12
2803     $self-><M::Node.appendChild> ($r);
2804 wakaba 1.1 }__;
2805    
2806     @@Test:
2807     @@@QName: AtomFeedElement.addNewEntry.1.test
2808     @@@PerlDef:
2809     my $doc;
2810     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2811    
2812     my $feed = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2813    
2814     my $ent = $feed-><M::AtomFeedElement.addNewEntry>
2815     ('about:id', 'entry title', 'en');
2816    
2817     $test->id ('entry.interface');
2818     $test->assert_isa ($ent, <IFName::AtomEntryElement>);
2819    
2820     $test->id ('entry.namespaceURI');
2821     $test->assert_equals ($ent-><AG::Node.namespaceURI>, <Q::atom|>);
2822    
2823     $test->id ('entry.localName');
2824     $test->assert_equals ($ent-><AG::Node.localName>, 'entry');
2825    
2826     $test->id ('entry.lang');
2827     $test->assert_equals ($ent-><M::Element.getAttributeNS>
2828     (<Q::xml|>, 'lang'),
2829     'en');
2830    
2831     my $id;
2832     my $title;
2833     my $updated;
2834    
2835     for my $cn (@{$ent-><AG::Node.childNodes>}) {
2836     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2837     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2838     if ($cn-><AG::Node.localName> eq 'id') {
2839     $id = $cn;
2840     } elsif ($cn-><AG::Node.localName> eq 'title') {
2841     $title = $cn;
2842     } elsif ($cn-><AG::Node.localName> eq 'updated') {
2843     $updated = $cn;
2844     }
2845     }
2846     }
2847    
2848     $test->id ('id');
2849     $test->assert_not_null ($id);
2850    
2851     $test->id ('id.value');
2852     $test->assert_equals ($id-><AG::Node.textContent>, 'about:id');
2853    
2854     $test->id ('title');
2855     $test->assert_not_null ($title);
2856    
2857     $test->id ('title.value');
2858     $test->assert_equals ($title-><AG::Node.textContent>, 'entry title');
2859    
2860     $test->id ('title.type');
2861     $test->assert_null ($title-><M::Element.getAttributeNS> (null, 'type'));
2862    
2863     $test->id ('updated');
2864     $test->assert_not_null ($updated);
2865    
2866     $test->id ('updated.value');
2867     $test->assert_num_not_equals
2868     (actual_value => $updated-><AG::AtomDateConstruct.value>,
2869     expected_value => 0);
2870 wakaba 1.12
2871     $test->id ('parent');
2872     $test->assert_equals ($ent-><AG::Node.parentNode>, $feed);
2873 wakaba 1.1 @@Test:
2874     @@@QName: AtomFeedElement.addNewEntry.2.test
2875     @@@enDesc:
2876     <DOM::null> <CODE::lang>.
2877     @@@PerlDef:
2878     my $doc;
2879     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
2880    
2881     my $feed = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
2882    
2883     my $ent = $feed-><M::AtomFeedElement.addNewEntry>
2884     ('about:id', 'entry title', null);
2885    
2886     $test->id ('entry.lang');
2887     $test->assert_null ($ent-><M::Element.getAttributeNS>
2888     (<Q::xml|>, 'lang'));
2889     ##AtomFeedElement
2890    
2891 wakaba 1.8 ECDef:
2892     @QName: entry-prop
2893     @mv:elementTypeClassName: entry-prop
2894     @mv:refers: atom|author
2895     @mv:refers: atom|category
2896     @mv:refers: atom|content
2897     @mv:refers: atom|contributor
2898     @mv:refers: atom|id
2899     @mv:refers: atom|link
2900     @mv:refers: atom|published
2901     @mv:refers: atom|rights
2902     @mv:refers: atom|source
2903     @mv:refers: atom|summary
2904     @mv:refers: atom|title
2905     @mv:refers: atom|updated
2906     @mv:refers: extensionElements
2907    
2908 wakaba 1.1 IFClsETDef:
2909     @IFQName: AtomEntryElement
2910     @ETQName: atom|entry
2911     @ETRQName: atom|entry
2912     @ClsQName: ManakaiAtomEntryElement
2913    
2914     @IFISA: AtomElement
2915     @ClsISA: ManakaiAtomElement
2916    
2917 wakaba 1.14 @f:implements: AtomFeature10
2918 wakaba 1.10 @mv:refers: atomCommonAttributes
2919    
2920 wakaba 1.9 @cm:
2921     (entry-prop+)
2922    
2923 wakaba 1.1 @enDesc:
2924     The <XE::atom|entry> element represents an individual
2925     entry, acting as a container for metadata and data
2926     associated with the entry.
2927    
2928     @Attr:
2929     @@Name: authorElements
2930     @@enDesc:
2931     A static list of <XE::atom|author> child elements of the node.
2932     @@Type: StaticNodeList
2933     @@Get:
2934     @@@enDesc:
2935     It <kwd:MUST> <I::return a <XE::atom|author> child element list>
2936     of the node.
2937     @@@disDef:
2938     @@@@dlp:cloneCode: ManakaiAtomFeedElement.authorElements.get
2939    
2940     @Attr:
2941     @@Name: entryAuthorElements
2942     @@enDesc:
2943     A static list of <XE::atom|author> elements for the node.
2944     @@Type: StaticNodeList
2945     @@Get:
2946     @@@enDesc:
2947     = If the node contains one or more <XE::atom|author>
2948     element node in its child node list, then it
2949     <kwd:MUST> return a <IF::StaticNodeList> that
2950     would be returned by the <A::AtomEntryElement.authorElements>
2951     attribute of the node.
2952    
2953     = Otherwise, if the node contains a <XE::atom|source>
2954     element node in its child node list, then it
2955     <kwd:MUST> return a <IF::StaticNodeList> that
2956     would be returned by the <A::AtomSourceElement.authorElements>
2957     attribute of that node, unless its <A::NodeList.length>
2958     is zero.
2959    
2960     = Otherwise, if the <A::Node.parentNode> of the
2961     node is a <XE::atom|feed> element node, then
2962     it <kwd:MUST> return a <IF::StaticNodeList> that
2963     would be returned by the <A::AtomFeedElement.authorElements>
2964     attribute of that node.
2965    
2966     = Otherwise, it <kwd:MUST> return a <IF::StaticNodeList>
2967     whose <A::NodeList.length> is zero.
2968     @@@PerlDef:
2969     __DEEP{
2970     E: {
2971     no warnings 'uninitialized';
2972     __CODE{tc|createStaticNodeList:: $r => $r}__;
2973    
2974     my $source;
2975     for my $cn (@{$self-><AG::Node.childNodes>}) {
2976     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2977     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
2978     if ($cn-><AG::Node.localName> eq 'author') {
2979     push @{$r}, $cn;
2980     } elsif ($cn-><AG::Node.localName> eq 'source') {
2981     $source = $cn;
2982     }
2983     }
2984     }
2985     last E unless @{$r} == 0;
2986    
2987     if (defined $source) {
2988     $r = $source-><AG::AtomSourceElement.authorElements>;
2989     }
2990     last E unless @{$r} == 0;
2991    
2992     my $parent = $self-><AG::Node.parentNode>;
2993     if (defined $parent and
2994     $parent-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
2995     $parent-><AG::Node.namespaceURI> eq <Q::atom|> and
2996     $parent-><AG::Node.localName> eq 'feed') {
2997     $r = $parent-><AG::AtomFeedElement.authorElements>;
2998     }
2999     } # E
3000     }__;
3001    
3002     @@Test:
3003     @@@QName: AtomEntryElement.entryAuthorElements.1.test
3004     @@@PerlDef:
3005     my $doc;
3006     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3007    
3008     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3009    
3010    
3011     $test->id ('empty');
3012     my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3013     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0);
3014    
3015     $test->id ('one');
3016     $el-><M::Node.appendChild>
3017     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3018     $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3019     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 1);
3020    
3021     $test->id ('source');
3022     for ($el-><M::Node.appendChild>
3023     ($doc-><M::Document.createElementNS>
3024     (<Q::atom|>, 'source'))) {
3025     $_-><M::Node.appendChild>
3026     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3027     $_-><M::Node.appendChild>
3028     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3029     }
3030     $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3031     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 1);
3032    
3033     $test->id ('parent');
3034     for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
3035     $_-><M::Node.appendChild>
3036     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3037     $_-><M::Node.appendChild>
3038     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3039     $_-><M::Node.appendChild>
3040     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3041     $_-><M::Node.appendChild> ($el);
3042     }
3043     $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3044     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 1);
3045     @@Test:
3046     @@@QName: AtomEntryElement.entryAuthorElements.2.test
3047     @@@PerlDef:
3048     my $doc;
3049     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3050    
3051     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3052    
3053     $test->id ('source');
3054     for ($el-><M::Node.appendChild>
3055     ($doc-><M::Document.createElementNS>
3056     (<Q::atom|>, 'source'))) {
3057     $_-><M::Node.appendChild>
3058     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3059     $_-><M::Node.appendChild>
3060     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3061     }
3062     my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3063     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 2);
3064    
3065     $test->id ('parent');
3066     for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
3067     $_-><M::Node.appendChild>
3068     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3069     $_-><M::Node.appendChild>
3070     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3071     $_-><M::Node.appendChild>
3072     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3073     $_-><M::Node.appendChild> ($el);
3074     }
3075     $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3076     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 2);
3077     @@Test:
3078     @@@QName: AtomEntryElement.entryAuthorElements.3.test
3079     @@@PerlDef:
3080     my $doc;
3081     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3082    
3083     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3084    
3085     $test->id ('source');
3086     for ($el-><M::Node.appendChild>
3087     ($doc-><M::Document.createElementNS>
3088     (<Q::atom|>, 'source'))) {
3089     # empty
3090     }
3091     my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3092     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0);
3093    
3094     $test->id ('parent');
3095 wakaba 1.20 my $parent;
3096 wakaba 1.1 for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
3097 wakaba 1.20 $parent = $_;
3098 wakaba 1.1 $_-><M::Node.appendChild>
3099     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3100     $_-><M::Node.appendChild>
3101     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3102     $_-><M::Node.appendChild>
3103     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3104     $_-><M::Node.appendChild> ($el);
3105     }
3106     $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3107     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 3);
3108     @@Test:
3109     @@@QName: AtomEntryElement.entryAuthorElements.4.test
3110     @@@PerlDef:
3111     my $doc;
3112     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3113    
3114     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3115    
3116     $test->id ('parent');
3117 wakaba 1.20 my $parent;
3118 wakaba 1.1 for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
3119 wakaba 1.20 $parent = $_;
3120 wakaba 1.1 $_-><M::Node.appendChild>
3121     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3122     $_-><M::Node.appendChild>
3123     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3124     $_-><M::Node.appendChild>
3125     ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3126     $_-><M::Node.appendChild> ($el);
3127     }
3128     my $list = $el-><AG::AtomEntryElement.entryAuthorElements>;
3129     $test->assert_num_equals (actual_value => 0+@$list, expected_value => 3);
3130    
3131     @Attr:
3132     @@Name: categoryElements
3133     @@enDesc:
3134     A static list of <XE::atom|category> child elements of the node.
3135     @@Type: StaticNodeList
3136     @@Get:
3137     @@@enDesc:
3138     It <kwd:MUST> <I::return a <XE::atom|category> child element list>
3139     of the node.
3140     @@@disDef:
3141     @@@@dlp:cloneCode: ManakaiAtomFeedElement.categoryElements.get
3142 wakaba 1.2
3143     @Attr:
3144     @@Name: contentElement
3145     @@enDesc:
3146     The <XE::atom|content> child element of the node.
3147     @@Type: AtomContentElement
3148     @@Get:
3149     @@@enDesc:
3150     It <kwd:MUST> <I::return a <XE::atom|content> child element>
3151     of the node.
3152     @@@nullCase:
3153     @@@@enDesc:
3154     If the algorithm returns <DOM::null>.
3155     @@@NodeReadOnlyError:
3156     @@@PerlDef:
3157     __CODE{returnChildElement::
3158     $node => $self,
3159     $namespaceURI => {<Q::atom|>},
3160     $localName => 'content',
3161     $r => $r,
3162     }__;
3163 wakaba 1.1
3164     @Attr:
3165     @@Name: contributorElements
3166     @@enDesc:
3167     A static list of <XE::atom|contributor> child elements of the node.
3168     @@Type: StaticNodeList
3169     @@Get:
3170     @@@enDesc:
3171     It <kwd:MUST> <I::return a <XE::atom|contributor> child element list>
3172     of the node.
3173     @@@disDef:
3174     @@@@dlp:cloneCode: ManakaiAtomFeedElement.contributorElements.get
3175    
3176     @Attr:
3177     @@Name: id
3178     @@enDesc:
3179     The <XE::atom|id> value of the feed.
3180    
3181     It <kwd:MUST> <I::reflect the string value
3182     of the <XE::atom|id> child element> of the node.
3183     @@Type: DOMString
3184     @@actualType: DOMURI
3185     @@Get:
3186     @@@nullCase:
3187     @@@@enDesc:
3188     If the algorithm returns <DOM::null>.
3189     @@@NodeReadOnlyError:
3190     @@@disDef:
3191     @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.get
3192     @@Set:
3193     @@@nullCase:
3194     @@@@enDesc:
3195     Removes the value.
3196     @@@NodeReadOnlyError:
3197     @@@disDef:
3198     @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.set
3199    
3200     @Attr:
3201     @@Name: linkElements
3202     @@enDesc:
3203     A static list of <XE::atom|link> child elements of the node.
3204     @@Type: StaticNodeList
3205     @@Get:
3206     @@@enDesc:
3207     It <kwd:MUST> <I::return a <XE::atom|link> child element list>
3208     of the node.
3209     @@@disDef:
3210     @@@@dlp:cloneCode: ManakaiAtomFeedElement.linkElements.get
3211    
3212     @Attr:
3213     @@Name: publishedElement
3214     @@enDesc:
3215     The <XE::atom|published> child element of the node.
3216     @@Type: AtomPublishedElement
3217     @@Get:
3218     @@@enDesc:
3219     It <kwd:MUST> <I::return a <XE::atom|published> child element>
3220     of the node.
3221     @@@nullCase:
3222     @@@@enDesc:
3223     If the algorithm returns <DOM::null>.
3224     @@@NodeReadOnlyError:
3225     @@@PerlDef:
3226     __CODE{returnChildElement::
3227     $node => $self,
3228     $namespaceURI => {<Q::atom|>},
3229     $localName => 'published',
3230     $r => $r,
3231     }__;
3232    
3233     @Attr:
3234     @@Name: rightsElement
3235     @@enDesc:
3236     The <XE::atom|rights> child element of the node.
3237     @@Type: AtomRightsElement
3238     @@Get:
3239     @@@enDesc:
3240     It <kwd:MUST> <I::return a <XE::atom|rights> child element>
3241     of the node.
3242     @@@nullCase:
3243     @@@@enDesc:
3244     If the algorithm returns <DOM::null>.
3245     @@@NodeReadOnlyError:
3246     @@@disDef:
3247     @@@@dlp:cloneCode: ManakaiAtomFeedElement.rightsElement.get
3248    
3249     @Attr:
3250     @@Name: entryRightsElement
3251     @@enDesc:
3252     The <XE::atom|rights> element for the node.
3253     @@Type: AtomRightsElement
3254     @@Get:
3255     @@@enDesc:
3256     = If the node contains a <XE::atom|rights>
3257     element node in its child node list, then it
3258     <kwd:MUST> return the first such a node in document order.
3259    
3260     = Otherwise, if the <A::Node.parentNode> of the
3261     node is a <XE::atom|feed> element node, then
3262     it <kwd:MUST> return an <IF::AtomRightsElement>
3263     that would be returned by the <A::AtomFeedElement.rightsElement>
3264     attribute of that node, except when it is <DOM::null>.
3265    
3266     {OLI:: Otherwise,
3267    
3268     {OLI:: If the <cfg::cfg|create-child-element> configuration
3269     parameter is set to <DOM::true>,
3270    
3271     = Create an element node <VAR::N> whose element type
3272     is <XE::atom|rights>.
3273    
3274     = Append <VAR::N> to this node as if the <M::Node.appendChild>
3275     method were called for the node with its parameter
3276     set to <VAR::N>. Note that this might throw an exception.
3277    
3278     = Then, <VAR::N> <kwd:MUST> be returned.
3279    
3280     }
3281    
3282     = Otherwise, it <kwd:MUST> return <DOM::null>.
3283     }
3284     @@@nullCase:
3285     @@@@enDesc:
3286     If the algorithm returns <DOM::null>.
3287     @@@NodeReadOnlyError:
3288     @@@PerlDef:
3289     __DEEP{
3290     E: {
3291     no warnings 'uninitialized';
3292     for my $cn (@{$self-><AG::Node.childNodes>}) {
3293     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
3294     $cn-><AG::Node.localName> eq 'rights' and
3295     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
3296     $r = $cn;
3297     last E;
3298     }
3299     }
3300    
3301     my $parent = $self-><AG::Node.parentNode>;
3302     if (defined $parent and
3303     $parent-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
3304     $parent-><AG::Node.namespaceURI> eq <Q::atom|> and
3305     $parent-><AG::Node.localName> eq 'feed') {
3306     for my $cn (@{$parent-><AG::Node.childNodes>}) {
3307     if ($cn-><AG::Node.nodeType> == <C::Node.ELEMENT_NODE> and
3308     $cn-><AG::Node.localName> eq 'rights' and
3309     $cn-><AG::Node.namespaceURI> eq <Q::atom|>) {
3310     $r = $cn;
3311     last E;
3312     }
3313     }
3314     }
3315    
3316     my $od = $self-><AG::Node.ownerDocument>;
3317     if ($od-><AG::Document.domConfig>
3318     -><M::CFG.getParameter> (<Q::cfg|create-child-element>)) {
3319     $r = $od-><M::Document.createElementNS> (<Q::atom|>, 'rights');
3320     $self-><M::Node.appendChild> ($r);
3321     }
3322     } # E
3323     }__;
3324    
3325     @@Test:
3326     @@@QName: AtomEntryElement.entryRightsElement.1.test
3327     @@@PerlDef:
3328     my $doc;
3329     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3330    
3331     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3332    
3333     $test->id ('no');
3334     my $rights = $el-><AG::AtomEntryElement.entryRightsElement>;
3335     $test->assert_null ($rights);
3336    
3337     $doc-><AG::Document.domConfig>
3338     -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
3339    
3340     $rights = $el-><AG::AtomEntryElement.entryRightsElement>;
3341    
3342     $test->id ('created.namespaceURI');
3343     $test->assert_equals ($rights-><AG::Node.namespaceURI>, <Q::atom|>);
3344    
3345     $test->id ('created.localName');
3346     $test->assert_equals ($rights-><AG::Node.localName>, 'rights');
3347    
3348     $test->id ('created.parentNode');
3349     $test->assert_equals ($rights-><AG::Node.parentNode>, $el);
3350    
3351     $test->id ('get');
3352     my $rights2 = $el-><AG::AtomEntryElement.entryRightsElement>;
3353     $test->assert_equals ($rights2, $rights);
3354     @@Test:
3355     @@@QName: AtomEntryElement.entryRightsElement.2.test
3356     @@@PerlDef:
3357     my $doc;
3358     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3359    
3360     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3361    
3362     my $feed = $doc-><M::Document.createElementNS> (<Q::atom|>, 'feed');
3363     $feed-><M::Node.appendChild> ($el);
3364     my $rights = $doc-><M::Document.createElementNS> (<Q::atom|>, 'rights');
3365     $feed-><M::Node.appendChild> ($rights);
3366    
3367     $test->id ('get');
3368     my $rights2 = $el-><AG::AtomEntryElement.entryRightsElement>;
3369     $test->assert_equals ($rights2, $rights);
3370    
3371     @Attr:
3372     @@Name: sourceElement
3373     @@enDesc:
3374     The <XE::atom|source> child element of the node.
3375     @@Type: AtomSourceElement
3376     @@Get:
3377     @@@enDesc:
3378     It <kwd:MUST> <I::return a <XE::atom|source> child element>
3379     of the node.
3380     @@@nullCase:
3381     @@@@enDesc:
3382     If the algorithm returns <DOM::null>.
3383     @@@NodeReadOnlyError:
3384     @@@PerlDef:
3385     __CODE{returnChildElement::
3386     $node => $self,
3387     $namespaceURI => {<Q::atom|>},
3388     $localName => 'source',
3389     $r => $r,
3390     }__;
3391    
3392     @Attr:
3393     @@Name: summaryElement
3394     @@enDesc:
3395     The <XE::atom|summary> child element of the node.
3396     @@Type: AtomSummaryElement
3397     @@Get:
3398     @@@enDesc:
3399     It <kwd:MUST> <I::return a <XE::atom|summary> child element>
3400     of the node.
3401     @@@nullCase:
3402     @@@@enDesc:
3403     If the algorithm returns <DOM::null>.
3404     @@@NodeReadOnlyError:
3405     @@@PerlDef:
3406     __CODE{returnChildElement::
3407     $node => $self,
3408     $namespaceURI => {<Q::atom|>},
3409     $localName => 'summary',
3410     $r => $r,
3411     }__;
3412    
3413     @Attr:
3414     @@Name: titleElement
3415     @@enDesc:
3416     The <XE::atom|title> child element of the node.
3417     @@Type: AtomTitleElement
3418     @@Get:
3419     @@@enDesc:
3420     It <kwd:MUST> <I::return a <XE::atom|title> child element>
3421     of the node.
3422     @@@nullCase:
3423     @@@@enDesc:
3424     If the algorithm returns <DOM::null>.
3425     @@@NodeReadOnlyError:
3426     @@@disDef:
3427     @@@@dlp:cloneCode: ManakaiAtomFeedElement.titleElement.get
3428    
3429     @Attr:
3430     @@Name: updatedElement
3431     @@enDesc:
3432     The <XE::atom|updated> child element of the node.
3433     @@Type: AtomUpdatedElement
3434     @@Get:
3435     @@@enDesc:
3436     It <kwd:MUST> <I::return a <XE::atom|updated> child element>
3437     of the node.
3438     @@@nullCase:
3439     @@@@enDesc:
3440     If the algorithm returns <DOM::null>.
3441     @@@NodeReadOnlyError:
3442     @@@disDef:
3443     @@@@dlp:cloneCode: ManakaiAtomFeedElement.updatedElement.get
3444     ##AtomEntryElement
3445    
3446     IFClsETDef:
3447 wakaba 1.7 @IFQName: AtomIdElement
3448     @ETQName: atom|id
3449     @ETRQName: atom|id
3450     @ClsQName: ManakaiAtomIdElement
3451    
3452     @IFISA: AtomElement
3453     @ClsISA: ManakaiAtomElement
3454 wakaba 1.10
3455 wakaba 1.14 @f:implements: AtomFeature10
3456 wakaba 1.10 @mv:refers: atomCommonAttributes
3457 wakaba 1.9
3458     @cm: atomUriCM
3459 wakaba 1.7 ##AtomIdElement
3460    
3461     IFClsETDef:
3462 wakaba 1.8 @IFQName: AtomIconElement
3463     @ETQName: atom|icon
3464     @ETRQName: atom|icon
3465     @ClsQName: ManakaiAtomIconElement
3466    
3467     @IFISA: AtomElement
3468     @ClsISA: ManakaiAtomElement
3469 wakaba 1.9
3470 wakaba 1.14 @f:implements: AtomFeature10
3471 wakaba 1.10 @mv:refers: atomCommonAttributes
3472    
3473 wakaba 1.9 @cm: atomUriCM
3474 wakaba 1.8 ##AtomIconElement
3475    
3476     IFClsETDef:
3477 wakaba 1.7 @IFQName: AtomNameElement
3478     @ETQName: atom|name
3479     @ETRQName: atom|name
3480     @ClsQName: ManakaiAtomNameElement
3481    
3482     @IFISA: AtomElement
3483     @ClsISA: ManakaiAtomElement
3484 wakaba 1.9
3485 wakaba 1.14 @f:implements: AtomFeature10
3486 wakaba 1.10 # no common attribs
3487 wakaba 1.9 @cm: TextCM
3488 wakaba 1.13
3489     @mv:refers: Atom
3490 wakaba 1.7 ##AtomNameElement
3491    
3492     IFClsETDef:
3493     @IFQName: AtomUriElement
3494     @ETQName: atom|uri
3495     @ETRQName: atom|uri
3496     @ClsQName: ManakaiAtomUriElement
3497    
3498     @IFISA: AtomElement
3499     @ClsISA: ManakaiAtomElement
3500 wakaba 1.9
3501 wakaba 1.14 @f:implements: AtomFeature10
3502 wakaba 1.10 # no common attribs
3503 wakaba 1.9 @cm: atomUriCM
3504 wakaba 1.13
3505     @mv:refers: Atom
3506 wakaba 1.7 ##AtomUriElement
3507    
3508     IFClsETDef:
3509     @IFQName: AtomEmailElement
3510     @ETQName: atom|email
3511     @ETRQName: atom|email
3512     @ClsQName: ManakaiAtomEmailElement
3513    
3514     @IFISA: AtomElement
3515     @ClsISA: ManakaiAtomElement
3516 wakaba 1.9
3517 wakaba 1.14 @f:implements: AtomFeature10
3518 wakaba 1.10 # no common attribs
3519 wakaba 1.9 @cm: atomEmailAddressCM
3520 wakaba 1.13
3521     @mv:refers: Atom
3522 wakaba 1.7 ##AtomEmailElement
3523    
3524     IFClsETDef:
3525 wakaba 1.8 @IFQName: AtomLogoElement
3526     @ETQName: atom|logo
3527     @ETRQName: atom|logo
3528     @ClsQName: ManakaiAtomLogoElement
3529    
3530     @IFISA: AtomElement
3531     @ClsISA: ManakaiAtomElement
3532 wakaba 1.9
3533 wakaba 1.14 @f:implements: AtomFeature10
3534 wakaba 1.10 @mv:refers: atomCommonAttributes
3535    
3536 wakaba 1.9 @cm: atomUriCM
3537 wakaba 1.8 ##AtomLogoElement
3538    
3539     IFClsETDef:
3540 wakaba 1.1 @IFQName: AtomContentElement
3541     @ETQName: atom|content
3542 wakaba 1.6 @ETRQName: atom|content
3543 wakaba 1.1 @ClsQName: ManakaiAtomContentElement
3544    
3545     @IFISA: AtomElement
3546     @ClsISA: ManakaiAtomElement
3547    
3548 wakaba 1.14 @f:implements: AtomFeature10
3549 wakaba 1.10 @mv:refers: atomCommonAttributes
3550    
3551 wakaba 1.9 @cm:
3552     dxm|ANY||ManakaiDOM|all
3553    
3554 wakaba 1.1 @enDesc:
3555     The <XE::atom|content> element either contains or links to
3556     the content of the entry.
3557    
3558 wakaba 1.13 @ATTR:
3559 wakaba 1.1 @@Name: type
3560     @@enDesc:
3561     The type of the element.
3562    
3563     It <kwd:MUST> <I::reflect the string value
3564     of the <XA::type> attribute> of the node. It default
3565     value <kwd:MUST> be <CODE::text> if and only if
3566     there is no <XA::src> attribute on the node.
3567     @@Type: DOMString
3568     @@Get:
3569     @@@nullCase:
3570     @@@@enDesc:
3571     If the algorithm returns <DOM::null>.
3572     @@@PerlDef:
3573     __CODE{getReflectAttrStringValue::
3574     $node => $self,
3575     $namespaceURI => {null},
3576     $localName => 'type',
3577     $r => $r,
3578     $defaultValue => {
3579     $self-><M::Element.hasAttributeNS> (null, 'src') ? null : 'text'
3580     },
3581     }__;
3582     @@Set:
3583     @@@nullCase:
3584     @@@@enDesc:
3585     Removes the attribute.
3586     @@@NodeReadOnlyError:
3587     @@@PerlDef:
3588     __CODE{setReflectAttrStringValue::
3589     $node => $self,
3590     $namespaceURI => {null},
3591     $localName => 'type',
3592     $given => $given,
3593     }__;
3594    
3595     @@Test:
3596     @@@QName: AtomContentElement.type.test
3597     @@@PerlDef:
3598     my $doc;
3599     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3600    
3601     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3602    
3603     $test->id ('default.no.src');
3604     $test->assert_equals ($el-><AG::AtomContentElement.type>, 'text');
3605    
3606     $test->id ('default.src');
3607     $el-><AS::AtomContentElement.src> ('http://atom.example/');
3608     $test->assert_null ($el-><AG::AtomContentElement.type>);
3609    
3610     $test->id ('set.xhtml');
3611     $el-><AS::AtomContentElement.type> ('xhtml');
3612     $test->assert_equals ($el-><AG::AtomContentElement.type>, 'xhtml');
3613    
3614     $test->id ('set.imt');
3615     $el-><AS::AtomContentElement.type> ('application/xml');
3616     $test->assert_equals ($el-><AG::AtomContentElement.type>,
3617     'application/xml');
3618    
3619     $test->id ('remove');
3620     $el-><AS::AtomContentElement.type> (null);
3621     $test->assert_null ($el-><AG::AtomContentElement.type>);
3622    
3623 wakaba 1.13 @ATTR:
3624 wakaba 1.1 @@Name: src
3625     @@enDesc:
3626     The source of the remote content of the element.
3627    
3628     It <kwd:MUST> <I::reflect the string value
3629     of the <XA::src> attribute> of the node.
3630     @@Type: DOMString
3631     @@Type: DOMURI
3632     @@Get:
3633     @@@nullCase:
3634     @@@@enDesc:
3635     If the algorithm returns <DOM::null>.
3636     @@@PerlDef:
3637     __CODE{getReflectAttrURIValue::
3638     $node => $self,
3639     $namespaceURI => {null},
3640     $localName => 'src',
3641     $r => $r,
3642     $defaultValue => {null},
3643     }__;
3644     @@Set:
3645     @@@nullCase:
3646     @@@@enDesc:
3647     Removes the attribute.
3648     @@@NodeReadOnlyError:
3649     @@@PerlDef:
3650     __CODE{setReflectAttrURIValue::
3651     $node => $self,
3652     $namespaceURI => {null},
3653     $localName => 'src',
3654     $given => $given,
3655     }__;
3656    
3657     @@Test:
3658     @@@QName: AtomContentElement.src.test
3659     @@@PerlDef:
3660     my $doc;
3661     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3662    
3663     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3664    
3665     $test->id ('default');
3666     $test->assert_null ($el-><AG::AtomContentElement.src>);
3667    
3668     $test->id ('set');
3669     $el-><AS::AtomContentElement.src> ('http://atom.example/');
3670     $test->assert_equals ($el-><AG::AtomContentElement.src>,
3671     'http://atom.example/');
3672    
3673     $test->id ('set.relative');
3674     $el-><AS::AtomContentElement.src> ('atom');
3675     $test->assert_equals ($el-><AG::AtomContentElement.src>, 'atom');
3676    
3677     $test->id ('set.relative.base');
3678     $el-><M::Element.setAttributeNS> (<Q::xml|>, 'xml:base',
3679     'http://atom.example/');
3680     $test->assert_equals ($el-><AG::AtomContentElement.src>,
3681     'http://atom.example/atom');
3682    
3683     $test->id ('remove');
3684     $el-><AS::AtomContentElement.src> (null);
3685     $test->assert_null ($el-><AG::AtomContentElement.src>);
3686    
3687     @Attr:
3688     @@Name: container
3689     @@enDesc:
3690     The container element that contains the actual content for the node.
3691     @@Type: Element
3692     @@Get:
3693     @@@enDesc:
3694     - If the <A::AtomContentElement.type> is <CODE::xhtml>,
3695     it <kwd:MUST> <I::return the <XE::html|div> child element>.
3696    
3697     - Otherwise, if the <A::AtomContentElement.src> is <DOM::null>,
3698     it <kwd:MUST> return <DOM::null>.
3699    
3700     - Otherwise, it <kwd:MUST> return the node itself.
3701     @@@nullCase:
3702     @@@@enDesc:
3703     If the algorithm returns <DOM::null>.
3704     @@@NodeReadOnlyError:
3705     @@@PerlDef:
3706     __DEEP{
3707     my $type = $self-><AG::AtomContentElement.type>;
3708     if (defined $type and $type eq 'xhtml') {
3709     __UNDEEP{
3710     __CODE{returnChildElement::
3711     $node => $self,
3712     $namespaceURI => {<Q::html|>},
3713     $localName => 'div',
3714     $r => $r,
3715     }__;
3716     }__;
3717     } elsif (not $self-><M::Element.hasAttributeNS> (null, 'src')) {
3718     $r = $self;
3719     }
3720     }__;
3721    
3722     @@Test:
3723     @@@QName: AtomContentElement.container.1.test
3724     @@@PerlDef:
3725     my $doc;
3726     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3727    
3728     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3729    
3730     $test->id ('no');
3731     $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3732    
3733     $test->id ('application/smil');
3734     $el-><AS::AtomContentElement.type> ('application/smil');
3735     $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3736    
3737     $test->id ('text');
3738     $el-><AS::AtomContentElement.type> ('text');
3739     $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3740    
3741     $test->id ('html');
3742     $el-><AS::AtomContentElement.type> ('html');
3743     $test->assert_equals ($el-><AG::AtomContentElement.container>, $el);
3744    
3745     $test->id ('xhtml');
3746     $el-><AS::AtomContentElement.type> ('xhtml');
3747     $test->assert_null ($el-><AG::AtomContentElement.container>);
3748    
3749     $doc-><AG::Document.domConfig>
3750     -><M::CFG.setParameter> (<Q::cfg|create-child-element> => true);
3751     my $con = $el-><AG::AtomContentElement.container>;
3752    
3753     $test->id ('xhtml.create');
3754     $test->assert_not_equals ($con, $el);
3755    
3756     $test->id ('xhtml.namespaceURI');
3757     $test->assert_equals ($con-><AG::Node.namespaceURI>, <Q::html|>);
3758    
3759     $test->id ('xhtml.localName');
3760     $test->assert_equals ($con-><AG::Node.localName>, 'div');
3761    
3762     $test->id ('xhtml.parentNode');
3763     $test->assert_equals ($con-><AG::Node.parentNode>, $el);
3764    
3765     $test->id ('xhtml.2');
3766     $test->assert_equals ($el-><AG::AtomContentElement.container>, $con);
3767     @@Test:
3768     @@@QName: AtomContentElement.container.2.test
3769     @@@enDesc:
3770     With <XA::src>.
3771     @@@PerlDef:
3772     my $doc;
3773     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
3774    
3775     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'content');
3776    
3777     $el-><AS::AtomContentElement.src> ('http://www.example.com/');
3778    
3779     $test->id ('no');
3780     $test->assert_null ($el-><AG::AtomContentElement.container>);
3781    
3782     $test->id ('application/smil');
3783     $el-><AS::AtomContentElement.type> ('application/smil');
3784     $test->assert_null ($el-><AG::AtomContentElement.container>);
3785    
3786     @enImplNote:
3787     @@ddid: base64
3788     @@@:
3789     {TODO::
3790     Access to Base64'ed content is necessary.
3791     }
3792     ##AtomContentElement
3793    
3794     IFClsETDef:
3795     @IFQName: AtomAuthorElement
3796     @ETQName: atom|author
3797 wakaba 1.6 @ETRQName: atom|author
3798 wakaba 1.1 @ClsQName: ManakaiAtomAuthorElement
3799    
3800     @IFISA: AtomPersonConstruct
3801     @ClsISA: ManakaiAtomPersonConstruct
3802 wakaba 1.14
3803     @f:implements: AtomFeature10
3804 wakaba 1.8 @mv:refers: PersonAG
3805 wakaba 1.7 @mv:elementContentModel: PersonCM
3806 wakaba 1.1
3807     @enDesc:
3808     The <XE::atom|author> element is a Person construct that
3809     indicates the author of the entry or feed.
3810     ##AtomAuthorElement
3811    
3812     IFClsETDef:
3813     @IFQName: AtomCategoryElement
3814     @ETQName: atom|category
3815 wakaba 1.6 @ETRQName: atom|category
3816 wakaba 1.1 @ClsQName: ManakaiAtomCategoryElement
3817    
3818     @IFISA: AtomElement
3819     @ClsISA: ManakaiAtomElement
3820    
3821 wakaba 1.14 @f:implements: AtomFeature10
3822 wakaba 1.10 @mv:refers: atomCommonAttributes
3823    
3824 wakaba 1.9 @cm: undefinedContent
3825    
3826 wakaba 1.1 @enDesc:
3827     The <XE::atom|category> element conveys information abut
3828     a category associated with an entry or feed.
3829    
3830     @Attr:
3831     @@Name: term
3832     @@enDesc:
3833     The <XA::term> attribute of the element.
3834    
3835     It <kwd:MUST> <I::reflect the string value
3836     of the <XA::term> attribute> of the node.
3837     @@Type: DOMString
3838     @@Get:
3839     @@@nullCase:
3840     @@@@enDesc:
3841     If the algorithm returns <DOM::null>.
3842     @@@PerlDef:
3843     __CODE{getReflectAttrStringValue::
3844     $node => $self,
3845     $namespaceURI => {null},
3846     $localName => 'term',
3847     $r => $r,
3848     $defaultValue => {null},
3849     }__;
3850     @@Set:
3851     @@@nullCase:
3852     @@@@enDesc:
3853     Removes the attribute.
3854     @@@NodeReadOnlyError:
3855     @@@PerlDef:
3856     __CODE{setReflectAttrStringValue::
3857     $node => $self,
3858     $namespaceURI => {null},
3859     $localName => 'term',
3860     $given => $given,
3861     }__;
3862    
3863     @Attr:
3864     @@Name: scheme
3865     @@enDesc:
3866     The categorization scheme of the element.
3867    
3868     It <kwd:MUST> <I::reflect the URI value
3869     of the <XA::scheme> attribute> of the node.
3870     @@Type: DOMString
3871     @@Type: DOMURI
3872     @@Get:
3873     @@@nullCase:
3874     @@@@enDesc:
3875     If the algorithm returns <DOM::null>.
3876     @@@PerlDef:
3877     __CODE{getReflectAttrURIValue::
3878     $node => $self,
3879     $namespaceURI => {null},
3880     $localName => 'scheme',
3881     $r => $r,
3882     $defaultValue => {null},
3883     }__;
3884     @@Set:
3885     @@@nullCase:
3886     @@@@enDesc:
3887     Removes the attribute.
3888     @@@NodeReadOnlyError:
3889     @@@PerlDef:
3890     __CODE{setReflectAttrURIValue::
3891     $node => $self,
3892     $namespaceURI => {null},
3893     $localName => 'scheme',
3894     $given => $given,
3895     }__;
3896    
3897     @Attr:
3898     @@Name: label
3899     @@enDesc:
3900     The <XA::label> attribute of the element.
3901    
3902     It <kwd:MUST> <I::reflect the string value
3903     of the <XA::label> attribute> of the node.
3904     @@Type: DOMString
3905     @@Get:
3906     @@@nullCase:
3907     @@@@enDesc:
3908     If the algorithm returns <DOM::null>.
3909     @@@PerlDef:
3910     __CODE{getReflectAttrStringValue::
3911     $node => $self,
3912     $namespaceURI => {null},
3913     $localName => 'label',
3914     $r => $r,
3915     $defaultValue => {null},
3916     }__;
3917     @@Set:
3918     @@@nullCase:
3919     @@@@enDesc:
3920     Removes the attribute.
3921     @@@NodeReadOnlyError:
3922     @@@PerlDef:
3923     __CODE{setReflectAttrStringValue::
3924     $node => $self,
3925     $namespaceURI => {null},
3926     $localName => 'label',
3927     $given => $given,
3928     }__;
3929     ##AtomCategoryElement
3930    
3931     IFClsETDef:
3932     @IFQName: AtomContributorElement
3933     @ETQName: atom|contributor
3934 wakaba 1.6 @ETRQName: atom|contributor
3935 wakaba 1.1 @ClsQName: ManakaiAtomContributorElement
3936    
3937     @IFISA: AtomPersonConstruct
3938     @ClsISA: ManakaiAtomPersonConstruct
3939 wakaba 1.14
3940     @f:implements: AtomFeature10
3941 wakaba 1.8 @mv:refers: PersonAG
3942 wakaba 1.7 @mv:elementContentModel: PersonCM
3943 wakaba 1.1
3944     @enDesc:
3945     The <XE::atom|contributor> element is a Person construct that
3946     indicates a person or other entity who contributed to the entry
3947     or feed.
3948     ##AtomContributorElement
3949    
3950     IFClsETDef:
3951     @IFQName: AtomGeneratorElement
3952     @ETQName: atom|generator
3953 wakaba 1.6 @ETRQName: atom|generator
3954 wakaba 1.1 @ClsQName: ManakaiAtomGeneratorElement
3955    
3956     @IFISA: AtomElement
3957     @ClsISA: ManakaiAtomElement
3958    
3959 wakaba 1.14 @f:implements: AtomFeature10
3960 wakaba 1.10 @mv:refers: atomCommonAttributes
3961    
3962 wakaba 1.9 @cm:
3963     (dxm|PCDATA||ManakaiDOM|all)*
3964    
3965 wakaba 1.1 @enDesc:
3966     The <XE::atom|generator> element identifies the agent used
3967     to generate a feed.
3968    
3969     @Attr:
3970     @@Name: uri
3971     @@enDesc:
3972     The URI attribute of the element.
3973    
3974     It <kwd:MUST> <I::reflect the URI value
3975     of the <XA::uri> attribute> of the node.
3976     @@Type: DOMString
3977     @@Type: DOMURI
3978     @@Get:
3979     @@@nullCase:
3980     @@@@enDesc:
3981     If the algorithm returns <DOM::null>.
3982     @@@PerlDef:
3983     __CODE{getReflectAttrURIValue::
3984     $node => $self,
3985     $namespaceURI => {null},
3986     $localName => 'uri',
3987     $r => $r,
3988     $defaultValue => {null},
3989     }__;
3990     @@Set:
3991     @@@nullCase:
3992     @@@@enDesc:
3993     Removes the attribute.
3994     @@@NodeReadOnlyError:
3995     @@@PerlDef:
3996     __CODE{setReflectAttrURIValue::
3997     $node => $self,
3998     $namespaceURI => {null},
3999     $localName => 'uri',
4000     $given => $given,
4001     }__;
4002    
4003     @Attr:
4004     @@Name: version
4005     @@enDesc:
4006     The <XA::version> attribute of the element.
4007    
4008     It <kwd:MUST> <I::reflect the string value
4009     of the <XA::version> attribute> of the node.
4010     @@Type: DOMString
4011     @@Get:
4012     @@@nullCase:
4013     @@@@enDesc:
4014     If the algorithm returns <DOM::null>.
4015     @@@PerlDef:
4016     __CODE{getReflectAttrStringValue::
4017     $node => $self,
4018     $namespaceURI => {null},
4019     $localName => 'version',
4020     $r => $r,
4021     $defaultValue => {null},
4022     }__;
4023     @@Set:
4024     @@@nullCase:
4025     @@@@enDesc:
4026     Removes the attribute.
4027     @@@NodeReadOnlyError:
4028     @@@PerlDef:
4029     __CODE{setReflectAttrStringValue::
4030     $node => $self,
4031     $namespaceURI => {null},
4032     $localName => 'version',
4033     $given => $given,
4034     }__;
4035     ##AtomGeneratorElement
4036    
4037     IFClsETDef:
4038     @IFQName: AtomLinkElement
4039     @ETQName: atom|link
4040 wakaba 1.6 @ETRQName: atom|link
4041 wakaba 1.1 @ClsQName: ManakaiAtomLinkElement
4042    
4043     @IFISA: AtomElement
4044     @ClsISA: ManakaiAtomElement
4045    
4046 wakaba 1.14 @f:implements: AtomFeature10
4047 wakaba 1.10 @mv:refers: atomCommonAttributes
4048    
4049 wakaba 1.9 @cm: undefinedContent
4050    
4051 wakaba 1.1 @enDesc:
4052     The <XE::atom|link> element defines a reference from an entry
4053     or feed to a Web resource.
4054    
4055 wakaba 1.6 @ATTR:
4056 wakaba 1.1 @@Name: href
4057     @@enDesc:
4058     The <XA::href> attribute of the element.
4059    
4060     It <kwd:MUST> <I::reflect the URI value
4061     of the <XA::href> attribute> of the node.
4062     @@Type: DOMString
4063 wakaba 1.6 @@actualType: DOMURI
4064 wakaba 1.1 @@Get:
4065     @@@nullCase:
4066     @@@@enDesc:
4067     If the algorithm returns <DOM::null>.
4068     @@@PerlDef:
4069     __CODE{getReflectAttrURIValue::
4070     $node => $self,
4071     $namespaceURI => {null},
4072     $localName => 'href',
4073     $r => $r,
4074     $defaultValue => {null},
4075     }__;
4076     @@Set:
4077     @@@nullCase:
4078     @@@@enDesc:
4079     Removes the attribute.
4080     @@@NodeReadOnlyError:
4081     @@@PerlDef:
4082     __CODE{setReflectAttrURIValue::
4083     $node => $self,
4084     $namespaceURI => {null},
4085     $localName => 'href',
4086     $given => $given,
4087     }__;
4088    
4089 wakaba 1.6 @ATTR:
4090 wakaba 1.1 @@Name: rel
4091     @@enDesc:
4092     The <XA::rel> attribute of the element.
4093    
4094     It <kwd:MUST> <I::reflect the string value
4095     of the <XA::rel> attribute> of the node, with
4096     a few exceptions. The default value <kwd:MUST>
4097     be <URI^DISCore|QName::rel|alternate>.
4098     @@Type: DOMString
4099 wakaba 1.6 @@actualType: DOMURI
4100 wakaba 1.1 @@Get:
4101     @@@enDesc:
4102     If the algorithm returns a string that does not contain
4103     any <CHAR::COLON> character, the string
4104     <URI^DISCore|QName::rel|> <kwd:MUST> be prepended
4105     for the return value of the getter.
4106     @@@PerlDef:
4107     __CODE{getReflectAttrStringValue::
4108     $node => $self,
4109     $namespaceURI => {null},
4110     $localName => 'rel',
4111     $r => $r,
4112     $defaultValue => {<Q::rel|alternate>},
4113     }__;
4114     if (defined $r and index ($r, ':') == -1) {
4115     $r = <Q::rel|> . $r;
4116     }
4117     @@Set:
4118     @@@enDesc:
4119     If the given value starts with <URI^DISCore|QName::rel|> (by
4120     simple character-by-character comparison), such substring
4121     <kwd:MUST> be removed for the purpose of the setter algorithm,
4122     if and only if the result string is not empty and does contain
4123     none of <CHAR::COLON>, <CHAR::SOLIDUS>, <CHAR::QUESTION MARK>,
4124     and <CHAR::NUMBER SIGN>.
4125     @@@nullCase:
4126     @@@@enDesc:
4127     Removes the attribute.
4128     @@@NodeReadOnlyError:
4129     @@@PerlDef:
4130     if (defined $given) {
4131     $given =~ s[\Ahttp://www.iana.org/assignments/relation/([^:/?#]+)\z]
4132     [$1];
4133     }
4134     __CODE{setReflectAttrStringValue::
4135     $node => $self,
4136     $namespaceURI => {null},
4137     $localName => 'rel',
4138     $given => $given,
4139     }__;
4140    
4141     @@Test:
4142     @@@QName: AtomLinkElement.rel.test
4143     @@@PerlDef:
4144     my $doc;
4145     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4146    
4147     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4148    
4149     $test->id ('default');
4150     $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
4151     <Q::rel|alternate>);
4152    
4153     $test->id ('set');
4154     $el-><AS::AtomLinkElement.rel> ('http://www.example.com/');
4155     $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
4156     'http://www.example.com/');
4157    
4158     $test->id ('set.self');
4159     $el-><AS::AtomLinkElement.rel> ('self');
4160     $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
4161     <Q::rel|self>);
4162    
4163     $test->id ('set.qrelated');
4164     $el-><AS::AtomLinkElement.rel> (<Q::rel|related>);
4165     $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
4166     <Q::rel|related>);
4167    
4168     $test->id ('remove');
4169     $el-><AS::AtomLinkElement.rel> (null);
4170     $test->assert_equals ($el-><AG::AtomLinkElement.rel>,
4171     <Q::rel|alternate>);
4172    
4173 wakaba 1.6 @ATTR:
4174 wakaba 1.1 @@Name: type
4175     @@enDesc:
4176     The <XA::type> attribute of the element.
4177    
4178     It <kwd:MUST> <I::reflect the string value
4179     of the <XA::type> attribute> of the node.
4180     @@Type: DOMString
4181     @@Get:
4182 wakaba 1.14 @@@enDesc:
4183     {P:: If the feature <Feature^^DISCore|QName::AtomThreadingFeature10>
4184     is supported, the attribute getter <kwd:MUST> return
4185     the string <CODE::application/atom+xml> when both of the
4186     following conditions are met:
4187    
4188     - The attribute getter would otherwise return <DOM::null>.
4189    
4190     - The <A::AtomLinkElement.rel> attribute contains
4191     a string value of <URI^^DISCore|QName::rel|replies>.
4192    
4193     }
4194 wakaba 1.1 @@@nullCase:
4195     @@@@enDesc:
4196     If the algorithm returns <DOM::null>.
4197     @@@PerlDef:
4198     __CODE{getReflectAttrStringValue::
4199     $node => $self,
4200     $namespaceURI => {null},
4201     $localName => 'type',
4202     $r => $r,
4203     $defaultValue => {null},
4204     }__;
4205 wakaba 1.14
4206     unless (defined $r) {
4207     __DEEP{
4208     my $rel = $self-><AG::AtomLinkElement.rel>;
4209     if (defined $rel and $rel eq <Q::rel|replies>) {
4210     $r = q<application/atom+xml>;
4211     }
4212     }__;
4213     }
4214 wakaba 1.1 @@Set:
4215     @@@nullCase:
4216     @@@@enDesc:
4217     Removes the attribute.
4218     @@@NodeReadOnlyError:
4219     @@@PerlDef:
4220     __CODE{setReflectAttrStringValue::
4221     $node => $self,
4222     $namespaceURI => {null},
4223     $localName => 'type',
4224     $given => $given,
4225     }__;
4226    
4227 wakaba 1.14 @@Test:
4228     @@@QName: AtomLinkElement.type.!rel.test
4229     @@@PerlDef:
4230     my $doc;
4231     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4232    
4233     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4234    
4235     $test->id ('implied');
4236     my $type0 = $el-><AG::AtomLinkElement.type>;
4237     $test->assert_null ($type0);
4238    
4239     $test->id ('explicit');
4240     $el-><AS::AtomLinkElement.type> ('application/atom+xml');
4241     my $type1 = $el-><AG::AtomLinkElement.type>;
4242     $test->assert_equals ($type1, q<application/atom+xml>);
4243    
4244     $test->id ('different');
4245     $el-><AS::AtomLinkElement.type> ('application/xhtml+xml');
4246     my $type2 = $el-><AG::AtomLinkElement.type>;
4247     $test->assert_equals ($type2, q<application/xhtml+xml>);
4248     @@Test:
4249     @@@QName: AtomLinkElement.type.rel!=replies.test
4250     @@@PerlDef:
4251     my $doc;
4252     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4253    
4254     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4255    
4256     $el-><AS::AtomLinkElement.rel> (<Q::rel|alternate>);
4257    
4258     $test->id ('implied');
4259     my $type0 = $el-><AG::AtomLinkElement.type>;
4260     $test->assert_null ($type0);
4261    
4262     $test->id ('explicit');
4263     $el-><AS::AtomLinkElement.type> ('application/atom+xml');
4264     my $type1 = $el-><AG::AtomLinkElement.type>;
4265     $test->assert_equals ($type1, q<application/atom+xml>);
4266    
4267     $test->id ('different');
4268     $el-><AS::AtomLinkElement.type> ('application/xhtml+xml');
4269     my $type2 = $el-><AG::AtomLinkElement.type>;
4270     $test->assert_equals ($type2, q<application/xhtml+xml>);
4271     @@Test:
4272     @@@QName: AtomLinkElement.type.rel=replies.test
4273     @@@PerlDef:
4274     my $doc;
4275     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4276    
4277     my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4278    
4279     $el-><AS::AtomLinkElement.rel> (<Q::rel|replies>);
4280    
4281     $test->id ('implied');
4282     my $type0 = $el-><AG::AtomLinkElement.type>;
4283     $test->assert_equals ($type0, q<application/atom+xml>);
4284    
4285     $test->id ('explicit');
4286     $el-><AS::AtomLinkElement.type> ('application/atom+xml');
4287     my $type1 = $el-><AG::AtomLinkElement.type>;
4288     $test->assert_equals ($type1, q<application/atom+xml>);
4289    
4290     $test->id ('different');
4291     $el-><AS::AtomLinkElement.type> ('application/xhtml+xml');
4292     my $type2 = $el-><AG::AtomLinkElement.type>;
4293     $test->assert_equals ($type2, q<application/xhtml+xml>);
4294    
4295 wakaba 1.6 @ATTR:
4296 wakaba 1.1 @@Name: hreflang
4297     @@enDesc:
4298     The <XA::hreflang> attribute of the element.
4299    
4300     It <kwd:MUST> <I::reflect the string value
4301     of the <XA::hreflang> attribute> of the node.
4302     @@Type: DOMString
4303     @@Get:
4304     @@@nullCase:
4305     @@@@enDesc:
4306     If the algorithm returns <DOM::null>.
4307     @@@PerlDef:
4308     __CODE{getReflectAttrStringValue::
4309     $node => $self,
4310     $namespaceURI => {null},
4311     $localName => 'hreflang',
4312     $r => $r,
4313     $defaultValue => {null},
4314     }__;
4315     @@Set:
4316     @@@nullCase:
4317     @@@@enDesc:
4318     Removes the attribute.
4319     @@@NodeReadOnlyError:
4320     @@@PerlDef:
4321     __CODE{setReflectAttrStringValue::
4322     $node => $self,
4323     $namespaceURI => {null},
4324     $localName => 'hreflang',
4325     $given => $given,
4326     }__;
4327    
4328 wakaba 1.6 @ATTR:
4329 wakaba 1.1 @@Name: title
4330     @@enDesc:
4331     The <XA::title> attribute of the element.
4332    
4333     It <kwd:MUST> <I::reflect the string value
4334     of the <XA::title> attribute> of the node.
4335     @@Type: DOMString
4336     @@Get:
4337     @@@nullCase:
4338     @@@@enDesc:
4339     If the algorithm returns <DOM::null>.
4340     @@@PerlDef:
4341     __CODE{getReflectAttrStringValue::
4342     $node => $self,
4343     $namespaceURI => {null},
4344     $localName => 'title',
4345     $r => $r,
4346     $defaultValue => {null},
4347     }__;
4348     @@Set:
4349     @@@nullCase:
4350     @@@@enDesc:
4351     Removes the attribute.
4352     @@@NodeReadOnlyError:
4353     @@@PerlDef:
4354     __CODE{setReflectAttrStringValue::
4355     $node => $self,
4356     $namespaceURI => {null},
4357     $localName => 'title',
4358     $given => $given,
4359     }__;
4360    
4361 wakaba 1.6 @ATTR:
4362 wakaba 1.1 @@Name: length
4363     @@enDesc:
4364     The <XA::length> attribute of the element.
4365    
4366     It <kwd:MUST> <I::reflect the string value
4367     of the <XA::length> attribute> of the node.
4368     @@Type: DOMString
4369     @@Get:
4370     @@@nullCase:
4371     @@@@enDesc:
4372     If the algorithm returns <DOM::null>.
4373     @@@PerlDef:
4374     __CODE{getReflectAttrStringValue::
4375     $node => $self,
4376     $namespaceURI => {null},
4377     $localName => 'length',
4378     $r => $r,
4379     $defaultValue => {null},
4380     }__;
4381     @@Set:
4382     @@@nullCase:
4383     @@@@enDesc:
4384     Removes the attribute.
4385     @@@NodeReadOnlyError:
4386     @@@PerlDef:
4387     __CODE{setReflectAttrStringValue::
4388     $node => $self,
4389     $namespaceURI => {null},
4390     $localName => 'length',
4391     $given => $given,
4392     }__;
4393     ##AtomLinkElement
4394    
4395     IFClsETDef:
4396     @IFQName: AtomPublishedElement
4397     @ETQName: atom|published
4398 wakaba 1.6 @ETRQName: atom|published
4399 wakaba 1.1 @ClsQName: ManakaiAtomPublishedElement
4400    
4401     @IFISA: AtomDateConstruct
4402     @ClsISA: ManakaiAtomDateConstruct
4403 wakaba 1.14
4404     @f:implements: AtomFeature10
4405 wakaba 1.8 @mv:refers: DateAG
4406 wakaba 1.7 @mv:elementContentModel: DateCM
4407 wakaba 1.1
4408     @enDesc:
4409     The <XE::atom|published> element is a Date construct
4410     indicating an instant in time associated with an
4411     event early in the life cycle of the entry.
4412    
4413     Typically, <XE::atom|published> will be associated with
4414     the initial creation or first availability of the resouce.
4415     ##AtomPublishedElement
4416    
4417     IFClsETDef:
4418     @IFQName: AtomRightsElement
4419     @ETQName: atom|rights
4420 wakaba 1.6 @ETRQName: atom|rights
4421 wakaba 1.1 @ClsQName: ManakaiAtomRightsElement
4422    
4423     @IFISA: AtomTextConstruct
4424     @ClsISA: ManakaiAtomTextConstruct
4425 wakaba 1.14
4426     @f:implements: AtomFeature10
4427 wakaba 1.8 @mv:refers: TextAG
4428 wakaba 1.7 @mv:elementContentModel: TextCM
4429 wakaba 1.1
4430     @enDesc:
4431     The <XE::atom|rights> element is a Text construct
4432     that conveys information about rights held in and
4433     over an entry or feed.
4434     ##AtomRightsElement
4435    
4436 wakaba 1.8 ECDef:
4437     @QName: source-prop
4438     @mv:elementTypeClassName: source-prop
4439     @mv:refers: atom|author
4440     @mv:refers: atom|category
4441     @mv:refers: atom|contributor
4442     @mv:refers: atom|generator
4443     @mv:refers: atom|icon
4444     @mv:refers: atom|id
4445     @mv:refers: atom|link
4446     @mv:refers: atom|logo
4447     @mv:refers: atom|rights
4448     @mv:refers: atom|subtitle
4449     @mv:refers: atom|title
4450     @mv:refers: atom|updated
4451     @mv:refers: extensionElements
4452    
4453 wakaba 1.1 IFClsETDef:
4454     @IFQName: AtomSourceElement
4455     @ETQName: atom|source
4456 wakaba 1.6 @ETRQName: atom|source
4457 wakaba 1.1 @ClsQName: ManakaiAtomSourceElement
4458    
4459     @IFISA: AtomElement
4460     @ClsISA: ManakaiAtomElement
4461 wakaba 1.10
4462 wakaba 1.14 @f:implements: AtomFeature10
4463 wakaba 1.10 @mv:refers: atomCommonAttributes
4464 wakaba 1.1
4465 wakaba 1.9 @cm:
4466     (source-prop*)
4467    
4468 wakaba 1.1 @Attr:
4469     @@Name: authorElements
4470     @@enDesc:
4471     A static list of <XE::atom|author> child elements of the node.
4472     @@Type: StaticNodeList
4473     @@Get:
4474     @@@enDesc:
4475     It <kwd:MUST> <I::return a <XE::atom|author> child element list>
4476     of the node.
4477     @@@disDef:
4478     @@@@dlp:cloneCode: ManakaiAtomFeedElement.authorElements.get
4479    
4480     @Attr:
4481     @@Name: categoryElements
4482     @@enDesc:
4483     A static list of <XE::atom|category> child elements of the node.
4484     @@Type: StaticNodeList
4485     @@Get:
4486     @@@enDesc:
4487     It <kwd:MUST> <I::return a <XE::atom|category> child element list>
4488     of the node.
4489     @@@disDef:
4490     @@@@dlp:cloneCode: ManakaiAtomFeedElement.categoryElements.get
4491    
4492     @Attr:
4493     @@Name: contributorElements
4494     @@enDesc:
4495     A static list of <XE::atom|contributor> child elements of the node.
4496     @@Type: StaticNodeList
4497     @@Get:
4498     @@@enDesc:
4499     It <kwd:MUST> <I::return a <XE::atom|contributor> child element list>
4500     of the node.
4501     @@@disDef:
4502     @@@@dlp:cloneCode: ManakaiAtomFeedElement.contributorElements.get
4503    
4504     @Attr:
4505     @@Name: generatorElement
4506     @@enDesc:
4507     The <XE::atom|generator> child element of the node.
4508     @@Type: AtomGeneratorElement
4509     @@Get:
4510     @@@enDesc:
4511     It <kwd:MUST> <I::return a <XE::atom|generator> child element>
4512     of the node.
4513     @@@nullCase:
4514     @@@@enDesc:
4515     If the algorithm returns <DOM::null>.
4516     @@@NodeReadOnlyError:
4517     @@@disDef:
4518     @@@@dlp:cloneCode: ManakaiAtomFeedElement.generatorElement.get
4519    
4520     @Attr:
4521     @@Name: icon
4522     @@enDesc:
4523     The <XE::atom|icon> value of the node.
4524    
4525     It <kwd:MUST> <I::reflect the URI value
4526     of the <XE::atom|icon> child element> of the node.
4527     @@Type: DOMString
4528     @@actualType: DOMURI
4529     @@Get:
4530     @@@nullCase:
4531     @@@@enDesc:
4532     If the algorithm returns <DOM::null>.
4533     @@@NodeReadOnlyError:
4534     @@@disDef:
4535     @@@@dlp:cloneCode: ManakaiAtomFeedElement.icon.get
4536     @@Set:
4537     @@@nullCase:
4538     @@@@enDesc:
4539     Removes the value.
4540     @@@NodeReadOnlyError:
4541     @@@disDef:
4542     @@@@dlp:cloneCode: ManakaiAtomFeedElement.icon.set
4543    
4544     @Attr:
4545     @@Name: id
4546     @@enDesc:
4547     The <XE::atom|id> value of the node.
4548    
4549     It <kwd:MUST> <I::reflect the string value
4550     of the <XE::atom|id> child element> of the node.
4551     @@Type: DOMString
4552     @@actualType: DOMURI
4553     @@Get:
4554     @@@nullCase:
4555     @@@@enDesc:
4556     If the algorithm returns <DOM::null>.
4557     @@@NodeReadOnlyError:
4558     @@@disDef:
4559     @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.get
4560     @@Set:
4561     @@@nullCase:
4562     @@@@enDesc:
4563     Removes the value.
4564     @@@NodeReadOnlyError:
4565     @@@disDef:
4566     @@@@dlp:cloneCode: ManakaiAtomFeedElement.id.set
4567    
4568     @Attr:
4569     @@Name: linkElements
4570     @@enDesc:
4571     A static list of <XE::atom|link> child elements of the node.
4572     @@Type: StaticNodeList
4573     @@Get:
4574     @@@enDesc:
4575     It <kwd:MUST> <I::return a <XE::atom|link> child element list>
4576     of the node.
4577     @@@disDef:
4578     @@@@dlp:cloneCode: ManakaiAtomFeedElement.linkElements.get
4579    
4580     @Attr:
4581     @@Name: logo
4582     @@enDesc:
4583     The <XE::atom|logo> value of the node.
4584    
4585     It <kwd:MUST> <I::reflect the URI value
4586     of the <XE::atom|logo> child element> of the node.
4587     @@Type: DOMString
4588     @@actualType: DOMURI
4589     @@Get:
4590     @@@nullCase:
4591     @@@@enDesc:
4592     If the algorithm returns <DOM::null>.
4593     @@@NodeReadOnlyError:
4594     @@@disDef:
4595     @@@@dlp:cloneCode: ManakaiAtomFeedElement.logo.get
4596     @@Set:
4597     @@@nullCase:
4598     @@@@enDesc:
4599     Removes the value.
4600     @@@NodeReadOnlyError:
4601     @@@disDef:
4602     @@@@dlp:cloneCode: ManakaiAtomFeedElement.logo.set
4603    
4604     @Attr:
4605     @@Name: rightsElement
4606     @@enDesc:
4607     The <XE::atom|rights> child element of the node.
4608     @@Type: AtomRightsElement
4609     @@Get:
4610     @@@enDesc:
4611     It <kwd:MUST> <I::return a <XE::atom|rights> child element>
4612     of the node.
4613     @@@nullCase:
4614     @@@@enDesc:
4615     If the algorithm returns <DOM::null>.
4616     @@@NodeReadOnlyError:
4617     @@@disDef:
4618     @@@@dlp:cloneCode: ManakaiAtomFeedElement.rightsElement.get
4619    
4620     @Attr:
4621     @@Name: subtitleElement
4622     @@enDesc:
4623     The <XE::atom|subtitle> child element of the node.
4624     @@Type: AtomSubtitleElement
4625     @@Get:
4626     @@@enDesc:
4627     It <kwd:MUST> <I::return a <XE::atom|subtitle> child element>
4628     of the node.
4629     @@@nullCase:
4630     @@@@enDesc:
4631     If the algorithm returns <DOM::null>.
4632     @@@NodeReadOnlyError:
4633     @@@disDef:
4634     @@@@dlp:cloneCode: ManakaiAtomFeedElement.subtitleElement.get
4635    
4636     @Attr:
4637     @@Name: titleElement
4638     @@enDesc:
4639     The <XE::atom|title> child element of the node.
4640     @@Type: AtomTitleElement
4641     @@Get:
4642     @@@enDesc:
4643     It <kwd:MUST> <I::return a <XE::atom|title> child element>
4644     of the node.
4645     @@@nullCase:
4646     @@@@enDesc:
4647     If the algorithm returns <DOM::null>.
4648     @@@NodeReadOnlyError:
4649     @@@disDef:
4650     @@@@dlp:cloneCode: ManakaiAtomFeedElement.titleElement.get
4651    
4652     @Attr:
4653     @@Name: updatedElement
4654     @@enDesc:
4655     The <XE::atom|updated> child element of the node.
4656     @@Type: AtomUpdatedElement
4657     @@Get:
4658     @@@enDesc:
4659     It <kwd:MUST> <I::return a <XE::atom|updated> child element>
4660     of the node.
4661     @@@nullCase:
4662     @@@@enDesc:
4663     If the algorithm returns <DOM::null>.
4664     @@@NodeReadOnlyError:
4665     @@@disDef:
4666     @@@@dlp:cloneCode: ManakaiAtomFeedElement.updatedElement.get
4667     ##AtomSourceElement
4668    
4669     IFClsETDef:
4670     @IFQName: AtomSubtitleElement
4671     @ETQName: atom|subtitle
4672 wakaba 1.6 @ETRQName: atom|subtitle
4673 wakaba 1.1 @ClsQName: ManakaiAtomSubtitleElement
4674    
4675     @IFISA: AtomTextConstruct
4676     @ClsISA: ManakaiAtomTextConstruct
4677 wakaba 1.14
4678     @f:implements: AtomFeature10
4679 wakaba 1.8 @mv:refers: TextAG
4680 wakaba 1.7 @mv:elementContentModel: TextCM
4681 wakaba 1.1
4682     @enDesc:
4683     The <XE::atom|subtitle> element is a Text construct
4684     that conveys a human-readable description or subtitle for a feed.
4685     ##AtomSubtitleElement
4686    
4687     IFClsETDef:
4688     @IFQName: AtomSummaryElement
4689     @ETQName: atom|summary
4690 wakaba 1.6 @ETRQName: atom|summary
4691 wakaba 1.1 @ClsQName: ManakaiAtomSummaryElement
4692    
4693     @IFISA: AtomTextConstruct
4694     @ClsISA: ManakaiAtomTextConstruct
4695 wakaba 1.14
4696     @f:implements: AtomFeature10
4697 wakaba 1.8 @mv:refers: TextAG
4698 wakaba 1.7 @mv:elementContentModel: TextCM
4699 wakaba 1.1
4700     @enDesc:
4701     The <XE::atom|summary> element is a Text construct
4702     that conveys a short summary, abstract, or excerpt of an entry.
4703     ##AtomSummaryElement
4704    
4705     IFClsETDef:
4706     @IFQName: AtomTitleElement
4707     @ETQName: atom|title
4708 wakaba 1.6 @ETRQName: atom|title
4709 wakaba 1.1 @ClsQName: ManakaiAtomTitleElement
4710    
4711     @IFISA: AtomTextConstruct
4712     @ClsISA: ManakaiAtomTextConstruct
4713 wakaba 1.14
4714     @f:implements: AtomFeature10
4715 wakaba 1.8 @mv:refers: TextAG
4716 wakaba 1.7 @mv:elementContentModel: TextCM
4717 wakaba 1.1
4718     @enDesc:
4719     The <XE::atom|title> element is a Text construct
4720     that conveys a human-readable title for an entry or feed.
4721     ##AtomTitleElement
4722    
4723     IFClsETDef:
4724     @IFQName: AtomUpdatedElement
4725     @ETQName: atom|updated
4726 wakaba 1.6 @ETRQName: atom|updated
4727 wakaba 1.1 @ClsQName: ManakaiAtomUpdatedElement
4728    
4729     @IFISA: AtomDateConstruct
4730     @ClsISA: ManakaiAtomDateConstruct
4731 wakaba 1.14
4732     @f:implements: AtomFeature10
4733 wakaba 1.8 @mv:refers: DateAG
4734 wakaba 1.7 @mv:elementContentModel: DateCM
4735 wakaba 1.1
4736     @enDesc:
4737     The <XE::atom|updated> element is a Date construct
4738     indicating the most recent instant in time when an
4739     entry or feed was modified in a way the publisher considers
4740     significant.
4741     ##AtomPublishedElement
4742    
4743     ElementTypeBinding:
4744     @Name: NodeReadOnlyError
4745     @ElementType:
4746     dx:raises
4747     @ShadowContent:
4748     @@@: MDOMX|NOMOD_THIS
4749     @@Description:
4750     @@@lang:en
4751     @@@@:
4752     If the node or a descendant of it, which
4753     is to be modified, is read-only.
4754    
4755     ## -- Configuration Parameters
4756    
4757     boolCParam:
4758     @QName: cfg|create-child-element
4759     @tc:nodeStemKey:
4760     @@@: ccldel
4761     @@ForCheck: =ManakaiDOM|all
4762     @c:targetType: tc|Document
4763     @IsSupportRequired:1
4764     @TrueCase:
4765     @@c:isSupported:1
4766     @@enDesc:
4767     If the parameter is set to <DOM::true>, some DOM attributes
4768     that returns an element will create a child element
4769     when there is no element that met the condition defined
4770     for that DOM attribute.
4771     @FalseCase:
4772     @@c:isSupported:1
4773     @@IsSupportRequired:1
4774     @@IsDefault:1
4775     @@enDesc:
4776     If the parameter is set to <DOM::true>, some DOM attributes
4777     that returns an element will <EM::not> create a child element
4778     even when there is no element that met the condition defined
4779     for that DOM attribute.
4780     @TestC:
4781     @@QName: cfg.create-child-element.set.test
4782     @@PerlCDef:
4783     my $doc;
4784     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4785    
4786     my $cfg = $doc-><AG::Document.domConfig>;
4787     my $cp = <Q::cfg|create-child-element>;
4788    
4789     $test->id ('default');
4790     $test->assert_false ($cfg-><M::CFG.getParameter> ($cp));
4791    
4792     $test->id ('set.f.to.t');
4793     $cfg-><M::CFG.setParameter> ($cp => true);
4794     $test->assert_true ($cfg-><M::CFG.getParameter> ($cp));
4795    
4796     $test->id ('set.t.to.f');
4797     $cfg-><M::CFG.setParameter> ($cp => false);
4798     $test->assert_false ($cfg-><M::CFG.getParameter> ($cp));
4799    
4800     $cfg-><M::CFG.setParameter> ($cp => true);
4801    
4802     $test->id ('reset');
4803     $cfg-><M::CFG.setParameter> ($cp => null);
4804     $test->assert_false ($cfg-><M::CFG.getParameter> ($cp));
4805    
4806     ResourceDef:
4807     @QName: CFG
4808     @AliasFor: c|DOMConfiguration
4809    
4810     ElementTypeBinding:
4811     @Name: boolCParam
4812     @ElementType:
4813     dis:ResourceDef
4814     @ShadowContent:
4815     @@DISCore:resourceType:
4816     @@@@: c|DOMConfigurationParameter
4817     @@DISCore:resourceType:
4818     @@@@: DISCore|Property
4819     @@@For: =ManakaiDOM|all
4820     @@Type: idl|boolean||ManakaiDOM|all
4821 wakaba 1.8
4822     ECDef:
4823     @QName: simpleExtensionElements
4824     @mv:elementTypeClassName: simple.extra
4825     @DISCore:resourceType: mv|ElementTypeAdditionalClass
4826    
4827     ECDef:
4828     @QName: structuredExtensionElements
4829     @mv:elementTypeClassName: structured.extra
4830     @DISCore:resourceType: mv|ElementTypeAdditionalClass
4831    
4832     EMDef:
4833     @QName: extensionElements
4834     @mv:elementTypeClassName: extra
4835     @mv:refers: simpleExtensionElements
4836     @mv:refers: structuredExtensionElements
4837     @DISCore:resourceType: mv|ElementTypeAdditionalClass
4838    
4839     AGDef:
4840     @QName: undefinedAttributes
4841     @mv:attributeTypeGroupName: common.extra
4842    
4843 wakaba 1.9 ResourceDef:
4844     @QName: undefinedContent
4845     @mv:elementContentModelName: undefined
4846     @DISCore:resourceType: mv|ElementContentModel
4847     @cm: dxm|ANY||ManakaiDOM|all
4848     @enImplNote:
4849     (text | anyForeignElement)*
4850 wakaba 1.14
4851     ## -- Atom Threading Extension [RFC 4685]
4852    
4853     IFClsDef:
4854     @IFQName: AtomEntryElementThread
4855     @ClsQName: ManakaiAtomEntryElementThread
4856    
4857     @ClsISA: ManakaiAtomEntryElement
4858    
4859     @f:implements: AtomThreadingFeature10
4860    
4861     @enDesc:
4862     If the feature <Feature^^DISCore|QName::AtomThreadingFeature10>
4863     is supported, any <IF::Element> whose element type
4864     is <XE::atom|entry> <kwd:MUST> implement the <IF::AtomEntryElementThread>
4865     interface in addition to other appropriate interfaces.
4866    
4867     @Test:
4868     @@QName: AtomEntryElementThread.1.test
4869     @@PerlDef:
4870     my $doc;
4871     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4872    
4873     my $el = $doc->create_element_ns (<Q::atom|>, 'entry');
4874    
4875     $test->id ('interface');
4876     $test->assert_isa ($el, <IFName::AtomEntryElementThread>);
4877    
4878     $test->id ('feature');
4879     $test->assert_true ($el->is_supported (<Q::fe|AtomThreading> => '1.0'));
4880    
4881     @Attr:
4882     @@Name: threadInReplyToElements
4883     @@enDesc:
4884     A static list of <XE::thr|in-reply-to> child elements of the node.
4885     @@Type: StaticNodeList
4886     @@Get:
4887     @@@enDesc:
4888     It <kwd:MUST> <I::return a <XE::thr|in-reply-to> child element list>
4889     of the node.
4890     @@@PerlDef:
4891     __CODE{returnChildElementList::
4892     $node => $self,
4893     $namespaceURI => {<Q::thr|>},
4894     $localName => 'in-reply-to',
4895     $r => $r,
4896     }__;
4897     ##AtomEntryElementThread
4898    
4899     IFClsETDef:
4900     @IFQName: AtomThreadInReplyToElement
4901     @ETQName: thr|in-reply-to
4902     @ETRQName: thr|in-reply-to
4903     @ClsQName: ManakaiAtomThreadInReplyToElement
4904    
4905     @IFISA: AtomDateConstruct
4906     @ClsISA: ManakaiAtomDateConstruct
4907    
4908     @f:implements: AtomThreadingFeature10
4909     @mv:refers: atomCommonAttributes
4910    
4911     @cm: undefinedContent
4912    
4913     @enDesc:
4914     The <XE::thr|in-reply-to> element is used to indicate
4915     that an entry is a response to another resource.
4916    
4917     If the entry is a response to multiple resources,
4918     additional <XE::thr|in-reply-to> element <kwd:MAY>
4919     be used.
4920    
4921     RFC 4685 assigns no significance to the order in which
4922     multiple <XE::thr|in-reply-to> element appear within
4923     an entry.
4924    
4925     @Test:
4926     @@QName: AtomThreadInReplyToElement.1.test
4927     @@PerlDef:
4928     my $doc;
4929     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4930    
4931     my $el = $doc->create_element_ns (<Q::thr|>, 'in-reply-to');
4932    
4933     $test->id ('interface');
4934     $test->assert_isa ($el, <IFName::AtomThreadInReplyToElement>);
4935    
4936     $test->id ('feature');
4937     $test->assert_true ($el->is_supported (<Q::fe|AtomThreading> => '1.0'));
4938    
4939     @ATTR:
4940     @@Name: ref
4941     @@enDesc:
4942     The <XA::ref> attribute of the element.
4943    
4944     It <kwd:MUST> <I::reflect the URI value
4945     of the <XA::ref> attribute> of the node.
4946    
4947     The <XA::ref> attribute specifies the persistent,
4948     universally unique identifier of the resource being
4949     responded to. The value <kwd:MUST> conform to
4950     the same construction and comparison rules as the
4951     value of the <XE::atom|id> element. Though the IRI
4952     might use a dereferenceable scheme, processors <kwd:MUST-NOT>
4953     assume that it can be dereferenced.
4954    
4955     The <XE::thr|in-reply-to> element <kwd:MUST> contain
4956     a <XA::ref> attribute identifying the resource that
4957     is being respnoded to.
4958    
4959     If the resource being responded to does not have a persistent,
4960     universally unique identifier, the publisher <kwd:MUST> assign an
4961     identifier that satisfies all the considerations in Section 4.2.6 of
4962     RFC 4287 for use as the value of the <XA::ref> attribute.
4963     In that case, if a representation of the resource can be retrieved
4964     from an IRI that can be used as a valid atom:id value, then this IRI
4965     <kwd:SHOULD> be used as the value of both the <XA::ref> and
4966     <XA::href> attributes.
4967     @@Type: DOMString
4968     @@actualType: DOMURI
4969     @@Get:
4970     @@@nullCase:
4971     @@@@enDesc:
4972     If the algorithm returns <DOM::null>.
4973     @@@PerlDef:
4974     __CODE{getReflectAttrURIValue::
4975     $node => $self,
4976     $namespaceURI => {null},
4977     $localName => 'ref',
4978     $r => $r,
4979     $defaultValue => {null},
4980     }__;
4981     @@Set:
4982     @@@nullCase:
4983     @@@@enDesc:
4984     Removes the attribute.
4985     @@@NodeReadOnlyError:
4986     @@@PerlDef:
4987     __CODE{setReflectAttrURIValue::
4988     $node => $self,
4989     $namespaceURI => {null},
4990     $localName => 'ref',
4991     $given => $given,
4992     }__;
4993    
4994     @ATTR:
4995     @@Name: source
4996     @@enDesc:
4997     The <XA::source> attribute of the element.
4998    
4999     It <kwd:MUST> <I::reflect the URI value
5000     of the <XA::source> attribute> of the node.
5001    
5002     The <XA::source> attribute <kwd:MAY> be used to specify the IRI
5003     of an Atom Feed or Entry Document containing an
5004     <XE::atom|entry> with an <XE::atom|id> value equal to the
5005     value of the <XA::ref> attribute. The IRI specified <kwd:MUST>
5006     be dereferenceable.
5007     @@Type: DOMString
5008     @@actualType: DOMURI
5009     @@Get:
5010     @@@nullCase:
5011     @@@@enDesc:
5012     If the algorithm returns <DOM::null>.
5013     @@@PerlDef:
5014     __CODE{getReflectAttrURIValue::
5015     $node => $self,
5016     $namespaceURI => {null},
5017     $localName => 'source',
5018     $r => $r,
5019     $defaultValue => {null},
5020     }__;
5021     @@Set:
5022     @@@nullCase:
5023     @@@@enDesc:
5024     Removes the attribute.
5025     @@@NodeReadOnlyError:
5026     @@@PerlDef:
5027     __CODE{setReflectAttrURIValue::
5028     $node => $self,
5029     $namespaceURI => {null},
5030     $localName => 'source',
5031     $given => $given,
5032     }__;
5033    
5034     @ATTR:
5035     @@Name: href
5036     @@enDesc:
5037     The <XA::href> attribute of the element.
5038    
5039     It <kwd:MUST> <I::reflect the URI value
5040     of the <XA::href> attribute> of the node.
5041    
5042     The <XA::href> attribute specifies an IRI that may be used
5043     to retrieve a representation of the resource being
5044     responded to. The IRI specified <kwd:MUST> be
5045     dereferenceable.
5046     @@Type: DOMString
5047     @@actualType: DOMURI
5048     @@Get:
5049     @@@nullCase:
5050     @@@@enDesc:
5051     If the algorithm returns <DOM::null>.
5052     @@@PerlDef:
5053     __CODE{getReflectAttrURIValue::
5054     $node => $self,
5055     $namespaceURI => {null},
5056     $localName => 'href',
5057     $r => $r,
5058     $defaultValue => {null},
5059     }__;
5060     @@Set:
5061     @@@nullCase:
5062     @@@@enDesc:
5063     Removes the attribute.
5064     @@@NodeReadOnlyError:
5065     @@@PerlDef:
5066     __CODE{setReflectAttrURIValue::
5067     $node => $self,
5068     $namespaceURI => {null},
5069     $localName => 'href',
5070     $given => $given,
5071     }__;
5072    
5073     @ATTR:
5074     @@Name: type
5075     @@enDesc:
5076     The <XA::type> attribute of the element.
5077    
5078     It <kwd:MUST> <I::reflect the string value
5079     of the <XA::type> attribute> of the node.
5080    
5081     The <XA::type> attribute <kwd:MAY> be used to provide
5082     a hint to the client about the media type of the
5083     resource identified by the <XA::href> attribute.
5084     The <XA::type> attribute is only meaningful if a
5085     corresponding <XA::href> attribute is also provided.
5086     @@Type: DOMString
5087     @@Get:
5088     @@@nullCase:
5089     @@@@enDesc:
5090     If the algorithm returns <DOM::null>.
5091     @@@PerlDef:
5092     __CODE{getReflectAttrStringValue::
5093     $node => $self,
5094     $namespaceURI => {null},
5095     $localName => 'type',
5096     $r => $r,
5097     $defaultValue => {null},
5098     }__;
5099     @@Set:
5100     @@@nullCase:
5101     @@@@enDesc:
5102     Removes the attribute.
5103     @@@NodeReadOnlyError:
5104     @@@PerlDef:
5105     __CODE{setReflectAttrStringValue::
5106     $node => $self,
5107     $namespaceURI => {null},
5108     $localName => 'type',
5109     $given => $given,
5110     }__;
5111     ##AtomThreadInReplyToElement
5112    
5113     IFClsDef:
5114     @IFQName: AtomLinkElementThread
5115     @ClsQName: ManakaiAtomLinkElementThread
5116    
5117     @ClsISA: ManakaiAtomLinkElement
5118    
5119     @f:implements: AtomThreadingFeature10
5120    
5121     @enDesc:
5122     An <XE::atom|link> element with a <XA::rel> attribute value of
5123     <XML::replies> may be used to reference a resource where responses
5124     to an entry may be found. If the <XA::type> attribute of the
5125     <XE::atom|link> is omitted, its value is assumed to be
5126     <XML::application/atom+xml>.
5127    
5128     A <XML::replies> link appearing as a child of the <XE::atom|feed>
5129     or <XE::atom|source> element indicates that the referenced
5130     resource likely contains responses to any of that
5131     feed's entries. A <XML::replies>
5132     link appearing as a child of an <XE::atom|entry> element
5133     indicates that the linked resource likely contains responses
5134     specific to that entry.
5135    
5136     If the feature <Feature^^DISCore|QName::AtomThreadingFeature10>
5137     is supported, any <IF::Element> whose element type
5138     is <XE::atom|link> <kwd:MUST> implement the <IF::AtomLinkElementThread>
5139     interface in addition to other appropriate interfaces.
5140    
5141     @Test:
5142     @@QName: AtomLinkElementThread.1.test
5143     @@PerlDef:
5144     my $doc;
5145     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
5146    
5147     my $el = $doc->create_element_ns (<Q::atom|>, 'link');
5148    
5149     $test->id ('interface');
5150     $test->assert_isa ($el, <IFName::AtomLinkElementThread>);
5151    
5152     $test->id ('feature');
5153     $test->assert_true ($el->is_supported (<Q::fe|AtomThreading> => '1.0'));
5154    
5155     @ATTR:
5156     @@Name: threadCount
5157     @@enDesc:
5158     The <XA::thr|count> attribute of the element.
5159    
5160     It <kwd:MUST> <I::reflect the non-negative integer value
5161     of the <XA::thr|count> attribute> of the node.
5162    
5163     An <XE::atom|link> element using the <XML::replies>
5164     <XA::rel> attribute value <kwd:MAY> contain
5165     a <XA::thr|count> attribute whose value is a
5166     non-negative integer that provides a hint to clients
5167     as to the total number of replies contained by the
5168     linked resource. The value is advisory and
5169     may not accurately reflect the actual number of replies.
5170     @@Type: idl|long||ManakaiDOM|all
5171     @@Get:
5172     @@@PerlDef:
5173     __CODE{getReflectAttrNonNegativeIntegerValue::
5174     $node => $self,
5175     $namespaceURI => {<Q::thr|>},
5176     $localName => 'count',
5177     $r => $r,
5178     $defaultValue => {null},
5179     }__;
5180     @@Set:
5181     @@@NodeReadOnlyError:
5182     @@@PerlDef:
5183     __CODE{setReflectAttrNonNegativeIntegerValue::
5184     $node => $self,
5185     $namespaceURI => {<Q::thr|>},
5186     $localName => 'count',
5187     $given => $given,
5188     }__;
5189    
5190     @@Test:
5191     @@@QName: AtomLinkElementThread.threadCount.1.test
5192     @@@PerlDef:
5193     my $doc;
5194     __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
5195    
5196     my $link = $doc->create_element_ns (<Q::atom|>, 'link');
5197    
5198     $test->id ('default');
5199     $test->assert_num_equals
5200     (expected_value => -1,
5201     actual_value =>
5202     $link-><AG::AtomLinkElementThread.threadCount>);
5203    
5204     $test->id ('zero');
5205     $link-><AS::AtomLinkElementThread.threadCount> (0);
5206     $test->assert_num_equals
5207     (expected_value => 0,
5208     actual_value =>
5209     $link-><AG::AtomLinkElementThread.threadCount>);
5210     $test->id ('zero.attr');
5211     $test->assert_equals ($link->get_attribute_ns (<Q::thr|>, 'count'), '0');
5212    
5213     $test->id ('one');
5214     $link-><AS::AtomLinkElementThread.threadCount> (1);
5215     $test->assert_num_equals
5216     (expected_value => 1,
5217     actual_value =>
5218     $link-><AG::AtomLinkElementThread.threadCount>);
5219     $test->id ('one.attr');
5220     $test->assert_equals ($link->get_attribute_ns (<Q::thr|>, 'count'), '1');
5221    
5222     $test->id ('10000');
5223     $link-><AS::AtomLinkElementThread.threadCount> (10000);
5224     $test->assert_num_equals
5225     (expected_value => 10000,
5226     actual_value =>
5227     $link-><AG::AtomLinkElementThread.threadCount>);
5228     $test->id ('10000.attr');
5229     $test->assert_equals ($link->get_attribute_ns (<Q::thr|>, 'count'),
5230     '10000');
5231    
5232     $test->id ('+10000');
5233     $link->set_attribute_ns (<Q::thr|>, 'thr:count', '+10000');
5234     $test->assert_num_equals
5235     (expected_value => 10000,
5236     actual_value =>
5237     $link-><AG::AtomLinkElementThread.threadCount>);
5238    
5239     $test->id ('010000');
5240     $link->set_attribute_ns (<Q::thr|>, 'thr:count', '010000');
5241     $test->assert_num_equals
5242     (expected_value => 10000,
5243     actual_value =>
5244     $link-><AG::AtomLinkElementThread.threadCount>);
5245    
5246     $test->id ('-100');
5247     $link-><AS::AtomLinkElementThread.threadCount> (-100);
5248     $test->assert_num_equals
5249     (expected_value => -1,
5250     actual_value =>
5251     $link-><AG::AtomLinkElementThread.threadCount>);
5252     $test->id ('-100.attr');
5253     $test->assert_false ($link->has_attribute_ns (<Q::thr|>, 'count'));
5254    
5255     $test->id ('120a');
5256     $link->set_attribute_ns (<Q::thr|>, 'thr:count', '120a');
5257     $test->assert_num_equals
5258     (expected_value => -1,
5259     actual_value =>
5260     $link-><AG::AtomLinkElementThread.threadCount>);
5261    
5262     $test->id ('-1');
5263     $link-><AS::AtomLinkElementThread.threadCount> (-1);
5264     $test->assert_num_equals
5265     (expected_value => -1,
5266     actual_value =>
5267     $link-><AG::AtomLinkElementThread.threadCount>);
5268     $test->id ('-1.attr');
5269     $test->assert_false ($link->has_attribute_ns (<Q::thr|>, 'count'));
5270    
5271     @enImplNote:
5272     @@ddid: updated
5273     @@@:
5274     {TODO::
5275     <XA::thr|updated> attribute
5276     }
5277     ##AtomLinkElementThread
5278    
5279     enImplNote:
5280     @@ddid: total
5281     @@@:
5282     {TODO::
5283     <XE::thr|total>
5284     }
5285    
5286     enImplNote:
5287     @@ddid: threaddtd
5288     @@@:
5289     {TODO::
5290     DTD impl for threading
5291     }

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24