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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.13 by wakaba, Sun Sep 10 11:19:24 2006 UTC revision 1.21 by wakaba, Sat Dec 30 04:42:55 2006 UTC
# Line 52  Module: Line 52  Module:
52        @@@QName: MDOM|TreeCore        @@@QName: MDOM|TreeCore
53        @@@WithFor: ManakaiDOM|ManakaiDOMLatest        @@@WithFor: ManakaiDOM|ManakaiDOMLatest
54      @@Module:      @@Module:
       @@@WithFor: ManakaiDOM|ManakaiDOM  
     @@Module:  
       @@@WithFor: ManakaiDOM|ManakaiDOMLatest  
     @@Module:  
55        @@@QName: DISlib|DISMarkup        @@@QName: DISlib|DISMarkup
56        @@@WithFor: ManakaiDOM|all        @@@WithFor: ManakaiDOM|all
57    @DefaultFor: ManakaiDOM|ManakaiDOMLatest    @DefaultFor: ManakaiDOM|ManakaiDOMLatest
# Line 77  Namespace: Line 73  Namespace:
73      http://suika.fam.cx/~wakaba/archive/2004/dom/xdt#      http://suika.fam.cx/~wakaba/archive/2004/dom/xdt#
74    @DOMMain:    @DOMMain:
75      http://suika.fam.cx/~wakaba/archive/2004/dom/main#      http://suika.fam.cx/~wakaba/archive/2004/dom/main#
76      @domperl:
77        http://suika.fam.cx/~wakaba/archive/2006/dom/perl/
78    @dx:    @dx:
79      http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#      http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#
80    @dxm:    @dxm:
# Line 119  Namespace: Line 117  Namespace:
117      http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/      http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/
118    @test:    @test:
119      http://suika.fam.cx/~wakaba/archive/2004/dis/Test#      http://suika.fam.cx/~wakaba/archive/2004/dis/Test#
120      @thr:
121        http://purl.org/syndication/thread/1.0
122    @tx:    @tx:
123      http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/      http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/
124    @urigen:    @urigen:
# Line 252  ElementTypeBinding: Line 252  ElementTypeBinding:
252      @@DISCore:resourceType:      @@DISCore:resourceType:
253        @@@@: DISLang|Class        @@@@: DISLang|Class
254        @@@ForCheck: ManakaiDOM|ForClass        @@@ForCheck: ManakaiDOM|ForClass
255      @@Implement:  
       @@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF  
       @@@ContentType: DISCore|TFPQNames  
       @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM  
256      @@Implement:      @@Implement:
257        @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF        @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF
258        @@@ContentType: DISCore|TFPQNames        @@@ContentType: DISCore|TFPQNames
# Line 270  ElementTypeBinding: Line 267  ElementTypeBinding:
267        @@@@: s|ElementType        @@@@: s|ElementType
268        @@@ForCheck: s|ForML        @@@ForCheck: s|ForML
269    
     @@f:implements: AtomFeature10  
   
270  ElementTypeBinding:  ElementTypeBinding:
271    @Name: IFClsDef    @Name: IFClsDef
272    @ElementType:    @ElementType:
# Line 291  ElementTypeBinding: Line 286  ElementTypeBinding:
286      @@DISCore:resourceType:      @@DISCore:resourceType:
287        @@@@: DISLang|Class        @@@@: DISLang|Class
288        @@@ForCheck: ManakaiDOM|ForClass        @@@ForCheck: ManakaiDOM|ForClass
289      @@Implement:  
       @@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF  
       @@@ContentType: DISCore|TFPQNames  
       @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM  
290      @@Implement:      @@Implement:
291        @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF        @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF
292        @@@ContentType: DISCore|TFPQNames        @@@ContentType: DISCore|TFPQNames
293        @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest        @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOMLatest
294    
     @@f:implements: AtomFeature10  
   
295  ElementTypeBinding:  ElementTypeBinding:
296    @Name: IFClsConstructDef    @Name: IFClsConstructDef
297    @ElementType:    @ElementType:
# Line 324  ElementTypeBinding: Line 314  ElementTypeBinding:
314      @@DISCore:resourceType:      @@DISCore:resourceType:
315        @@@@: DISLang|Class        @@@@: DISLang|Class
316        @@@ForCheck: ManakaiDOM|ForClass        @@@ForCheck: ManakaiDOM|ForClass
317      @@Implement:  
       @@@@: ||ManakaiDOM|ManakaiDOM||ManakaiDOM|ForIF  
       @@@ContentType: DISCore|TFPQNames  
       @@@ForCheck: ManakaiDOM|ForClass ManakaiDOM|ManakaiDOM  
318      @@Implement:      @@Implement:
319        @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF        @@@@: ||ManakaiDOM|ManakaiDOMLatest||ManakaiDOM|ForIF
320        @@@ContentType: DISCore|TFPQNames        @@@ContentType: DISCore|TFPQNames
# Line 341  ElementTypeBinding: Line 328  ElementTypeBinding:
328        @@@@: mv|ElementContentModel        @@@@: mv|ElementContentModel
329        @@@ForCheck: mv|ForCM        @@@ForCheck: mv|ForCM
330    
     @@f:implements: AtomFeature10  
331    
332  ElementTypeBinding:  ElementTypeBinding:
333    @Name: IFQName    @Name: IFQName
# Line 568  FeatureDef: Line 554  FeatureDef:
554      @@enDesc:      @@enDesc:
555        The Atom DOM, version 1.0.        The Atom DOM, version 1.0.
556    
557    FeatureDef:
558      @featureQName: fe|AtomThreading
559      @QName: AtomThreadingFeature
560      @FeatureVerDef:
561        @@QName: AtomThreadingFeature10
562        @@Version: 1.0
563        @@f:instanceOf: AtomThreadingFeature
564        @@f:requires: fe|AtomFeature10
565        @@enDesc:
566          The Atom Threading Extension DOM, version 1.0.
567    
568  ## -- Modules  ## -- Modules
569    
570  ModuleSetDef:  ModuleSetDef:
# Line 700  IFClsDef: Line 697  IFClsDef:
697    @IFQName: AtomImplementation    @IFQName: AtomImplementation
698    @ClsQName: ManakaiAtomImplementation    @ClsQName: ManakaiAtomImplementation
699    
700    @IFISA: c|DOMImplementation    @domperl:implementedByObjectsOf: c|DOMImplementation
701    @ClsISA: c|ManakaiDOMImplementation    @domperl:classImplementedByObjectsOf: c|ManakaiDOMImplementation
702    
703    @enDesc:    @enDesc:
704      The <IF::AtomImplementation> interface provides convenience      The <IF::AtomImplementation> interface provides convenience
705      methods to create Atom documents.      methods to create Atom documents.
706    
707    @f:provides: AtomFeature10    @f:provides: AtomFeature10
708      @f:implements: AtomFeature10
709    
710    @Test:    @Test:
711      @@QName: AtomImplementation.interface.test      @@QName: AtomImplementation.interface.test
712      @@PerlDef:      @@PerlDef:
713        for my $interface (        for my $interface (
714          <IFName::AtomImplementation>,          <IFName::AtomImplementation>,
         <IFName::AtomImplementation||ManakaiDOM|ManakaiDOM>,  
715          <IFName::c|DOMImplementation>,          <IFName::c|DOMImplementation>,
         <IFName::urigen|URIImplementation>,  
         <IFName::f|MinimumImplementation>,  
716          <IFName::f|GetFeature>,          <IFName::f|GetFeature>,
717        ) {        ) {
718          $test->id ($interface);          $test->id ($interface);
719          $test->assert_true          $test->assert_true
720                   (<Class::ManakaiAtomImplementation>->isa ($interface));                   (<Class::c|ManakaiDOMImplementation>->isa ($interface));
721        }        }
722    @Test:    @Test:
723      @@QName: ImplementationRegistry.AtomImplementation.1.test      @@QName: ImplementationRegistry.AtomImplementation.1.test
724      @@PerlDef:      @@PerlDef:
725        require Message::Markup::Atom;        require Message::Markup::Atom;
726        my $impl = $Message::DOM::ImplementationRegistry        my $impl = $Message::DOM::ImplementationRegistry
727                     ->get_implementation ({                     ->get_dom_implementation ({
728                         <Q::fe|Atom> => '1.0',                         <Q::fe|Atom> => '1.0',
729                       });                       });
730    
# Line 739  IFClsDef: Line 734  IFClsDef:
734      @@PerlDef:      @@PerlDef:
735        require Message::Markup::Atom;        require Message::Markup::Atom;
736        my $impl = $Message::DOM::ImplementationRegistry        my $impl = $Message::DOM::ImplementationRegistry
737                     ->get_implementation ({                     ->get_dom_implementation ({
738                         Core => '3.0',                         Core => '3.0',
739                         <Q::fe|Atom> => '1.0',                         <Q::fe|Atom> => '1.0',
740                       });                       });
# Line 750  IFClsDef: Line 745  IFClsDef:
745      @@PerlDef:      @@PerlDef:
746        require Message::Markup::Atom;        require Message::Markup::Atom;
747        my $impl = $Message::DOM::ImplementationRegistry        my $impl = $Message::DOM::ImplementationRegistry
748                     ->get_implementation ({                     ->get_dom_implementation ({
749                         XML => '3.0',                         XML => '3.0',
750                         <Q::fe|Atom> => '1.0',                         <Q::fe|Atom> => '1.0',
751                       });                       });
# Line 786  IFClsDef: Line 781  IFClsDef:
781            The implementation <kwd:MUST> treate <DOM::null>            The implementation <kwd:MUST> treate <DOM::null>
782            as if an empty string is specified.            as if an empty string is specified.
783      @@Return:      @@Return:
784        @@@Type: AtomFeedDocument        @@@Type: AtomDocument
785        @@@enDesc:        @@@enDesc:
786          The newly created Atom Feed Document.          The newly created Atom Feed Document.
787    
# Line 969  IFClsDef: Line 964  IFClsDef:
964            The implementation <kwd:MUST> treate <DOM::null>            The implementation <kwd:MUST> treate <DOM::null>
965            as if an empty string is specified.            as if an empty string is specified.
966      @@Return:      @@Return:
967        @@@Type: AtomEntryDocument        @@@Type: AtomDocument
968        @@@enDesc:        @@@enDesc:
969          The newly created Atom Entry Document.          The newly created Atom Entry Document.
970    
# Line 1512  IFClsDef: Line 1507  IFClsDef:
1507          <QUOTE::reflecting Date child element> attribute should          <QUOTE::reflecting Date child element> attribute should
1508          be provided for published and created?          be provided for published and created?
1509        }        }
 ##AtomImplementation  
1510    
1511  IFClsDef:    @CODE:
1512    @IFQName: AtomDocument      @@QName: getReflectAttrNonNegativeIntegerValue
1513    @ClsQName: ManakaiAtomDocument      @@enDesc:
1514          {P:: If a DOM attribute is defined to <DFN::reflect the
1515               non-negative integer value of the <VAR::attr-name> attribute>
1516               of the node <VAR::E>, the getter of the attribute <kwd:MUST>
1517               return the value defined by the algorithm:
1518    
1519            {OLI:: If the <VAR::E> contains an attribute node <VAR::A> whose name
1520                   is <VAR::attr-name>:
1521    
1522              = If the <A::Node.nodeValue> of the <VAR::A> is
1523                one or more sequence of digits (<CHAR::DIGIT ZERO>,
1524                <CHAR::DIGIT ONE>, ..., <CHAR::DIGIT NINE>) optionally
1525                preceding by a <CHAR::PLUS SIGN>, then
1526                the attribute getter <kwd:MUST> return a value
1527                by interpreting the <A::Node.nodeValue> of the <VAR::A>
1528                as a decimal number.
1529    
1530    @IFISA: Document          }
   @ClsISA: td|ManakaiDOMDocument  
1531    
1532    @s:rootElementType: AnyAtomElement||ManakaiDOM|all          = If a default value is explicitly defined
1533              where this algorithm is referenced, it <kwd:MUST>
1534              return the default value.
1535    
1536    @enDesc:          = Otherwise, it <kwd:MUST> return a binding-specific
1537      If the <Feature::fe|Atom> feature version <FeatureVer::1.0>            default value, if it is defined by the specification
1538      is supported, a <IF::Document> object whose <A::Document.documentElement>'s            of the binding, or <DOM::-1>.
     <A::Node.namespaceURI>, if any, is <URI^^DISCore|QName::atom|> at least  
     at the time of creation <kwd:MUST> also  
     implement the <IF::AtomDocument> interface.  Other  
     <IF:Document> objects <kwd:MAY> also implement  
     the <IF::AtomDocument> interface.  
1539    
1540    @Test:        }
     @@QName: createDocument.AtomDocument.test  
     @@PerlDef:  
       my $impl;  
       __CODE{tc|createImplForTest:: $impl => $impl}__;  
       
       my $doc = $impl-><M::c|DOMImplementation.createDocument>  
                          (<Q::atom|>, 'unknown');  
1541    
1542        $test->id ('interface');          {NOTE::
1543        $test->assert_isa ($doc, <IFName::AtomDocument>);            In Atom Threading Extension <SRC::RFC 4685>,
1544  ##AtomDocument            the <CHAR::PLUS SIGN> and leading <CHAR::DIGIT ZERO>s
1545              are prohibitted.
1546            }
1547        @@PerlDef:
1548          __DEEP{
1549            E: {
1550              $r = $node-><M::Element.getAttributeNS> ($namespaceURI, $localName);
1551              if (defined $r) {
1552                if ($r =~ /\A\+?([0-9]+)\z/) {
1553                  $r = 0+$1;
1554                  last E;
1555                }
1556              }
1557    
1558  IFClsDef:            $r = $defaultValue;
1559    @IFQName: AtomFeedDocument            $r = -1 unless defined $r;
1560    @ClsQName: ManakaiFeedEntryDocument          } # E
1561          }__;
1562    
1563    @IFISA: AtomDocument    @CODE:
1564    @ClsISA: ManakaiAtomDocument      @@QName: setReflectAttrNonNegativeIntegerValue
1565        @@enDesc:
1566          {P:: If a DOM attribute is defined to <DFN::reflect the
1567               non-negative integer value
1568               of the <VAR::attr-name> attribute> of the node <VAR::E>,
1569               the setter of the attribute <kwd:MUST> modify the node as
1570               defined by the algorithm:
1571    
1572    @s:rootElementType:          = If the given value is <DOM::-1> or one of binding-specific
1573      @@@: atom|feed            default values, if any, as defined by the specification
1574      @@DISCore:stopISARecursive: 1            of the binding, it <kwd:MUST>
1575              remove the <VAR::attr-name> attribute node, if any,
1576              from the list of attribute nodes of <VAR::E>.
1577    
1578    @enDesc:          = Otherwise, it <kwd:MUST> set the <VAR::attr-name>
1579      The <IF::AtomFeedDocument> interface provides convenience            attribute node value to a string representation
1580      methods and attributes for an Atom            of the given value as if
1581      Feed Document, i.e. representation of an Atom feed.            the <M::Element.setAttributeNS> method were invoked.
1582              The string representation <kwd:MUST> be a decimal
1583              number consist of one or more sequence of digits
1584              (<CHAR::DIGIT ZERO>, <CHAR::DIGIT ONE>, ..., <CHAR::DIGIT NINE>)
1585              <EM::without> any leading <CHAR::DIGIT ZERO>.
1586              The <CHAR::PLUS SIGN> <kwd:MUST> be omitted.
1587    
1588      If the <Feature::fe|Atom> feature version <FeatureVer::1.0>        }
     is supported, a <IF::Document> object whose <A::Document.documentElement>'s  
     element type, if any, is <XE::atom|feed> at least at  
     the time of creation <kwd:MUST> also  
     implement the <IF::AtomFeedDocument> interface.  Other  
     <IF::Document> objects <kwd:MAY> also implement  
     the <IF::AtomFeedDocument> interface.  
1589    
1590    @Test:          {NOTE::
1591      @@QName: createDocument.AtomFeedDocument.test            It might throw an exception.
1592            }
1593      @@PerlDef:      @@PerlDef:
1594        my $impl;        __DEEP{
1595        __CODE{tc|createImplForTest:: $impl => $impl}__;          if (defined $given and $given >= 0) {
1596                  $node-><M::Element.setAttributeNS>
1597        my $doc = $impl-><M::c|DOMImplementation.createDocument>                     ($namespaceURI, $localName, 0+$given);
1598                           (<Q::atom|>, 'feed');          } else {
1599              $node-><M::Element.removeAttributeNS> ($namespaceURI, $localName);
1600        $test->id ('interface');          }
1601        $test->assert_isa ($doc, <IFName::AtomFeedDocument>);        }__;
1602  ##AtomFeedDocument  ##AtomImplementation
1603    
1604  IFClsDef:  IFClsDef:
1605    @IFQName: AtomEntryDocument    @IFQName: AtomDocument
1606    @ClsQName: ManakaiAtomEntryDocument    @ClsQName: ManakaiAtomDocument
1607    
1608    @IFISA: AtomDocument    @domperl:implementedByObjectsOf: Document
1609    @ClsISA: ManakaiAtomDocument    @domperl:classImplementedByObjectsOf: td|ManakaiDOMDocument
1610    
1611    @s:rootElementType:    @f:implements: AtomFeature10
     @@@: atom|entry  
     @@DISCore:stopISARecursive: 1  
1612    
1613    @enDesc:    @enDesc:
     The <IF::AtomEntryDocument> 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.  
   
1614      If the <Feature::fe|Atom> feature version <FeatureVer::1.0>      If the <Feature::fe|Atom> feature version <FeatureVer::1.0>
1615      is supported, a <IF::Document> object whose <A::Document.documentElement>'s      is supported, a <IF::Document> object whose <A::Document.documentElement>'s
1616      element type, if any, is <XE::atom|entry> at least at      <A::Node.namespaceURI>, if any, is <URI^^DISCore|QName::atom|> at least
1617      the time of the creation <kwd:MUST> also      at the time of creation <kwd:MUST> also
1618      implement the <IF::AtomEntryDocument> interface.  Other      implement the <IF::AtomDocument> interface.  Other
1619      <IF::Document> objects <kwd:MAY> also implement      <IF:Document> objects <kwd:MAY> also implement
1620      the <IF::AtomEntryDocument> interface.      the <IF::AtomDocument> interface.
1621    
1622    @Test:    @Test:
1623      @@QName: createDocument.AtomEntryDocument.test      @@QName: createDocument.AtomDocument.test
1624      @@PerlDef:      @@PerlDef:
1625        my $impl;        my $impl;
1626        __CODE{tc|createImplForTest:: $impl => $impl}__;        __CODE{tc|createImplForTest:: $impl => $impl}__;
1627            
1628        my $doc = $impl-><M::c|DOMImplementation.createDocument>        my $doc = $impl-><M::c|DOMImplementation.createDocument>
1629                           (<Q::atom|>, 'entry');                           (<Q::atom|>, 'unknown');
1630    
1631        $test->id ('interface');        $test->id ('interface');
1632        $test->assert_isa ($doc, <IFName::AtomEntryDocument>);        $test->assert_isa ($doc, <IFName::AtomDocument>);
1633  ##AtomEntryDocument  ##AtomDocument
1634    
1635  AGDef:  AGDef:
1636    @QName: atomCommonAttributes    @QName: atomCommonAttributes
# Line 1730  IFClsDef: Line 1742  IFClsDef:
1742    @IFISA: Element    @IFISA: Element
1743    @ClsISA: te|ManakaiDOMElement    @ClsISA: te|ManakaiDOMElement
1744        
1745      @f:implements: AtomFeature10
1746    @s:elementType: AnyAtomElement||ManakaiDOM|all    @s:elementType: AnyAtomElement||ManakaiDOM|all
1747    
1748    @enDesc:    @enDesc:
# Line 1755  IFClsDef: Line 1768  IFClsDef:
1768      @@PerlDef:      @@PerlDef:
1769        for my $interface (        for my $interface (
1770          <IFName::AtomElement>,          <IFName::AtomElement>,
         <IFName::AtomElement||ManakaiDOM|ManakaiDOM>,  
1771          <IFName::Element>,          <IFName::Element>,
1772          <IFName::Node>,          <IFName::Node>,
1773          <IFName::f|GetFeature>,          <IFName::f|GetFeature>,
# Line 1799  IFClsConstructDef: Line 1811  IFClsConstructDef:
1811    @IFISA: AtomElement    @IFISA: AtomElement
1812    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
1813    
1814      @f:implements: AtomFeature10
1815    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
1816    
1817    @cm:    @cm:
# Line 1940  IFClsConstructDef: Line 1953  IFClsConstructDef:
1953    @IFISA: AtomElement    @IFISA: AtomElement
1954    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
1955    
1956      @f:implements: AtomFeature10
1957    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
1958    
1959    @cm:    @cm:
# Line 2096  IFClsConstructDef: Line 2110  IFClsConstructDef:
2110    @IFISA: AtomElement    @IFISA: AtomElement
2111    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
2112    
2113      @f:implements: AtomFeature10
2114    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
2115    
2116    @cm:    @cm:
# Line 2203  IFClsETDef: Line 2218  IFClsETDef:
2218    @IFISA: AtomElement    @IFISA: AtomElement
2219    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
2220    
2221      @f:implements: AtomFeature10
2222    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
2223    
2224    @cm:    @cm:
# Line 2926  IFClsETDef: Line 2942  IFClsETDef:
2942    @IFISA: AtomElement    @IFISA: AtomElement
2943    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
2944    
2945      @f:implements: AtomFeature10
2946    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
2947    
2948    @cm:    @cm:
# Line 3103  IFClsETDef: Line 3120  IFClsETDef:
3120          $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0);          $test->assert_num_equals (actual_value => 0+@$list, expected_value => 0);
3121    
3122          $test->id ('parent');          $test->id ('parent');
3123            my $parent;
3124          for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {          for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
3125              $parent = $_;
3126            $_-><M::Node.appendChild>            $_-><M::Node.appendChild>
3127                  ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));                  ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3128            $_-><M::Node.appendChild>            $_-><M::Node.appendChild>
# Line 3123  IFClsETDef: Line 3142  IFClsETDef:
3142          my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');          my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'entry');
3143    
3144          $test->id ('parent');          $test->id ('parent');
3145            my $parent;
3146          for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {          for ($doc-><M::Document.createElementNS> (<Q::atom|>, 'feed')) {
3147              $parent = $_;
3148            $_-><M::Node.appendChild>            $_-><M::Node.appendChild>
3149                  ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));                  ($doc-><M::Document.createElementNS> (<Q::atom|>, 'author'));
3150            $_-><M::Node.appendChild>            $_-><M::Node.appendChild>
# Line 3459  IFClsETDef: Line 3480  IFClsETDef:
3480    @IFISA: AtomElement    @IFISA: AtomElement
3481    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3482    
3483      @f:implements: AtomFeature10
3484    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
3485        
3486    @cm: atomUriCM    @cm: atomUriCM
# Line 3473  IFClsETDef: Line 3495  IFClsETDef:
3495    @IFISA: AtomElement    @IFISA: AtomElement
3496    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3497    
3498      @f:implements: AtomFeature10
3499    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
3500    
3501    @cm: atomUriCM    @cm: atomUriCM
# Line 3487  IFClsETDef: Line 3510  IFClsETDef:
3510    @IFISA: AtomElement    @IFISA: AtomElement
3511    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3512    
3513      @f:implements: AtomFeature10
3514    # no common attribs    # no common attribs
3515    @cm: TextCM    @cm: TextCM
3516    
# Line 3502  IFClsETDef: Line 3526  IFClsETDef:
3526    @IFISA: AtomElement    @IFISA: AtomElement
3527    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3528    
3529      @f:implements: AtomFeature10
3530    # no common attribs    # no common attribs
3531    @cm: atomUriCM    @cm: atomUriCM
3532    
# Line 3517  IFClsETDef: Line 3542  IFClsETDef:
3542    @IFISA: AtomElement    @IFISA: AtomElement
3543    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3544    
3545      @f:implements: AtomFeature10
3546    # no common attribs    # no common attribs
3547    @cm: atomEmailAddressCM    @cm: atomEmailAddressCM
3548    
# Line 3532  IFClsETDef: Line 3558  IFClsETDef:
3558    @IFISA: AtomElement    @IFISA: AtomElement
3559    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3560    
3561      @f:implements: AtomFeature10
3562    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
3563    
3564    @cm: atomUriCM    @cm: atomUriCM
# Line 3546  IFClsETDef: Line 3573  IFClsETDef:
3573    @IFISA: AtomElement    @IFISA: AtomElement
3574    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3575    
3576      @f:implements: AtomFeature10
3577    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
3578    
3579    @cm:    @cm:
# Line 3799  IFClsETDef: Line 3827  IFClsETDef:
3827    
3828    @IFISA: AtomPersonConstruct    @IFISA: AtomPersonConstruct
3829    @ClsISA: ManakaiAtomPersonConstruct    @ClsISA: ManakaiAtomPersonConstruct
3830    
3831      @f:implements: AtomFeature10
3832    @mv:refers: PersonAG    @mv:refers: PersonAG
3833    @mv:elementContentModel: PersonCM    @mv:elementContentModel: PersonCM
3834    
# Line 3816  IFClsETDef: Line 3846  IFClsETDef:
3846    @IFISA: AtomElement    @IFISA: AtomElement
3847    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3848    
3849      @f:implements: AtomFeature10
3850    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
3851    
3852    @cm: undefinedContent    @cm: undefinedContent
# Line 3933  IFClsETDef: Line 3964  IFClsETDef:
3964    
3965    @IFISA: AtomPersonConstruct    @IFISA: AtomPersonConstruct
3966    @ClsISA: ManakaiAtomPersonConstruct    @ClsISA: ManakaiAtomPersonConstruct
3967    
3968      @f:implements: AtomFeature10
3969    @mv:refers: PersonAG    @mv:refers: PersonAG
3970    @mv:elementContentModel: PersonCM    @mv:elementContentModel: PersonCM
3971    
# Line 3951  IFClsETDef: Line 3984  IFClsETDef:
3984    @IFISA: AtomElement    @IFISA: AtomElement
3985    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
3986    
3987      @f:implements: AtomFeature10
3988    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
3989    
3990    @cm:    @cm:
# Line 4037  IFClsETDef: Line 4071  IFClsETDef:
4071    @IFISA: AtomElement    @IFISA: AtomElement
4072    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
4073    
4074      @f:implements: AtomFeature10
4075    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
4076    
4077    @cm: undefinedContent    @cm: undefinedContent
# Line 4172  IFClsETDef: Line 4207  IFClsETDef:
4207        of the <XA::type> attribute> of the node.        of the <XA::type> attribute> of the node.
4208      @@Type: DOMString      @@Type: DOMString
4209      @@Get:      @@Get:
4210          @@@enDesc:
4211            {P:: If the feature <Feature^^DISCore|QName::AtomThreadingFeature10>
4212                 is supported, the attribute getter <kwd:MUST> return
4213                 the string <CODE::application/atom+xml> when both of the
4214                 following conditions are met:
4215    
4216               - The attribute getter would otherwise return <DOM::null>.
4217    
4218               - The <A::AtomLinkElement.rel> attribute contains
4219                 a string value of <URI^^DISCore|QName::rel|replies>.
4220    
4221            }
4222        @@@nullCase:        @@@nullCase:
4223          @@@@enDesc:          @@@@enDesc:
4224            If the algorithm returns <DOM::null>.            If the algorithm returns <DOM::null>.
# Line 4183  IFClsETDef: Line 4230  IFClsETDef:
4230            $r => $r,            $r => $r,
4231            $defaultValue => {null},            $defaultValue => {null},
4232          }__;          }__;
4233    
4234            unless (defined $r) {
4235              __DEEP{
4236                my $rel = $self-><AG::AtomLinkElement.rel>;
4237                if (defined $rel and $rel eq <Q::rel|replies>) {
4238                  $r = q<application/atom+xml>;
4239                }
4240              }__;
4241            }
4242      @@Set:      @@Set:
4243        @@@nullCase:        @@@nullCase:
4244          @@@@enDesc:          @@@@enDesc:
# Line 4196  IFClsETDef: Line 4252  IFClsETDef:
4252            $given => $given,            $given => $given,
4253          }__;          }__;
4254    
4255        @@Test:
4256          @@@QName: AtomLinkElement.type.!rel.test
4257          @@@PerlDef:
4258            my $doc;
4259            __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4260    
4261            my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4262    
4263            $test->id ('implied');
4264            my $type0 = $el-><AG::AtomLinkElement.type>;
4265            $test->assert_null ($type0);
4266    
4267            $test->id ('explicit');
4268            $el-><AS::AtomLinkElement.type> ('application/atom+xml');
4269            my $type1 = $el-><AG::AtomLinkElement.type>;
4270            $test->assert_equals ($type1, q<application/atom+xml>);
4271    
4272            $test->id ('different');
4273            $el-><AS::AtomLinkElement.type> ('application/xhtml+xml');
4274            my $type2 = $el-><AG::AtomLinkElement.type>;
4275            $test->assert_equals ($type2, q<application/xhtml+xml>);
4276        @@Test:
4277          @@@QName: AtomLinkElement.type.rel!=replies.test
4278          @@@PerlDef:
4279            my $doc;
4280            __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4281    
4282            my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4283    
4284            $el-><AS::AtomLinkElement.rel> (<Q::rel|alternate>);
4285    
4286            $test->id ('implied');
4287            my $type0 = $el-><AG::AtomLinkElement.type>;
4288            $test->assert_null ($type0);
4289    
4290            $test->id ('explicit');
4291            $el-><AS::AtomLinkElement.type> ('application/atom+xml');
4292            my $type1 = $el-><AG::AtomLinkElement.type>;
4293            $test->assert_equals ($type1, q<application/atom+xml>);
4294    
4295            $test->id ('different');
4296            $el-><AS::AtomLinkElement.type> ('application/xhtml+xml');
4297            my $type2 = $el-><AG::AtomLinkElement.type>;
4298            $test->assert_equals ($type2, q<application/xhtml+xml>);
4299        @@Test:
4300          @@@QName: AtomLinkElement.type.rel=replies.test
4301          @@@PerlDef:
4302            my $doc;
4303            __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4304    
4305            my $el = $doc-><M::Document.createElementNS> (<Q::atom|>, 'link');
4306    
4307            $el-><AS::AtomLinkElement.rel> (<Q::rel|replies>);
4308    
4309            $test->id ('implied');
4310            my $type0 = $el-><AG::AtomLinkElement.type>;
4311            $test->assert_equals ($type0, q<application/atom+xml>);
4312    
4313            $test->id ('explicit');
4314            $el-><AS::AtomLinkElement.type> ('application/atom+xml');
4315            my $type1 = $el-><AG::AtomLinkElement.type>;
4316            $test->assert_equals ($type1, q<application/atom+xml>);
4317    
4318            $test->id ('different');
4319            $el-><AS::AtomLinkElement.type> ('application/xhtml+xml');
4320            my $type2 = $el-><AG::AtomLinkElement.type>;
4321            $test->assert_equals ($type2, q<application/xhtml+xml>);
4322    
4323    @ATTR:    @ATTR:
4324      @@Name: hreflang      @@Name: hreflang
4325      @@enDesc:      @@enDesc:
# Line 4304  IFClsETDef: Line 4428  IFClsETDef:
4428    
4429    @IFISA: AtomDateConstruct    @IFISA: AtomDateConstruct
4430    @ClsISA: ManakaiAtomDateConstruct    @ClsISA: ManakaiAtomDateConstruct
4431    
4432      @f:implements: AtomFeature10
4433    @mv:refers: DateAG    @mv:refers: DateAG
4434    @mv:elementContentModel: DateCM    @mv:elementContentModel: DateCM
4435    
# Line 4324  IFClsETDef: Line 4450  IFClsETDef:
4450    
4451    @IFISA: AtomTextConstruct    @IFISA: AtomTextConstruct
4452    @ClsISA: ManakaiAtomTextConstruct    @ClsISA: ManakaiAtomTextConstruct
4453    
4454      @f:implements: AtomFeature10
4455    @mv:refers: TextAG    @mv:refers: TextAG
4456    @mv:elementContentModel: TextCM    @mv:elementContentModel: TextCM
4457    
# Line 4359  IFClsETDef: Line 4487  IFClsETDef:
4487    @IFISA: AtomElement    @IFISA: AtomElement
4488    @ClsISA: ManakaiAtomElement    @ClsISA: ManakaiAtomElement
4489    
4490      @f:implements: AtomFeature10
4491    @mv:refers: atomCommonAttributes    @mv:refers: atomCommonAttributes
4492    
4493    @cm:    @cm:
# Line 4573  IFClsETDef: Line 4702  IFClsETDef:
4702    
4703    @IFISA: AtomTextConstruct    @IFISA: AtomTextConstruct
4704    @ClsISA: ManakaiAtomTextConstruct    @ClsISA: ManakaiAtomTextConstruct
4705    
4706      @f:implements: AtomFeature10
4707    @mv:refers: TextAG    @mv:refers: TextAG
4708    @mv:elementContentModel: TextCM    @mv:elementContentModel: TextCM
4709    
# Line 4589  IFClsETDef: Line 4720  IFClsETDef:
4720    
4721    @IFISA: AtomTextConstruct    @IFISA: AtomTextConstruct
4722    @ClsISA: ManakaiAtomTextConstruct    @ClsISA: ManakaiAtomTextConstruct
4723    
4724      @f:implements: AtomFeature10
4725    @mv:refers: TextAG    @mv:refers: TextAG
4726    @mv:elementContentModel: TextCM    @mv:elementContentModel: TextCM
4727    
# Line 4605  IFClsETDef: Line 4738  IFClsETDef:
4738    
4739    @IFISA: AtomTextConstruct    @IFISA: AtomTextConstruct
4740    @ClsISA: ManakaiAtomTextConstruct    @ClsISA: ManakaiAtomTextConstruct
4741    
4742      @f:implements: AtomFeature10
4743    @mv:refers: TextAG    @mv:refers: TextAG
4744    @mv:elementContentModel: TextCM    @mv:elementContentModel: TextCM
4745    
# Line 4621  IFClsETDef: Line 4756  IFClsETDef:
4756    
4757    @IFISA: AtomDateConstruct    @IFISA: AtomDateConstruct
4758    @ClsISA: ManakaiAtomDateConstruct    @ClsISA: ManakaiAtomDateConstruct
4759    
4760      @f:implements: AtomFeature10
4761    @mv:refers: DateAG    @mv:refers: DateAG
4762    @mv:elementContentModel: DateCM    @mv:elementContentModel: DateCM
4763    
# Line 4743  ResourceDef: Line 4880  ResourceDef:
4880    @cm: dxm|ANY||ManakaiDOM|all    @cm: dxm|ANY||ManakaiDOM|all
4881    @enImplNote:    @enImplNote:
4882      (text | anyForeignElement)*      (text | anyForeignElement)*
4883    
4884    ## -- Atom Threading Extension [RFC 4685]
4885    
4886    IFClsDef:
4887      @IFQName: AtomEntryElementThread
4888      @ClsQName: ManakaiAtomEntryElementThread
4889    
4890      @ClsISA: ManakaiAtomEntryElement
4891    
4892      @f:implements: AtomThreadingFeature10
4893    
4894      @enDesc:
4895        If the feature <Feature^^DISCore|QName::AtomThreadingFeature10>
4896        is supported, any <IF::Element> whose element type
4897        is <XE::atom|entry> <kwd:MUST> implement the <IF::AtomEntryElementThread>
4898        interface in addition to other appropriate interfaces.
4899    
4900      @Test:
4901        @@QName: AtomEntryElementThread.1.test
4902        @@PerlDef:
4903          my $doc;
4904          __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4905    
4906          my $el = $doc->create_element_ns (<Q::atom|>, 'entry');
4907    
4908          $test->id ('interface');
4909          $test->assert_isa ($el, <IFName::AtomEntryElementThread>);
4910    
4911          $test->id ('feature');
4912          $test->assert_true ($el->is_supported (<Q::fe|AtomThreading> => '1.0'));
4913    
4914      @Attr:
4915        @@Name: threadInReplyToElements
4916        @@enDesc:
4917          A static list of <XE::thr|in-reply-to> child elements of the node.
4918        @@Type: StaticNodeList
4919        @@Get:
4920          @@@enDesc:
4921            It <kwd:MUST> <I::return a <XE::thr|in-reply-to> child element list>
4922            of the node.
4923          @@@PerlDef:
4924            __CODE{returnChildElementList::
4925              $node => $self,
4926              $namespaceURI => {<Q::thr|>},
4927              $localName => 'in-reply-to',
4928              $r => $r,
4929            }__;
4930    ##AtomEntryElementThread
4931    
4932    IFClsETDef:
4933      @IFQName: AtomThreadInReplyToElement
4934      @ETQName: thr|in-reply-to
4935      @ETRQName: thr|in-reply-to
4936      @ClsQName: ManakaiAtomThreadInReplyToElement
4937    
4938      @IFISA: AtomDateConstruct
4939      @ClsISA: ManakaiAtomDateConstruct
4940    
4941      @f:implements: AtomThreadingFeature10
4942      @mv:refers: atomCommonAttributes
4943    
4944      @cm: undefinedContent
4945    
4946      @enDesc:
4947        The <XE::thr|in-reply-to> element is used to indicate
4948        that an entry is a response to another resource.
4949    
4950        If the entry is a response to multiple resources,
4951        additional <XE::thr|in-reply-to> element <kwd:MAY>
4952        be used.
4953    
4954        RFC 4685 assigns no significance to the order in which
4955        multiple <XE::thr|in-reply-to> element appear within
4956        an entry.
4957    
4958      @Test:
4959        @@QName: AtomThreadInReplyToElement.1.test
4960        @@PerlDef:
4961          my $doc;
4962          __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
4963    
4964          my $el = $doc->create_element_ns (<Q::thr|>, 'in-reply-to');
4965    
4966          $test->id ('interface');
4967          $test->assert_isa ($el, <IFName::AtomThreadInReplyToElement>);
4968    
4969          $test->id ('feature');
4970          $test->assert_true ($el->is_supported (<Q::fe|AtomThreading> => '1.0'));
4971    
4972      @ATTR:
4973        @@Name: ref
4974        @@enDesc:
4975          The <XA::ref> attribute of the element.
4976    
4977          It <kwd:MUST> <I::reflect the URI value
4978          of the <XA::ref> attribute> of the node.
4979    
4980          The <XA::ref> attribute specifies the persistent,
4981          universally unique identifier of the resource being
4982          responded to.  The value <kwd:MUST> conform to
4983          the same construction and comparison rules as the
4984          value of the <XE::atom|id> element.  Though the IRI
4985          might use a dereferenceable scheme, processors <kwd:MUST-NOT>
4986          assume that it can be dereferenced.
4987    
4988          The <XE::thr|in-reply-to> element <kwd:MUST> contain
4989          a <XA::ref> attribute identifying the resource that
4990          is being respnoded to.
4991    
4992          If the resource being responded to does not have a persistent,
4993          universally unique identifier, the publisher <kwd:MUST> assign an
4994          identifier that satisfies all the considerations in Section 4.2.6 of
4995          RFC 4287 for use as the value of the <XA::ref> attribute.
4996          In that case, if a representation of the resource can be retrieved
4997          from an IRI that can be used as a valid atom:id value, then this IRI
4998          <kwd:SHOULD> be used as the value of both the <XA::ref> and
4999          <XA::href> attributes.
5000        @@Type: DOMString
5001        @@actualType: DOMURI
5002        @@Get:
5003          @@@nullCase:
5004            @@@@enDesc:
5005              If the algorithm returns <DOM::null>.
5006          @@@PerlDef:
5007            __CODE{getReflectAttrURIValue::
5008              $node => $self,
5009              $namespaceURI => {null},
5010              $localName => 'ref',
5011              $r => $r,
5012              $defaultValue => {null},
5013            }__;
5014        @@Set:
5015          @@@nullCase:
5016            @@@@enDesc:
5017              Removes the attribute.
5018          @@@NodeReadOnlyError:
5019          @@@PerlDef:
5020            __CODE{setReflectAttrURIValue::
5021              $node => $self,
5022              $namespaceURI => {null},
5023              $localName => 'ref',
5024              $given => $given,
5025            }__;
5026            
5027      @ATTR:
5028        @@Name: source
5029        @@enDesc:
5030          The <XA::source> attribute of the element.
5031    
5032          It <kwd:MUST> <I::reflect the URI value
5033          of the <XA::source> attribute> of the node.
5034    
5035          The <XA::source> attribute <kwd:MAY> be used to specify the IRI
5036          of an Atom Feed or Entry Document containing an
5037          <XE::atom|entry> with an <XE::atom|id> value equal to the
5038          value of the <XA::ref> attribute.  The IRI specified <kwd:MUST>
5039          be dereferenceable.
5040        @@Type: DOMString
5041        @@actualType: DOMURI
5042        @@Get:
5043          @@@nullCase:
5044            @@@@enDesc:
5045              If the algorithm returns <DOM::null>.
5046          @@@PerlDef:
5047            __CODE{getReflectAttrURIValue::
5048              $node => $self,
5049              $namespaceURI => {null},
5050              $localName => 'source',
5051              $r => $r,
5052              $defaultValue => {null},
5053            }__;
5054        @@Set:
5055          @@@nullCase:
5056            @@@@enDesc:
5057              Removes the attribute.
5058          @@@NodeReadOnlyError:
5059          @@@PerlDef:
5060            __CODE{setReflectAttrURIValue::
5061              $node => $self,
5062              $namespaceURI => {null},
5063              $localName => 'source',
5064              $given => $given,
5065            }__;
5066            
5067      @ATTR:
5068        @@Name: href
5069        @@enDesc:
5070          The <XA::href> attribute of the element.
5071    
5072          It <kwd:MUST> <I::reflect the URI value
5073          of the <XA::href> attribute> of the node.
5074    
5075          The <XA::href> attribute specifies an IRI that may be used
5076          to retrieve a representation of the resource being
5077          responded to.  The IRI specified <kwd:MUST> be
5078          dereferenceable.
5079        @@Type: DOMString
5080        @@actualType: DOMURI
5081        @@Get:
5082          @@@nullCase:
5083            @@@@enDesc:
5084              If the algorithm returns <DOM::null>.
5085          @@@PerlDef:
5086            __CODE{getReflectAttrURIValue::
5087              $node => $self,
5088              $namespaceURI => {null},
5089              $localName => 'href',
5090              $r => $r,
5091              $defaultValue => {null},
5092            }__;
5093        @@Set:
5094          @@@nullCase:
5095            @@@@enDesc:
5096              Removes the attribute.
5097          @@@NodeReadOnlyError:
5098          @@@PerlDef:
5099            __CODE{setReflectAttrURIValue::
5100              $node => $self,
5101              $namespaceURI => {null},
5102              $localName => 'href',
5103              $given => $given,
5104            }__;
5105      
5106      @ATTR:
5107        @@Name: type
5108        @@enDesc:
5109          The <XA::type> attribute of the element.
5110    
5111          It <kwd:MUST> <I::reflect the string value
5112          of the <XA::type> attribute> of the node.
5113    
5114          The <XA::type> attribute <kwd:MAY> be used to provide
5115          a hint to the client about the media type of the
5116          resource identified by the <XA::href> attribute.
5117          The <XA::type> attribute is only meaningful if a
5118          corresponding <XA::href> attribute is also provided.
5119        @@Type: DOMString
5120        @@Get:
5121          @@@nullCase:
5122            @@@@enDesc:
5123              If the algorithm returns <DOM::null>.
5124          @@@PerlDef:
5125            __CODE{getReflectAttrStringValue::
5126              $node => $self,
5127              $namespaceURI => {null},
5128              $localName => 'type',
5129              $r => $r,
5130              $defaultValue => {null},
5131            }__;
5132        @@Set:
5133          @@@nullCase:
5134            @@@@enDesc:
5135              Removes the attribute.
5136          @@@NodeReadOnlyError:
5137          @@@PerlDef:
5138            __CODE{setReflectAttrStringValue::
5139              $node => $self,
5140              $namespaceURI => {null},
5141              $localName => 'type',
5142              $given => $given,
5143            }__;
5144    ##AtomThreadInReplyToElement
5145    
5146    IFClsDef:
5147      @IFQName: AtomLinkElementThread
5148      @ClsQName: ManakaiAtomLinkElementThread
5149    
5150      @ClsISA: ManakaiAtomLinkElement
5151    
5152      @f:implements: AtomThreadingFeature10
5153    
5154      @enDesc:
5155        An <XE::atom|link> element with a <XA::rel> attribute value of
5156        <XML::replies> may be used to reference a resource where responses
5157        to an entry may be found.  If the <XA::type> attribute of the
5158        <XE::atom|link> is omitted, its value is assumed to be
5159        <XML::application/atom+xml>.
5160    
5161        A <XML::replies> link appearing as a child of the <XE::atom|feed>
5162        or <XE::atom|source> element indicates that the referenced
5163        resource likely contains responses to any of that
5164        feed's entries.  A <XML::replies>
5165        link appearing as a child of an <XE::atom|entry> element
5166        indicates that the linked resource likely contains responses
5167        specific to that entry.
5168    
5169        If the feature <Feature^^DISCore|QName::AtomThreadingFeature10>
5170        is supported, any <IF::Element> whose element type
5171        is <XE::atom|link> <kwd:MUST> implement the <IF::AtomLinkElementThread>
5172        interface in addition to other appropriate interfaces.
5173    
5174      @Test:
5175        @@QName: AtomLinkElementThread.1.test
5176        @@PerlDef:
5177          my $doc;
5178          __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
5179    
5180          my $el = $doc->create_element_ns (<Q::atom|>, 'link');
5181    
5182          $test->id ('interface');
5183          $test->assert_isa ($el, <IFName::AtomLinkElementThread>);
5184    
5185          $test->id ('feature');
5186          $test->assert_true ($el->is_supported (<Q::fe|AtomThreading> => '1.0'));
5187    
5188      @ATTR:
5189        @@Name: threadCount
5190        @@enDesc:
5191          The <XA::thr|count> attribute of the element.
5192    
5193          It <kwd:MUST> <I::reflect the non-negative integer value
5194          of the <XA::thr|count> attribute> of the node.
5195    
5196          An <XE::atom|link> element using the <XML::replies>
5197          <XA::rel> attribute value <kwd:MAY> contain
5198          a <XA::thr|count> attribute whose value is a
5199          non-negative integer that provides a hint to clients
5200          as to the total number of replies contained by the
5201          linked resource.  The value is advisory and
5202          may not accurately reflect the actual number of replies.
5203        @@Type: idl|long||ManakaiDOM|all
5204        @@Get:
5205          @@@PerlDef:
5206            __CODE{getReflectAttrNonNegativeIntegerValue::
5207              $node => $self,
5208              $namespaceURI => {<Q::thr|>},
5209              $localName => 'count',
5210              $r => $r,
5211              $defaultValue => {null},
5212            }__;
5213        @@Set:
5214          @@@NodeReadOnlyError:
5215          @@@PerlDef:
5216            __CODE{setReflectAttrNonNegativeIntegerValue::
5217              $node => $self,
5218              $namespaceURI => {<Q::thr|>},
5219              $localName => 'count',
5220              $given => $given,
5221            }__;
5222    
5223        @@Test:
5224          @@@QName: AtomLinkElementThread.threadCount.1.test
5225          @@@PerlDef:
5226            my $doc;
5227            __CODE{tc|createEmptyDocumentForTest:: $doc => $doc}__;
5228    
5229            my $link = $doc->create_element_ns (<Q::atom|>, 'link');
5230    
5231            $test->id ('default');
5232            $test->assert_num_equals
5233                     (expected_value => -1,
5234                      actual_value =>
5235                        $link-><AG::AtomLinkElementThread.threadCount>);
5236    
5237            $test->id ('zero');
5238            $link-><AS::AtomLinkElementThread.threadCount> (0);
5239            $test->assert_num_equals
5240                     (expected_value => 0,
5241                      actual_value =>
5242                        $link-><AG::AtomLinkElementThread.threadCount>);
5243            $test->id ('zero.attr');
5244            $test->assert_equals ($link->get_attribute_ns (<Q::thr|>, 'count'), '0');
5245    
5246            $test->id ('one');
5247            $link-><AS::AtomLinkElementThread.threadCount> (1);
5248            $test->assert_num_equals
5249                     (expected_value => 1,
5250                      actual_value =>
5251                        $link-><AG::AtomLinkElementThread.threadCount>);
5252            $test->id ('one.attr');
5253            $test->assert_equals ($link->get_attribute_ns (<Q::thr|>, 'count'), '1');
5254    
5255            $test->id ('10000');
5256            $link-><AS::AtomLinkElementThread.threadCount> (10000);
5257            $test->assert_num_equals
5258                     (expected_value => 10000,
5259                      actual_value =>
5260                        $link-><AG::AtomLinkElementThread.threadCount>);
5261            $test->id ('10000.attr');
5262            $test->assert_equals ($link->get_attribute_ns (<Q::thr|>, 'count'),
5263                                  '10000');
5264    
5265            $test->id ('+10000');
5266            $link->set_attribute_ns (<Q::thr|>, 'thr:count', '+10000');
5267            $test->assert_num_equals
5268                     (expected_value => 10000,
5269                      actual_value =>
5270                        $link-><AG::AtomLinkElementThread.threadCount>);
5271    
5272            $test->id ('010000');
5273            $link->set_attribute_ns (<Q::thr|>, 'thr:count', '010000');
5274            $test->assert_num_equals
5275                     (expected_value => 10000,
5276                      actual_value =>
5277                        $link-><AG::AtomLinkElementThread.threadCount>);
5278    
5279            $test->id ('-100');
5280            $link-><AS::AtomLinkElementThread.threadCount> (-100);
5281            $test->assert_num_equals
5282                     (expected_value => -1,
5283                      actual_value =>
5284                        $link-><AG::AtomLinkElementThread.threadCount>);
5285            $test->id ('-100.attr');
5286            $test->assert_false ($link->has_attribute_ns (<Q::thr|>, 'count'));
5287    
5288            $test->id ('120a');
5289            $link->set_attribute_ns (<Q::thr|>, 'thr:count', '120a');
5290            $test->assert_num_equals
5291                     (expected_value => -1,
5292                      actual_value =>
5293                        $link-><AG::AtomLinkElementThread.threadCount>);
5294    
5295            $test->id ('-1');
5296            $link-><AS::AtomLinkElementThread.threadCount> (-1);
5297            $test->assert_num_equals
5298                     (expected_value => -1,
5299                      actual_value =>
5300                        $link-><AG::AtomLinkElementThread.threadCount>);
5301            $test->id ('-1.attr');
5302            $test->assert_false ($link->has_attribute_ns (<Q::thr|>, 'count'));
5303    
5304      @enImplNote:
5305        @@ddid: updated
5306        @@@:
5307          {TODO::
5308            <XA::thr|updated> attribute
5309          }
5310    ##AtomLinkElementThread
5311    
5312    enImplNote:
5313      @@ddid: total
5314      @@@:
5315        {TODO::
5316          <XE::thr|total>
5317        }
5318    
5319    enImplNote:
5320      @@ddid: threaddtd
5321      @@@:
5322        {TODO::
5323          DTD impl for threading
5324        }

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.21

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24