includes/wikiengine/Parse/Default/Wikilink.php
changeset 1 fe660c52c48f
--- /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 @@
+<?php
+
+/**
+*
+* Parse for links to wiki pages.
+*
+* @category Text
+*
+* @package Text_Wiki
+*
+* @author Paul M. Jones <pmjones@php.net>
+*
+* @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 <pmjones@php.net>
+*
+*/
+
+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);
+    }
+}
+?>