Просмотр исходного кода

Refactored filtering.

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@20275 44c647ce-9c0f-0410-b52a-842ac1e357ba
kokx 16 лет назад
Родитель
Сommit
58a1d2bed4

+ 92 - 0
documentation/manual/en/module_specs/Zend_Markup-Renderers.xml

@@ -49,4 +49,96 @@ echo $bbcode->render('my [foo]tag[/foo]');
             support for custom tags.
         </para>
     </sect2>
+    
+    <sect2 id="zend.markup.renderers.list">
+        <title>List of tags</title>
+
+        <table id="zend.markup.renderers.list.tags">
+            <title>List of tags</title>
+
+            <tgroup cols="2" align="left" colsep="1" rowsep="1">
+                <thead>
+                    <row>
+                        <entry>Sample input (bbcode)</entry>
+
+                        <entry>Sample output</entry>
+                    </row>
+                </thead>
+
+                <tbody>
+                    <row>
+                        <entry>[b]foo[/b]</entry>
+
+                        <entry><![CDATA[<strong>foo</strong>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[i]foo[/i]</entry>
+
+                        <entry><![CDATA[<em>foo</em>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[cite]foo[/cite]</entry>
+
+                        <entry><![CDATA[<cite>foo</cite>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[del]foo[/del]</entry>
+
+                        <entry><![CDATA[<del>foo</del>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[ins]foo[/ins]</entry>
+
+                        <entry><![CDATA[<ins>foo</ins>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[sup]foo[/sup]</entry>
+
+                        <entry><![CDATA[<sup>foo</sup>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[sub]foo[/sub]</entry>
+
+                        <entry><![CDATA[<sub>foo</sub>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[span]foo[/span]</entry>
+
+                        <entry><![CDATA[<span>foo</span>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[acronym title="PHP Hypertext Preprocessor]PHP[/acronym]</entry>
+
+                        <entry><![CDATA[<acronym title="PHP Hypertext Preprocessor">PHP</acronym>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[url=http://framework.zend.com/]Zend Framework[/url]</entry>
+
+                        <entry><![CDATA[<a href="http://framework.zend.com/">Zend Framework</a>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[h1]foobar[/h1]</entry>
+
+                        <entry><![CDATA[<h1>foobar</h1>]]></entry>
+                    </row>
+
+                    <row>
+                        <entry>[img]http://framework.zend.com/images/logo.gif[/img]</entry>
+
+                        <entry><![CDATA[<img src="http://framework.zend.com/images/logo.gif" />]]></entry>
+                    </row>
+                </tbody>
+            </tgroup>
+        </table>
+    </sect2>
 </sect1>

+ 24 - 13
library/Zend/Markup/Renderer/Html.php

@@ -25,6 +25,14 @@
  */
 require_once 'Zend/Uri.php';
 /**
+ * @see Zend_Filter_HtmlEntities
+ */
+require_once 'Zend/Filter/HtmlEntities.php';
+/**
+ * @see Zend_Filter_Callback
+ */
+require_once 'Zend/Filter/Callback.php';
+/**
  * @see Zend_Markup_Renderer_RendererAbstract
  */
 require_once 'Zend/Markup/Renderer/RendererAbstract.php';
@@ -326,7 +334,23 @@ class Zend_Markup_Renderer_Html extends Zend_Markup_Renderer_RendererAbstract
         ));
 
         parent::__construct($options);
+
+        if (!isset($options['addDefaultFilters']) || ($options['addDefaultFilters'] == false)) {
+            $this->addDefaultFilters();
+        }
     }
+
+    /**
+     * Initialize the default filters
+     *
+     * @return void
+     */
+    public function addDefaultFilters()
+    {
+        $this->getFilterChain()->addFilter(new Zend_Filter_HtmlEntities());
+        $this->getFilterChain()->addFilter(new Zend_Filter_Callback('nl2br'));
+    }
+
     /**
      * Execute a replace token
      *
@@ -449,17 +473,4 @@ class Zend_Markup_Renderer_Html extends Zend_Markup_Renderer_RendererAbstract
         return false;
     }
 
-    /**
-     * Filter method, used for converting newlines to <br /> tags
-     *
-     * @param  string $value
-     * @return string
-     */
-    protected function _filter($value)
-    {
-        if ($this->_filter) {
-            return nl2br(htmlentities($value, ENT_QUOTES));
-        }
-        return $value;
-    }
 }

+ 94 - 19
library/Zend/Markup/Renderer/RendererAbstract.php

@@ -25,6 +25,10 @@
  */
 require_once 'Zend/Config.php';
 /**
+ * @see Zend_Filter
+ */
+require_once 'Zend/Filter.php';
+/**
  * @see Zend_Markup_Renderer_TokenConverterInterface
  */
 require_once 'Zend/Markup/Renderer/TokenConverterInterface.php';
@@ -69,6 +73,13 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     protected $_filter = true;
 
     /**
+     * Filter chain
+     *
+     * @var Zend_Filter
+     */
+    protected $_filterChain;
+
+    /**
      * The current group
      *
      * @var string
@@ -90,6 +101,14 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     protected $_pluginLoader;
 
     /**
+     * The current token
+     *
+     * @var Zend_Markup_Token
+     */
+    protected $_token;
+
+
+    /**
      * Constructor
      *
      * @param array|Zend_Config $options
@@ -108,6 +127,9 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         if (isset($options['useDefaultTags']) && ($options['useDefaultTags'] == false)) {
             $this->removeDefaultTags();
         }
+        if (isset($options['filter'])) {
+            $this->getFilterChain()->addFilter($options['filter']);
+        }
     }
 
     /**
@@ -143,11 +165,38 @@ 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
+     *
+     * @return void
+     */
+    public function addFilter(Zend_Filter_Interface $filter)
+    {
+        $this->getFilterChain()->addFilter($filter);
+    }
+
+    /**
      * Add a new tag
      *
-     * @param  string $name
-     * @param  string $type
-     * @param  array $info
+     * @param string $name
+     * @param string $type
+     * @param array $info
+     *
      * @return Zend_Markup_Renderer_RendererAbstract
      */
     public function addTag($name, $type, array $info)
@@ -262,8 +311,11 @@ abstract class Zend_Markup_Renderer_RendererAbstract
     protected function _render(Zend_Markup_Token $token)
     {
         $return    = '';
+
+        // 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()])) {
@@ -280,6 +332,8 @@ abstract class Zend_Markup_Renderer_RendererAbstract
             }
         }
 
+        $this->_token = $token;
+
         // if this tag has children, execute them
         if ($token->hasChildren()) {
             foreach ($token->getChildren() as $child) {
@@ -287,6 +341,8 @@ abstract class Zend_Markup_Renderer_RendererAbstract
             }
         }
 
+        // reset to the old values
+        $this->_token  = $oldToken;
         $this->_filter = $oldFilter;
         $this->_group  = $oldGroup;
 
@@ -333,14 +389,8 @@ abstract class Zend_Markup_Renderer_RendererAbstract
             return $this->_filter($token->getTag()) . $this->_render($token) . $token->getStopper();
         }
 
-        $tag  = $this->_tags[$token->getName()];
-        $name = $token->getName();
-
-        // alias processing
-        while ($tag['type'] & self::TYPE_ALIAS) {
-            $name = $tag['name'];
-            $tag  = $this->_tags[$name];
-        }
+        $name = $this->_getTagName($token);
+        $tag  = $this->_tags[$name];
 
         // check if the tag has content
         if (($tag['type'] & self::TAG_NORMAL) && !$token->hasChildren()) {
@@ -381,7 +431,39 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         return $this->_executeSingleReplace($token, $tag);
     }
 
-    // methods that will probably be interhited by subclasses
+    /**
+     * Get the tag name
+     *
+     * @param Zend_Markup_Token
+     *
+     * @return string
+     */
+    protected function _getTagName(Zend_Markup_Token $token)
+    {
+        $name = $token->getName();
+
+        // process the aliases
+        while ($this->_tags[$name]['type'] & self::TYPE_ALIAS) {
+            $name = $this->_tags[$name]['name'];
+        }
+
+        return $name;
+    }
+
+    /**
+     * Filter method
+     *
+     * @param string $value
+     *
+     * @return string
+     */
+    protected function _filter($value)
+    {
+        if ($this->_filter) {
+            return $this->getFilterChain()->filter($value);
+        }
+        return $value;
+    }
 
     /**
      * Execute a replace token
@@ -407,11 +489,4 @@ abstract class Zend_Markup_Renderer_RendererAbstract
         return $tag['replace'];
     }
 
-    /**
-     * Abstract filter method
-     *
-     * @param  string $value
-     * @return string
-     */
-    abstract protected function _filter($value);
 }