- Added the GeoRSS module.
#- Iteration one, tests and more stuff still needs to follow.


git-svn-id: https://svn.apache.org/repos/asf/incubator/zetacomponents/trunk@1001189 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/Feed/ChangeLog b/Feed/ChangeLog
index 680749e..5524fbc 100644
--- a/Feed/ChangeLog
+++ b/Feed/ChangeLog
@@ -1,3 +1,9 @@
+1.4alpha1 - [RELEASEDATE]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+- Added the GeoRSS module.
+
+
 1.3 - Monday 21 December 2009
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/Feed/src/feed.php b/Feed/src/feed.php
index ef7bb5a..7d72631 100644
--- a/Feed/src/feed.php
+++ b/Feed/src/feed.php
@@ -53,6 +53,8 @@
  *    {@link http://dublincore.org/documents/dces/ Specifications}
  *  - Geo ({@link ezcFeedGeoModule}) -
  *    {@link http://www.w3.org/2003/01/geo/ Specifications}
+ *  - GeoRss ({@link ezcFeedGeoRssModule}) -
+ *    {@link http://www.georss.org/georss/ Specifications}
  *  - iTunes ({@link ezcFeedITunesModule}) -
  *    {@link http://www.apple.com/itunes/store/podcaststechspecs.html Specifications}
  *
@@ -973,6 +975,7 @@
      *    'CreativeCommons' => 'ezcFeedCreativeCommonsModule',
      *    'DublinCore'      => 'ezcFeedDublinCoreModule',
      *    'Geo'             => 'ezcFeedGeoModule',
+     *    'GeoRss'          => 'ezcFeedGeoRssModule',
      *    'iTunes'          => 'ezcFeedITunesModule'
      * );
      * </code>
@@ -997,6 +1000,7 @@
      *    'creativeCommons' => 'CreativeCommons',
      *    'dc'              => 'DublinCore',
      *    'geo'             => 'Geo',
+     *    'georss'          => 'GeoRss',
      *    'itunes'          => 'iTunes'
      * );
      * </code>
@@ -1164,6 +1168,7 @@
         self::registerModule( 'CreativeCommons', 'ezcFeedCreativeCommonsModule', 'creativeCommons' );
         self::registerModule( 'DublinCore', 'ezcFeedDublinCoreModule', 'dc' );
         self::registerModule( 'Geo', 'ezcFeedGeoModule', 'geo' );
+        self::registerModule( 'GeoRss', 'ezcFeedGeoRssModule', 'georss' );
         self::registerModule( 'iTunes', 'ezcFeedITunesModule', 'itunes' );
     }
 }
diff --git a/Feed/src/feed_autoload.php b/Feed/src/feed_autoload.php
index 79ed4c0..b031591 100644
--- a/Feed/src/feed_autoload.php
+++ b/Feed/src/feed_autoload.php
@@ -53,6 +53,7 @@
     'ezcFeedEntryElement'                        => 'Feed/structs/entry.php',
     'ezcFeedGeneratorElement'                    => 'Feed/structs/generator.php',
     'ezcFeedGeoModule'                           => 'Feed/modules/geo_module.php',
+    'ezcFeedGeoRssModule'                        => 'Feed/modules/georss_module.php',
     'ezcFeedITunesModule'                        => 'Feed/modules/itunes_module.php',
     'ezcFeedIdElement'                           => 'Feed/structs/id.php',
     'ezcFeedImageElement'                        => 'Feed/structs/image.php',
diff --git a/Feed/src/interfaces/module.php b/Feed/src/interfaces/module.php
index 90dd3b2..5fdf0b6 100644
--- a/Feed/src/interfaces/module.php
+++ b/Feed/src/interfaces/module.php
@@ -37,6 +37,8 @@
  *    {@link http://www.apple.com/itunes/store/podcaststechspecs.html Specifications}
  *  - Geo ({@link ezcFeedGeoModule}) -
  *    {@link http://www.w3.org/2003/01/geo/ Specifications}
+ *  - GeoRss ({@link ezcFeedGeoModule}) -
+ *    {@link http://www.georss.org/georss/ Specifications}
  *  - CreativeCommons ({@link ezcFeedCreativeCommonsModule}) -
  *    {@link http://backend.userland.com/creativeCommonsRssModule Specifications}
  *
diff --git a/Feed/src/modules/georss_module.php b/Feed/src/modules/georss_module.php
new file mode 100644
index 0000000..8445e3b
--- /dev/null
+++ b/Feed/src/modules/georss_module.php
@@ -0,0 +1,270 @@
+<?php
+/**
+ * File containing the ezcFeedGeoRssModule class.
+ *
+ * @package Feed
+ * @version //autogentag//
+ * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ * @filesource
+ */
+
+/**
+ * Support for the GeoRss module: data container, generator, parser.
+ *
+ * Specifications: {@link http://www.w3.org/2003/01/geo/}.
+ *
+ * Create example:
+ *
+ * <code>
+ * <?php
+ * // $feed is an ezcFeed object
+ * $item = $feed->add( 'item' );
+ * $module = $item->addModule( 'GeoRss' );
+ * $module->lat = 26.58;
+ * $module->long = -97.83;
+ * ?>
+ * </code>
+ *
+ * Parse example:
+ *
+ * <code>
+ * <?php
+ * // $item is an ezcFeedEntryElement object
+ * $lat = isset( $item->GeoRss->lat ) ? $item->GeoRss->lat->__toString() : null;
+ * $long = isset( $item->GeoRss->long ) ? $item->GeoRss->long->__toString() : null;
+ * ?>
+ * </code>
+ *
+ * @property ezcFeedTextElement $lat
+ *                              {@link http://en.wikipedia.org/wiki/WGS84 WGS84} latitude
+ *                              on the globe as decimal degrees
+ *                              (eg. 25.03358300). Can also be negative.
+ * @property ezcFeedTextElement $long
+ *                              {@link http://en.wikipedia.org/wiki/WGS84 WGS84} longitude
+ *                              on the globe as decimal degrees
+ *                              (eg. 121.56430000). Can also be negative.
+ *
+ * @package Feed
+ * @version //autogentag//
+ */
+class ezcFeedGeoRssModule extends ezcFeedModule
+{
+    /**
+     * Constructs a new ezcFeedContentModule object.
+     *
+     * @param string $level The level of the data container ('feed' or 'item')
+     */
+    public function __construct( $level = 'feed' )
+    {
+        parent::__construct( $level );
+    }
+
+    /**
+     * Sets the property $name to $value.
+     *
+     * @throws ezcBasePropertyNotFoundException
+     *         if the property $name is not defined
+     *
+     * @param string $name The property name
+     * @param mixed $value The property value
+     * @ignore
+     */
+    public function __set( $name, $value )
+    {
+        if ( $this->isElementAllowed( $name ) )
+        {
+            $node = $this->add( $name );
+            $node->text = $value;
+        }
+        else
+        {
+            parent::__set( $name, $value );
+        }
+    }
+
+    /**
+     * Returns the value of property $name.
+     *
+     * @throws ezcBasePropertyNotFoundException
+     *         if the property $name is not defined
+     *
+     * @param string $name The property name
+     * @return mixed
+     * @ignore
+     */
+    public function __get( $name )
+    {
+        if ( $this->isElementAllowed( $name ) )
+        {
+            return $this->properties[$name];
+        }
+        else
+        {
+            return parent::__get( $name );
+        }
+    }
+
+    /**
+     * Returns if the property $name is set.
+     *
+     * @param string $name The property name
+     * @return bool
+     * @ignore
+     */
+    public function __isset( $name )
+    {
+        if ( $this->isElementAllowed( $name ) )
+        {
+            return isset( $this->properties[$name] );
+        }
+        else
+        {
+            return parent::__isset( $name );
+        }
+    }
+
+    /**
+     * Returns true if the element $name is allowed in the current module at the
+     * current level (feed or item), and false otherwise.
+     *
+     * @param string $name The element name to check if allowed in the current module and level (feed or item)
+     * @return bool
+     */
+    public function isElementAllowed( $name )
+    {
+        switch ( $this->level )
+        {
+            case 'feed':
+                if ( in_array( $name, array( 'lat', 'long', 'point', 'where' ) ) )
+                {
+                    return true;
+                }
+                break;
+
+            case 'item':
+                if ( in_array( $name, array( 'lat', 'long', 'point', 'where' ) ) )
+                {
+                    return true;
+                }
+                break;
+        }
+        return false;
+    }
+
+    /**
+     * Adds a new ezcFeedElement element with name $name to this module and
+     * returns it.
+     *
+     * @throws ezcFeedUnsupportedElementException
+     *         if trying to add an element which is not supported.
+     *
+     * @param string $name The element name
+     * @return ezcFeedElement
+     */
+    public function add( $name )
+    {
+        if ( $this->isElementAllowed( $name ) )
+        {
+            switch ( $name )
+            {
+                case 'lat':
+                case 'long':
+                case 'point':
+                case 'where':
+                    $node = new ezcFeedTextElement();
+                    break;
+            }
+
+            $this->properties[$name] = $node;
+            return $node;
+        }
+        else
+        {
+            throw new ezcFeedUnsupportedElementException( $name );
+        }
+    }
+
+    /**
+     * Adds the module elements to the $xml XML document, in the container $root.
+     *
+     * @param DOMDocument $xml The XML document in which to add the module elements
+     * @param DOMNode $root The parent node which will contain the module elements
+     */
+    public function generate( DOMDocument $xml, DOMNode $root )
+    {
+        if ( isset( $this->lat ) && isset( $this->long ) )
+        {
+            $elementTag = $xml->createElement( $this->getNamespacePrefix() . ':' . 'point' );
+            $root->appendChild( $elementTag );
+
+            $elementTag->nodeValue = "{$this->lat} {$this->long}";
+        }
+    }
+
+    /**
+     * Parses the XML element $node and creates a feed element in the current
+     * module with name $name.
+     *
+     * @param string $name The name of the element belonging to the module
+     * @param DOMElement $node The XML child from which to take the values for $name
+     */
+    public function parse( $name, DOMElement $node )
+    {
+        if ( $this->isElementAllowed( $name ) )
+        {
+            switch ( $name )
+            {
+                case 'where':
+                    $children = $node->childNodes;
+                    $value = trim( $children->item(1)->textContent );
+                    list( $lat, $long ) = explode( ' ', $value );
+
+                    $element = $this->add( 'lat' );
+                    $element->text = $lat;
+                    $element = $this->add( 'long' );
+                    $element->text = $long;
+                    break;
+                case 'point':
+                    $value = $node->textContent;
+                    list( $lat, $long ) = explode( ' ', $value );
+                    $element = $this->add( 'lat' );
+                    $element->text = $lat;
+                    $element = $this->add( 'long' );
+                    $element->text = $long;
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Returns the module name (GeoRss').
+     *
+     * @return string
+     */
+    public static function getModuleName()
+    {
+        return 'GeoRss';
+    }
+
+    /**
+     * Returns the namespace for this module ('http://www.w3.org/2003/01/geo/wgs84_pos#').
+     *
+     * @return string
+     */
+    public static function getNamespace()
+    {
+        return 'http://www.georss.org/georss';
+    }
+
+    /**
+     * Returns the namespace prefix for this module ('georss').
+     *
+     * @return string
+     */
+    public static function getNamespacePrefix()
+    {
+        return 'georss';
+    }
+}
+?>