From eabe326466d0993720f5c3398bd0d6a71c0d6f34 Mon Sep 17 00:00:00 2001 From: Jeremy Shipman Date: Fri, 14 Sep 2007 01:12:22 +0000 Subject: [PATCH] Pear bbcode parser no longer requires work. git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.1.0@41699 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- parsers/BBCodeParser.ini | 2 +- parsers/BBCodeParser.php | 2 +- parsers/HTML/BBCodeParser/Filter.php | 10 + parsers/HTML/BBCodeParser/Filter/Basic.php | 71 +++++++ .../HTML/BBCodeParser/Filter/EmailLinks.php | 85 ++++++++ parsers/HTML/BBCodeParser/Filter/Extended.php | 97 +++++++++ parsers/HTML/BBCodeParser/Filter/Images.php | 79 +++++++ parsers/HTML/BBCodeParser/Filter/Links.php | 200 ++++++++++++++++++ parsers/HTML/BBCodeParser/Filter/Lists.php | 108 ++++++++++ ..._BBCodeParser.php => HTMLBBCodeParser.php} | 0 10 files changed, 652 insertions(+), 2 deletions(-) create mode 100644 parsers/HTML/BBCodeParser/Filter.php create mode 100644 parsers/HTML/BBCodeParser/Filter/Basic.php create mode 100644 parsers/HTML/BBCodeParser/Filter/EmailLinks.php create mode 100644 parsers/HTML/BBCodeParser/Filter/Extended.php create mode 100644 parsers/HTML/BBCodeParser/Filter/Images.php create mode 100644 parsers/HTML/BBCodeParser/Filter/Links.php create mode 100644 parsers/HTML/BBCodeParser/Filter/Lists.php rename parsers/HTML/{HTML_BBCodeParser.php => HTMLBBCodeParser.php} (100%) diff --git a/parsers/BBCodeParser.ini b/parsers/BBCodeParser.ini index 5d91dc158..2d120fe04 100644 --- a/parsers/BBCodeParser.ini +++ b/parsers/BBCodeParser.ini @@ -20,5 +20,5 @@ xmlclose = "true" ; possible values: a comma seperated list of filters ; comma seperated list of filters to use -filters = "" +filters = "Basic,Extended,EmailLinks,Images,Links,Lists" diff --git a/parsers/BBCodeParser.php b/parsers/BBCodeParser.php index d449f1210..ec53e3ab2 100644 --- a/parsers/BBCodeParser.php +++ b/parsers/BBCodeParser.php @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/parsers/HTML/BBCodeParser/Filter/Basic.php b/parsers/HTML/BBCodeParser/Filter/Basic.php new file mode 100644 index 000000000..58fb328cd --- /dev/null +++ b/parsers/HTML/BBCodeParser/Filter/Basic.php @@ -0,0 +1,71 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Basic.php,v 1.6 2007/07/02 16:54:25 cweiske Exp $ +// + +/** +* @package HTML_BBCodeParser +* @author Stijn de Reede +*/ + + +require_once 'HTML/BBCodeParser/Filter.php'; + + + + +class HTML_BBCodeParser_Filter_Basic extends HTML_BBCodeParser_Filter +{ + + /** + * An array of tags parsed by the engine + * + * @access private + * @var array + */ + var $_definedTags = array( 'b' => array( 'htmlopen' => 'strong', + 'htmlclose' => 'strong', + 'allowed' => 'all', + 'attributes'=> array()), + 'i' => array( 'htmlopen' => 'em', + 'htmlclose' => 'em', + 'allowed' => 'all', + 'attributes'=> array()), + 'u' => array( 'htmlopen' => 'span style="text-decoration:underline;"', + 'htmlclose' => 'span', + 'allowed' => 'all', + 'attributes'=> array()), + 's' => array( 'htmlopen' => 'del', + 'htmlclose' => 'del', + 'allowed' => 'all', + 'attributes'=> array()), + 'sub' => array( 'htmlopen' => 'sub', + 'htmlclose' => 'sub', + 'allowed' => 'all', + 'attributes'=> array()), + 'sup' => array( 'htmlopen' => 'sup', + 'htmlclose' => 'sup', + 'allowed' => 'all', + 'attributes'=> array()) + ); + +} + + +?> \ No newline at end of file diff --git a/parsers/HTML/BBCodeParser/Filter/EmailLinks.php b/parsers/HTML/BBCodeParser/Filter/EmailLinks.php new file mode 100644 index 000000000..58e3f6f67 --- /dev/null +++ b/parsers/HTML/BBCodeParser/Filter/EmailLinks.php @@ -0,0 +1,85 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Email.php,v 1.5 2007/07/02 16:54:25 cweiske Exp $ +// + +/** +* @package HTML_BBCodeParser +* @author Stijn de Reede +*/ + + +require_once 'HTML/BBCodeParser/Filter.php'; + + + + +class HTML_BBCodeParser_Filter_EmailLinks extends HTML_BBCodeParser_Filter +{ + + /** + * An array of tags parsed by the engine + * + * @access private + * @var array + */ + var $_definedTags = array( 'email' => array( 'htmlopen' => 'a', + 'htmlclose' => 'a', + 'allowed' => 'none^img', + 'attributes'=> array('email' =>'href=%2$smailto:%1$s%2$s') + + ) + ); + + + /** + * Executes statements before the actual array building starts + * + * This method should be overwritten in a filter if you want to do + * something before the parsing process starts. This can be useful to + * allow certain short alternative tags which then can be converted into + * proper tags with preg_replace() calls. + * The main class walks through all the filters and and calls this + * method if it exists. The filters should modify their private $_text + * variable. + * + * @return none + * @access private + * @see $_text + * @author Stijn de Reede + */ + function _preparse() + { + $options = HTML_BBCodeParser::getStaticProperty('HTML_BBCodeParser','_options'); + $o = $options['open']; + $c = $options['close']; + $oe = $options['open_esc']; + $ce = $options['close_esc']; + $pattern = array( "!(^|\s)([-a-z0-9_.]+@[-a-z0-9.]+\.[a-z]{2,4})!i", + "!".$oe."email(".$ce."|\s.*".$ce.")(.*)".$oe."/email".$ce."!Ui"); + $replace = array( "\\1".$o."email=\\2".$c."\\2".$o."/email".$c, + $o."email=\\2\\1\\2".$o."/email".$c); + $this->_preparsed = preg_replace($pattern, $replace, $this->_text); + } + + +} + + +?> diff --git a/parsers/HTML/BBCodeParser/Filter/Extended.php b/parsers/HTML/BBCodeParser/Filter/Extended.php new file mode 100644 index 000000000..1d376fd27 --- /dev/null +++ b/parsers/HTML/BBCodeParser/Filter/Extended.php @@ -0,0 +1,97 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Extended.php,v 1.3 2007/07/02 16:54:25 cweiske Exp $ +// + +/** +* @package HTML_BBCodeParser +* @author Stijn de Reede +*/ + + +require_once 'HTML/BBCodeParser/Filter.php'; + + + + +class HTML_BBCodeParser_Filter_Extended extends HTML_BBCodeParser_Filter +{ + + /** + * An array of tags parsed by the engine + * + * @access private + * @var array + */ + var $_definedTags = array( + 'color' => array( 'htmlopen' => 'span', + 'htmlclose' => 'span', + 'allowed' => 'all', + 'attributes'=> array('color' =>'style=%2$scolor:%1$s%2$s')), + 'size' => array( 'htmlopen' => 'span', + 'htmlclose' => 'span', + 'allowed' => 'all', + 'attributes'=> array('size' =>'style=%2$sfont-size:%1$spt%2$s')), + 'font' => array( 'htmlopen' => 'span', + 'htmlclose' => 'span', + 'allowed' => 'all', + 'attributes'=> array('font' =>'style=%2$sfont-family:%1$s%2$s')), + 'align' => array( 'htmlopen' => 'div', + 'htmlclose' => 'div', + 'allowed' => 'all', + 'attributes'=> array('align' =>'style=%2$stext-align:%1$s%2$s')), + 'quote' => array('htmlopen' => 'q', + 'htmlclose' => 'q', + 'allowed' => 'all', + 'attributes'=> array('quote' =>'cite=%2$s%1$s%2$s')), + 'code' => array('htmlopen' => 'pre', + 'htmlclose' => 'pre', + 'allowed' => 'all', + 'attributes'=> array()), + 'h1' => array('htmlopen' => 'h1', + 'htmlclose' => 'h1', + 'allowed' => 'all', + 'attributes'=> array()), + 'h2' => array('htmlopen' => 'h2', + 'htmlclose' => 'h2', + 'allowed' => 'all', + 'attributes'=> array()), + 'h3' => array('htmlopen' => 'h3', + 'htmlclose' => 'h3', + 'allowed' => 'all', + 'attributes'=> array()), + 'h4' => array('htmlopen' => 'h4', + 'htmlclose' => 'h4', + 'allowed' => 'all', + 'attributes'=> array()), + 'h5' => array('htmlopen' => 'h5', + 'htmlclose' => 'h5', + 'allowed' => 'all', + 'attributes'=> array()), + 'h6' => array('htmlopen' => 'h6', + 'htmlclose' => 'h6', + 'allowed' => 'all', + 'attributes'=> array()) + + ); + + +} + +?> \ No newline at end of file diff --git a/parsers/HTML/BBCodeParser/Filter/Images.php b/parsers/HTML/BBCodeParser/Filter/Images.php new file mode 100644 index 000000000..a779cdca4 --- /dev/null +++ b/parsers/HTML/BBCodeParser/Filter/Images.php @@ -0,0 +1,79 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Images.php,v 1.8 2007/07/02 17:44:47 cweiske Exp $ +// + +/** +* @package HTML_BBCodeParser +* @author Stijn de Reede +*/ +require_once 'HTML/BBCodeParser/Filter.php'; + +class HTML_BBCodeParser_Filter_Images extends HTML_BBCodeParser_Filter +{ + + /** + * An array of tags parsed by the engine + * + * @access private + * @var array + */ + var $_definedTags = array( + 'img' => array( + 'htmlopen' => 'img', + 'htmlclose' => '', + 'allowed' => 'none', + 'attributes'=> array( + 'img' => 'src=%2$s%1$s%2$s', + 'w' => 'width=%2$s%1$d%2$s', + 'h' => 'height=%2$s%1$d%2$s', + 'alt' => 'alt=%2$s%1$s%2$s', + ) + ) + ); + + /** + * Executes statements before the actual array building starts + * + * This method should be overwritten in a filter if you want to do + * something before the parsing process starts. This can be useful to + * allow certain short alternative tags which then can be converted into + * proper tags with preg_replace() calls. + * The main class walks through all the filters and and calls this + * method if it exists. The filters should modify their private $_text + * variable. + * + * @return none + * @access private + * @see $_text + * @author Stijn de Reede + */ + function _preparse() + { + $options = HTML_BBCodeParser::getStaticProperty('HTML_BBCodeParser','_options'); + $o = $options['open']; + $c = $options['close']; + $oe = $options['open_esc']; + $ce = $options['close_esc']; + $this->_preparsed = preg_replace( + "!".$oe."img(\s?.*)".$ce."(.*)".$oe."/img".$ce."!Ui", + $o."img=\"\$2\"\$1".$c.$o."/img".$c, + $this->_text); + } +} \ No newline at end of file diff --git a/parsers/HTML/BBCodeParser/Filter/Links.php b/parsers/HTML/BBCodeParser/Filter/Links.php new file mode 100644 index 000000000..ced113b6b --- /dev/null +++ b/parsers/HTML/BBCodeParser/Filter/Links.php @@ -0,0 +1,200 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Links.php,v 1.12 2007/07/02 18:26:17 cweiske Exp $ +// + +/** +* @package HTML_BBCodeParser +* @author Stijn de Reede +*/ +require_once 'HTML/BBCodeParser/Filter.php'; + +/** + * + */ +class HTML_BBCodeParser_Filter_Links extends HTML_BBCodeParser_Filter +{ + /** + * List of allowed schemes + * + * @access private + * @var array + */ + var $_allowedSchemes = array('http', 'https', 'ftp'); + + /** + * Default scheme + * + * @access private + * @var string + */ + var $_defaultScheme = 'http'; + + /** + * An array of tags parsed by the engine + * + * @access private + * @var array + */ + var $_definedTags = array( + 'url' => array( + 'htmlopen' => 'a', + 'htmlclose' => 'a', + 'allowed' => 'none^img', + 'attributes'=> array('url' => 'href=%2$s%1$s%2$s') + ) + ); + + + /** + * Executes statements before the actual array building starts + * + * This method should be overwritten in a filter if you want to do + * something before the parsing process starts. This can be useful to + * allow certain short alternative tags which then can be converted into + * proper tags with preg_replace() calls. + * The main class walks through all the filters and and calls this + * method if it exists. The filters should modify their private $_text + * variable. + * + * @return none + * @access private + * @see $_text + * @author Stijn de Reede + * @author Seth Price + */ + function _preparse() + { + $options = HTML_BBCodeParser::getStaticProperty('HTML_BBCodeParser', '_options'); + $o = $options['open']; + $c = $options['close']; + $oe = $options['open_esc']; + $ce = $options['close_esc']; + + $schemes = implode('|', $this->_allowedSchemes); + + $pattern = array( "/(?_text); + $pp = preg_replace($pattern[1], $o."url=\$2\$1\$2".$o."/url".$c, $pp); + $this->_preparsed = preg_replace_callback($pattern[2], array($this, 'smarterPPLink'), $pp); + + } + + /** + * Intelligently expand a URL into a link + * + * @return string + * @access private + * @author Seth Price + * @author Lorenzo Alberton + */ + function smarterPPLinkExpand($matches) + { + //echo '
';var_dump($matches);echo '

'; + $options = HTML_BBCodeParser::getStaticProperty('HTML_BBCodeParser','_options'); + $o = $options['open']; + $c = $options['close']; + + //If we have an intro tag that is [url], then skip this match + if ($matches[1] == $o.'url'.$c) { + return $matches[0]; + } + + $punctuation = '.,;:'; // Links can't end with these chars + $trailing = ''; + // Knock off ending punctuation + $last = substr($matches[2], -1); + while (strpos($punctuation, $last) !== false) { + // Last character is punctuation - remove it from the url + $trailing = $last.$trailing; + $matches[2] = substr($matches[2], 0, -1); + $last = substr($matches[2], -1); + } + + $off = strpos($matches[2], ':'); + + //Is a ":" (therefore a scheme) defined? + if ($off === false) { + /* + * Create a link with the default scheme of http. Notice that the + * text that is viewable to the user is unchanged, but the link + * itself contains the "http://". + */ + return $matches[1].$o.'url='.$this->_defaultScheme.'://'.$matches[2].$c.$matches[2].$o.'/url'.$c.$trailing; + } + + $scheme = substr($matches[2], 0, $off); + + /* + * If protocol is in the approved list than allow it. Note that this + * check isn't really needed, but the created link will just be deleted + * later in smarterPPLink() if we create it now and it isn't on the + * scheme list. + */ + if (in_array($scheme, $this->_allowedSchemes)) { + return $matches[1].$o.'url'.$c.$matches[2].$o.'/url'.$c.$trailing; + } + + return $matches[0]; + } + + /** + * Finish preparsing URL to clean it up + * + * @return string + * @access private + * @author Seth Price + */ + function smarterPPLink($matches) + { + $options = HTML_BBCodeParser::getStaticProperty('HTML_BBCodeParser','_options'); + $o = $options['open']; + $c = $options['close']; + + $urlServ = $matches[1]; + $path = $matches[5]; + + $off = strpos($urlServ, ':'); + + if ($off === false) { + //Default to http + $urlServ = $this->_defaultScheme.'://'.$urlServ; + $off = strpos($urlServ, ':'); + } + + //Add trailing slash if missing (to create a valid URL) + if (!$path) { + $path = '/'; + } + + $protocol = substr($urlServ, 0, $off); + + if (in_array($protocol, $this->_allowedSchemes)) { + //If protocol is in the approved list than allow it + return $o.'url='.$urlServ.$path.$c.$matches[6].$o.'/url'.$c; + } + + //Else remove url tag + return $matches[6]; + } +} +?> \ No newline at end of file diff --git a/parsers/HTML/BBCodeParser/Filter/Lists.php b/parsers/HTML/BBCodeParser/Filter/Lists.php new file mode 100644 index 000000000..5b2bd764c --- /dev/null +++ b/parsers/HTML/BBCodeParser/Filter/Lists.php @@ -0,0 +1,108 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Lists.php,v 1.5 2007/07/02 16:54:25 cweiske Exp $ +// + + +/** +* @package HTML_BBCodeParser +* @author Stijn de Reede +*/ + +require_once 'HTML/BBCodeParser/Filter.php'; + +/** + * + */ +class HTML_BBCodeParser_Filter_Lists extends HTML_BBCodeParser_Filter +{ + + /** + * An array of tags parsed by the engine + * + * @access private + * @var array + */ + var $_definedTags = array( 'list' => array( 'htmlopen' => 'ol', + 'htmlclose' => 'ol', + 'allowed' => 'all', + 'child' => 'none^li', + 'attributes'=> array('list' => 'style=%2$slist-style-type:%1$s;%2$s') + ), + 'ulist' => array( 'htmlopen' => 'ul', + 'htmlclose' => 'ul', + 'allowed' => 'all', + 'child' => 'none^li', + 'attributes'=> array('list' => 'style=%2$slist-style-type:%1$s;%2$s') + ), + 'li' => array( 'htmlopen' => 'li', + 'htmlclose' => 'li', + 'allowed' => 'all', + 'parent' => 'none^ulist,list', + 'attributes'=> array() + ) + ); + + + /** + * Executes statements before the actual array building starts + * + * This method should be overwritten in a filter if you want to do + * something before the parsing process starts. This can be useful to + * allow certain short alternative tags which then can be converted into + * proper tags with preg_replace() calls. + * The main class walks through all the filters and and calls this + * method if it exists. The filters should modify their private $_text + * variable. + * + * @return none + * @access private + * @see $_text + * @author Stijn de Reede , Seth Price + */ + function _preparse() + { + $options = HTML_BBCodeParser::getStaticProperty('HTML_BBCodeParser','_options'); + $o = $options['open']; + $c = $options['close']; + $oe = $options['open_esc']; + $ce = $options['close_esc']; + + $pattern = array( "!".$oe."\*".$ce."!", + "!".$oe."(u?)list=(?-i:A)(\s*[^".$ce."]*)".$ce."!i", + "!".$oe."(u?)list=(?-i:a)(\s*[^".$ce."]*)".$ce."!i", + "!".$oe."(u?)list=(?-i:I)(\s*[^".$ce."]*)".$ce."!i", + "!".$oe."(u?)list=(?-i:i)(\s*[^".$ce."]*)".$ce."!i", + "!".$oe."(u?)list=(?-i:1)(\s*[^".$ce."]*)".$ce."!i", + "!".$oe."(u?)list([^".$ce."]*)".$ce."!i"); + + $replace = array( $o."li".$c, + $o."\$1list=upper-alpha\$2".$c, + $o."\$1list=lower-alpha\$2".$c, + $o."\$1list=upper-roman\$2".$c, + $o."\$1list=lower-roman\$2".$c, + $o."\$1list=decimal\$2".$c, + $o."\$1list\$2".$c ); + + $this->_preparsed = preg_replace($pattern, $replace, $this->_text); + } +} + + +?> \ No newline at end of file diff --git a/parsers/HTML/HTML_BBCodeParser.php b/parsers/HTML/HTMLBBCodeParser.php similarity index 100% rename from parsers/HTML/HTML_BBCodeParser.php rename to parsers/HTML/HTMLBBCodeParser.php