/[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.19 - (show annotations) (download)
Sat Dec 2 12:46:24 2006 UTC (17 years, 4 months ago) by wakaba
Branch: MAIN
CVS Tags: manakai-200612
Changes since 1.18: +4 -4 lines
++ manakai/t/ChangeLog	2 Dec 2006 12:46:13 -0000
2006-12-02  Wakaba  <wakaba@suika.fam.cx>

	* Makefile (dom-DOMString.t): New test.

++ manakai/bin/ChangeLog	2 Dec 2006 12:35:25 -0000
2006-12-02  Wakaba  <wakaba@suika.fam.cx>

	* daf.pl: Call |get_dom_implementation|
	instead of obsolete |get_implementation|.

	* grep-dis.pl: |lib/manakai/*.pl| is added.

++ manakai/lib/Message/Util/ChangeLog	2 Dec 2006 12:45:49 -0000
2006-12-02  Wakaba  <wakaba@suika.fam.cx>

	* Makefile: |lib/Message/DOM/DOMString.pm| is added.

++ manakai/lib/Message/DOM/ChangeLog	2 Dec 2006 12:45:20 -0000
2006-12-02  Wakaba  <wakaba@suika.fam.cx>

	* DOMString.dis: New module.

	* DOMString.pm: New file.

	* DOMCore.dis (min): Moved from |DOMFeature.dis|.
	(ImplementationRegistryVariable): Moved from |DOMFeature.dis|.
	Now it references the |DOMImplementationRegistry| object.
	(DOMImplementationRegistryVariable): Moved from |DOMMain.dis|.
	(DOMImplementationRegistry): New interface and
	class, reformed from |ImplementationRegistry| in |DOMFeature.dis|
	and |DOMImplementationRegistry| in |DOMMain.dis|.  Note
	that the class no longer support |get_implementation|
	and |get_implementation_list| methods from
	the |ImplementationRegistry| interface.
	(DOMImplementationList): Class implemented; no
	longer inherits from |ImplementationList|.
	(DOMImplementationSource): Class implemented; no
	longer inherits from |ImplementationSource|.  Note that
	the class no longer support |get_implementation|
	and |get_implementation_list| methods from
	the |ImplementationSource| interface.
	(DOMStringList): Removed.

	* DOMFeature.dis (min, ManakaiDOM:DOMHTMLFeature,
	ManakaiDOM:DOMEventsFeature, ManakaiDOM:DOMXMLFeature,
	ManakaiDOM:DOMXMLFeatureXML11, most part of
	documentation for obsolete DOM Level 3 Minimum Implementation
	module, obsolete property name aliases,
	ImplemenationRegistryVar, ImplementationRegistry,
	DEBUG, MIString, ImplementationList, ImplementationSource,
	ManakaiDOM:implID): Removed.

	* DOMMain.dis (Redefine, RedefinedBy, Redefined): Removed.
	(DOMString): Removed.
	(DOMImplementationRegistryVar, DOMImplementationRegistry): Removed.

	* Makefile: |DOMString.pm| is added.

	* TreeCore.dis (is_default_namespace): |null| was
	returned where a false is expected (|null| is
	a false in Perl, but real |false| is appropriate here).

1 Module:
2 @QName: Markup|Atom
3 @enFN:
4 Atom DOM
5 @enDesc:
6 The <DFN::Atom DOM> is a language and platform independent
7 programming language interface to Atom 1.0 documents
8 built on the W3C Document Object Model (DOM). It defines
9 a number of interfaces that provide convenience
10 methods and attributes to process Atom 1.0 documents.
11
12 {TODO::
13 - Move descriptions below to somewhere.
14
15 - Formal definition for <IF::StaticNodeList> (reference
16 to Selectors API?) is necessary.
17 }
18
19 Some attributes are defined to contain a <IF::StaticNodeList>.
20 Multiple invocations for such an attribute don't have
21 to return exactly same object, even if no changes are made
22 on the underlying DOM structure.
23
24 {NOTE::
25 The equality of <IF::StaticNodeList> objects as per
26 the <M::Node.isEqualNode> method, however, is
27 preserved as long as the underlying DOM structure
28 and the configuration parameters are not changed.
29 }
30
31 Methods and attributes defined in this module does <EM::not>
32 support <IF::tx|EntityReference>s; for example, an element
33 node that is a child node of an entity reference node
34 that is a child node of another element node is <EM::not> considered
35 as a child element node of the other element node. As a
36 result, applications written using this module might ignore
37 parts of Atom documents unless they configures their XML
38 parser not to expose entity references in the result DOM tree.
39
40 @Namespace:
41 http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/Atom/
42
43 @DISCore:author: DISCore|Wakaba
44 @License: license|Perl+MPL
45 @Date:
46 $Date: 2006/11/05 12:31:50 $
47
48 @Require:
49 @@Module:
50 @@@QName: Markup|common
51 @@Module:
52 @@@QName: MDOM|TreeCore
53 @@@WithFor: ManakaiDOM|ManakaiDOMLatest
54 @@Module:
55 @@@WithFor: ManakaiDOM|ManakaiDOM
56 @@Module:
57 @@@WithFor: ManakaiDOM|ManakaiDOMLatest
58 @@Module:
59 @@@QName: DISlib|DISMarkup
60 @@@WithFor: ManakaiDOM|all
61 @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 @DISlib:
71 http://suika.fam.cx/~wakaba/archive/2004/dis/
72 @dis:
73 http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
74 @dlp:
75 http://suika.fam.cx/~wakaba/archive/2004/dis/Perl#
76 @d:
77 http://suika.fam.cx/~wakaba/archive/2004/dom/xdt#
78 @DOMMain:
79 http://suika.fam.cx/~wakaba/archive/2004/dom/main#
80 @domperl:
81 http://suika.fam.cx/~wakaba/archive/2006/dom/perl/
82 @dx:
83 http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#
84 @dxm:
85 http://suika.fam.cx/~wakaba/archive/2004/dis/XML#
86 @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 @mv:
111 http://suika.fam.cx/www/2006/05/mv/
112 @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 @thr:
125 http://purl.org/syndication/thread/1.0
126 @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 @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 @@@@: mv|AttributeType
184 @@@ForCheck: s|ForML
185 @@ForCheck: !=ManakaiDOM|ManakaiDOM
186
187 ElementTypeBinding:
188 @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 @Name: IFClsConstructDef
307 @ElementType:
308 dis:ResourceDef
309 @ShadowContent:
310 @@DISCore:resourceType:
311 @@@@: dis|MultipleResource
312 @@@ForCheck:
313 !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML !mv|ForCM !mv|ForAG
314 @@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 @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 @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 @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 @Name: enLN
506 @ElementType:
507 mv:longName
508 @ShadowContent:
509 @@lang:en
510
511 ElementTypeBinding:
512 @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
570 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 ## -- Modules
582
583 ModuleSetDef:
584 @QName: Atom
585 @enLN: Atom
586 @mv:version: 1.0
587 @mv:contains: AtomDatatypes
588 @mv:contains: AtomProperties
589 @mv:contains: AtomEntry
590 @mv:contains: AtomFeed
591 @mv:contains: AtomQName
592
593 @mv:targetNamespace: atom|
594 @mv:defaultNamespacePrefix: atom
595 @mv:systemIdentifierBaseURI: \
596
597 ModuleDef:
598 @QName: AtomFeed
599 @mv:id: feed
600 @enLN: Feed
601 @mv:contains: feed-prop
602 @mv:contains: atom|feed
603
604 ModuleDef:
605 @QName: AtomEntry
606 @mv:id: entry
607 @enLN: Entry
608 @mv:contains: entry-prop
609 @mv:contains: atom|entry
610
611 ModuleDef:
612 @QName: AtomProperties
613 @mv:id: props
614 @enLN: Properties
615 @mv:contains: atom|content
616 @mv:contains: atom|contributor
617 @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 @mv:contains: atom|icon
624 @mv:contains: atom|id
625 @mv:contains: atom|logo
626 @mv:contains: atom|rights
627 @mv:contains: atom|subtitle
628 @mv:contains: atom|summary
629 @mv:contains: atom|title
630 @mv:contains: source-prop
631 @mv:contains: atom|source
632
633 ModuleDef:
634 @QName: AtomDatatypes
635 @mv:id: datatypes
636 @enLN: Datatypes
637
638 @mv:contains: atomNCName
639 @mv:contains: atomMediaType
640 @mv:contains: atomLanguageTag
641 @mv:contains: atomUri
642 @mv:contains: atomUriCM
643 @mv:contains: atomEmailAddress
644 @mv:contains: atomEmailAddressCM
645
646 @mv:contains: undefinedAttributes
647 @mv:contains: undefinedContent
648 @mv:contains: atomCommonAttributes
649
650 @mv:contains: simpleExtensionElements
651 @mv:contains: structuredExtensionElements
652 @mv:contains: extensionElements
653
654 @mv:contains: TextAG
655 @mv:contains: TextCM
656
657 @mv:contains: atom|name
658 @mv:contains: atom|email
659 @mv:contains: atom|uri
660 @mv:contains: PersonAG
661 @mv:contains: person-prop
662 @mv:contains: PersonCM
663
664 @mv:contains: DateAG
665 @mv:contains: DateCM
666
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
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
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
707 ## -- Implementation
708
709 IFClsDef:
710 @IFQName: AtomImplementation
711 @ClsQName: ManakaiAtomImplementation
712
713 @domperl:implementedByObjectsOf: c|DOMImplementation
714 @domperl:classImplementedByObjectsOf: c|ManakaiDOMImplementation
715
716 @enDesc:
717 The <IF::AtomImplementation> interface provides convenience
718 methods to create Atom documents.
719
720 @f:provides: AtomFeature10
721 @f:implements: AtomFeature10
722
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 (<Class::c|ManakaiDOMImplementation>->isa ($interface));
735 }
736 @Test:
737 @@QName: ImplementationRegistry.AtomImplementation.1.test
738 @@PerlDef:
739 require Message::Markup::Atom;
740 my $impl = $Message::DOM::ImplementationRegistry
741 ->get_dom_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_dom_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_dom_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 @@@Type: AtomDocument
799 @@@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 @@@Type: AtomDocument
982 @@@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
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 ##AtomImplementation
1617
1618 IFClsDef:
1619 @IFQName: AtomDocument
1620 @ClsQName: ManakaiAtomDocument
1621
1622 @domperl:implementedByObjectsOf: Document
1623 @domperl:classImplementedByObjectsOf: td|ManakaiDOMDocument
1624
1625 @f:implements: AtomFeature10
1626
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 AGDef:
1650 @QName: atomCommonAttributes
1651 @enFN: common attributes
1652 @mv:attributeTypeGroupName: common
1653
1654 @mv:refers: Atom
1655
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 @mv:refers: undefinedAttributes
1665 ##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 STCDef:
1690 @QName: atomUriCM
1691 @mv:elementContentModelName: URI
1692 @cm: (dxm|PCDATA||ManakaiDOM|all)*
1693
1694 STDef:
1695 @QName: atomEmailAddress
1696 @mv:datatypeEntityName: EmailAddress
1697 #subsetOf xsd|string
1698 #pattern
1699 STCDef:
1700 @QName: atomEmailAddressCM
1701 @mv:elementContentModelName: EmailAddress
1702 @cm: (dxm|PCDATA||ManakaiDOM|all)*
1703
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 @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 @Name: STDef
1738 @ElementType:
1739 dis:ResourceDef
1740 @ShadowContent:
1741 @@DISCore:resourceType: mv|XMLDTDDatatypeEntity
1742 @@For: =ManakaiDOM|ManakaiDOMLatest
1743
1744 ElementTypeBinding:
1745 @Name: STCDef
1746 @ElementType:
1747 dis:ResourceDef
1748 @ShadowContent:
1749 @@DISCore:resourceType: mv|ElementContentModel
1750 @@For: =ManakaiDOM|ManakaiDOMLatest
1751
1752 IFClsDef:
1753 @IFQName: AtomElement
1754 @ClsQName: ManakaiAtomElement
1755
1756 @IFISA: Element
1757 @ClsISA: te|ManakaiDOMElement
1758
1759 @f:implements: AtomFeature10
1760 @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 ElementTypeBinding:
1812 @Name: cm
1813 @ElementType:
1814 mv:elementContentModel
1815 @ShadowContent:
1816 @@ContentType: lang|dcmodel
1817
1818 IFClsConstructDef:
1819 @IFQName: AtomTextConstruct
1820 @ClsQName: ManakaiAtomTextConstruct
1821 @AGQName: TextAG
1822 @AGName: text
1823 @CMQName: TextCM
1824 @CMName: text
1825
1826 @IFISA: AtomElement
1827 @ClsISA: ManakaiAtomElement
1828
1829 @f:implements: AtomFeature10
1830 @mv:refers: atomCommonAttributes
1831
1832 @cm:
1833 dxm|ANY||ManakaiDOM|all
1834 @enImplNote:
1835 @@ddid:cm
1836 @@@:
1837 {TODO::
1838 (dxm|PCDATA||ManakaiDOM|all | html|div)*
1839 }
1840
1841 @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 small quantities. The content of a Text construct is
1850 Language-Sensitive.
1851
1852 @ATTR:
1853 @@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 IFClsConstructDef:
1961 @IFQName: AtomPersonConstruct
1962 @ClsQName: ManakaiAtomPersonConstruct
1963 @AGQName: PersonAG
1964 @AGName: person
1965 @CMQName: PersonCM
1966 @CMName: person
1967
1968 @IFISA: AtomElement
1969 @ClsISA: ManakaiAtomElement
1970
1971 @f:implements: AtomFeature10
1972 @mv:refers: atomCommonAttributes
1973
1974 @cm:
1975 (person-prop+)
1976
1977 @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 @@Type: AtomNameElement
2025 @@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 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 IFClsConstructDef:
2118 @IFQName: AtomDateConstruct
2119 @ClsQName: ManakaiAtomDateConstruct
2120 @AGQName: DateAG
2121 @AGName: date
2122 @CMQName: DateCM
2123 @CMName: date
2124
2125 @IFISA: AtomElement
2126 @ClsISA: ManakaiAtomElement
2127
2128 @f:implements: AtomFeature10
2129 @mv:refers: atomCommonAttributes
2130
2131 @cm:
2132 (dxm|PCDATA||ManakaiDOM|all)*
2133 @enImplNote:
2134 @@ddid: cm
2135 @@@:
2136 {TODO::
2137 xsd|dateTime
2138 }
2139
2140 @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 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 IFClsETDef:
2228 @IFQName: AtomFeedElement
2229 @ETQName: atom|feed
2230 @ETRQName: atom|feed
2231 @ClsQName: ManakaiAtomFeedElement
2232
2233 @IFISA: AtomElement
2234 @ClsISA: ManakaiAtomElement
2235
2236 @f:implements: AtomFeature10
2237 @mv:refers: atomCommonAttributes
2238
2239 @cm:
2240 (feed-prop+, atom|entry*)
2241
2242 @enDesc:
2243 The <XE::atom|feed> element is the document element
2244 of an Atom Feed Document.
2245
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
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
2846 $self-><M::Node.appendChild> ($r);
2847 }__;
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
2914 $test->id ('parent');
2915 $test->assert_equals ($ent-><AG::Node.parentNode>, $feed);
2916 @@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 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 IFClsETDef:
2952 @IFQName: AtomEntryElement
2953 @ETQName: atom|entry
2954 @ETRQName: atom|entry
2955 @ClsQName: ManakaiAtomEntryElement
2956
2957 @IFISA: AtomElement
2958 @ClsISA: ManakaiAtomElement
2959
2960 @f:implements: AtomFeature10
2961 @mv:refers: atomCommonAttributes
2962
2963 @cm:
2964 (entry-prop+)
2965
2966 @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
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
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 @IFQName: AtomIdElement
3487 @ETQName: atom|id
3488 @ETRQName: atom|id
3489 @ClsQName: ManakaiAtomIdElement
3490
3491 @IFISA: AtomElement
3492 @ClsISA: ManakaiAtomElement
3493
3494 @f:implements: AtomFeature10
3495 @mv:refers: atomCommonAttributes
3496
3497 @cm: atomUriCM
3498 ##AtomIdElement
3499
3500 IFClsETDef:
3501 @IFQName: AtomIconElement
3502 @ETQName: atom|icon
3503 @ETRQName: atom|icon
3504 @ClsQName: ManakaiAtomIconElement
3505
3506 @IFISA: AtomElement
3507 @ClsISA: ManakaiAtomElement
3508
3509 @f:implements: AtomFeature10
3510 @mv:refers: atomCommonAttributes
3511
3512 @cm: atomUriCM
3513 ##AtomIconElement
3514
3515 IFClsETDef:
3516 @IFQName: AtomNameElement
3517 @ETQName: atom|name
3518 @ETRQName: atom|name
3519 @ClsQName: ManakaiAtomNameElement
3520
3521 @IFISA: AtomElement
3522 @ClsISA: ManakaiAtomElement
3523
3524 @f:implements: AtomFeature10
3525 # no common attribs
3526 @cm: TextCM
3527
3528 @mv:refers: Atom
3529 ##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
3540 @f:implements: AtomFeature10
3541 # no common attribs
3542 @cm: atomUriCM
3543
3544 @mv:refers: Atom
3545 ##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
3556 @f:implements: AtomFeature10
3557 # no common attribs
3558 @cm: atomEmailAddressCM
3559
3560 @mv:refers: Atom
3561 ##AtomEmailElement
3562
3563 IFClsETDef:
3564 @IFQName: AtomLogoElement
3565 @ETQName: atom|logo
3566 @ETRQName: atom|logo
3567 @ClsQName: ManakaiAtomLogoElement
3568
3569 @IFISA: AtomElement
3570 @ClsISA: ManakaiAtomElement
3571
3572 @f:implements: AtomFeature10
3573 @mv:refers: atomCommonAttributes
3574
3575 @cm: atomUriCM
3576 ##AtomLogoElement
3577
3578 IFClsETDef:
3579 @IFQName: AtomContentElement
3580 @ETQName: atom|content
3581 @ETRQName: atom|content
3582 @ClsQName: ManakaiAtomContentElement
3583
3584 @IFISA: AtomElement
3585 @ClsISA: ManakaiAtomElement
3586
3587 @f:implements: AtomFeature10
3588 @mv:refers: atomCommonAttributes
3589
3590 @cm:
3591 dxm|ANY||ManakaiDOM|all
3592
3593 @enDesc:
3594 The <XE::atom|content> element either contains or links to
3595 the content of the entry.
3596
3597 @ATTR:
3598 @@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 @ATTR:
3663 @@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 @ETRQName: atom|author
3837 @ClsQName: ManakaiAtomAuthorElement
3838
3839 @IFISA: AtomPersonConstruct
3840 @ClsISA: ManakaiAtomPersonConstruct
3841
3842 @f:implements: AtomFeature10
3843 @mv:refers: PersonAG
3844 @mv:elementContentModel: PersonCM
3845
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 @ETRQName: atom|category
3855 @ClsQName: ManakaiAtomCategoryElement
3856
3857 @IFISA: AtomElement
3858 @ClsISA: ManakaiAtomElement
3859
3860 @f:implements: AtomFeature10
3861 @mv:refers: atomCommonAttributes
3862
3863 @cm: undefinedContent
3864
3865 @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 @ETRQName: atom|contributor
3974 @ClsQName: ManakaiAtomContributorElement
3975
3976 @IFISA: AtomPersonConstruct
3977 @ClsISA: ManakaiAtomPersonConstruct
3978
3979 @f:implements: AtomFeature10
3980 @mv:refers: PersonAG
3981 @mv:elementContentModel: PersonCM
3982
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 @ETRQName: atom|generator
3993 @ClsQName: ManakaiAtomGeneratorElement
3994
3995 @IFISA: AtomElement
3996 @ClsISA: ManakaiAtomElement
3997
3998 @f:implements: AtomFeature10
3999 @mv:refers: atomCommonAttributes
4000
4001 @cm:
4002 (dxm|PCDATA||ManakaiDOM|all)*
4003
4004 @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 @ETRQName: atom|link
4080 @ClsQName: ManakaiAtomLinkElement
4081
4082 @IFISA: AtomElement
4083 @ClsISA: ManakaiAtomElement
4084
4085 @f:implements: AtomFeature10
4086 @mv:refers: atomCommonAttributes
4087
4088 @cm: undefinedContent
4089
4090 @enDesc:
4091 The <XE::atom|link> element defines a reference from an entry
4092 or feed to a Web resource.
4093
4094 @ATTR:
4095 @@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 @@actualType: DOMURI
4103 @@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 @ATTR:
4129 @@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 @@actualType: DOMURI
4139 @@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 @ATTR:
4213 @@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 @@@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 @@@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
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 @@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 @@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 @ATTR:
4335 @@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 @ATTR:
4368 @@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 @ATTR:
4401 @@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 @ETRQName: atom|published
4438 @ClsQName: ManakaiAtomPublishedElement
4439
4440 @IFISA: AtomDateConstruct
4441 @ClsISA: ManakaiAtomDateConstruct
4442
4443 @f:implements: AtomFeature10
4444 @mv:refers: DateAG
4445 @mv:elementContentModel: DateCM
4446
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 @ETRQName: atom|rights
4460 @ClsQName: ManakaiAtomRightsElement
4461
4462 @IFISA: AtomTextConstruct
4463 @ClsISA: ManakaiAtomTextConstruct
4464
4465 @f:implements: AtomFeature10
4466 @mv:refers: TextAG
4467 @mv:elementContentModel: TextCM
4468
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 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 IFClsETDef:
4493 @IFQName: AtomSourceElement
4494 @ETQName: atom|source
4495 @ETRQName: atom|source
4496 @ClsQName: ManakaiAtomSourceElement
4497
4498 @IFISA: AtomElement
4499 @ClsISA: ManakaiAtomElement
4500
4501 @f:implements: AtomFeature10
4502 @mv:refers: atomCommonAttributes
4503
4504 @cm:
4505 (source-prop*)
4506
4507 @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 @ETRQName: atom|subtitle
4712 @ClsQName: ManakaiAtomSubtitleElement
4713
4714 @IFISA: AtomTextConstruct
4715 @ClsISA: ManakaiAtomTextConstruct
4716
4717 @f:implements: AtomFeature10
4718 @mv:refers: TextAG
4719 @mv:elementContentModel: TextCM
4720
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 @ETRQName: atom|summary
4730 @ClsQName: ManakaiAtomSummaryElement
4731
4732 @IFISA: AtomTextConstruct
4733 @ClsISA: ManakaiAtomTextConstruct
4734
4735 @f:implements: AtomFeature10
4736 @mv:refers: TextAG
4737 @mv:elementContentModel: TextCM
4738
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 @ETRQName: atom|title
4748 @ClsQName: ManakaiAtomTitleElement
4749
4750 @IFISA: AtomTextConstruct
4751 @ClsISA: ManakaiAtomTextConstruct
4752
4753 @f:implements: AtomFeature10
4754 @mv:refers: TextAG
4755 @mv:elementContentModel: TextCM
4756
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 @ETRQName: atom|updated
4766 @ClsQName: ManakaiAtomUpdatedElement
4767
4768 @IFISA: AtomDateConstruct
4769 @ClsISA: ManakaiAtomDateConstruct
4770
4771 @f:implements: AtomFeature10
4772 @mv:refers: DateAG
4773 @mv:elementContentModel: DateCM
4774
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
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 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
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