includes/wikiengine/Parse/Mediawiki/Freelink.php
changeset 1027 98c052fc3337
parent 1026 f0431eb8161e
child 1028 dde4416dea00
equal deleted inserted replaced
1026:f0431eb8161e 1027:98c052fc3337
     1 <?php
       
     2 
       
     3 /**
       
     4 * 
       
     5 * Parses for wiki freelink text.
       
     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: Freelink.php,v 1.4 2005/10/19 23:43:53 toggg Exp $
       
    16 * 
       
    17 */
       
    18 
       
    19 /**
       
    20 * 
       
    21 * Parses for freelinked page links.
       
    22 * 
       
    23 * This class implements a Text_Wiki_Parse to find source text marked as a
       
    24 * wiki freelink, and automatically create a link to that page.
       
    25 * 
       
    26 * A freelink is any page name not conforming to the standard
       
    27 * StudlyCapsStyle for a wiki page name.  For example, a page normally
       
    28 * named MyHomePage can be renamed and referred to as ((My Home Page)) --
       
    29 * note the spaces in the page name.  You can also make a "nice-looking"
       
    30 * link without renaming the target page; e.g., ((MyHomePage|My Home
       
    31 * Page)).  Finally, you can use named anchors on the target page:
       
    32 * ((MyHomePage|My Home Page#Section1)).
       
    33 *
       
    34 * @category Text
       
    35 * 
       
    36 * @package Text_Wiki
       
    37 * 
       
    38 * @author Paul M. Jones <pmjones@php.net>
       
    39 * 
       
    40 */
       
    41 
       
    42 class Text_Wiki_Parse_Freelink extends Text_Wiki_Parse {
       
    43     
       
    44     
       
    45     /**
       
    46     * 
       
    47     * Constructor.  We override the Text_Wiki_Parse constructor so we can
       
    48     * explicitly comment each part of the $regex property.
       
    49     * 
       
    50     * @access public
       
    51     * 
       
    52     * @param object &$obj The calling "parent" Text_Wiki object.
       
    53     * 
       
    54     */
       
    55     
       
    56     function Text_Wiki_Parse_Freelink(&$obj)
       
    57     {
       
    58         parent::Text_Wiki_Parse($obj);
       
    59         
       
    60         $this->regex =
       
    61             '/' .                                                   // START regex
       
    62             "\\(\\(" .                                               // double open-parens
       
    63             "(" .                                                   // START freelink page patter
       
    64             "[-A-Za-z0-9 _+\\/.,;:!?'\"\\[\\]\\{\\}&\xc0-\xff]+" . // 1 or more of just about any character
       
    65             ")" .                                                   // END  freelink page pattern
       
    66             "(" .                                                   // START display-name
       
    67             "\|" .                                                   // a pipe to start the display name
       
    68             "[-A-Za-z0-9 _+\\/.,;:!?'\"\\[\\]\\{\\}&\xc0-\xff]+" . // 1 or more of just about any character
       
    69             ")?" .                                                   // END display-name pattern 0 or 1
       
    70             "(" .                                                   // START pattern for named anchors
       
    71             "\#" .                                                   // a hash mark
       
    72             "[A-Za-z]" .                                           // 1 alpha
       
    73             "[-A-Za-z0-9_:.]*" .                                   // 0 or more alpha, digit, underscore
       
    74             ")?" .                                                   // END named anchors pattern 0 or 1
       
    75             "()\\)\\)" .                                           // double close-parens
       
    76             '/';                                                   // END regex
       
    77     }
       
    78     
       
    79     
       
    80     /**
       
    81     * 
       
    82     * Generates a replacement for the matched text.  Token options are:
       
    83     * 
       
    84     * 'page' => the wiki page name (e.g., HomePage).
       
    85     * 
       
    86     * 'text' => alternative text to be displayed in place of the wiki
       
    87     * page name.
       
    88     * 
       
    89     * 'anchor' => a named anchor on the target wiki page
       
    90     * 
       
    91     * @access public
       
    92     *
       
    93     * @param array &$matches The array of matches from parse().
       
    94     *
       
    95     * @return A delimited token to be used as a placeholder in
       
    96     * the source text, plus any text priot to the match.
       
    97     *
       
    98     */
       
    99     
       
   100     function process(&$matches)
       
   101     {
       
   102         // use nice variable names
       
   103         $page = $matches[1];
       
   104         $text = $matches[2];
       
   105         $anchor = $matches[3];
       
   106         
       
   107         // is the page given a new text appearance?
       
   108         if (trim($text) == '') {
       
   109             // no
       
   110             $text = $page;
       
   111         } else {
       
   112             // yes, strip the leading | character
       
   113             $text = substr($text, 1);
       
   114         }
       
   115         
       
   116         // set the options
       
   117         $options = array(
       
   118             'page'   => $page,
       
   119             'text'   => $text,
       
   120             'anchor' => $anchor
       
   121         );
       
   122         
       
   123         // return a token placeholder
       
   124         return $this->wiki->addToken($this->rule, $options);
       
   125     }
       
   126 }
       
   127 ?>