* * @license LGPL * * @version $Id: Url.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ * */ /** * * 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 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 * * @category Text * * @package Text_Wiki * * @author Paul M. Jones * */ 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] ); // tokenize return $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 ); // tokenize return $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] ); // tokenize return $this->wiki->addToken($this->rule, $options); } } ?>