Browse Source

Refactored filter functionality in Zend_Markup.

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@20285 44c647ce-9c0f-0410-b52a-842ac1e357ba
kokx 16 years ago
parent
commit
abed8c7c05

+ 11 - 5
library/Zend/Markup/Renderer/Html.php

@@ -54,7 +54,7 @@ class Zend_Markup_Renderer_Html extends Zend_Markup_Renderer_RendererAbstract
      *
      * @var array
      */
-    protected $_tags = array(
+    protected $_markups = array(
         'b' => array(
             'type'   => 10, // self::TYPE_REPLACE | self::TAG_NORMAL
             'tag'    => 'strong',
@@ -337,14 +337,20 @@ class Zend_Markup_Renderer_Html extends Zend_Markup_Renderer_RendererAbstract
     }
 
     /**
-     * Initialize the default filters
+     * Set the default filter
      *
      * @return void
      */
-    public function addDefaultFilters()
+    public function setDefaultFilter(Zend_Filter_Interface $filter = null)
     {
-        $this->getFilterChain()->addFilter(new Zend_Filter_HtmlEntities());
-        $this->getFilterChain()->addFilter(new Zend_Filter_Callback('nl2br'));
+        if (empty($filter)) {
+            $this->_defaultFilter = new Zend_Filter();
+
+            $this->_defaultFilter->addFilter(new Zend_Filter_HtmlEntities());
+            $this->_defaultFilter->addFilter(new Zend_Filter_Callback('nl2br'));
+        } else {
+            $this->_defaultFilter = $filter;
+        }
     }
 
     /**

+ 118 - 103
library/Zend/Markup/Renderer/RendererAbstract.php

@@ -56,7 +56,7 @@ abstract class Zend_Markup_Renderer_RendererAbstract
      *
      * @var array
      */
-    protected $_tags = array();
+    protected $_markups = array();
 
     /**
      * Parser
@@ -66,18 +66,18 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     protected $_parser;
 
     /**
-     * Use the filter or not
+     * What filter to use
      *
      * @var bool
      */
-    protected $_filter = true;
+    protected $_filter;
 
     /**
      * Filter chain
      *
      * @var Zend_Filter
      */
-    protected $_filterChain;
+    protected $_defaultFilter;
 
     /**
      * The current group
@@ -124,20 +124,14 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         if (isset($options['parser'])) {
             $this->setParser($options['parser']);
         }
-        if (isset($options['prependFilter'])) {
-            $this->addFilter($options['prependFilter']);
-        }
         if (isset($options['useDefaultTags']) && ($options['useDefaultTags'] === false)) {
             $this->removeDefaultTags();
         }
         if (!isset($options['useDefaultFilters']) || ($options['useDefaultFilters'] === true)) {
-            $this->addDefaultFilters();
-        }
-        if (isset($options['filter'])) {
-            $this->addFilter($options['filter']);
+            $this->setDefaultFilter();
         }
-        if (isset($options['appendFilter'])) {
-            $this->addFilter($options['appendFilter']);
+        if (isset($options['defaultFilter'])) {
+            $this->addDefaultFilter($options['defaultFilter']);
         }
     }
 
@@ -174,113 +168,93 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     }
 
     /**
-     * Get the filter chain
-     *
-     * @return Zend_Filter
-     */
-    public function getFilterChain()
-    {
-        if (null === $this->_filterChain) {
-            $this->_filterChain = new Zend_Filter();
-        }
-
-        return $this->_filterChain;
-    }
-
-    /**
-     * Add a filter
-     *
-     * @param Zend_Filter_Interface $filter
-     * @param string $filter
-     *
-     * @return void
-     */
-    public function addFilter(Zend_Filter_Interface $filter, $placement = Zend_Filter::CHAIN_APPEND)
-    {
-        $this->getFilterChain()->addFilter($filter, $placement);
-    }
-
-    /**
-     * Add a new tag
+     * Add a new markup
      *
      * @param string $name
      * @param string $type
-     * @param array $info
+     * @param array $options
      *
      * @return Zend_Markup_Renderer_RendererAbstract
      */
-    public function addTag($name, $type, array $info)
+    public function addMarkup($name, $type, array $options)
     {
-        if (!isset($info['group']) && ($type ^ self::TYPE_ALIAS)) {
+        if (!isset($options['group']) && ($type ^ self::TYPE_ALIAS)) {
             require_once 'Zend/Markup/Renderer/Exception.php';
             throw new Zend_Markup_Renderer_Exception("There is no render group defined.");
         }
 
-        if (isset($info['filter'])) {
-            $filter = (boolean) $info['filter'];
+        // add the filter
+        if (isset($options['filter'])) {
+            if ($options['filter'] instanceof Zend_Filter_Interface) {
+                $filter = $options['filter'];
+            } elseif ($options['filter'] === true) {
+                $filter = $this->getDefaultFilter();
+            } else {
+                $filter = false;
+            }
         } else {
-            $filter = true;
+            $filter = $this->getDefaultFilter();
         }
 
         // check the type
         if ($type & self::TYPE_CALLBACK) {
             // add a callback tag
-            if (isset($info['callback'])) {
-                if (!($info['callback'] instanceof Zend_Markup_Renderer_TokenConverterInterface)) {
+            if (isset($options['callback'])) {
+                if (!($options['callback'] instanceof Zend_Markup_Renderer_TokenConverterInterface)) {
                     require_once 'Zend/Markup/Renderer/Exception.php';
                     throw new Zend_Markup_Renderer_Exception("Not a valid tag callback.");
                 }
-                if (method_exists($info['callback'], 'setRenderer')) {
-                    $info['callback']->setRenderer($this);
+                if (method_exists($options['callback'], 'setRenderer')) {
+                    $options['callback']->setRenderer($this);
                 }
             } else {
-                $info['callback'] = null;
+                $options['callback'] = null;
             }
 
-            $info['type'] = $type;
-            $info['filter'] = $filter;
+            $options['type'] = $type;
+            $options['filter'] = $filter;
 
-            $this->_tags[$name] = $info;
+            $this->_markups[$name] = $options;
         } elseif ($type & self::TYPE_ALIAS) {
             // add an alias
-            if (empty($info['name'])) {
+            if (empty($options['name'])) {
                 require_once 'Zend/Markup/Renderer/Exception.php';
                 throw new Zend_Markup_Renderer_Exception(
                         'No alias was provided but tag was defined as such');
             }
 
-            $this->_tags[$name] = array(
+            $this->_markups[$name] = array(
                 'type' => self::TYPE_ALIAS,
-                'name' => $info['name']
+                'name' => $options['name']
             );
         } else {
             if ($type & self::TAG_SINGLE) {
                 // add a single replace tag
-                $info['type']   = $type;
-                $info['filter'] = $filter;
+                $options['type']   = $type;
+                $options['filter'] = $filter;
 
-                $this->_tags[$name] = $info;
+                $this->_markups[$name] = $options;
             } else {
                 // add a replace tag
-                $info['type']   = $type;
-                $info['filter'] = $filter;
+                $options['type']   = $type;
+                $options['filter'] = $filter;
 
-                $this->_tags[$name] = $info;
+                $this->_markups[$name] = $options;
             }
         }
         return $this;
     }
 
     /**
-     * Remove a tag
+     * Remove a markup
      *
      * @param string $name
      *
      * @return void
      */
-    public function removeTag($name)
+    public function removeMarkup($name)
     {
-        unset($this->_tags[$name]);
+        unset($this->_markups[$name]);
     }
 
     /**
@@ -288,9 +262,9 @@ abstract class Zend_Markup_Renderer_RendererAbstract
      *
      * @return void
      */
-    public function clearTags()
+    public function clearMarkups()
     {
-        $this->_tags = array();
+        $this->_markups = array();
     }
 
     /**
@@ -309,6 +283,8 @@ abstract class Zend_Markup_Renderer_RendererAbstract
 
         $root = $tokenList->current();
 
+        $this->_filter = $this->getDefaultFilter();
+
         return $this->_render($root);
     }
 
@@ -325,16 +301,11 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         // save old values to reset them after the work is done
         $oldFilter = $this->_filter;
         $oldGroup  = $this->_group;
-        $oldToken  = $this->_token;
 
         // check filter and group usage in this tag
-        if (isset($this->_tags[$token->getName()])) {
-            if (isset($this->_tags[$token->getName()]['filter'])
-                && $this->_tags[$token->getName()]['filter']
-            ) {
-                $this->_filter = true;
-            } else {
-                $this->_filter = false;
+        if (isset($this->_markups[$token->getName()])) {
+            if (isset($this->_markups[$token->getName()]['filter'])) {
+                $this->_filter = $this->_markups[$token->getName()]['filter'];
             }
 
             if ($group = $this->_getGroup($token)) {
@@ -352,7 +323,6 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         }
 
         // reset to the old values
-        $this->_token  = $oldToken;
         $this->_filter = $oldFilter;
         $this->_group  = $oldGroup;
 
@@ -367,15 +337,15 @@ abstract class Zend_Markup_Renderer_RendererAbstract
      */
     protected function _getGroup(Zend_Markup_Token $token)
     {
-        if (!isset($this->_tags[$token->getName()])) {
+        if (!isset($this->_markups[$token->getName()])) {
             return false;
         }
 
-        $tag = $this->_tags[$token->getName()];
+        $tag = $this->_markups[$token->getName()];
 
         // alias processing
         while ($tag['type'] & self::TYPE_ALIAS) {
-            $tag = $this->_tags[$tag['name']];
+            $tag = $this->_markups[$tag['name']];
         }
 
         return isset($tag['group']) ? $tag['group'] : false;
@@ -395,12 +365,15 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         }
 
         // if the token doesn't have a notation, return the plain text
-        if (!isset($this->_tags[$token->getName()])) {
-            return $this->_filter($token->getTag()) . $this->_render($token) . $token->getStopper();
+        if (!isset($this->_markups[$token->getName()])) {
+            $oldToken  = $this->_token;
+            $return = $this->_filter($token->getTag()) . $this->_render($token) . $token->getStopper();
+            $this->_token = $oldToken;
+            return $return;
         }
 
         $name = $this->_getTagName($token);
-        $tag  = $this->_tags[$name];
+        $tag  = $this->_markups[$name];
 
         // check if the tag has content
         if (($tag['type'] & self::TAG_NORMAL) && !$token->hasChildren()) {
@@ -409,7 +382,16 @@ abstract class Zend_Markup_Renderer_RendererAbstract
 
         // check for the context
         if (!in_array($tag['group'], $this->_groups[$this->_group])) {
-            return $this->_filter($token->getTag()) . $this->_render($token) . $token->getStopper();
+            $oldToken  = $this->_token;
+            $return = $this->_filter($token->getTag()) . $this->_render($token) . $token->getStopper();
+            $this->_token = $oldToken;
+            return $return;
+        }
+
+        // check for the filter
+        if (!isset($tag['filter'])
+        || (!($tag['filter'] instanceof Zend_Filter_Interface) && ($tag['filter'] !== false))) {
+            $this->_markups[$name]['filter'] = $this->getDefaultFilter();
         }
 
         // callback
@@ -442,37 +424,37 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     }
 
     /**
-     * Get the tag name
+     * Filter method
      *
-     * @param Zend_Markup_Token
+     * @param string $value
      *
      * @return string
      */
-    protected function _getTagName(Zend_Markup_Token $token)
+    protected function _filter($value)
     {
-        $name = $token->getName();
-
-        // process the aliases
-        while ($this->_tags[$name]['type'] & self::TYPE_ALIAS) {
-            $name = $this->_tags[$name]['name'];
+        if ($this->_filter instanceof Zend_Filter_Interface) {
+            return $this->_filter->filter($value);
         }
-
-        return $name;
+        return $value;
     }
 
     /**
-     * Filter method
+     * Get the tag name
      *
-     * @param string $value
+     * @param Zend_Markup_Token
      *
      * @return string
      */
-    protected function _filter($value)
+    protected function _getTagName(Zend_Markup_Token $token)
     {
-        if ($this->_filter) {
-            return $this->getFilterChain()->filter($value);
+        $name = $token->getName();
+
+        // process the aliases
+        while ($this->_markups[$name]['type'] & self::TYPE_ALIAS) {
+            $name = $this->_markups[$name]['name'];
         }
-        return $value;
+
+        return $name;
     }
 
     /**
@@ -500,10 +482,43 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     }
 
     /**
-     * Initialize the default filters
+     * Get the default filter
+     *
+     * @return void
+     */
+    public function getDefaultFilter()
+    {
+        if (null === $this->_defaultFilter) {
+            $this->setDefaultFilter();
+        }
+
+        return $this->_defaultFilter;
+    }
+
+    /**
+     * Add a default filter
+     *
+     * @param string $filter
      *
      * @return void
      */
-    abstract public function addDefaultFilters();
+    public function addDefaultfilter(Zend_Filter_Interface $filter, $placement = Zend_Filter::CHAIN_APPEND)
+    {
+        if (!($this->_defaultFilter instanceof Zend_Filter)) {
+            $defaultFilter = new Zend_Filter();
+            $defaultFilter->addFilter($filter);
+            $this->_defaultFilter = $defaultFilter;
+        }
+
+        $this->_defaultFilter->addFilter($filter, $placement);
+    }
 
+    /**
+     * Set the default filters
+     *
+     * @param Zend_Filter_Interface $filter
+     *
+     * @return void
+     */
+    abstract public function setDefaultFilter(Zend_Filter_Interface $filter = null);
 }

+ 7 - 7
tests/Zend/Markup/BbcodeAndHtmlTest.php

@@ -152,16 +152,16 @@ class Zend_Markup_BbcodeAndHtmlTest extends PHPUnit_Framework_TestCase
             'Zend/Markup/Test/Renderer/Html'
         );
 
-        $this->_markup->addTag('bar',
+        $this->_markup->addMarkup('bar',
             Zend_Markup_Renderer_RendererAbstract::TYPE_CALLBACK | Zend_Markup_Renderer_RendererAbstract::TAG_NORMAL,
             array('group' => 'inline'));
-        $this->_markup->addTag('suppp',
+        $this->_markup->addMarkup('suppp',
             Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE | Zend_Markup_Renderer_RendererAbstract::TAG_NORMAL,
             array('start' => '<sup>', 'end' => '</sup>', 'group' => 'inline'));
-        $this->_markup->addTag('zend',
+        $this->_markup->addMarkup('zend',
             Zend_Markup_Renderer_RendererAbstract::TYPE_REPLACE | Zend_Markup_Renderer_RendererAbstract::TAG_SINGLE,
             array('replace' => 'Zend Framework', 'group' => 'inline'));
-        $this->_markup->addTag('line', Zend_Markup_Renderer_RendererAbstract::TYPE_ALIAS,
+        $this->_markup->addMarkup('line', Zend_Markup_Renderer_RendererAbstract::TYPE_ALIAS,
             array('name' => 'hr'));
 
         $this->assertEquals('[foo=blaat]hell<sup>test</sup>blaat[/foo]',
@@ -374,14 +374,14 @@ BBCODE;
 
     public function testRemoveTag()
     {
-        $this->_markup->removeTag('b');
+        $this->_markup->removeMarkup('b');
 
         $this->assertEquals('[b]bar[/b]', $this->_markup->render('[b]bar[/b]'));
     }
 
     public function testClearTags()
     {
-        $this->_markup->clearTags();
+        $this->_markup->clearMarkups();
 
         $this->assertEquals('[i]foo[/i]', $this->_markup->render('[i]foo[/i]'));
     }
@@ -390,7 +390,7 @@ BBCODE;
     {
         $m = $this->_markup;
 
-        $m->addFilter(new Zend_Filter_StringToUpper());
+        $m->addDefaultFilter(new Zend_Filter_StringToUpper());
 
         $this->assertEquals('<strong>HELLO</strong>', $m->render('[b]hello[/b]'));
     }

+ 11 - 2
tests/Zend/Markup/Test/Renderer/MockRenderer.php

@@ -42,8 +42,17 @@ require_once 'Zend/Markup/Renderer/RendererAbstract.php';
 class Zend_Markup_Test_Renderer_MockRenderer extends Zend_Markup_Renderer_RendererAbstract
 {
 
-    public function addDefaultFilters()
+    /**
+     * Set the default filter
+     *
+     * @return void
+     */
+    public function setDefaultFilter(Zend_Filter_Interface $filter = null)
     {
-        // we don't do anything here
+        if (empty($filter)) {
+            $this->_defaultFilter = new Zend_Filter();
+        } else {
+            $this->_defaultFilter = $filter;
+        }
     }
 }