diff -r 902822492a68 -r fe660c52c48f includes/wikiengine/Parse/Default/Wikilink.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/includes/wikiengine/Parse/Default/Wikilink.php Wed Jun 13 16:07:17 2007 -0400 @@ -0,0 +1,197 @@ + +* +* @license LGPL +* +* @version $Id: Wikilink.php,v 1.5 2005/09/14 14:29:38 toggg Exp $ +* +*/ + +/** +* +* Parse for links to wiki pages. +* +* Wiki page names are typically in StudlyCapsStyle made of +* WordsSmashedTogether. +* +* You can also create described links to pages in this style: +* [WikiPageName nice text link to use for display] +* +* The token options for this rule are: +* +* 'page' => the wiki page name. +* +* 'text' => the displayed link text. +* +* 'anchor' => a named anchor on the target wiki page. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Wikilink extends Text_Wiki_Parse { + + var $conf = array ( + 'ext_chars' => false + ); + + /** + * + * Constructor. + * + * We override the Text_Wiki_Parse constructor so we can + * explicitly comment each part of the $regex property. + * + * @access public + * + * @param object &$obj The calling "parent" Text_Wiki object. + * + */ + + function Text_Wiki_Parse_Wikilink(&$obj) + { + parent::Text_Wiki_Parse($obj); + + if ($this->getConf('ext_chars')) { + // use an extended character set; this should + // allow for umlauts and so on. taken from the + // Tavi project defaults.php file. + $upper = "A-Z\xc0-\xde"; + $lower = "a-z0-9\xdf-\xfe"; + $either = "A-Za-z0-9\xc0-\xfe"; + } else { + // the default character set, should be fine + // for most purposes. + $upper = "A-Z"; + $lower = "a-z0-9"; + $either = "A-Za-z0-9"; + } + + // build the regular expression for finding WikiPage names. + $this->regex = + "(!?" . // START WikiPage pattern (1) + "[$upper]" . // 1 upper + "[$either]*" . // 0+ alpha or digit + "[$lower]+" . // 1+ lower or digit + "[$upper]" . // 1 upper + "[$either]*" . // 0+ or more alpha or digit + ")" . // END WikiPage pattern (/1) + "((\#" . // START Anchor pattern (2)(3) + "[$either]" . // 1 alpha + "(" . // start sub pattern (4) + "[-_$either:.]*" . // 0+ dash, alpha, digit, underscore, colon, dot + "[-_$either]" . // 1 dash, alpha, digit, or underscore + ")?)?)"; // end subpatterns (/4)(/3)(/2) + } + + + /** + * + * First parses for described links, then for standalone links. + * + * @access public + * + * @return void + * + */ + + function parse() + { + // described wiki links + $tmp_regex = '/\[' . $this->regex . ' (.+?)\]/'; + $this->wiki->source = preg_replace_callback( + $tmp_regex, + array(&$this, 'processDescr'), + $this->wiki->source + ); + + // standalone wiki links + if ($this->getConf('ext_chars')) { + $either = "A-Za-z0-9\xc0-\xfe"; + } else { + $either = "A-Za-z0-9"; + } + + $tmp_regex = "/(^|[^{$either}\-_]){$this->regex}/"; + $this->wiki->source = preg_replace_callback( + $tmp_regex, + array(&$this, 'process'), + $this->wiki->source + ); + } + + + /** + * + * Generate a replacement for described links. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A delimited token to be used as a placeholder in + * the source text, plus any text priot to the match. + * + */ + + function processDescr(&$matches) + { + // set the options + $options = array( + 'page' => $matches[1], + 'text' => $matches[5], + 'anchor' => $matches[3] + ); + + // create and return the replacement token and preceding text + return $this->wiki->addToken($this->rule, $options); // . $matches[7]; + } + + + /** + * + * Generate a replacement for standalone links. + * + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A delimited token to be used as a placeholder in + * the source text, plus any text prior to the match. + * + */ + + function process(&$matches) + { + // when prefixed with !, it's explicitly not a wiki link. + // return everything as it was. + if ($matches[2]{0} == '!') { + return $matches[1] . substr($matches[2], 1) . $matches[3]; + } + + // set the options + $options = array( + 'page' => $matches[2], + 'text' => $matches[2] . $matches[3], + 'anchor' => $matches[3] + ); + + // create and return the replacement token and preceding text + return $matches[1] . $this->wiki->addToken($this->rule, $options); + } +} +?>