home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / Text / Wiki / Parse.php < prev    next >
Encoding:
PHP Script  |  2008-07-02  |  6.4 KB  |  265 lines

  1. <?php
  2. // vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
  3. /**
  4.  * Baseline rule class for extension into a "real" parser component.
  5.  *
  6.  * PHP versions 4 and 5
  7.  *
  8.  * @category   Text
  9.  * @package    Text_Wiki
  10.  * @author     Paul M. Jones <pmjones@php.net>
  11.  * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  12.  * @version    CVS: $Id: Parse.php,v 1.5 2005/07/29 08:57:29 toggg Exp $
  13.  * @link       http://pear.php.net/package/Text_Wiki
  14.  */
  15.  
  16. /**
  17.  * Baseline rule class for extension into a "real" parser component.
  18.  *
  19.  * Text_Wiki_Rule classes do not stand on their own; they are called by a
  20.  * Text_Wiki object, typcially in the transform() method. Each rule class
  21.  * performs three main activities: parse, process, and render.
  22.  *
  23.  * The parse() method takes a regex and applies it to the whole block of
  24.  * source text at one time. Each match is sent as $matches to the
  25.  * process() method.
  26.  *
  27.  * The process() method acts on the matched text from the source, and
  28.  * then processes the source text is some way.  This may mean the
  29.  * creation of a delimited token using addToken().  In every case, the
  30.  * process() method returns the text that should replace the matched text
  31.  * from parse().
  32.  *
  33.  * @category   Text
  34.  * @package    Text_Wiki
  35.  * @author     Paul M. Jones <pmjones@php.net>
  36.  * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  37.  * @version    Release: @package_version@
  38.  * @link       http://pear.php.net/package/Text_Wiki
  39.  */
  40. class Text_Wiki_Parse {
  41.  
  42.  
  43.     /**
  44.     *
  45.     * Configuration options for this parser rule.
  46.     *
  47.     * @access public
  48.     *
  49.     * @var string
  50.     *
  51.     */
  52.  
  53.     var $conf = array();
  54.  
  55.  
  56.     /**
  57.     *
  58.     * Regular expression to find matching text for this rule.
  59.     *
  60.     * @access public
  61.     *
  62.     * @var string
  63.     *
  64.     * @see parse()
  65.     *
  66.     */
  67.  
  68.     var $regex = null;
  69.  
  70.  
  71.     /**
  72.     *
  73.     * The name of this rule for new token array elements.
  74.     *
  75.     * @access public
  76.     *
  77.     * @var string
  78.     *
  79.     */
  80.  
  81.     var $rule = null;
  82.  
  83.  
  84.     /**
  85.     *
  86.     * A reference to the calling Text_Wiki object.
  87.     *
  88.     * This is needed so that each rule has access to the same source
  89.     * text, token set, URLs, interwiki maps, page names, etc.
  90.     *
  91.     * @access public
  92.     *
  93.     * @var object
  94.     */
  95.  
  96.     var $wiki = null;
  97.  
  98.  
  99.     /**
  100.     *
  101.     * Constructor for this parser rule.
  102.     *
  103.     * @access public
  104.     *
  105.     * @param object &$obj The calling "parent" Text_Wiki object.
  106.     *
  107.     */
  108.  
  109.     function Text_Wiki_Parse(&$obj)
  110.     {
  111.         // set the reference to the calling Text_Wiki object;
  112.         // this allows us access to the shared source text, token
  113.         // array, etc.
  114.         $this->wiki =& $obj;
  115.  
  116.         // set the name of this rule; generally used when adding
  117.         // to the tokens array. strip off the Text_Wiki_Parse_ portion.
  118.         // text_wiki_parse_
  119.         // 0123456789012345
  120.         $tmp = substr(get_class($this), 16);
  121.         $this->rule = ucwords(strtolower($tmp));
  122.  
  123.         // override config options for the rule if specified
  124.         if (isset($this->wiki->parseConf[$this->rule]) &&
  125.             is_array($this->wiki->parseConf[$this->rule])) {
  126.  
  127.             $this->conf = array_merge(
  128.                 $this->conf,
  129.                 $this->wiki->parseConf[$this->rule]
  130.             );
  131.  
  132.         }
  133.     }
  134.  
  135.  
  136.     /**
  137.     *
  138.     * Abstrct method to parse source text for matches.
  139.     *
  140.     * Applies the rule's regular expression to the source text, passes
  141.     * every match to the process() method, and replaces the matched text
  142.     * with the results of the processing.
  143.     *
  144.     * @access public
  145.     *
  146.     * @see Text_Wiki_Parse::process()
  147.     *
  148.     */
  149.  
  150.     function parse()
  151.     {
  152.         $this->wiki->source = preg_replace_callback(
  153.             $this->regex,
  154.             array(&$this, 'process'),
  155.             $this->wiki->source
  156.         );
  157.     }
  158.  
  159.  
  160.     /**
  161.     *
  162.     * Abstract method to generate replacements for matched text.
  163.     *
  164.     * @access public
  165.     *
  166.     * @param array $matches An array of matches from the parse() method
  167.     * as generated by preg_replace_callback.  $matches[0] is the full
  168.     * matched string, $matches[1] is the first matched pattern,
  169.     * $matches[2] is the second matched pattern, and so on.
  170.     *
  171.     * @return string The processed text replacement; defaults to the
  172.     * full matched string (i.e., no changes to the text).
  173.     *
  174.     * @see Text_Wiki_Parse::parse()
  175.     *
  176.     */
  177.  
  178.     function process(&$matches)
  179.     {
  180.         return $matches[0];
  181.     }
  182.  
  183.  
  184.     /**
  185.     *
  186.     * Simple method to safely get configuration key values.
  187.     *
  188.     * @access public
  189.     *
  190.     * @param string $key The configuration key.
  191.     *
  192.     * @param mixed $default If the key does not exist, return this value
  193.     * instead.
  194.     *
  195.     * @return mixed The configuration key value (if it exists) or the
  196.     * default value (if not).
  197.     *
  198.     */
  199.  
  200.     function getConf($key, $default = null)
  201.     {
  202.         if (isset($this->conf[$key])) {
  203.             return $this->conf[$key];
  204.         } else {
  205.             return $default;
  206.         }
  207.     }
  208.  
  209.  
  210.     /**
  211.     *
  212.     * Extract 'attribute="value"' portions of wiki markup.
  213.     *
  214.     * This kind of markup is typically used only in macros, but is useful
  215.     * anywhere.
  216.     *
  217.     * The syntax is pretty strict; there can be no spaces between the
  218.     * option name, the equals, and the first double-quote; the value
  219.     * must be surrounded by double-quotes.  You can escape characters in
  220.     * the value with a backslash, and the backslash will be stripped for
  221.     * you.
  222.     *
  223.     * @access public
  224.     *
  225.     * @param string $text The "attributes" portion of markup.
  226.     *
  227.     * @return array An associative array of key-value pairs where the
  228.     * key is the option name and the value is the option value.
  229.     *
  230.     */
  231.  
  232.     function getAttrs($text)
  233.     {
  234.         // find the =" sections;
  235.         $tmp = explode('="', trim($text));
  236.  
  237.         // basic setup
  238.         $k = count($tmp) - 1;
  239.         $attrs = array();
  240.         $key = null;
  241.  
  242.         // loop through the sections
  243.         foreach ($tmp as $i => $val) {
  244.  
  245.             // first element is always the first key
  246.             if ($i == 0) {
  247.                 $key = trim($val);
  248.                 continue;
  249.             }
  250.  
  251.             // find the last double-quote in the value.
  252.             // the part to the left is the value for the last key,
  253.             // the part to the right is the next key name
  254.             $pos = strrpos($val, '"');
  255.             $attrs[$key] = stripslashes(substr($val, 0, $pos));
  256.             $key = trim(substr($val, $pos+1));
  257.  
  258.         }
  259.  
  260.         return $attrs;
  261.  
  262.     }
  263. }
  264. ?>
  265.