/[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.18 - (hide annotations) (download)
Sun Nov 5 12:31:50 2006 UTC (17 years, 5 months ago) by wakaba
Branch: MAIN
Changes since 1.17: +3 -74 lines
++ manakai/bin/ChangeLog	5 Nov 2006 11:37:25 -0000
	* daf.pl Prototype declarations are added.

2006-11-05  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Markup/ChangeLog	5 Nov 2006 11:39:17 -0000
2006-11-05  Wakaba  <wakaba@suika.fam.cx>

	* Atom.dis (AtomFeedDocument, AtomEntryDocument): Removed.

++ manakai/lib/Message/DOM/ChangeLog	5 Nov 2006 11:38:15 -0000
	* DOMCore.dis (TypeInfo, UserDataHandler): Removed.

	* Element.dis (TypeInfo): Moved from |DOMCore.dis|.

	* TreeCore.dis (UserDataHandler): Moved from |DOMCore.dis|.

2006-11-05  Wakaba  <wakaba@suika.fam.cx>

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24