includes/wikiengine/Parse/Default/Wikilink.php
changeset 1 fe660c52c48f
equal deleted inserted replaced
0:902822492a68 1:fe660c52c48f
       
     1 <?php
       
     2 
       
     3 /**
       
     4 *
       
     5 * Parse for links to wiki pages.
       
     6 *
       
     7 * @category Text
       
     8 *
       
     9 * @package Text_Wiki
       
    10 *
       
    11 * @author Paul M. Jones <pmjones@php.net>
       
    12 *
       
    13 * @license LGPL
       
    14 *
       
    15 * @version $Id: Wikilink.php,v 1.5 2005/09/14 14:29:38 toggg Exp $
       
    16 *
       
    17 */
       
    18 
       
    19 /**
       
    20 *
       
    21 * Parse for links to wiki pages.
       
    22 *
       
    23 * Wiki page names are typically in StudlyCapsStyle made of
       
    24 * WordsSmashedTogether.
       
    25 *
       
    26 * You can also create described links to pages in this style:
       
    27 * [WikiPageName nice text link to use for display]
       
    28 *
       
    29 * The token options for this rule are:
       
    30 *
       
    31 * 'page' => the wiki page name.
       
    32 *
       
    33 * 'text' => the displayed link text.
       
    34 *
       
    35 * 'anchor' => a named anchor on the target wiki page.
       
    36 *
       
    37 * @category Text
       
    38 *
       
    39 * @package Text_Wiki
       
    40 *
       
    41 * @author Paul M. Jones <pmjones@php.net>
       
    42 *
       
    43 */
       
    44 
       
    45 class Text_Wiki_Parse_Wikilink extends Text_Wiki_Parse {
       
    46 
       
    47     var $conf = array (
       
    48     	'ext_chars' => false
       
    49     );
       
    50 
       
    51     /**
       
    52     *
       
    53     * Constructor.
       
    54     *
       
    55     * We override the Text_Wiki_Parse constructor so we can
       
    56     * explicitly comment each part of the $regex property.
       
    57     *
       
    58     * @access public
       
    59     *
       
    60     * @param object &$obj The calling "parent" Text_Wiki object.
       
    61     *
       
    62     */
       
    63 
       
    64     function Text_Wiki_Parse_Wikilink(&$obj)
       
    65     {
       
    66         parent::Text_Wiki_Parse($obj);
       
    67 
       
    68         if ($this->getConf('ext_chars')) {
       
    69         	// use an extended character set; this should
       
    70         	// allow for umlauts and so on.  taken from the
       
    71         	// Tavi project defaults.php file.
       
    72 			$upper = "A-Z\xc0-\xde";
       
    73 			$lower = "a-z0-9\xdf-\xfe";
       
    74 			$either = "A-Za-z0-9\xc0-\xfe";
       
    75 		} else {
       
    76 			// the default character set, should be fine
       
    77 			// for most purposes.
       
    78 			$upper = "A-Z";
       
    79 			$lower = "a-z0-9";
       
    80 			$either = "A-Za-z0-9";
       
    81 		}
       
    82 
       
    83         // build the regular expression for finding WikiPage names.
       
    84         $this->regex =
       
    85             "(!?" .            // START WikiPage pattern (1)
       
    86             "[$upper]" .       // 1 upper
       
    87             "[$either]*" .     // 0+ alpha or digit
       
    88             "[$lower]+" .      // 1+ lower or digit
       
    89             "[$upper]" .       // 1 upper
       
    90             "[$either]*" .     // 0+ or more alpha or digit
       
    91             ")" .              // END WikiPage pattern (/1)
       
    92             "((\#" .           // START Anchor pattern (2)(3)
       
    93             "[$either]" .      // 1 alpha
       
    94             "(" .              // start sub pattern (4)
       
    95             "[-_$either:.]*" . // 0+ dash, alpha, digit, underscore, colon, dot
       
    96             "[-_$either]" .    // 1 dash, alpha, digit, or underscore
       
    97             ")?)?)";           // end subpatterns (/4)(/3)(/2)
       
    98     }
       
    99 
       
   100 
       
   101     /**
       
   102     *
       
   103     * First parses for described links, then for standalone links.
       
   104     *
       
   105     * @access public
       
   106     *
       
   107     * @return void
       
   108     *
       
   109     */
       
   110 
       
   111     function parse()
       
   112     {
       
   113         // described wiki links
       
   114         $tmp_regex = '/\[' . $this->regex . ' (.+?)\]/';
       
   115         $this->wiki->source = preg_replace_callback(
       
   116             $tmp_regex,
       
   117             array(&$this, 'processDescr'),
       
   118             $this->wiki->source
       
   119         );
       
   120 
       
   121         // standalone wiki links
       
   122         if ($this->getConf('ext_chars')) {
       
   123 			$either = "A-Za-z0-9\xc0-\xfe";
       
   124 		} else {
       
   125 			$either = "A-Za-z0-9";
       
   126 		}
       
   127 
       
   128         $tmp_regex = "/(^|[^{$either}\-_]){$this->regex}/";
       
   129         $this->wiki->source = preg_replace_callback(
       
   130             $tmp_regex,
       
   131             array(&$this, 'process'),
       
   132             $this->wiki->source
       
   133         );
       
   134     }
       
   135 
       
   136 
       
   137     /**
       
   138     *
       
   139     * Generate a replacement for described links.
       
   140     *
       
   141     * @access public
       
   142     *
       
   143     * @param array &$matches The array of matches from parse().
       
   144     *
       
   145     * @return A delimited token to be used as a placeholder in
       
   146     * the source text, plus any text priot to the match.
       
   147     *
       
   148     */
       
   149 
       
   150     function processDescr(&$matches)
       
   151     {
       
   152         // set the options
       
   153         $options = array(
       
   154             'page'   => $matches[1],
       
   155             'text'   => $matches[5],
       
   156             'anchor' => $matches[3]
       
   157         );
       
   158 
       
   159         // create and return the replacement token and preceding text
       
   160         return $this->wiki->addToken($this->rule, $options); // . $matches[7];
       
   161     }
       
   162 
       
   163 
       
   164     /**
       
   165     *
       
   166     * Generate a replacement for standalone links.
       
   167     *
       
   168     *
       
   169     * @access public
       
   170     *
       
   171     * @param array &$matches The array of matches from parse().
       
   172     *
       
   173     * @return A delimited token to be used as a placeholder in
       
   174     * the source text, plus any text prior to the match.
       
   175     *
       
   176     */
       
   177 
       
   178     function process(&$matches)
       
   179     {
       
   180         // when prefixed with !, it's explicitly not a wiki link.
       
   181         // return everything as it was.
       
   182         if ($matches[2]{0} == '!') {
       
   183             return $matches[1] . substr($matches[2], 1) . $matches[3];
       
   184         }
       
   185 
       
   186         // set the options
       
   187         $options = array(
       
   188             'page' => $matches[2],
       
   189             'text' => $matches[2] . $matches[3],
       
   190             'anchor' => $matches[3]
       
   191         );
       
   192 
       
   193         // create and return the replacement token and preceding text
       
   194         return $matches[1] . $this->wiki->addToken($this->rule, $options);
       
   195     }
       
   196 }
       
   197 ?>