Blame | Last modification | View Log | RSS feed
<?php/**** Parse for URLS in the source text.** Various URL markings are supported: inline (the URL by itself),* numbered or footnote reference (where the URL is enclosed in square brackets), and* named reference (where the URL is enclosed in square brackets and has a* name included inside the brackets). E.g.:** inline -- http://example.com* numbered -- [http://example.com]* described -- [http://example.com Example Description]** When rendering a URL token, this will convert URLs pointing to a .gif,* .jpg, or .png image into an inline <img /> tag (for the 'xhtml'* format).** Token options are:** 'type' => ['inline'|'footnote'|'descr'] the type of URL** 'href' => the URL link href portion** 'text' => the displayed text of the URL link** $Id: Url.php,v 1.1 2005-01-20 19:43:20 jpm Exp $** @author Paul M. Jones <pmjones@ciaweb.net>** @package Text_Wiki**/class Text_Wiki_Parse_Url extends Text_Wiki_Parse {/**** Keeps a running count of numbered-reference URLs.** @access public** @var int**/var $footnoteCount = 0;/**** URL schemes recognized by this rule.** @access public** @var array**/var $conf = array('schemes' => array('http://','https://','ftp://','gopher://','news://','mailto:'));/**** Constructor.** We override the constructor so we can comment the regex nicely.** @access public**/function Text_Wiki_Parse_Url(&$obj){parent::Text_Wiki_Parse($obj);// convert the list of recognized schemes to a regex-safe string,// where the pattern delim is a slash$tmp = array();$list = $this->getConf('schemes', array());foreach ($list as $val) {$tmp[] = preg_quote($val, '/');}$schemes = implode('|', $tmp);// build the regex$this->regex ="($schemes)" . // allowed schemes"(" . // start pattern"[^ \\/\"\'{$this->wiki->delim}]*\\/" . // no spaces, backslashes, slashes, double-quotes, single quotes, or delimiters;")*" . // end pattern"[^ \\t\\n\\/\"\'{$this->wiki->delim}]*" ."[A-Za-z0-9\\/?=&~_]";}/**** Find three different kinds of URLs in the source text.** @access public**/function parse(){// -------------------------------------------------------------//// Described-reference (named) URLs.//// the regular expression for this kind of URL$tmp_regex = '/\[(' . $this->regex . ') ([^\]]+)\]/';// use a custom callback processing method to generate// the replacement text for matches.$this->wiki->source = preg_replace_callback($tmp_regex,array(&$this, 'processDescr'),$this->wiki->source);// -------------------------------------------------------------//// Numbered-reference (footnote-style) URLs.//// the regular expression for this kind of URL$tmp_regex = '/\[(' . $this->regex . ')\]/U';// use a custom callback processing method to generate// the replacement text for matches.$this->wiki->source = preg_replace_callback($tmp_regex,array(&$this, 'processFootnote'),$this->wiki->source);// -------------------------------------------------------------//// Normal inline URLs.//// the regular expression for this kind of URL$tmp_regex = '/(^|[^A-Za-z])(' . $this->regex . ')(.*?)/';// use the standard callback for inline URLs$this->wiki->source = preg_replace_callback($tmp_regex,array(&$this, 'process'),$this->wiki->source);}/**** Process inline URLs.** @param array &$matches** @param array $matches An array of matches from the parse() method* as generated by preg_replace_callback. $matches[0] is the full* matched string, $matches[1] is the first matched pattern,* $matches[2] is the second matched pattern, and so on.** @return string The processed text replacement.**/function process(&$matches){// set options$options = array('type' => 'inline','href' => $matches[2],'text' => $matches[2]);// tokenizereturn $matches[1] . $this->wiki->addToken($this->rule, $options) . $matches[5];}/**** Process numbered (footnote) URLs.** Token options are:* @param array &$matches** @param array $matches An array of matches from the parse() method* as generated by preg_replace_callback. $matches[0] is the full* matched string, $matches[1] is the first matched pattern,* $matches[2] is the second matched pattern, and so on.** @return string The processed text replacement.**/function processFootnote(&$matches){// keep a running count for footnotes$this->footnoteCount++;// set options$options = array('type' => 'footnote','href' => $matches[1],'text' => $this->footnoteCount);// tokenizereturn $this->wiki->addToken($this->rule, $options);}/**** Process described-reference (named-reference) URLs.** Token options are:* 'type' => ['inline'|'footnote'|'descr'] the type of URL* 'href' => the URL link href portion* 'text' => the displayed text of the URL link** @param array &$matches** @param array $matches An array of matches from the parse() method* as generated by preg_replace_callback. $matches[0] is the full* matched string, $matches[1] is the first matched pattern,* $matches[2] is the second matched pattern, and so on.** @return string The processed text replacement.**/function processDescr(&$matches){// set options$options = array('type' => 'descr','href' => $matches[1],'text' => $matches[4]);// tokenizereturn $this->wiki->addToken($this->rule, $options);}}?>