--- messaging/manakai/lib/Message/Markup/Atom.dis 2006/05/13 05:40:58 1.3 +++ messaging/manakai/lib/Message/Markup/Atom.dis 2006/12/29 14:45:44 1.20 @@ -43,7 +43,7 @@ @DISCore:author: DISCore|Wakaba @License: license|Perl+MPL @Date: - $Date: 2006/05/13 05:40:58 $ + $Date: 2006/12/29 14:45:44 $ @Require: @@Module: @@ -55,6 +55,9 @@ @@@WithFor: ManakaiDOM|ManakaiDOM @@Module: @@@WithFor: ManakaiDOM|ManakaiDOMLatest + @@Module: + @@@QName: DISlib|DISMarkup + @@@WithFor: ManakaiDOM|all @DefaultFor: ManakaiDOM|ManakaiDOMLatest Namespace: @@ -64,16 +67,22 @@ http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core# @cfg: http://suika.fam.cx/www/2006/dom-config/ + @DISlib: + http://suika.fam.cx/~wakaba/archive/2004/dis/ @dis: http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-- - @doc: - http://suika.fam.cx/~wakaba/archive/2005/7/tutorial# + @dlp: + http://suika.fam.cx/~wakaba/archive/2004/dis/Perl# @d: http://suika.fam.cx/~wakaba/archive/2004/dom/xdt# @DOMMain: http://suika.fam.cx/~wakaba/archive/2004/dom/main# + @domperl: + http://suika.fam.cx/~wakaba/archive/2006/dom/perl/ @dx: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException# + @dxm: + http://suika.fam.cx/~wakaba/archive/2004/dis/XML# @ecore: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/Core/ @f: @@ -94,14 +103,12 @@ http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom# @Markup: http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup# - @mat: - http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/Atom/ @MDOM: http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM. @MDOMX: http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception# - @dlp: - http://suika.fam.cx/~wakaba/archive/2004/dis/Perl# + @mv: + http://suika.fam.cx/www/2006/05/mv/ @rel: http://www.iana.org/assignments/relation/ @s: @@ -114,6 +121,8 @@ http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/ @test: http://suika.fam.cx/~wakaba/archive/2004/dis/Test# + @thr: + http://purl.org/syndication/thread/1.0 @tx: http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/ @urigen: @@ -160,6 +169,22 @@ @@ForCheck: !=ManakaiDOM|ManakaiDOM ElementTypeBinding: + @Name: ATTR + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: + @@@@: DISLang|Attribute + @@@ForCheck: ManakaiDOM|ForIF + @@DISCore:resourceType: + @@@@: DISLang|Attribute + @@@ForCheck: ManakaiDOM|ForClass + @@DISCore:resourceType: + @@@@: mv|AttributeType + @@@ForCheck: s|ForML + @@ForCheck: !=ManakaiDOM|ManakaiDOM + +ElementTypeBinding: @Name: Get @ElementType: dis:ResourceDef @@ -249,8 +274,6 @@ @@@@: s|ElementType @@@ForCheck: s|ForML - @@f:implements: AtomFeature10 - ElementTypeBinding: @Name: IFClsDef @ElementType: @@ -279,7 +302,45 @@ @@@ContentType: DISCore|TFPQNames @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest - @@f:implements: AtomFeature10 +ElementTypeBinding: + @Name: IFClsConstructDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: + @@@@: dis|MultipleResource + @@@ForCheck: + !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML !mv|ForCM !mv|ForAG + @@resourceFor: ManakaiDOM|ForIF + @@resourceFor: ManakaiDOM|ForClass + @@resourceFor: mv|ForCM + @@resourceFor: mv|ForAG + @@For: ManakaiDOM|ManakaiDOM + + @@DISCore:resourceType: + @@@@: DISLang|Interface + @@@ForCheck: ManakaiDOM|ForIF + + @@DISCore:resourceType: + @@@@: DISLang|Class + @@@ForCheck: ManakaiDOM|ForClass + @@Implement: + @@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF + @@@ContentType: DISCore|TFPQNames + @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM + @@Implement: + @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF + @@@ContentType: DISCore|TFPQNames + @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest + + @@DISCore:resourceType: + @@@@: mv|AttributeTypeGroup + @@@ForCheck: mv|ForAG + + @@DISCore:resourceType: + @@@@: mv|ElementContentModel + @@@ForCheck: mv|ForCM + ElementTypeBinding: @Name: IFQName @@ -311,6 +372,34 @@ @@ContentType: DISCore|QName ElementTypeBinding: + @Name: CMQName + @ElementType: + dis:QName + @ShadowContent: + @@ForCheck: mv|ForCM + +ElementTypeBinding: + @Name: CMName + @ElementType: + mv:elementContentModelName + @ShadowContent: + @@ForCheck: mv|ForCM + +ElementTypeBinding: + @Name: AGQName + @ElementType: + dis:QName + @ShadowContent: + @@ForCheck: mv|ForAG + +ElementTypeBinding: + @Name: AGName + @ElementType: + mv:attributeTypeGroupName + @ShadowContent: + @@ForCheck: mv|ForAG + +ElementTypeBinding: @Name: IFISA @ElementType: dis:ISA @@ -413,6 +502,13 @@ @@lang:en ElementTypeBinding: + @Name: enLN + @ElementType: + mv:longName + @ShadowContent: + @@lang:en + +ElementTypeBinding: @Name: TrueCase @ElementType: dis:ResourceDef @@ -471,20 +567,158 @@ @@enDesc: The Atom DOM, version 1.0. +FeatureDef: + @featureQName: fe|AtomThreading + @QName: AtomThreadingFeature + @FeatureVerDef: + @@QName: AtomThreadingFeature10 + @@Version: 1.0 + @@f:instanceOf: AtomThreadingFeature + @@f:requires: fe|AtomFeature10 + @@enDesc: + The Atom Threading Extension DOM, version 1.0. + +## -- Modules + +ModuleSetDef: + @QName: Atom + @enLN: Atom + @mv:version: 1.0 + @mv:contains: AtomDatatypes + @mv:contains: AtomProperties + @mv:contains: AtomEntry + @mv:contains: AtomFeed + @mv:contains: AtomQName + + @mv:targetNamespace: atom| + @mv:defaultNamespacePrefix: atom + @mv:systemIdentifierBaseURI: \ + +ModuleDef: + @QName: AtomFeed + @mv:id: feed + @enLN: Feed + @mv:contains: feed-prop + @mv:contains: atom|feed + +ModuleDef: + @QName: AtomEntry + @mv:id: entry + @enLN: Entry + @mv:contains: entry-prop + @mv:contains: atom|entry + +ModuleDef: + @QName: AtomProperties + @mv:id: props + @enLN: Properties + @mv:contains: atom|content + @mv:contains: atom|contributor + @mv:contains: atom|category + @mv:contains: atom|generator + @mv:contains: atom|link + @mv:contains: atom|author + @mv:contains: atom|published + @mv:contains: atom|updated + @mv:contains: atom|icon + @mv:contains: atom|id + @mv:contains: atom|logo + @mv:contains: atom|rights + @mv:contains: atom|subtitle + @mv:contains: atom|summary + @mv:contains: atom|title + @mv:contains: source-prop + @mv:contains: atom|source + +ModuleDef: + @QName: AtomDatatypes + @mv:id: datatypes + @enLN: Datatypes + + @mv:contains: atomNCName + @mv:contains: atomMediaType + @mv:contains: atomLanguageTag + @mv:contains: atomUri + @mv:contains: atomUriCM + @mv:contains: atomEmailAddress + @mv:contains: atomEmailAddressCM + + @mv:contains: undefinedAttributes + @mv:contains: undefinedContent + @mv:contains: atomCommonAttributes + + @mv:contains: simpleExtensionElements + @mv:contains: structuredExtensionElements + @mv:contains: extensionElements + + @mv:contains: TextAG + @mv:contains: TextCM + + @mv:contains: atom|name + @mv:contains: atom|email + @mv:contains: atom|uri + @mv:contains: PersonAG + @mv:contains: person-prop + @mv:contains: PersonCM + + @mv:contains: DateAG + @mv:contains: DateCM + +ResourceDef: + @QName: AtomQName + @enLN: Qualified Names + @mv:id: qname + @For: =ManakaiDOM|ManakaiDOMLatest + @DISCore:resourceType: mv|XMLDTDQNameModule + + @mv:contains: Atom + +ResourceDef: + @QName: Atom10 + @enLN: Atom 1.0 + @mv:id: atom10 + @For: =ManakaiDOM|ManakaiDOMLatest + @DISCore:resourceType: mv|XMLDTDDriver + + @mv:refers: Atom + + @mv:refers: AtomQName + @mv:refers: AtomDatatypes + @mv:refers: AtomProperties + @mv:refers: AtomEntry + @mv:refers: AtomFeed + +ElementTypeBinding: + @Name: ModuleSetDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|XMLDTDModuleSet + @@For: =ManakaiDOM|ManakaiDOMLatest + +ElementTypeBinding: + @Name: ModuleDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|XMLDTDModule + @@For: =ManakaiDOM|ManakaiDOMLatest + ## -- Implementation IFClsDef: @IFQName: AtomImplementation @ClsQName: ManakaiAtomImplementation - @IFISA: c|DOMImplementation - @ClsISA: c|ManakaiDOMImplementation + @domperl:implementedByObjectsOf: c|DOMImplementation + @domperl:classImplementedByObjectsOf: c|ManakaiDOMImplementation @enDesc: The interface provides convenience methods to create Atom documents. @f:provides: AtomFeature10 + @f:implements: AtomFeature10 @Test: @@QName: AtomImplementation.interface.test @@ -493,20 +727,18 @@ , , , - , - , , ) { $test->id ($interface); $test->assert_true - (->isa ($interface)); + (->isa ($interface)); } @Test: @@QName: ImplementationRegistry.AtomImplementation.1.test @@PerlDef: require Message::Markup::Atom; my $impl = $Message::DOM::ImplementationRegistry - ->get_implementation ({ + ->get_dom_implementation ({ => '1.0', }); @@ -516,7 +748,7 @@ @@PerlDef: require Message::Markup::Atom; my $impl = $Message::DOM::ImplementationRegistry - ->get_implementation ({ + ->get_dom_implementation ({ Core => '3.0', => '1.0', }); @@ -527,7 +759,7 @@ @@PerlDef: require Message::Markup::Atom; my $impl = $Message::DOM::ImplementationRegistry - ->get_implementation ({ + ->get_dom_implementation ({ XML => '3.0', => '1.0', }); @@ -563,7 +795,7 @@ The implementation treate as if an empty string is specified. @@Return: - @@@Type: AtomFeedDocument + @@@Type: AtomDocument @@@enDesc: The newly created Atom Feed Document. @@ -746,7 +978,7 @@ The implementation treate as if an empty string is specified. @@Return: - @@@Type: AtomEntryDocument + @@@Type: AtomDocument @@@enDesc: The newly created Atom Entry Document. @@ -1289,16 +1521,108 @@ attribute should be provided for published and created? } + + @CODE: + @@QName: getReflectAttrNonNegativeIntegerValue + @@enDesc: + {P:: If a DOM attribute is defined to attribute> + of the node , the getter of the attribute + return the value defined by the algorithm: + + {OLI:: If the contains an attribute node whose name + is : + + = If the of the is + one or more sequence of digits (, + , ..., ) optionally + preceding by a , then + the attribute getter return a value + by interpreting the of the + as a decimal number. + + } + + = If a default value is explicitly defined + where this algorithm is referenced, it + return the default value. + + = Otherwise, it return a binding-specific + default value, if it is defined by the specification + of the binding, or . + + } + + {NOTE:: + In Atom Threading Extension , + the and leading s + are prohibitted. + } + @@PerlDef: + __DEEP{ + E: { + $r = $node-> ($namespaceURI, $localName); + if (defined $r) { + if ($r =~ /\A\+?([0-9]+)\z/) { + $r = 0+$1; + last E; + } + } + + $r = $defaultValue; + $r = -1 unless defined $r; + } # E + }__; + + @CODE: + @@QName: setReflectAttrNonNegativeIntegerValue + @@enDesc: + {P:: If a DOM attribute is defined to attribute> of the node , + the setter of the attribute modify the node as + defined by the algorithm: + + = If the given value is or one of binding-specific + default values, if any, as defined by the specification + of the binding, it + remove the attribute node, if any, + from the list of attribute nodes of . + + = Otherwise, it set the + attribute node value to a string representation + of the given value as if + the method were invoked. + The string representation be a decimal + number consist of one or more sequence of digits + (, , ..., ) + any leading . + The be omitted. + + } + + {NOTE:: + It might throw an exception. + } + @@PerlDef: + __DEEP{ + if (defined $given and $given >= 0) { + $node-> + ($namespaceURI, $localName, 0+$given); + } else { + $node-> ($namespaceURI, $localName); + } + }__; ##AtomImplementation IFClsDef: @IFQName: AtomDocument @ClsQName: ManakaiAtomDocument - @IFISA: Document - @ClsISA: td|ManakaiDOMDocument + @domperl:implementedByObjectsOf: Document + @domperl:classImplementedByObjectsOf: td|ManakaiDOMDocument - @s:rootElementType: AnyAtomElement||ManakaiDOM|all + @f:implements: AtomFeature10 @enDesc: If the feature version @@ -1322,80 +1646,108 @@ $test->assert_isa ($doc, ); ##AtomDocument -IFClsDef: - @IFQName: AtomFeedDocument - @ClsQName: ManakaiFeedEntryDocument - - @IFISA: AtomDocument - @ClsISA: ManakaiAtomDocument - - @s:rootElementType: - @@@: atom|feed - @@DISCore:stopISARecursive: 1 - - @enDesc: - The interface provides convenience - methods and attributes for an Atom - Feed Document, i.e. representation of an Atom feed. - - If the feature version - is supported, a object whose 's - element type, if any, is at least at - the time of creation also - implement the interface. Other - objects also implement - the interface. - - @Test: - @@QName: createDocument.AtomFeedDocument.test - @@PerlDef: - my $impl; - __CODE{tc|createImplForTest:: $impl => $impl}__; - - my $doc = $impl-> - (, 'feed'); - - $test->id ('interface'); - $test->assert_isa ($doc, ); -##AtomFeedDocument +AGDef: + @QName: atomCommonAttributes + @enFN: common attributes + @mv:attributeTypeGroupName: common -IFClsDef: - @IFQName: AtomEntryDocument - @ClsQName: ManakaiAtomEntryDocument + @mv:refers: Atom + + @ATDef: + @@mv:attributeTypeName: xml|base + @@mv:attributeValueType: atomUri + + @ATDef: + @@mv:attributeTypeName: xml|lang + @@mv:attributeValueType: atomLanguageTag + + @mv:refers: undefinedAttributes +##atomCommonAttributes + +STDef: + @QName: atomNCName + @mv:datatypeEntityName: NCName + #subsetOf: xsd|string + #minLength, pattern + +STDef: + @QName: atomMediaType + @mv:datatypeEntityName: MediaType + #subsetOf xsd|string + # pattern + +STDef: + @QName: atomLanguageTag + @mv:datatypeEntityName: LangaugeTag + #subsetOf: xsd|string + #pattern + +STDef: + @QName: atomUri + @mv:datatypeEntityName: URI + #aliasfor text +STCDef: + @QName: atomUriCM + @mv:elementContentModelName: URI + @cm: (dxm|PCDATA||ManakaiDOM|all)* + +STDef: + @QName: atomEmailAddress + @mv:datatypeEntityName: EmailAddress + #subsetOf xsd|string + #pattern +STCDef: + @QName: atomEmailAddressCM + @mv:elementContentModelName: EmailAddress + @cm: (dxm|PCDATA||ManakaiDOM|all)* - @IFISA: AtomDocument - @ClsISA: ManakaiAtomDocument +ElementTypeBinding: + @Name: AGDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|AttributeTypeGroup + @@For: =ManakaiDOM|ManakaiDOMLatest - @s:rootElementType: - @@@: atom|entry - @@DISCore:stopISARecursive: 1 +ElementTypeBinding: + @Name: ATDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|AttributeType + @@For: =ManakaiDOM|ManakaiDOMLatest - @enDesc: - The interface provides convenience - methods and attributes for an Atom - Entry Document, i.e. exactly one Atom entry, outside - of the context of an Atom feed. +ElementTypeBinding: + @Name: ECDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|ElementTypeClass + @@For: =ManakaiDOM|ManakaiDOMLatest - If the feature version - is supported, a object whose 's - element type, if any, is at least at - the time of the creation also - implement the interface. Other - objects also implement - the interface. +ElementTypeBinding: + @Name: EMDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|ElementTypeClassMix + @@For: =ManakaiDOM|ManakaiDOMLatest - @Test: - @@QName: createDocument.AtomEntryDocument.test - @@PerlDef: - my $impl; - __CODE{tc|createImplForTest:: $impl => $impl}__; - - my $doc = $impl-> - (, 'entry'); +ElementTypeBinding: + @Name: STDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|XMLDTDDatatypeEntity + @@For: =ManakaiDOM|ManakaiDOMLatest - $test->id ('interface'); - $test->assert_isa ($doc, ); -##AtomEntryDocument +ElementTypeBinding: + @Name: STCDef + @ElementType: + dis:ResourceDef + @ShadowContent: + @@DISCore:resourceType: mv|ElementContentModel + @@For: =ManakaiDOM|ManakaiDOMLatest IFClsDef: @IFQName: AtomElement @@ -1404,6 +1756,7 @@ @IFISA: Element @ClsISA: te|ManakaiDOMElement + @f:implements: AtomFeature10 @s:elementType: AnyAtomElement||ManakaiDOM|all @enDesc: @@ -1455,13 +1808,36 @@ @@ContentType: DISCore|QName @ForCheck: =ManakaiDOM|all -IFClsDef: +ElementTypeBinding: + @Name: cm + @ElementType: + mv:elementContentModel + @ShadowContent: + @@ContentType: lang|dcmodel + +IFClsConstructDef: @IFQName: AtomTextConstruct @ClsQName: ManakaiAtomTextConstruct + @AGQName: TextAG + @AGName: text + @CMQName: TextCM + @CMName: text @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + dxm|ANY||ManakaiDOM|all + @enImplNote: + @@ddid:cm + @@@: + {TODO:: + (dxm|PCDATA||ManakaiDOM|all | html|div)* + } + @enDesc: The interface provides convenience methods and attributes for nodes @@ -1470,10 +1846,10 @@ interface. A Text construct contains human-readable text, usually in - small quantities. The content of Text constructs is + small quantities. The content of a Text construct is Language-Sensitive. - @Attr: + @ATTR: @@Name: type @@enDesc: The attribute of the element. @@ -1581,13 +1957,23 @@ $test->assert_equals ($el->, $con); ##AtomTextConstruct -IFClsDef: +IFClsConstructDef: @IFQName: AtomPersonConstruct @ClsQName: ManakaiAtomPersonConstruct + @AGQName: PersonAG + @AGName: person + @CMQName: PersonCM + @CMName: person @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + (person-prop+) + @enDesc: The interface provides convenience methods and attributes for nodes @@ -1635,7 +2021,7 @@ @@Name: nameElement @@enDesc: The child element of the node. - @@Type: AtomElement + @@Type: AtomNameElement @@Get: @@@enDesc: It child element> @@ -1720,13 +2106,37 @@ }__; ##AtomPersonConstruct -IFClsDef: +ECDef: + @QName: person-prop + @mv:elementTypeClassName: person-prop + @mv:refers: atom|name + @mv:refers: atom|uri + @mv:refers: atom|email + @mv:refers: extensionElements + +IFClsConstructDef: @IFQName: AtomDateConstruct @ClsQName: ManakaiAtomDateConstruct + @AGQName: DateAG + @AGName: date + @CMQName: DateCM + @CMName: date @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + (dxm|PCDATA||ManakaiDOM|all)* + @enImplNote: + @@ddid: cm + @@@: + {TODO:: + xsd|dateTime + } + @enDesc: The interface provides convenience methods and attributes for nodes @@ -1797,6 +2207,23 @@ } ##AtomDateConstruct +ECDef: + @QName: feed-prop + @mv:elementTypeClassName: feed-prop + @mv:refers: atom|author + @mv:refers: atom|category + @mv:refers: atom|contributor + @mv:refers: atom|generator + @mv:refers: atom|icon + @mv:refers: atom|id + @mv:refers: atom|link + @mv:refers: atom|logo + @mv:refers: atom|rights + @mv:refers: atom|subtitle + @mv:refers: atom|title + @mv:refers: atom|updated + @mv:refers: extensionElements + IFClsETDef: @IFQName: AtomFeedElement @ETQName: atom|feed @@ -1806,6 +2233,12 @@ @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + (feed-prop+, atom|entry*) + @enDesc: The element is the document element of an Atom Feed Document. @@ -2409,6 +2842,8 @@ (, 'updated'); $updatede-> (scalar time); $r-> ($updatede); + + $self-> ($r); }__; @@Test: @@ -2475,6 +2910,9 @@ $test->assert_num_not_equals (actual_value => $updated->, expected_value => 0); + + $test->id ('parent'); + $test->assert_equals ($ent->, $feed); @@Test: @@@QName: AtomFeedElement.addNewEntry.2.test @@@enDesc: @@ -2493,6 +2931,23 @@ (, 'lang')); ##AtomFeedElement +ECDef: + @QName: entry-prop + @mv:elementTypeClassName: entry-prop + @mv:refers: atom|author + @mv:refers: atom|category + @mv:refers: atom|content + @mv:refers: atom|contributor + @mv:refers: atom|id + @mv:refers: atom|link + @mv:refers: atom|published + @mv:refers: atom|rights + @mv:refers: atom|source + @mv:refers: atom|summary + @mv:refers: atom|title + @mv:refers: atom|updated + @mv:refers: extensionElements + IFClsETDef: @IFQName: AtomEntryElement @ETQName: atom|entry @@ -2502,6 +2957,12 @@ @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + (entry-prop+) + @enDesc: The element represents an individual entry, acting as a container for metadata and data @@ -2674,7 +3135,9 @@ $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0); $test->id ('parent'); + my $parent; for ($doc-> (, 'feed')) { + $parent = $_; $_-> ($doc-> (, 'author')); $_-> @@ -2694,7 +3157,9 @@ my $el = $doc-> (, 'entry'); $test->id ('parent'); + my $parent; for ($doc-> (, 'feed')) { + $parent = $_; $_-> ($doc-> (, 'author')); $_-> @@ -3022,18 +3487,118 @@ ##AtomEntryElement IFClsETDef: + @IFQName: AtomIdElement + @ETQName: atom|id + @ETRQName: atom|id + @ClsQName: ManakaiAtomIdElement + + @IFISA: AtomElement + @ClsISA: ManakaiAtomElement + + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: atomUriCM +##AtomIdElement + +IFClsETDef: + @IFQName: AtomIconElement + @ETQName: atom|icon + @ETRQName: atom|icon + @ClsQName: ManakaiAtomIconElement + + @IFISA: AtomElement + @ClsISA: ManakaiAtomElement + + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: atomUriCM +##AtomIconElement + +IFClsETDef: + @IFQName: AtomNameElement + @ETQName: atom|name + @ETRQName: atom|name + @ClsQName: ManakaiAtomNameElement + + @IFISA: AtomElement + @ClsISA: ManakaiAtomElement + + @f:implements: AtomFeature10 + # no common attribs + @cm: TextCM + + @mv:refers: Atom +##AtomNameElement + +IFClsETDef: + @IFQName: AtomUriElement + @ETQName: atom|uri + @ETRQName: atom|uri + @ClsQName: ManakaiAtomUriElement + + @IFISA: AtomElement + @ClsISA: ManakaiAtomElement + + @f:implements: AtomFeature10 + # no common attribs + @cm: atomUriCM + + @mv:refers: Atom +##AtomUriElement + +IFClsETDef: + @IFQName: AtomEmailElement + @ETQName: atom|email + @ETRQName: atom|email + @ClsQName: ManakaiAtomEmailElement + + @IFISA: AtomElement + @ClsISA: ManakaiAtomElement + + @f:implements: AtomFeature10 + # no common attribs + @cm: atomEmailAddressCM + + @mv:refers: Atom +##AtomEmailElement + +IFClsETDef: + @IFQName: AtomLogoElement + @ETQName: atom|logo + @ETRQName: atom|logo + @ClsQName: ManakaiAtomLogoElement + + @IFISA: AtomElement + @ClsISA: ManakaiAtomElement + + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: atomUriCM +##AtomLogoElement + +IFClsETDef: @IFQName: AtomContentElement @ETQName: atom|content + @ETRQName: atom|content @ClsQName: ManakaiAtomContentElement @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + dxm|ANY||ManakaiDOM|all + @enDesc: The element either contains or links to the content of the entry. - @Attr: + @ATTR: @@Name: type @@enDesc: The type of the element. @@ -3098,7 +3663,7 @@ $el-> (null); $test->assert_null ($el->); - @Attr: + @ATTR: @@Name: src @@enDesc: The source of the remote content of the element. @@ -3272,11 +3837,16 @@ IFClsETDef: @IFQName: AtomAuthorElement @ETQName: atom|author + @ETRQName: atom|author @ClsQName: ManakaiAtomAuthorElement @IFISA: AtomPersonConstruct @ClsISA: ManakaiAtomPersonConstruct + @f:implements: AtomFeature10 + @mv:refers: PersonAG + @mv:elementContentModel: PersonCM + @enDesc: The element is a Person construct that indicates the author of the entry or feed. @@ -3285,11 +3855,17 @@ IFClsETDef: @IFQName: AtomCategoryElement @ETQName: atom|category + @ETRQName: atom|category @ClsQName: ManakaiAtomCategoryElement @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: undefinedContent + @enDesc: The element conveys information abut a category associated with an entry or feed. @@ -3398,11 +3974,16 @@ IFClsETDef: @IFQName: AtomContributorElement @ETQName: atom|contributor + @ETRQName: atom|contributor @ClsQName: ManakaiAtomContributorElement @IFISA: AtomPersonConstruct @ClsISA: ManakaiAtomPersonConstruct + @f:implements: AtomFeature10 + @mv:refers: PersonAG + @mv:elementContentModel: PersonCM + @enDesc: The element is a Person construct that indicates a person or other entity who contributed to the entry @@ -3412,11 +3993,18 @@ IFClsETDef: @IFQName: AtomGeneratorElement @ETQName: atom|generator + @ETRQName: atom|generator @ClsQName: ManakaiAtomGeneratorElement @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + (dxm|PCDATA||ManakaiDOM|all)* + @enDesc: The element identifies the agent used to generate a feed. @@ -3492,16 +4080,22 @@ IFClsETDef: @IFQName: AtomLinkElement @ETQName: atom|link + @ETRQName: atom|link @ClsQName: ManakaiAtomLinkElement @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: undefinedContent + @enDesc: The element defines a reference from an entry or feed to a Web resource. - @Attr: + @ATTR: @@Name: href @@enDesc: The attribute of the element. @@ -3509,7 +4103,7 @@ It attribute> of the node. @@Type: DOMString - @@Type: DOMURI + @@actualType: DOMURI @@Get: @@@nullCase: @@@@enDesc: @@ -3535,7 +4129,7 @@ $given => $given, }__; - @Attr: + @ATTR: @@Name: rel @@enDesc: The attribute of the element. @@ -3545,6 +4139,7 @@ a few exceptions. The default value be . @@Type: DOMString + @@actualType: DOMURI @@Get: @@@enDesc: If the algorithm returns a string that does not contain @@ -3618,7 +4213,7 @@ $test->assert_equals ($el->, ); - @Attr: + @ATTR: @@Name: type @@enDesc: The attribute of the element. @@ -3627,6 +4222,18 @@ of the attribute> of the node. @@Type: DOMString @@Get: + @@@enDesc: + {P:: If the feature + is supported, the attribute getter return + the string when both of the + following conditions are met: + + - The attribute getter would otherwise return . + + - The attribute contains + a string value of . + + } @@@nullCase: @@@@enDesc: If the algorithm returns . @@ -3638,6 +4245,15 @@ $r => $r, $defaultValue => {null}, }__; + + unless (defined $r) { + __DEEP{ + my $rel = $self->; + if (defined $rel and $rel eq ) { + $r = q; + } + }__; + } @@Set: @@@nullCase: @@@@enDesc: @@ -3651,7 +4267,75 @@ $given => $given, }__; - @Attr: + @@Test: + @@@QName: AtomLinkElement.type.!rel.test + @@@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $el = $doc-> (, 'link'); + + $test->id ('implied'); + my $type0 = $el->; + $test->assert_null ($type0); + + $test->id ('explicit'); + $el-> ('application/atom+xml'); + my $type1 = $el->; + $test->assert_equals ($type1, q); + + $test->id ('different'); + $el-> ('application/xhtml+xml'); + my $type2 = $el->; + $test->assert_equals ($type2, q); + @@Test: + @@@QName: AtomLinkElement.type.rel!=replies.test + @@@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $el = $doc-> (, 'link'); + + $el-> (); + + $test->id ('implied'); + my $type0 = $el->; + $test->assert_null ($type0); + + $test->id ('explicit'); + $el-> ('application/atom+xml'); + my $type1 = $el->; + $test->assert_equals ($type1, q); + + $test->id ('different'); + $el-> ('application/xhtml+xml'); + my $type2 = $el->; + $test->assert_equals ($type2, q); + @@Test: + @@@QName: AtomLinkElement.type.rel=replies.test + @@@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $el = $doc-> (, 'link'); + + $el-> (); + + $test->id ('implied'); + my $type0 = $el->; + $test->assert_equals ($type0, q); + + $test->id ('explicit'); + $el-> ('application/atom+xml'); + my $type1 = $el->; + $test->assert_equals ($type1, q); + + $test->id ('different'); + $el-> ('application/xhtml+xml'); + my $type2 = $el->; + $test->assert_equals ($type2, q); + + @ATTR: @@Name: hreflang @@enDesc: The attribute of the element. @@ -3684,7 +4368,7 @@ $given => $given, }__; - @Attr: + @ATTR: @@Name: title @@enDesc: The attribute of the element. @@ -3717,7 +4401,7 @@ $given => $given, }__; - @Attr: + @ATTR: @@Name: length @@enDesc: The attribute of the element. @@ -3754,11 +4438,16 @@ IFClsETDef: @IFQName: AtomPublishedElement @ETQName: atom|published + @ETRQName: atom|published @ClsQName: ManakaiAtomPublishedElement @IFISA: AtomDateConstruct @ClsISA: ManakaiAtomDateConstruct + @f:implements: AtomFeature10 + @mv:refers: DateAG + @mv:elementContentModel: DateCM + @enDesc: The element is a Date construct indicating an instant in time associated with an @@ -3771,25 +4460,54 @@ IFClsETDef: @IFQName: AtomRightsElement @ETQName: atom|rights + @ETRQName: atom|rights @ClsQName: ManakaiAtomRightsElement @IFISA: AtomTextConstruct @ClsISA: ManakaiAtomTextConstruct + @f:implements: AtomFeature10 + @mv:refers: TextAG + @mv:elementContentModel: TextCM + @enDesc: The element is a Text construct that conveys information about rights held in and over an entry or feed. ##AtomRightsElement +ECDef: + @QName: source-prop + @mv:elementTypeClassName: source-prop + @mv:refers: atom|author + @mv:refers: atom|category + @mv:refers: atom|contributor + @mv:refers: atom|generator + @mv:refers: atom|icon + @mv:refers: atom|id + @mv:refers: atom|link + @mv:refers: atom|logo + @mv:refers: atom|rights + @mv:refers: atom|subtitle + @mv:refers: atom|title + @mv:refers: atom|updated + @mv:refers: extensionElements + IFClsETDef: @IFQName: AtomSourceElement @ETQName: atom|source + @ETRQName: atom|source @ClsQName: ManakaiAtomSourceElement @IFISA: AtomElement @ClsISA: ManakaiAtomElement + @f:implements: AtomFeature10 + @mv:refers: atomCommonAttributes + + @cm: + (source-prop*) + @Attr: @@Name: authorElements @@enDesc: @@ -3994,11 +4712,16 @@ IFClsETDef: @IFQName: AtomSubtitleElement @ETQName: atom|subtitle + @ETRQName: atom|subtitle @ClsQName: ManakaiAtomSubtitleElement @IFISA: AtomTextConstruct @ClsISA: ManakaiAtomTextConstruct + @f:implements: AtomFeature10 + @mv:refers: TextAG + @mv:elementContentModel: TextCM + @enDesc: The element is a Text construct that conveys a human-readable description or subtitle for a feed. @@ -4007,11 +4730,16 @@ IFClsETDef: @IFQName: AtomSummaryElement @ETQName: atom|summary + @ETRQName: atom|summary @ClsQName: ManakaiAtomSummaryElement @IFISA: AtomTextConstruct @ClsISA: ManakaiAtomTextConstruct + @f:implements: AtomFeature10 + @mv:refers: TextAG + @mv:elementContentModel: TextCM + @enDesc: The element is a Text construct that conveys a short summary, abstract, or excerpt of an entry. @@ -4020,11 +4748,16 @@ IFClsETDef: @IFQName: AtomTitleElement @ETQName: atom|title + @ETRQName: atom|title @ClsQName: ManakaiAtomTitleElement @IFISA: AtomTextConstruct @ClsISA: ManakaiAtomTextConstruct + @f:implements: AtomFeature10 + @mv:refers: TextAG + @mv:elementContentModel: TextCM + @enDesc: The element is a Text construct that conveys a human-readable title for an entry or feed. @@ -4033,11 +4766,16 @@ IFClsETDef: @IFQName: AtomUpdatedElement @ETQName: atom|updated + @ETRQName: atom|updated @ClsQName: ManakaiAtomUpdatedElement @IFISA: AtomDateConstruct @ClsISA: ManakaiAtomDateConstruct + @f:implements: AtomFeature10 + @mv:refers: DateAG + @mv:elementContentModel: DateCM + @enDesc: The element is a Date construct indicating the most recent instant in time when an @@ -4127,3 +4865,475 @@ @@For: ManakaiDOM|DOM3 @@For: =ManakaiDOM|all @@Type: idl|boolean||ManakaiDOM|all + +ECDef: + @QName: simpleExtensionElements + @mv:elementTypeClassName: simple.extra + @DISCore:resourceType: mv|ElementTypeAdditionalClass + +ECDef: + @QName: structuredExtensionElements + @mv:elementTypeClassName: structured.extra + @DISCore:resourceType: mv|ElementTypeAdditionalClass + +EMDef: + @QName: extensionElements + @mv:elementTypeClassName: extra + @mv:refers: simpleExtensionElements + @mv:refers: structuredExtensionElements + @DISCore:resourceType: mv|ElementTypeAdditionalClass + +AGDef: + @QName: undefinedAttributes + @mv:attributeTypeGroupName: common.extra + +ResourceDef: + @QName: undefinedContent + @mv:elementContentModelName: undefined + @For: =ManakaiDOM|ManakaiDOMLatest + @DISCore:resourceType: mv|ElementContentModel + @cm: dxm|ANY||ManakaiDOM|all + @enImplNote: + (text | anyForeignElement)* + +## -- Atom Threading Extension [RFC 4685] + +IFClsDef: + @IFQName: AtomEntryElementThread + @ClsQName: ManakaiAtomEntryElementThread + + @ClsISA: ManakaiAtomEntryElement + + @f:implements: AtomThreadingFeature10 + + @enDesc: + If the feature + is supported, any whose element type + is implement the + interface in addition to other appropriate interfaces. + + @Test: + @@QName: AtomEntryElementThread.1.test + @@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $el = $doc->create_element_ns (, 'entry'); + + $test->id ('interface'); + $test->assert_isa ($el, ); + + $test->id ('feature'); + $test->assert_true ($el->is_supported ( => '1.0')); + + @Attr: + @@Name: threadInReplyToElements + @@enDesc: + A static list of child elements of the node. + @@Type: StaticNodeList + @@Get: + @@@enDesc: + It child element list> + of the node. + @@@PerlDef: + __CODE{returnChildElementList:: + $node => $self, + $namespaceURI => {}, + $localName => 'in-reply-to', + $r => $r, + }__; +##AtomEntryElementThread + +IFClsETDef: + @IFQName: AtomThreadInReplyToElement + @ETQName: thr|in-reply-to + @ETRQName: thr|in-reply-to + @ClsQName: ManakaiAtomThreadInReplyToElement + + @IFISA: AtomDateConstruct + @ClsISA: ManakaiAtomDateConstruct + + @f:implements: AtomThreadingFeature10 + @mv:refers: atomCommonAttributes + + @cm: undefinedContent + + @enDesc: + The element is used to indicate + that an entry is a response to another resource. + + If the entry is a response to multiple resources, + additional element + be used. + + RFC 4685 assigns no significance to the order in which + multiple element appear within + an entry. + + @Test: + @@QName: AtomThreadInReplyToElement.1.test + @@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $el = $doc->create_element_ns (, 'in-reply-to'); + + $test->id ('interface'); + $test->assert_isa ($el, ); + + $test->id ('feature'); + $test->assert_true ($el->is_supported ( => '1.0')); + + @ATTR: + @@Name: ref + @@enDesc: + The attribute of the element. + + It attribute> of the node. + + The attribute specifies the persistent, + universally unique identifier of the resource being + responded to. The value conform to + the same construction and comparison rules as the + value of the element. Though the IRI + might use a dereferenceable scheme, processors + assume that it can be dereferenced. + + The element contain + a attribute identifying the resource that + is being respnoded to. + + If the resource being responded to does not have a persistent, + universally unique identifier, the publisher assign an + identifier that satisfies all the considerations in Section 4.2.6 of + RFC 4287 for use as the value of the attribute. + In that case, if a representation of the resource can be retrieved + from an IRI that can be used as a valid atom:id value, then this IRI + be used as the value of both the and + attributes. + @@Type: DOMString + @@actualType: DOMURI + @@Get: + @@@nullCase: + @@@@enDesc: + If the algorithm returns . + @@@PerlDef: + __CODE{getReflectAttrURIValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'ref', + $r => $r, + $defaultValue => {null}, + }__; + @@Set: + @@@nullCase: + @@@@enDesc: + Removes the attribute. + @@@NodeReadOnlyError: + @@@PerlDef: + __CODE{setReflectAttrURIValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'ref', + $given => $given, + }__; + + @ATTR: + @@Name: source + @@enDesc: + The attribute of the element. + + It attribute> of the node. + + The attribute be used to specify the IRI + of an Atom Feed or Entry Document containing an + with an value equal to the + value of the attribute. The IRI specified + be dereferenceable. + @@Type: DOMString + @@actualType: DOMURI + @@Get: + @@@nullCase: + @@@@enDesc: + If the algorithm returns . + @@@PerlDef: + __CODE{getReflectAttrURIValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'source', + $r => $r, + $defaultValue => {null}, + }__; + @@Set: + @@@nullCase: + @@@@enDesc: + Removes the attribute. + @@@NodeReadOnlyError: + @@@PerlDef: + __CODE{setReflectAttrURIValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'source', + $given => $given, + }__; + + @ATTR: + @@Name: href + @@enDesc: + The attribute of the element. + + It attribute> of the node. + + The attribute specifies an IRI that may be used + to retrieve a representation of the resource being + responded to. The IRI specified be + dereferenceable. + @@Type: DOMString + @@actualType: DOMURI + @@Get: + @@@nullCase: + @@@@enDesc: + If the algorithm returns . + @@@PerlDef: + __CODE{getReflectAttrURIValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'href', + $r => $r, + $defaultValue => {null}, + }__; + @@Set: + @@@nullCase: + @@@@enDesc: + Removes the attribute. + @@@NodeReadOnlyError: + @@@PerlDef: + __CODE{setReflectAttrURIValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'href', + $given => $given, + }__; + + @ATTR: + @@Name: type + @@enDesc: + The attribute of the element. + + It attribute> of the node. + + The attribute be used to provide + a hint to the client about the media type of the + resource identified by the attribute. + The attribute is only meaningful if a + corresponding attribute is also provided. + @@Type: DOMString + @@Get: + @@@nullCase: + @@@@enDesc: + If the algorithm returns . + @@@PerlDef: + __CODE{getReflectAttrStringValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'type', + $r => $r, + $defaultValue => {null}, + }__; + @@Set: + @@@nullCase: + @@@@enDesc: + Removes the attribute. + @@@NodeReadOnlyError: + @@@PerlDef: + __CODE{setReflectAttrStringValue:: + $node => $self, + $namespaceURI => {null}, + $localName => 'type', + $given => $given, + }__; +##AtomThreadInReplyToElement + +IFClsDef: + @IFQName: AtomLinkElementThread + @ClsQName: ManakaiAtomLinkElementThread + + @ClsISA: ManakaiAtomLinkElement + + @f:implements: AtomThreadingFeature10 + + @enDesc: + An element with a attribute value of + may be used to reference a resource where responses + to an entry may be found. If the attribute of the + is omitted, its value is assumed to be + . + + A link appearing as a child of the + or element indicates that the referenced + resource likely contains responses to any of that + feed's entries. A + link appearing as a child of an element + indicates that the linked resource likely contains responses + specific to that entry. + + If the feature + is supported, any whose element type + is implement the + interface in addition to other appropriate interfaces. + + @Test: + @@QName: AtomLinkElementThread.1.test + @@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $el = $doc->create_element_ns (, 'link'); + + $test->id ('interface'); + $test->assert_isa ($el, ); + + $test->id ('feature'); + $test->assert_true ($el->is_supported ( => '1.0')); + + @ATTR: + @@Name: threadCount + @@enDesc: + The attribute of the element. + + It attribute> of the node. + + An element using the + attribute value contain + a attribute whose value is a + non-negative integer that provides a hint to clients + as to the total number of replies contained by the + linked resource. The value is advisory and + may not accurately reflect the actual number of replies. + @@Type: idl|long||ManakaiDOM|all + @@Get: + @@@PerlDef: + __CODE{getReflectAttrNonNegativeIntegerValue:: + $node => $self, + $namespaceURI => {}, + $localName => 'count', + $r => $r, + $defaultValue => {null}, + }__; + @@Set: + @@@NodeReadOnlyError: + @@@PerlDef: + __CODE{setReflectAttrNonNegativeIntegerValue:: + $node => $self, + $namespaceURI => {}, + $localName => 'count', + $given => $given, + }__; + + @@Test: + @@@QName: AtomLinkElementThread.threadCount.1.test + @@@PerlDef: + my $doc; + __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__; + + my $link = $doc->create_element_ns (, 'link'); + + $test->id ('default'); + $test->assert_num_equals + (expected_value => -1, + actual_value => + $link->); + + $test->id ('zero'); + $link-> (0); + $test->assert_num_equals + (expected_value => 0, + actual_value => + $link->); + $test->id ('zero.attr'); + $test->assert_equals ($link->get_attribute_ns (, 'count'), '0'); + + $test->id ('one'); + $link-> (1); + $test->assert_num_equals + (expected_value => 1, + actual_value => + $link->); + $test->id ('one.attr'); + $test->assert_equals ($link->get_attribute_ns (, 'count'), '1'); + + $test->id ('10000'); + $link-> (10000); + $test->assert_num_equals + (expected_value => 10000, + actual_value => + $link->); + $test->id ('10000.attr'); + $test->assert_equals ($link->get_attribute_ns (, 'count'), + '10000'); + + $test->id ('+10000'); + $link->set_attribute_ns (, 'thr:count', '+10000'); + $test->assert_num_equals + (expected_value => 10000, + actual_value => + $link->); + + $test->id ('010000'); + $link->set_attribute_ns (, 'thr:count', '010000'); + $test->assert_num_equals + (expected_value => 10000, + actual_value => + $link->); + + $test->id ('-100'); + $link-> (-100); + $test->assert_num_equals + (expected_value => -1, + actual_value => + $link->); + $test->id ('-100.attr'); + $test->assert_false ($link->has_attribute_ns (, 'count')); + + $test->id ('120a'); + $link->set_attribute_ns (, 'thr:count', '120a'); + $test->assert_num_equals + (expected_value => -1, + actual_value => + $link->); + + $test->id ('-1'); + $link-> (-1); + $test->assert_num_equals + (expected_value => -1, + actual_value => + $link->); + $test->id ('-1.attr'); + $test->assert_false ($link->has_attribute_ns (, 'count')); + + @enImplNote: + @@ddid: updated + @@@: + {TODO:: + attribute + } +##AtomLinkElementThread + +enImplNote: + @@ddid: total + @@@: + {TODO:: + + } + +enImplNote: + @@ddid: threaddtd + @@@: + {TODO:: + DTD impl for threading + }