Selaa lähdekoodia

Added Tag URI support when rendering Atom Entries - fixes ZF-10246

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22758 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic 15 vuotta sitten
vanhempi
commit
acb869f116

+ 35 - 1
library/Zend/Feed/Writer/Renderer/Entry/Atom.php

@@ -286,7 +286,9 @@ class Zend_Feed_Writer_Renderer_Entry_Atom
                 $this->getDataContainer()->getLink());
         }
         if (!Zend_Uri::check($this->getDataContainer()->getId()) &&
-        !preg_match("#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#", $this->getDataContainer()->getId())) {
+        !preg_match("#^urn:[a-zA-Z0-9][a-zA-Z0-9\-]{1,31}:([a-zA-Z0-9\(\)\+\,\.\:\=\@\;\$\_\!\*\-]|%[0-9a-fA-F]{2})*#",
+            $this->getDataContainer()->getId()
+        ) && !$this->_validateTagUri($this->getDataContainer()->getId())) {
             require_once 'Zend/Feed/Exception.php';
             throw new Zend_Feed_Exception('Atom 1.0 IDs must be a valid URI/IRI');
         }
@@ -297,6 +299,38 @@ class Zend_Feed_Writer_Renderer_Entry_Atom
     }
     
     /**
+     * Validate a URI using the tag scheme (RFC 4151)
+     *
+     * @param string $id
+     * @return bool
+     */
+    protected function _validateTagUri($id)
+    {
+        if (preg_match('/^tag:(?<name>.*),(?<date>\d{4}-?\d{0,2}-?\d{0,2}):(?<specific>.*)(.*:)*$/', $id, $matches)) {
+            $dvalid = false;
+            $nvalid = false;
+            $date = $matches['date'];
+            $d6 = strtotime($date);
+            if ((strlen($date) == 4) && $date <= date('Y')) {
+                $dvalid = true;
+            } elseif ((strlen($date) == 7) && ($d6 < strtotime("now"))) {
+                $dvalid = true;
+            } elseif ((strlen($date) == 10) && ($d6 < strtotime("now"))) {
+                $dvalid = true;
+            }
+            $validator = new Zend_Validate_EmailAddress;
+            if ($validator->isValid($matches['name'])) {
+                $nvalid = true;
+            } else {
+                $nvalid = $validator->isValid('info@' . $matches['name']);
+            }
+            return $dvalid && $nvalid;
+
+        }
+        return false;
+    }
+    
+    /**
      * Set entry content 
      * 
      * @param  DOMDocument $dom 

+ 18 - 0
tests/Zend/Feed/Writer/Renderer/Entry/AtomTest.php

@@ -215,6 +215,24 @@ class Zend_Feed_Writer_Renderer_Entry_AtomTest extends PHPUnit_Framework_TestCas
         $entry = $feed->current();
         $this->assertEquals('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6', $entry->getId());
     }
+    
+    public function testEntryIdHasBeenSetUsingSimpleTagUri()
+    {
+        $this->_validEntry->setId('tag:example.org,2010:/foo/bar/');
+        $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter);
+        $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml());
+        $entry = $feed->current();
+        $this->assertEquals('tag:example.org,2010:/foo/bar/', $entry->getId());
+    }
+    
+    public function testEntryIdHasBeenSetUsingComplexTagUri()
+    {
+        $this->_validEntry->setId('tag:diveintomark.org,2004-05-27:/archives/2004/05/27/howto-atom-linkblog');
+        $renderer = new Zend_Feed_Writer_Renderer_Feed_Atom($this->_validWriter);
+        $feed = Zend_Feed_Reader::importString($renderer->render()->saveXml());
+        $entry = $feed->current();
+        $this->assertEquals('tag:diveintomark.org,2004-05-27:/archives/2004/05/27/howto-atom-linkblog', $entry->getId());
+    }
 
     public function testFeedIdDefaultIsUsedIfNotSetByHand()
     {