includes/wikiengine/Parse/Mediawiki/Emphasis.php
author Dan
Fri, 05 Oct 2007 01:57:00 -0400
changeset 161 e1a22031b5bd
parent 1 fe660c52c48f
permissions -rw-r--r--
Major revamps to the template parser. Fixed a few security holes that could allow PHP to be injected in untimely places in TPL code. Improved Ux for XSS attempt in tplWikiFormat. Documented many functions. Backported much cleaner parser from 2.0 branch. Beautified a lot of code in the depths of the template class. Pretty much a small-scale Extreme Makeover.

<?php
// vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
/**
 * Mediawiki: Parses for emphazised text.
 *
 * Text_Wiki rule parser to find source text emphazised
 * as defined by text surrounded by repeated single quotes  ''...'' and more
 * Translated are ''emphasis'' , '''strong''' or '''''both''''' ...
 *
 * PHP versions 4 and 5
 *
 * @category   Text
 * @package    Text_Wiki
 * @author     Bertrand Gugger <bertrand@toggg.com>
 * @author     Paul M. Jones <pmjones@php.net>
 * @copyright  2005 bertrand Gugger
 * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version    CVS: $Id: Emphasis.php,v 1.4 2006/02/15 12:27:40 toggg Exp $
 * @link       http://pear.php.net/package/Text_Wiki
 */

/**
 * Emphazised text rule parser class for Mediawiki. Makes Emphasis, Strong or both
 * This class implements a Text_Wiki_Parse to find source text marked for
 * emphasis, stronger and very as defined by text surrounded by 2,3 or 5 single-quotes.
 * On parsing, the text itself is left in place, but the starting and ending
 * instances of the single-quotes are replaced with tokens.
 *
 * @category   Text
 * @package    Text_Wiki
 * @author     Bertrand Gugger <bertrand@toggg.com>
 * @copyright  2005 bertrand Gugger
 * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/Text_Wiki
 * @see        Text_Wiki_Parse::Text_Wiki_Parse()
 */
class Text_Wiki_Parse_Emphasis extends Text_Wiki_Parse {

    /**
     * The regular expression used to parse the source text and find
     * matches conforming to this rule.  Used by the parse() method.
     * We match '' , ''' or ''''' embeded texts
     *
     * @access public
     * @var string
     * @see Text_Wiki_Parse::parse()
     */
    var $regex = "/(?<!')'('{1,4})(.*?)\\1'(?!')/";

    /**
     * Generates a replacement for the matched text.  Token options are:
     * - 'type' => ['start'|'end'] The starting or ending point of the emphasized text.
     * Generated tokens are Emphasis (this rule), Strong or Emphasis / Strong
     * The text itself is left in the source but may content bested blocks
     *
     * @access public
     * @param array &$matches The array of matches from parse().
     * @return string Delimited by start/end tokens to be used as
     * placeholder in the source text surrounding the text to be emphasized.
     */
    function process(&$matches)
    {
        $embeded = $matches[2];
        switch (strlen($matches[1])) {
            case 1:
                $start = $this->wiki->addToken($this->rule, array('type' => 'start'));
                $end   = $this->wiki->addToken($this->rule, array('type' => 'end'));
            break;
            case 3:
                $embeded = "'" . $embeded . "'";
            case 2:
                $start = $this->wiki->addToken('Strong',    array('type' => 'start'));
                $end   = $this->wiki->addToken('Strong',    array('type' => 'end'));
            break;
            case 4:
                $start = $this->wiki->addToken($this->rule, array('type' => 'start'))
                       . $this->wiki->addToken('Strong',    array('type' => 'start'));
                $end   = $this->wiki->addToken('Strong',    array('type' => 'end'))
                       . $this->wiki->addToken($this->rule, array('type' => 'end'));
            break;
        }
        return $start . $embeded . $end;
    }
}
?>