Author: as
Date: Wed Nov 14 16:17:32 2007
New Revision: 6729

Log:
- Added support for 'entry' ATOM feed elements (accessed as 'item' through
  ezcFeed).
# Support for all entry child elements will follow soon.

Added:
    trunk/Feed/tests/atom/regression/generate/entry/
    trunk/Feed/tests/atom/regression/generate/entry/entry_empty.in
    trunk/Feed/tests/atom/regression/generate/entry/entry_empty.out
    trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.in
    trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.out
    trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.in
    trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.out
    trunk/Feed/tests/atom/regression/generate/entry/entry_id.in
    trunk/Feed/tests/atom/regression/generate/entry/entry_id.out
    trunk/Feed/tests/atom/regression/parse/entry/
    trunk/Feed/tests/atom/regression/parse/entry/entry_empty.in
    trunk/Feed/tests/atom/regression/parse/entry/entry_empty.out
    trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.in
    trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.out
    
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.in
    
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.out
    trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.in
    trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.out
    trunk/Feed/tests/atom/regression/parse/entry/entry_id.in
    trunk/Feed/tests/atom/regression/parse/entry/entry_id.out
Modified:
    trunk/Feed/src/processors/atom.php

Modified: trunk/Feed/src/processors/atom.php
==============================================================================
--- trunk/Feed/src/processors/atom.php [iso-8859-1] (original)
+++ trunk/Feed/src/processors/atom.php [iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -95,6 +95,87 @@
         'subtitle'      => array( '#'          => 'string',
                                   'ATTRIBUTES' => array( 'type' => 'string' ), 
),
 
+        'entry'         => array( '#'          => 'none',
+                                  'NODES'      => array(
+                                                    'id'          => array( 
'#' => 'string' ),
+                                                    'title'       => array( 
'#' => 'string',
+                                                                            
'ATTRIBUTES' => array( 'type' => 'string' ), ),
+
+                                                    'updated'     => array( 
'#' => 'string' ),
+
+                                                    'author'      => array( 
'#' => 'none',
+                                                                            
'NODES'      => array(
+                                                                               
               'name' => array( '#' => 'string' ),
+                                                                               
               'email' => array( '#' => 'string' ),
+                                                                               
               'uri' => array( '#' => 'string' ),
+
+                                                                               
               'REQUIRED'   => array( 'name' ),
+                                                                               
               'OPTIONAL'   => array( 'email', 'uri' ),
+                                                                               
               ),
+
+                                                                            
'MULTI'      => 'authors' ),
+
+                                                    'content'     => array( 
'#' => 'string',
+                                                                            
'ATTRIBUTES' => array( 'type' => 'string' ), ),
+
+                                                    'link'        => array( 
'#'          => 'none',
+                                                                            
'ATTRIBUTES' => array( 'href' => 'string',
+                                                                               
                    'rel' => 'string',
+                                                                               
                    'type' => 'string',
+                                                                               
                    'hreflang' => 'string',
+                                                                               
                    'title' => 'string',
+                                                                               
                    'length' => 'string' ),
+
+                                                                            
'REQUIRED_ATTRIBUTES' => array( 'href' ),
+
+                                                                            
'MULTI'      => 'links' ),
+
+                                                    'summary'     => array( 
'#' => 'string',
+                                                                            
'ATTRIBUTES' => array( 'type' => 'string' ), ),
+
+                                                    'category'    => array( 
'#' => 'none',
+                                                                            
'ATTRIBUTES' => array( 'term' => 'string',
+                                                                               
                    'scheme' => 'string',
+                                                                               
                    'label' => 'string' ),
+
+                                                                            
'REQUIRED_ATTRIBUTES'   => array( 'term' ),
+                                                                              
+                                                                            
'MULTI'      => 'categories' ),
+
+                                                    'contributor' => array( 
'#' => 'none',
+                                                                            
'NODES'      => array(
+                                                                               
               'name' => array( '#' => 'string' ),
+                                                                               
               'email' => array( '#' => 'string' ),
+                                                                               
               'uri' => array( '#' => 'string' ),
+
+                                                                               
               'REQUIRED'   => array( 'name' ),
+                                                                               
               'OPTIONAL'   => array( 'email', 'uri' ),
+                                                                               
               ),
+
+                                                                            
'MULTI'      => 'contributors' ),
+
+                                                    'published'   => array( 
'#'          => 'string' ),
+
+                                                    'source'      => array( 
'#'          => 'none',
+                                                                            
'COPY'       => array( 'id', 'title', 'updated',
+                                                                               
                    'author', 'link', 'category',
+                                                                               
                    'contributor', 'rights' ), ),
+
+                                                    'rights'      => array( 
'#' => 'string',
+                                                                            
'ATTRIBUTES' => array( 'type' => 'string' ), ),
+
+                                                    'REQUIRED'   => array( 
'id', 'title', 'updated' ),
+
+                                                    'OPTIONAL'   => array( 
'author', 'content', 'link', 'summary',
+                                                                           
'category', 'contributor', 'published', 'rights',
+                                                                           
'source' ),
+
+                                                    ),
+
+                                  'ITEMS_MAP'  => array( 'copyright' => 
'rights', ),
+
+                                  'MULTI'      => 'entries' ),
+
         'REQUIRED'      => array( 'id', 'title', 'updated' ),
         'OPTIONAL'      => array( 'author', 'link', 'category',
                                   'contributor', 'generator', 'icon',
@@ -132,6 +213,7 @@
         $this->generateRequired();
         $this->generateAtLeastOne();
         $this->generateOptional();
+        $this->generateItems();
 
         return $this->xml->saveXML();
     }
@@ -381,6 +463,55 @@
     }
 
     /**
+     * Adds the feed entry elements to the XML document being generated.
+     *
+     * @ignore
+     */
+    protected function generateItems()
+    {
+        $entries = $this->get( 'entries' );
+        if ( $entries === null )
+        {
+            return;
+        }
+
+        $parent = 'entry';
+        foreach ( $entries as $entry )
+        {
+            $entryTag = $this->xml->createElement( $parent );
+            $this->channel->appendChild( $entryTag );
+
+            foreach ( $this->schema->getRequired( $parent ) as $element )
+            {
+                $data = $this->schema->isMulti( $parent, $element ) ? 
$this->get( $this->schema->getMulti( $parent, $element ) ) : $entry->$element;
+
+                if ( is_null( $data ) )
+                {
+                    throw new ezcFeedRequiredMetaDataMissingException( 
$element );
+                }
+
+                if ( !is_array( $data ) )
+                {
+                    $data = array( $data );
+                }
+
+                foreach ( $data as $dataNode )
+                {
+                    switch ( $element )
+                    {
+                        case 'updated':
+                            // Sample date: 2003-12-13T18:30:02-05:00
+                            $dataNode->set( date( "c", (int)$dataNode->get() ) 
);
+                            break;
+                    }
+                    $this->generateNode( $entryTag, $element, $dataNode );
+
+                }
+            }
+        }
+    }
+
+    /**
      * Returns true if the parser can parse the provided XML document object,
      * false otherwise.
      *
@@ -478,6 +609,11 @@
                         $this->parsePerson( $feed, $element, $channelChild, 
$tagName );
                         break;
 
+                    case 'item':
+                        $element = $feed->add( $tagName );
+                        $this->parseItem( $feed, $element, $channelChild );
+                        break;
+
                     default:
                         // check if it's part of a known module/namespace
                 }
@@ -510,6 +646,25 @@
      */
     protected function parseItem( ezcFeed $feed, ezcFeedElement $element, 
DOMElement $xml )
     {
+        foreach ( $xml->childNodes as $itemChild )
+        {
+            if ( $itemChild->nodeType === XML_ELEMENT_NODE )
+            {
+                $tagName = $itemChild->tagName;
+
+                switch ( $tagName )
+                {
+                    case 'id':
+                    case 'title':
+                        $element->$tagName = $itemChild->textContent;
+                        break;
+
+                    case 'updated':
+                        $element->$tagName = ezcFeedTools::prepareDate( 
$itemChild->textContent );
+                        break;
+                }
+            }
+        }
     }
 
     /**

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_empty.in
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_empty.in (added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_empty.in [iso-8859-1] 
Wed Nov 14 16:17:32 2007
@@ -1,0 +1,8 @@
+<?php
+return array( 'id' => 'Feed id',
+              'title' => array( array( '#' => 'Feed title',
+                                       'type' => '' ) ),
+              'updated' => 'Feed updated',
+              'author' => array( array( 'name' => 'Author name' ) ),
+              'item' => array( array() ) );
+?>

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_empty.out
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_empty.out (added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_empty.out 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,1 @@
+There was no data submitted for required channel attribute 'id'.

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.in
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.in 
(added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.in 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,10 @@
+<?php
+return array( 'id' => 'Feed id',
+              'title' => array( array( '#' => 'Feed title',
+                                       'type' => '' ) ),
+              'updated' => 'Feed updated',
+              'author' => array( array( 'name' => 'Author name' ) ),
+              'item' => array( array( 'id' => 'Entry id',
+                                      'title' => 'Entry title',
+                                      'updated' => 'Entry updated' ) ) );
+?>

Added: 
trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.out
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.out 
(added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_id+title+updated.out 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom";>
+  <id>Feed id</id>
+  <title type="text">Feed title</title>
+  <updated>XXX</updated>
+  <author>
+    <name>Author name</name>
+  </author>
+  <entry>
+    <id>Entry id</id>
+    <title>Entry title</title>
+    <updated>XXX</updated>
+  </entry>
+</feed> 

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.in
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.in (added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.in 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,9 @@
+<?php
+return array( 'id' => 'Feed id',
+              'title' => array( array( '#' => 'Feed title',
+                                       'type' => '' ) ),
+              'updated' => 'Feed updated',
+              'author' => array( array( 'name' => 'Author name' ) ),
+              'item' => array( array( 'id' => 'Entry id',
+                                      'title' => 'Entry title' ) ) );
+?>

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.out
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.out (added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_id+title.out 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,1 @@
+There was no data submitted for required channel attribute 'updated'.

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_id.in
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_id.in (added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_id.in [iso-8859-1] 
Wed Nov 14 16:17:32 2007
@@ -1,0 +1,8 @@
+<?php
+return array( 'id' => 'Feed id',
+              'title' => array( array( '#' => 'Feed title',
+                                       'type' => '' ) ),
+              'updated' => 'Feed updated',
+              'author' => array( array( 'name' => 'Author name' ) ),
+              'item' => array( array( 'id' => 'Entry id' ) ) );
+?>

Added: trunk/Feed/tests/atom/regression/generate/entry/entry_id.out
==============================================================================
--- trunk/Feed/tests/atom/regression/generate/entry/entry_id.out (added)
+++ trunk/Feed/tests/atom/regression/generate/entry/entry_id.out [iso-8859-1] 
Wed Nov 14 16:17:32 2007
@@ -1,0 +1,1 @@
+There was no data submitted for required channel attribute 'title'.

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_empty.in
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_empty.in (added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_empty.in [iso-8859-1] 
Wed Nov 14 16:17:32 2007
@@ -1,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom";>
+  <id>Feed id</id>
+  <title type="text">Feed title</title>
+  <updated>Feed updated</updated>
+  <entry/>
+</feed>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_empty.out
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_empty.out (added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_empty.out [iso-8859-1] 
Wed Nov 14 16:17:32 2007
@@ -1,0 +1,12 @@
+<?php
+$feed = new ezcFeed( 'atom' );
+
+$feed->id = 'Feed id';
+$feed->title = 'Feed title';
+$feed->title->type = 'text';
+$feed->updated = 'Feed updated';
+
+$entry = $feed->add( 'entry' );
+
+return $feed;
+?>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.in
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.in 
(added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.in 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom";>
+  <id>Feed id</id>
+  <title type="text">Feed title</title>
+  <updated>Feed updated</updated>
+  <entry>
+    <id>Entry id</id>
+    <title>Entry title</title>
+    <updated>2007-11-14T16:23:40+01:00</updated>
+  </entry>
+</feed>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.out
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.out 
(added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated.out 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,15 @@
+<?php
+$feed = new ezcFeed( 'atom' );
+
+$feed->id = 'Feed id';
+$feed->title = 'Feed title';
+$feed->title->type = 'text';
+$feed->updated = 'Feed updated';
+
+$entry = $feed->add( 'entry' );
+$entry->id = 'Entry id';
+$entry->title = 'Entry title';
+$entry->updated = 1195053820;
+
+return $feed;
+?>

Added: 
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.in
==============================================================================
--- 
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.in
 (added)
+++ 
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.in
 [iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom";>
+  <id>Feed id</id>
+  <title type="text">Feed title</title>
+  <updated>Feed updated</updated>
+  <entry>
+    <id>Entry id</id>
+    <title>Entry title</title>
+    <updated>Feed updated</updated>
+  </entry>
+</feed>

Added: 
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.out
==============================================================================
--- 
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.out
 (added)
+++ 
trunk/Feed/tests/atom/regression/parse/entry/entry_id+title+updated_wrong_date.out
 [iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,15 @@
+<?php
+$feed = new ezcFeed( 'atom' );
+
+$feed->id = 'Feed id';
+$feed->title = 'Feed title';
+$feed->title->type = 'text';
+$feed->updated = 'Feed updated';
+
+$entry = $feed->add( 'entry' );
+$entry->id = 'Entry id';
+$entry->title = 'Entry title';
+$entry->updated = time();
+
+return $feed;
+?>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.in
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.in (added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.in [iso-8859-1] 
Wed Nov 14 16:17:32 2007
@@ -1,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom";>
+  <id>Feed id</id>
+  <title type="text">Feed title</title>
+  <updated>Feed updated</updated>
+  <entry>
+    <id>Entry id</id>
+    <title>Entry title</title>
+  </entry>
+</feed>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.out
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.out (added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_id+title.out 
[iso-8859-1] Wed Nov 14 16:17:32 2007
@@ -1,0 +1,14 @@
+<?php
+$feed = new ezcFeed( 'atom' );
+
+$feed->id = 'Feed id';
+$feed->title = 'Feed title';
+$feed->title->type = 'text';
+$feed->updated = 'Feed updated';
+
+$entry = $feed->add( 'entry' );
+$entry->id = 'Entry id';
+$entry->title = 'Entry title';
+
+return $feed;
+?>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_id.in
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_id.in (added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_id.in [iso-8859-1] Wed 
Nov 14 16:17:32 2007
@@ -1,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom";>
+  <id>Feed id</id>
+  <title type="text">Feed title</title>
+  <updated>Feed updated</updated>
+  <entry>
+    <id>Entry id</id>
+  </entry>
+</feed>

Added: trunk/Feed/tests/atom/regression/parse/entry/entry_id.out
==============================================================================
--- trunk/Feed/tests/atom/regression/parse/entry/entry_id.out (added)
+++ trunk/Feed/tests/atom/regression/parse/entry/entry_id.out [iso-8859-1] Wed 
Nov 14 16:17:32 2007
@@ -1,0 +1,13 @@
+<?php
+$feed = new ezcFeed( 'atom' );
+
+$feed->id = 'Feed id';
+$feed->title = 'Feed title';
+$feed->title->type = 'text';
+$feed->updated = 'Feed updated';
+
+$entry = $feed->add( 'entry' );
+$entry->id = 'Entry id';
+
+return $feed;
+?>


-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to