--- /dev/null
+- Replace:
+Wiki.php:
+require_once 'Text/Wiki/Parse.php';
+require_once dirname(__FILE__) . '/Text/Wiki/Parse.php';
+
+require_once 'Text/Wiki/Render.php';
+require_once dirname(__FILE__) . '/Wiki/Render.php';
* The baseline abstract parser class.
*/
-require_once 'Text/Wiki/Parse.php';
+require_once dirname(__FILE__) . '/Wiki/Parse.php';
/**
* The baseline abstract render class.
*/
-require_once 'Text/Wiki/Render.php';
+require_once dirname(__FILE__) . '/Wiki/Render.php';
/**
--- /dev/null
+<?php
+
+/**
+*
+* Baseline rule class for extension into a "real" parser component.
+*
+* Text_Wiki_Rule classes do not stand on their own; they are called by a
+* Text_Wiki object, typcially in the transform()method. Each rule class
+* performs three main activities: parse, process, and render.
+*
+* The parse() method takes a regex and applies it to the whole block of
+* source text at one time. Each match is sent as $matches to the
+* process() method.
+*
+* The process() method acts on the matched text from the source, and
+* then processes the source text is some way. This may mean the
+* creation of a delimited token using addToken(). In every case, the
+* process() method returns the text that should replace the matched text
+* from parse().
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+* $Id: Parse.php,v 1.2 2004/09/25 19:05:13 pmjones Exp $
+*
+*/
+
+class Text_Wiki_Parse {
+
+
+ /**
+ *
+ * Configuration options for this parser rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $conf = array();
+
+
+ /**
+ *
+ * Regular expression to find matching text for this rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = null;
+
+
+ /**
+ *
+ * The name of this rule for new token array elements.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $rule = null;
+
+
+ /**
+ *
+ * A reference to the calling Text_Wiki object.
+ *
+ * This is needed so that each rule has access to the same source
+ * text, token set, URLs, interwiki maps, page names, etc.
+ *
+ * @access public
+ *
+ * @var object
+ */
+
+ var $wiki = null;
+
+
+ /**
+ *
+ * Constructor for this parser rule.
+ *
+ * @access public
+ *
+ * @param object &$obj The calling "parent" Text_Wiki object.
+ *
+ */
+
+ function Text_Wiki_Parse(&$obj)
+ {
+ // set the reference to the calling Text_Wiki object;
+ // this allows us access to the shared source text, token
+ // array, etc.
+ $this->wiki =& $obj;
+
+ // set the name of this rule; generally used when adding
+ // to the tokens array. strip off the Text_Wiki_Parse_ portion.
+ // text_wiki_parse_
+ // 0123456789012345
+ $tmp = substr(get_class($this), 16);
+ $this->rule = ucwords(strtolower($tmp));
+
+ // override config options for the rule if specified
+ if (isset($this->wiki->parseConf[$this->rule]) &&
+ is_array($this->wiki->parseConf[$this->rule])) {
+
+ $this->conf = array_merge(
+ $this->conf,
+ $this->wiki->parseConf[$this->rule]
+ );
+
+ }
+ }
+
+
+ /**
+ *
+ * Abstrct method to parse source text for matches.
+ *
+ * Applies the rule's regular expression to the source text, passes
+ * every match to the process() method, and replaces the matched text
+ * with the results of the processing.
+ *
+ * @access public
+ *
+ * @see Text_Wiki_Parse::process()
+ *
+ */
+
+ function parse()
+ {
+ $this->wiki->source = preg_replace_callback(
+ $this->regex,
+ array(&$this, 'process'),
+ $this->wiki->source
+ );
+ }
+
+
+ /**
+ *
+ * Abstract method to generate replacements for matched text.
+ *
+ * @access public
+ *
+ * @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; defaults to the
+ * full matched string (i.e., no changes to the text).
+ *
+ * @see Text_Wiki_Parse::parse()
+ *
+ */
+
+ function process(&$matches)
+ {
+ return $matches[0];
+ }
+
+
+ /**
+ *
+ * Simple method to safely get configuration key values.
+ *
+ * @access public
+ *
+ * @param string $key The configuration key.
+ *
+ * @param mixed $default If the key does not exist, return this value
+ * instead.
+ *
+ * @return mixed The configuration key value (if it exists) or the
+ * default value (if not).
+ *
+ */
+
+ function getConf($key, $default = null)
+ {
+ if (isset($this->conf[$key])) {
+ return $this->conf[$key];
+ } else {
+ return $default;
+ }
+ }
+
+
+ /**
+ *
+ * Extract 'attribute="value"' portions of wiki markup.
+ *
+ * This kind of markup is typically used only in macros, but is useful
+ * anywhere.
+ *
+ * The syntax is pretty strict; there can be no spaces between the
+ * option name, the equals, and the first double-quote; the value
+ * must be surrounded by double-quotes. You can escape characters in
+ * the value with a backslash, and the backslash will be stripped for
+ * you.
+ *
+ * @access public
+ *
+ * @param string $text The "attributes" portion of markup.
+ *
+ * @return array An associative array of key-value pairs where the
+ * key is the option name and the value is the option value.
+ *
+ */
+
+ function getAttrs($text)
+ {
+ // find the =" sections;
+ $tmp = explode('="', trim($text));
+
+ // basic setup
+ $k = count($tmp) - 1;
+ $attrs = array();
+ $key = null;
+
+ // loop through the sections
+ foreach ($tmp as $i => $val) {
+
+ // first element is always the first key
+ if ($i == 0) {
+ $key = trim($val);
+ continue;
+ }
+
+ // find the last double-quote in the value.
+ // the part to the left is the value for the last key,
+ // the part to the right is the next key name
+ $pos = strrpos($val, '"');
+ $attrs[$key] = stripslashes(substr($val, 0, $pos));
+ $key = trim(substr($val, $pos+1));
+
+ }
+
+ return $attrs;
+
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* This class implements a Text_Wiki_Parse to add an anchor target name
+* in the wiki page.
+*
+* @author Manuel Holtgrewe <purestorm at ggnore dot net>
+*
+* @author Paul M. Jones <pmjones at ciaweb dot net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Anchor extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule. Looks like a macro: [[# anchor_name]]
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = '/(\[\[# )([-_A-Za-z0-9.]+?)( .+)?(\]\])/i';
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'text' => The full matched text, not including the <code></code> tags.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches) {
+
+ $name = $matches[2];
+ $text = $matches[3];
+
+ $start = $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'start', 'name' => $name)
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'end', 'name' => $name)
+ );
+
+ // done, place the script output directly in the source
+ return $start . trim($text) . $end;
+ }
+}
+?>
--- /dev/null
+<?php
+
+/**
+*
+* Parse for block-quoted text.
+*
+* Find source text marked as a blockquote, identified by any number of
+* greater-than signs '>' at the start of the line, followed by a space,
+* and then the quote text; each '>' indicates an additional level of
+* quoting.
+*
+* $Id: Blockquote.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Blockquote extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * Regex for parsing the source text.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/\n((\>).*\n)(?!(\>))/Us';
+
+
+ /**
+ *
+ * Generates a replacement for the matched text.
+ *
+ * Token options are:
+ *
+ * 'type' =>
+ * 'start' : the start of a blockquote
+ * 'end' : the end of a blockquote
+ *
+ * 'level' => the indent level (0 for the first level, 1 for the
+ * second, etc)
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A series of text and delimited tokens marking the different
+ * list text and list elements.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // the replacement text we will return to parse()
+ $return = '';
+
+ // the list of post-processing matches
+ $list = array();
+
+ // $matches[1] is the text matched as a list set by parse();
+ // create an array called $list that contains a new set of
+ // matches for the various list-item elements.
+ preg_match_all(
+ '=^(\>+) (.*\n)=Ums',
+ $matches[1],
+ $list,
+ PREG_SET_ORDER
+ );
+
+ // a stack of starts and ends; we keep this so that we know what
+ // indent level we're at.
+ $stack = array();
+
+ // loop through each list-item element.
+ foreach ($list as $key => $val) {
+
+ // $val[0] is the full matched list-item line
+ // $val[1] is the number of initial '>' chars (indent level)
+ // $val[2] is the quote text
+
+ // we number levels starting at 1, not zero
+ $level = strlen($val[1]);
+
+ // get the text of the line
+ $text = $val[2];
+
+ // add a level to the list?
+ while ($level > count($stack)) {
+
+ // the current indent level is greater than the number
+ // of stack elements, so we must be starting a new
+ // level. push the new level onto the stack with a
+ // dummy value (boolean true)...
+ array_push($stack, true);
+
+ $return .= "\n";
+
+ // ...and add a start token to the return.
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'start',
+ 'level' => $level - 1
+ )
+ );
+
+ $return .= "\n\n";
+ }
+
+ // remove a level?
+ while (count($stack) > $level) {
+
+ // as long as the stack count is greater than the
+ // current indent level, we need to end list types.
+ // continue adding end-list tokens until the stack count
+ // and the indent level are the same.
+ array_pop($stack);
+
+ $return .= "\n\n";
+
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => 'end',
+ 'level' => count($stack)
+ )
+ );
+
+ $return .= "\n";
+ }
+
+ // add the line text.
+ $return .= $text;
+ }
+
+ // the last line may have been indented. go through the stack
+ // and create end-tokens until the stack is empty.
+ $return .= "\n";
+
+ while (count($stack) > 0) {
+ array_pop($stack);
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => 'end',
+ 'level' => count($stack)
+ )
+ );
+ }
+
+ // we're done! send back the replacement text.
+ return "\n$return\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Bold.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Rule to find source text marked for
+* strong emphasis (bold) as defined by text surrounded by three
+* single-quotes. On parsing, the text itself is left in place, but the
+* starting and ending instances of three single-quotes are replaced with
+* tokens.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Bold extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/'''(()|[^'].*)'''/U";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * emphasized text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A pair of delimited tokens to be used as a placeholder in
+ * the source text surrounding the text to be emphasized.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken($this->rule, array('type' => 'start'));
+ $end = $this->wiki->addToken($this->rule, array('type' => 'end'));
+ return $start . $matches[1] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Break.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to mark forced line breaks in the
+* source text.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Break extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/ _\n/';
+
+
+ /**
+ *
+ * Generates a replacement token for the matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A delimited token to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ return $this->wiki->addToken($this->rule);
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Center.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find lines marked for centering.
+* The line must start with "= " (i.e., an equal-sign followed by a space).
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Center extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = '/\n\= (.*?)\n/';
+
+ /**
+ *
+ * Generates a token entry for the matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'end')
+ );
+
+ return "\n" . $start . $matches[1] . $end . "\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Code.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find sections marked as code
+* examples. Blocks are marked as the string <code> on a line by itself,
+* followed by the inline code example, and terminated with the string
+* </code> on a line by itself. The code example is run through the
+* native PHP highlight_string() function to colorize it, then surrounded
+* with <pre>...</pre> tags when rendered as XHTML.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Code extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = '/^(\<code( .+)?\>)\n(.+)\n(\<\/code\>)(\s|$)/Umsi';
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'text' => The full matched text, not including the <code></code> tags.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // are there additional attribute arguments?
+ $args = trim($matches[2]);
+
+ if ($args == '') {
+ $options = array(
+ 'text' => $matches[3],
+ 'attr' => array('type' => '')
+ );
+ } else {
+ // get the attributes...
+ $attr = $this->getAttrs($args);
+
+ // ... and make sure we have a 'type'
+ if (! isset($attr['type'])) {
+ $attr['type'] = '';
+ }
+
+ // retain the options
+ $options = array(
+ 'text' => $matches[3],
+ 'attr' => $attr
+ );
+ }
+
+ return $this->wiki->addToken($this->rule, $options) . $matches[5];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Colortext.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked for
+* coloring.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Colortext extends Text_Wiki_Parse {
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\#\#(.+?)\|(.+?)\#\#/";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * emphasized text. The text itself is left in the source.
+ *
+ * 'color' => the color indicator
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the text to be
+ * emphasized.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'start',
+ 'color' => $matches[1]
+ )
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'end',
+ 'color' => $matches[1]
+ )
+ );
+
+ return $start . $matches[2] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Deflist.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked as a
+* definition list. In short, if a line starts with ':' then it is a
+* definition list item; another ':' on the same lines indicates the end
+* of the definition term and the beginning of the definition narrative.
+* The list items must be on sequential lines (no blank lines between
+* them) -- a blank line indicates the beginning of a new list.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Deflist extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/\n((: ).*\n)(?!(: |\n))/Us';
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' =>
+ * 'list_start' : the start of a definition list
+ * 'list_end' : the end of a definition list
+ * 'term_start' : the start of a definition term
+ * 'term_end' : the end of a definition term
+ * 'narr_start' : the start of definition narrative
+ * 'narr_end' : the end of definition narrative
+ * 'unknown' : unknown type of definition portion
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A series of text and delimited tokens marking the different
+ * list text and list elements.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // the replacement text we will return to parse()
+ $return = '';
+
+ // the list of post-processing matches
+ $list = array();
+
+ // start the deflist
+ $options = array('type' => 'list_start');
+ $return .= $this->wiki->addToken($this->rule, $options);
+
+ // $matches[1] is the text matched as a list set by parse();
+ // create an array called $list that contains a new set of
+ // matches for the various definition-list elements.
+ preg_match_all(
+ '/^(: )(.*)?( : )(.*)?$/Ums',
+ $matches[1],
+ $list,
+ PREG_SET_ORDER
+ );
+
+ // add each term and narrative
+ foreach ($list as $key => $val) {
+ $return .= (
+ $this->wiki->addToken($this->rule, array('type' => 'term_start')) .
+ trim($val[2]) .
+ $this->wiki->addToken($this->rule, array('type' => 'term_end')) .
+ $this->wiki->addToken($this->rule, array('type' => 'narr_start')) .
+ trim($val[4]) .
+ $this->wiki->addToken($this->rule, array('type' => 'narr_end'))
+ );
+ }
+
+
+ // end the deflist
+ $options = array('type' => 'list_end');
+ $return .= $this->wiki->addToken($this->rule, $options);
+
+ // done!
+ return "\n" . $return . "\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Delimiter.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find instances of the delimiter
+* character already embedded in the source text; it extracts them and replaces
+* them with a delimited token, then renders them as the delimiter itself
+* when the target format is XHTML.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Delimiter extends Text_Wiki_Parse {
+
+ /**
+ *
+ * Constructor. Overrides the Text_Wiki_Parse constructor so that we
+ * can set the $regex property dynamically (we need to include the
+ * Text_Wiki $delim character.
+ *
+ * @param object &$obj The calling "parent" Text_Wiki object.
+ *
+ * @param string $name The token name to use for this rule.
+ *
+ */
+
+ function Text_Wiki_Parse_delimiter(&$obj)
+ {
+ parent::Text_Wiki_Parse($obj);
+ $this->regex = '/' . $this->wiki->delim . '/';
+ }
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'text' => The full matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ return $this->wiki->addToken(
+ $this->rule,
+ array('text' => $this->wiki->delim)
+ );
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Embed.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to embed the contents of a URL
+* inside the page at render-time. Typically used to get script output.
+* This differs from the 'include' rule, which incorporates results at
+* parse-time; 'embed' output does not get parsed by Text_Wiki, while
+* 'include' ouput does.
+*
+* This rule is inherently not secure; it allows cross-site scripting to
+* occur if the embedded output has <script> or other similar tags. Be
+* careful.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Embed extends Text_Wiki_Parse {
+
+ var $conf = array(
+ 'base' => '/path/to/scripts/'
+ );
+
+ var $file = null;
+
+ var $output = null;
+
+ var $vars = null;
+
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = '/(\[\[embed )(.+?)( .+?)?(\]\])/i';
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'text' => The full matched text, not including the <code></code> tags.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // save the file location
+ $this->file = $this->getConf('base', './') . $matches[2];
+
+ // extract attribs as variables in the local space
+ $this->vars = $this->getAttrs($matches[3]);
+ unset($this->vars['this']);
+ extract($this->vars);
+
+ // run the script
+ ob_start();
+ include($this->file);
+ $this->output = ob_get_contents();
+ ob_end_clean();
+
+ // done, place the script output directly in the source
+ return $this->wiki->addToken(
+ $this->rule,
+ array('text' => $this->output)
+ );
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Emphasis.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked for
+* emphasis (italics) as defined by text surrounded by two single-quotes.
+* On parsing, the text itself is left in place, but the starting and ending
+* instances of two single-quotes are replaced with tokens.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_emphasis extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\/\/(.*?)\/\//";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * emphasized text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the text to be
+ * emphasized.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . $matches[1] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Freelink.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked as a
+* wiki freelink, and automatically create a link to that page.
+*
+* A freelink is any page name not conforming to the standard
+* StudlyCapsStyle for a wiki page name. For example, a page normally
+* named MyHomePage can be renamed and referred to as ((My Home Page)) --
+* note the spaces in the page name. You can also make a "nice-looking"
+* link without renaming the target page; e.g., ((MyHomePage|My Home
+* Page)). Finally, you can use named anchors on the target page:
+* ((MyHomePage|My Home Page#Section1)).
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Freelink extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * 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_Freelink(&$obj)
+ {
+ parent::Text_Wiki_Parse($obj);
+
+ $this->regex =
+ '/' . // START regex
+ "\\(\\(" . // double open-parens
+ "(" . // START freelink page patter
+ "[-A-Za-z0-9 _+\\/.,;:!?'\"\\[\\]\\{\\}&\xc0-\xff]+" . // 1 or more of just about any character
+ ")" . // END freelink page pattern
+ "(" . // START display-name
+ "\|" . // a pipe to start the display name
+ "[-A-Za-z0-9 _+\\/.,;:!?'\"\\[\\]\\{\\}&\xc0-\xff]+" . // 1 or more of just about any character
+ ")?" . // END display-name pattern 0 or 1
+ "(" . // START pattern for named anchors
+ "\#" . // a hash mark
+ "[A-Za-z]" . // 1 alpha
+ "[-A-Za-z0-9_:.]*" . // 0 or more alpha, digit, underscore
+ ")?" . // END named anchors pattern 0 or 1
+ "()\\)\\)" . // double close-parens
+ '/'; // END regex
+ }
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'page' => the wiki page name (e.g., HomePage).
+ *
+ * 'text' => alternative text to be displayed in place of the wiki
+ * page name.
+ *
+ * 'anchor' => a named anchor on the target wiki page
+ *
+ * @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 process(&$matches)
+ {
+ // use nice variable names
+ $page = $matches[1];
+ $text = $matches[2];
+
+ // get rid of the leading # from the anchor, if any
+ $anchor = substr($matches[3], 1);
+
+ // is the page given a new text appearance?
+ if (trim($text) == '') {
+ // no
+ $text = $page;
+ } else {
+ // yes, strip the leading | character
+ $text = substr($text, 1);
+ }
+
+ // set the options
+ $options = array(
+ 'page' => $page,
+ 'text' => $text,
+ 'anchor' => $anchor
+ );
+
+ // return a token placeholder
+ return $this->wiki->addToken($this->rule, $options);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+// $Id: Function.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+class Text_Wiki_Parse_Function extends Text_Wiki_Parse {
+
+ var $regex = '/^(\<function\>)\n(.+)\n(\<\/function\>)(\s|$)/Umsi';
+
+ function process(&$matches)
+ {
+ // default options
+ $opts = array(
+ 'name' => null,
+ 'access' => null,
+ 'return' => null,
+ 'params' => array(),
+ 'throws' => array()
+ );
+
+ // split apart the markup lines and loop through them
+ $lines = explode("\n", $matches[2]);
+ foreach ($lines as $line) {
+
+ // skip blank lines
+ if (trim($line) == '') {
+ continue;
+ }
+
+ // find the first ':' on the line; the left part is the
+ // type, the right part is the value. skip lines without
+ // a ':' on them.
+ $pos = strpos($line, ':');
+ if ($pos === false) {
+ continue;
+ }
+
+ // $type is the line type: name, access, return, param, throws
+ // 012345678901234
+ // name: something
+ $type = trim(substr($line, 0, $pos));
+ $val = trim(substr($line, $pos+1));
+
+ switch($type) {
+
+ case 'a':
+ case 'access':
+ $opts['access'] = $val;
+ break;
+
+ case 'n':
+ case 'name':
+ $opts['name'] = $val;
+ break;
+
+ case 'p':
+ case 'param':
+ $tmp = explode(',', $val);
+ $k = count($tmp);
+ if ($k == 1) {
+ $opts['params'][] = array(
+ 'type' => $tmp[0],
+ 'descr' => null,
+ 'default' => null
+ );
+ } elseif ($k == 2) {
+ $opts['params'][] = array(
+ 'type' => $tmp[0],
+ 'descr' => $tmp[1],
+ 'default' => null
+ );
+ } else {
+ $opts['params'][] = array(
+ 'type' => $tmp[0],
+ 'descr' => $tmp[1],
+ 'default' => $tmp[2]
+ );
+ }
+ break;
+
+ case 'r':
+ case 'return':
+ case 'returns':
+ $opts['return'] = $val;
+ break;
+
+ case 't':
+ case 'throws':
+ $tmp = explode(',', $val);
+ $k = count($tmp);
+ if ($k == 1) {
+ $opts['throws'][] = array(
+ 'type' => $tmp[0],
+ 'descr' => null
+ );
+ } else {
+ $opts['throws'][] = array(
+ 'type' => $tmp[0],
+ 'descr' => $tmp[1]
+ );
+ }
+ break;
+
+ default:
+ $opts[$type] = $val;
+ break;
+
+ }
+ }
+
+ // add the token back in place
+ return $this->wiki->addToken($this->rule, $opts) . $matches[4];
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Heading.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked to
+* be a heading element, as defined by text on a line by itself prefixed
+* with a number of plus signs (+). The heading text itself is left in
+* the source, but is prefixed and suffixed with delimited tokens marking
+* the start and end of the heading.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Heading extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/^(\+{1,6}) (.*)/m';
+
+ var $conf = array(
+ 'id_prefix' => 'toc'
+ );
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * heading text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the heading text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // keep a running count for header IDs. we use this later
+ // when constructing TOC entries, etc.
+ static $id;
+ if (! isset($id)) {
+ $id = 0;
+ }
+
+ $prefix = htmlspecialchars($this->getConf('id_prefix'));
+
+ $start = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'start',
+ 'level' => strlen($matches[1]),
+ 'text' => $matches[2],
+ 'id' => $prefix . $id ++
+ )
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'end',
+ 'level' => strlen($matches[1])
+ )
+ );
+
+ return $start . $matches[2] . $end . "\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Horiz.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked to
+* be a horizontal rule, as defined by four dashed on their own line.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Horiz extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/^([-]{4,})$/m';
+
+
+ /**
+ *
+ * Generates a replacement token for the matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A token marking the horizontal rule.
+ *
+ */
+
+ function process(&$matches)
+ {
+ return $this->wiki->addToken($this->rule);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Html.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked as
+* HTML to be redndred as-is. The block start is marked by <html> on its
+* own line, and the block end is marked by </html> on its own line.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Html extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/^\<html\>\n(.+)\n\<\/html\>(\s|$)/Umsi';
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'text' => The text of the HTML to be rendered as-is.
+ *
+ * @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 following the HTML block.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $options = array('text' => $matches[1]);
+ return $this->wiki->addToken($this->rule, $options) . $matches[2];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Image.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to embed the contents of a URL
+* inside the page. Typically used to get script output.
+*
+* This rule is inherently not secure; it allows cross-site scripting to
+* occur if the embedded output has <script> or other similar tags. Be
+* careful.
+*
+* In the future, we'll add a rule config options to set the base embed
+* path so that it is limited to one directory.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Image extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = '/(\[\[image )(.+?)(\]\])/i';
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'src' => The image source, typically a relative path name.
+ *
+ * 'opts' => Any macro options following the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $pos = strpos($matches[2], ' ');
+
+ if ($pos === false) {
+ $options = array(
+ 'src' => $matches[2],
+ 'attr' => array());
+ } else {
+ // everything after the space is attribute arguments
+ $options = array(
+ 'src' => substr($matches[2], 0, $pos),
+ 'attr' => $this->getAttrs(substr($matches[2], $pos+1))
+ );
+ }
+
+ return $this->wiki->addToken($this->rule, $options);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Include.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to include the results of a
+* script directly into the source at parse-time; thus, the output of the
+* script will be parsed by Text_Wiki. This differs from the 'embed'
+* rule, which incorporates the results at render-time, meaning that the
+* 'embed' content is not parsed by Text_Wiki.
+*
+* DANGER!
+*
+* This rule is inherently not secure; it allows cross-site scripting to
+* occur if the embedded output has <script> or other similar tags. Be
+* careful.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Include extends Text_Wiki_Parse {
+
+ var $conf = array(
+ 'base' => '/path/to/scripts/'
+ );
+
+ var $file = null;
+
+ var $output = null;
+
+ var $vars = null;
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = '/(\[\[include )(.+?)( .+?)?(\]\])/i';
+
+
+ /**
+ *
+ * Includes the results of the script directly into the source; the output
+ * will subsequently be parsed by the remaining Text_Wiki rules.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return The results of the included script.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // save the file location
+ $this->file = $this->getConf('base', './') . $matches[2];
+
+ // extract attribs as variables in the local space
+ $this->vars = $this->getAttrs($matches[3]);
+ unset($this->vars['this']);
+ extract($this->vars);
+
+ // run the script
+ ob_start();
+ include($this->file);
+ $this->output = ob_get_contents();
+ ob_end_clean();
+
+ // done, place the script output directly in the source
+ return $this->output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Interwiki.php,v 1.2 2005/02/01 03:47:37 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked as
+* an Interwiki link. See the regex for a detailed explanation of the
+* text matching procedure; e.g., "InterWikiName:PageName".
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Interwiki extends Text_Wiki_Parse {
+
+ // double-colons wont trip up now
+ var $regex = '([A-Za-z0-9_]+):((?!:)[A-Za-z0-9_\/=&~#.:;-]+)';
+
+
+ /**
+ *
+ * Parser. We override the standard parser so we can
+ * find both described interwiki links and standalone links.
+ *
+ * @access public
+ *
+ * @return void
+ *
+ */
+
+ function parse()
+ {
+ // described interwiki links
+ $tmp_regex = '/\[' . $this->regex . ' (.+?)\]/';
+ $this->wiki->source = preg_replace_callback(
+ $tmp_regex,
+ array(&$this, 'processDescr'),
+ $this->wiki->source
+ );
+
+ // standalone interwiki links
+ $tmp_regex = '/' . $this->regex . '/';
+ $this->wiki->source = preg_replace_callback(
+ $tmp_regex,
+ array(&$this, 'process'),
+ $this->wiki->source
+ );
+
+ }
+
+
+ /**
+ *
+ * Generates a replacement for the matched standalone interwiki text.
+ * Token options are:
+ *
+ * 'site' => The key name for the Text_Wiki interwiki array map,
+ * usually the name of the interwiki site.
+ *
+ * 'page' => The page on the target interwiki to link to.
+ *
+ * 'text' => The text to display as the link.
+ *
+ * @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 process(&$matches)
+ {
+ $options = array(
+ 'site' => $matches[1],
+ 'page' => $matches[2],
+ 'text' => $matches[0]
+ );
+
+ return $this->wiki->addToken($this->rule, $options);
+ }
+
+
+ /**
+ *
+ * Generates a replacement for described interwiki links. Token
+ * options are:
+ *
+ * 'site' => The key name for the Text_Wiki interwiki array map,
+ * usually the name of the interwiki site.
+ *
+ * 'page' => The page on the target interwiki to link to.
+ *
+ * 'text' => The text to display as the link.
+ *
+ * @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)
+ {
+ $options = array(
+ 'site' => $matches[1],
+ 'page' => $matches[2],
+ 'text' => $matches[3]
+ );
+
+ return $this->wiki->addToken($this->rule, $options);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Italic.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked for
+* emphasis (italics) as defined by text surrounded by two single-quotes.
+* On parsing, the text itself is left in place, but the starting and ending
+* instances of two single-quotes are replaced with tokens.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Italic extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/''(()|[^'].*)''/U";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * emphasized text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the text to be
+ * emphasized.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . $matches[1] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: List.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked as
+* a bulleted or numbered list. In short, if a line starts with '* ' then
+* it is a bullet list item; if a line starts with '# ' then it is a
+* number list item. Spaces in front of the * or # indicate an indented
+* sub-list. The list items must be on sequential lines, and may be
+* separated by blank lines to improve readability. Using a non-* non-#
+* non-whitespace character at the beginning of a line ends the list.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_List extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/\n((\*|#) .*\n)(?! {0,}(\* |# |\n))/Us';
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' =>
+ * 'bullet_start' : the start of a bullet list
+ * 'bullet_end' : the end of a bullet list
+ * 'number_start' : the start of a number list
+ * 'number_end' : the end of a number list
+ * 'item_start' : the start of item text (bullet or number)
+ * 'item_end' : the end of item text (bullet or number)
+ * 'unknown' : unknown type of list or item
+ *
+ * 'level' => the indent level (0 for the first level, 1 for the
+ * second, etc)
+ *
+ * 'count' => the list item number at this level. not needed for
+ * xhtml, but very useful for PDF and RTF.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A series of text and delimited tokens marking the different
+ * list text and list elements.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // the replacement text we will return
+ $return = '';
+
+ // the list of post-processing matches
+ $list = array();
+
+ // a stack of list-start and list-end types; we keep this
+ // so that we know what kind of list we're working with
+ // (bullet or number) and what indent level we're at.
+ $stack = array();
+
+ // the item count is the number of list items for any
+ // given list-type on the stack
+ $itemcount = array();
+
+ // have we processed the very first list item?
+ $pastFirst = false;
+
+ // populate $list with this set of matches. $matches[1] is the
+ // text matched as a list set by parse().
+ preg_match_all(
+ '=^( {0,})(\*|#) (.*)$=Ums',
+ $matches[1],
+ $list,
+ PREG_SET_ORDER
+ );
+
+ // loop through each list-item element.
+ foreach ($list as $key => $val) {
+
+ // $val[0] is the full matched list-item line
+ // $val[1] is the number of initial spaces (indent level)
+ // $val[2] is the list item type (* or #)
+ // $val[3] is the list item text
+
+ // how many levels are we indented? (1 means the "root"
+ // list level, no indenting.)
+ $level = strlen($val[1]) + 1;
+
+ // get the list item type
+ if ($val[2] == '*') {
+ $type = 'bullet';
+ } elseif ($val[2] == '#') {
+ $type = 'number';
+ } else {
+ $type = 'unknown';
+ }
+
+ // get the text of the list item
+ $text = $val[3];
+
+ // add a level to the list?
+ if ($level > count($stack)) {
+
+ // the current indent level is greater than the
+ // number of stack elements, so we must be starting
+ // a new list. push the new list type onto the
+ // stack...
+ array_push($stack, $type);
+
+ // ...and add a list-start token to the return.
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => $type . '_list_start',
+ 'level' => $level - 1
+ )
+ );
+ }
+
+ // remove a level from the list?
+ while (count($stack) > $level) {
+
+ // so we don't keep counting the stack, we set up a temp
+ // var for the count. -1 becuase we're going to pop the
+ // stack in the next command. $tmp will then equal the
+ // current level of indent.
+ $tmp = count($stack) - 1;
+
+ // as long as the stack count is greater than the
+ // current indent level, we need to end list types.
+ // continue adding end-list tokens until the stack count
+ // and the indent level are the same.
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => array_pop($stack) . '_list_end',
+ 'level' => $tmp
+ )
+ );
+
+ // reset to the current (previous) list type so that
+ // the new list item matches the proper list type.
+ $type = $stack[$tmp - 1];
+
+ // reset the item count for the popped indent level
+ unset($itemcount[$tmp + 1]);
+ }
+
+ // add to the item count for this list (taking into account
+ // which level we are at).
+ if (! isset($itemcount[$level])) {
+ // first count
+ $itemcount[$level] = 0;
+ } else {
+ // increment count
+ $itemcount[$level]++;
+ }
+
+ // is this the very first item in the list?
+ if (! $pastFirst) {
+ $first = true;
+ $pastFirst = true;
+ } else {
+ $first = false;
+ }
+
+ // create a list-item starting token.
+ $start = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => $type . '_item_start',
+ 'level' => $level,
+ 'count' => $itemcount[$level],
+ 'first' => $first
+ )
+ );
+
+ // create a list-item ending token.
+ $end = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => $type . '_item_end',
+ 'level' => $level,
+ 'count' => $itemcount[$level]
+ )
+ );
+
+ // add the starting token, list-item text, and ending token
+ // to the return.
+ $return .= $start . $val[3] . $end;
+ }
+
+ // the last list-item may have been indented. go through the
+ // list-type stack and create end-list tokens until the stack
+ // is empty.
+ while (count($stack) > 0) {
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => array_pop($stack) . '_list_end',
+ 'level' => count($stack)
+ )
+ );
+ }
+
+ // we're done! send back the replacement text.
+ return "\n" . $return . "\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Newline.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to mark implied line breaks in the
+* source text, usually a single carriage return in the middle of a paragraph
+* or block-quoted text.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Newline extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/([^\n])\n([^\n])/m';
+
+
+ /**
+ *
+ * Generates a replacement token for the matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A delimited token to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ return $matches[1] .
+ $this->wiki->addToken($this->rule) .
+ $matches[2];
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Paragraph.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki rule to find sections of the source
+* text that are paragraphs. A para is any line not starting with a token
+* delimiter, followed by two newlines.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Paragraph extends Text_Wiki_Parse {
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = "/^.*?\n\n/m";
+
+ var $conf = array(
+ 'skip' => array(
+ 'blockquote', // are we sure about this one?
+ 'code',
+ 'heading',
+ 'horiz',
+ 'deflist',
+ 'table',
+ 'list',
+ 'toc'
+ )
+ );
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'start' => The starting point of the paragraph.
+ *
+ * 'end' => The ending point of the paragraph.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $delim = $this->wiki->delim;
+
+ // was anything there?
+ if (trim($matches[0]) == '') {
+ return '';
+ }
+
+ // does the match start with a delimiter?
+ if (substr($matches[0], 0, 1) != $delim) {
+ // no.
+
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . trim($matches[0]) . $end;
+ }
+
+ // the line starts with a delimiter. read in the delimited
+ // token number, check the token, and see if we should
+ // skip it.
+
+ // loop starting at the second character (we already know
+ // the first is a delimiter) until we find another
+ // delimiter; the text between them is a token key number.
+ $key = '';
+ $len = strlen($matches[0]);
+ for ($i = 1; $i < $len; $i++) {
+ $char = $matches[0]{$i};
+ if ($char == $delim) {
+ break;
+ } else {
+ $key .= $char;
+ }
+ }
+
+ // look at the token and see if it's skippable (if we skip,
+ // it will not be marked as a paragraph)
+ $token_type = strtolower($this->wiki->tokens[$key][0]);
+ $skip = $this->getConf('skip', array());
+
+ if (in_array($token_type, $skip)) {
+ // this type of token should not have paragraphs applied to it.
+ // return the entire matched text.
+ return $matches[0];
+ } else {
+
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . trim($matches[0]) . $end;
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Phplookup.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* Find source text marked for
+* lookup in the PHP online manual.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Phplookup extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\[\[php (.+?)\]\]/";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * teletype text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the teletype text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ return $this->wiki->addToken(
+ $this->rule, array('text' => $matches[1])
+ );
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Prefilter.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* "Pre-filter" the source text.
+*
+* Convert DOS and Mac line endings to Unix, concat lines ending in a
+* backslash \ with the next line, convert tabs to 4-spaces, add newlines
+* to the top and end of the source text, compress 3 or more newlines to
+* 2 newlines.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Prefilter extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * Simple parsing method.
+ *
+ * @access public
+ *
+ */
+
+ function parse()
+ {
+ // convert DOS line endings
+ $this->wiki->source = str_replace("\r\n", "\n",
+ $this->wiki->source);
+
+ // convert Macintosh line endings
+ $this->wiki->source = str_replace("\r", "\n",
+ $this->wiki->source);
+
+ // concat lines ending in a backslash
+ $this->wiki->source = str_replace("\\\n", "",
+ $this->wiki->source);
+
+ // convert tabs to four-spaces
+ $this->wiki->source = str_replace("\t", " ",
+ $this->wiki->source);
+
+ // add extra newlines at the top and end; this
+ // seems to help many rules.
+ $this->wiki->source = "\n" . $this->wiki->source . "\n\n";
+
+ // finally, compress all instances of 3 or more newlines
+ // down to two newlines.
+ $find = "/\n{3,}/m";
+ $replace = "\n\n";
+ $this->wiki->source = preg_replace($find, $replace,
+ $this->wiki->source);
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Raw.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki rule to find sections of the source
+* text that are not to be processed by Text_Wiki. These blocks of "raw"
+* text will be rendered as they were found.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Raw extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to find source text matching this
+ * rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $regex = "/``(.*)``/U";
+
+
+ /**
+ *
+ * Generates a token entry for the matched text. Token options are:
+ *
+ * 'text' => The full matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A delimited token number to be used as a placeholder in
+ * the source text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $options = array('text' => $matches[1]);
+ return $this->wiki->addToken($this->rule, $options);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Revise.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked for
+* revision.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Revise extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\@\@({*?.*}*?)\@\@/U";
+
+
+ /**
+ *
+ * Config options.
+ *
+ * @access public
+ *
+ * @var array
+ *
+ */
+
+ var $conf = array(
+ 'delmark' => '---',
+ 'insmark' => '+++'
+ );
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * inserted text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the teletype text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $output = '';
+ $src = $matches[1];
+ $delmark = $this->getConf('delmark'); // ---
+ $insmark = $this->getConf('insmark'); // +++
+
+ // '---' must be before '+++' (if they both appear)
+ $del = strpos($src, $delmark);
+ $ins = strpos($src, $insmark);
+
+ // if neither is found, return right away
+ if ($del === false && $ins === false) {
+ return $matches[0];
+ }
+
+ // handle text to be deleted
+ if ($del !== false) {
+
+ // move forward to the end of the deletion mark
+ $del += strlen($delmark);
+
+ if ($ins === false) {
+ // there is no insertion text following
+ $text = substr($src, $del);
+ } else {
+ // there is insertion text following,
+ // mitigate the length
+ $text = substr($src, $del, $ins - $del);
+ }
+
+ $output .= $this->wiki->addToken(
+ $this->rule, array('type' => 'del_start')
+ );
+
+ $output .= $text;
+
+ $output .= $this->wiki->addToken(
+ $this->rule, array('type' => 'del_end')
+ );
+ }
+
+ // handle text to be inserted
+ if ($ins !== false) {
+
+ // move forward to the end of the insert mark
+ $ins += strlen($insmark);
+ $text = substr($src, $ins);
+
+ $output .= $this->wiki->addToken(
+ $this->rule, array('type' => 'ins_start')
+ );
+
+ $output .= $text;
+
+ $output .= $this->wiki->addToken(
+ $this->rule, array('type' => 'ins_end')
+ );
+ }
+
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Strong.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked for
+* strong emphasis (bold) as defined by text surrounded by three
+* single-quotes. On parsing, the text itself is left in place, but the
+* starting and ending instances of three single-quotes are replaced with
+* tokens.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Strong extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\*\*(.*?)\*\*/";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * emphasized text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A pair of delimited tokens to be used as a placeholder in
+ * the source text surrounding the text to be emphasized.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . $matches[1] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Superscript.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked for
+* strong emphasis (bold) as defined by text surrounded by three
+* single-quotes. On parsing, the text itself is left in place, but the
+* starting and ending instances of three single-quotes are replaced with
+* tokens.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Superscript extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\^\^(()|.*)\^\^/U";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text. Token options are:
+ *
+ * 'type' => ['start'|'end'] The starting or ending point of the
+ * emphasized text. The text itself is left in the source.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A pair of delimited tokens to be used as a placeholder in
+ * the source text surrounding the text to be emphasized.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . $matches[1] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Table.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find source text marked as a
+* set of table rows, where a line start and ends with double-pipes (||)
+* and uses double-pipes to separate table cells. The rows must be on
+* sequential lines (no blank lines between them) -- a blank line
+* indicates the beginning of a new table.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Table extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = '/\n((\|\|).*)(\n)(?!(\|\|))/Us';
+
+
+ /**
+ *
+ * Generates a replacement for the matched text.
+ *
+ * Token options are:
+ *
+ * 'type' =>
+ * 'table_start' : the start of a bullet list
+ * 'table_end' : the end of a bullet list
+ * 'row_start' : the start of a number list
+ * 'row_end' : the end of a number list
+ * 'cell_start' : the start of item text (bullet or number)
+ * 'cell_end' : the end of item text (bullet or number)
+ *
+ * 'cols' => the number of columns in the table (for 'table_start')
+ *
+ * 'rows' => the number of rows in the table (for 'table_start')
+ *
+ * 'span' => column span (for 'cell_start')
+ *
+ * 'attr' => column attribute flag (for 'cell_start')
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return A series of text and delimited tokens marking the different
+ * table elements and cell text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ // our eventual return value
+ $return = '';
+
+ // the number of columns in the table
+ $num_cols = 0;
+
+ // the number of rows in the table
+ $num_rows = 0;
+
+ // rows are separated by newlines in the matched text
+ $rows = explode("\n", $matches[1]);
+
+ // loop through each row
+ foreach ($rows as $row) {
+
+ // increase the row count
+ $num_rows ++;
+
+ // start a new row
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'row_start')
+ );
+
+ // cells are separated by double-pipes
+ $cell = explode("||", $row);
+
+ // get the number of cells (columns) in this row
+ $last = count($cell) - 1;
+
+ // is this more than the current column count?
+ // (we decrease by 1 because we never use cell zero)
+ if ($last - 1 > $num_cols) {
+ // increase the column count
+ $num_cols = $last - 1;
+ }
+
+ // by default, cells span only one column (their own)
+ $span = 1;
+
+ // ignore cell zero, and ignore the "last" cell; cell zero
+ // is before the first double-pipe, and the "last" cell is
+ // after the last double-pipe. both are always empty.
+ for ($i = 1; $i < $last; $i ++) {
+
+ // if there is no content at all, then it's an instance
+ // of two sets of || next to each other, indicating a
+ // span.
+ if ($cell[$i] == '') {
+
+ // add to the span and loop to the next cell
+ $span += 1;
+ continue;
+
+ } else {
+
+ // this cell has content.
+
+ // find any special "attr"ibute cell markers
+ if (substr($cell[$i], 0, 2) == '> ') {
+ // right-align
+ $attr = 'right';
+ $cell[$i] = substr($cell[$i], 2);
+ } elseif (substr($cell[$i], 0, 2) == '= ') {
+ // center-align
+ $attr = 'center';
+ $cell[$i] = substr($cell[$i], 2);
+ } elseif (substr($cell[$i], 0, 2) == '< ') {
+ // left-align
+ $attr = 'left';
+ $cell[$i] = substr($cell[$i], 2);
+ } elseif (substr($cell[$i], 0, 2) == '~ ') {
+ $attr = 'header';
+ $cell[$i] = substr($cell[$i], 2);
+ } else {
+ $attr = null;
+ }
+
+ // start a new cell...
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => 'cell_start',
+ 'attr' => $attr,
+ 'span' => $span
+ )
+ );
+
+ // ...add the content...
+ $return .= trim($cell[$i]);
+
+ // ...and end the cell.
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => 'cell_end',
+ 'attr' => $attr,
+ 'span' => $span
+ )
+ );
+
+ // reset the span.
+ $span = 1;
+ }
+
+ }
+
+ // end the row
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'row_end')
+ );
+
+ }
+
+ // wrap the return value in start and end tokens
+ $return =
+ $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'table_start',
+ 'rows' => $num_rows,
+ 'cols' => $num_cols
+ )
+ )
+ . $return .
+ $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'table_end'
+ )
+ );
+
+ // we're done!
+ return "\n$return\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Tighten.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* The rule removes all remaining newlines.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Tighten extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * Apply tightening directly to the source text.
+ *
+ * @access public
+ *
+ */
+
+ function parse()
+ {
+ $this->wiki->source = str_replace("\n", '',
+ $this->wiki->source);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+// $Id: Toc.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Parse to find all heading tokens and
+* build a table of contents. The [[toc]] tag gets replaced with a list
+* of all the level-2 through level-6 headings.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+
+class Text_Wiki_Parse_Toc extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text and find
+ * matches conforming to this rule. Used by the parse() method.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/\n\[\[toc( .*)?\]\]\n/m";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text.
+ *
+ * Token options are:
+ *
+ * 'type' => ['list_start'|'list_end'|'item_start'|'item_end'|'target']
+ *
+ * 'level' => The heading level (1-6).
+ *
+ * 'count' => Which entry number this is in the list.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A token indicating the TOC collection point.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $count = 0;
+
+ if (isset($matches[1])) {
+ $attr = $this->getAttrs(trim($matches[1]));
+ } else {
+ $attr = array();
+ }
+
+ $output = $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'list_start',
+ 'level' => 0,
+ 'attr' => $attr
+ )
+ );
+
+ foreach ($this->wiki->getTokens('Heading') as $key => $val) {
+
+ if ($val[1]['type'] != 'start') {
+ continue;
+ }
+
+ $options = array(
+ 'type' => 'item_start',
+ 'id' => $val[1]['id'],
+ 'level' => $val[1]['level'],
+ 'count' => $count ++
+ );
+
+ $output .= $this->wiki->addToken($this->rule, $options);
+
+ $output .= $val[1]['text'];
+
+ $output .= $this->wiki->addToken(
+ $this->rule,
+ array(
+ 'type' => 'item_end',
+ 'level' => $val[1]['level']
+ )
+ );
+ }
+
+ $output .= $this->wiki->addToken(
+ $this->rule, array(
+ 'type' => 'list_end',
+ 'level' => 0
+ )
+ );
+
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* Find source text marked for teletype (monospace).
+*
+* Defined by text surrounded by two curly braces. On parsing, the text
+* itself is left in place, but the starting and ending instances of
+* curly braces are replaced with tokens.
+*
+* Token options are:
+*
+* 'type' => ['start'|'end'] The starting or ending point of the
+* teletype text. The text itself is left in the source.
+*
+*
+* $Id: Tt.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Tt extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * The regular expression used to parse the source text.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ * @see parse()
+ *
+ */
+
+ var $regex = "/{{({*?.*}*?)}}/U";
+
+
+ /**
+ *
+ * Generates a replacement for the matched text.
+ *
+ * @access public
+ *
+ * @param array &$matches The array of matches from parse().
+ *
+ * @return string A pair of delimited tokens to be used as a
+ * placeholder in the source text surrounding the teletype text.
+ *
+ */
+
+ function process(&$matches)
+ {
+ $start = $this->wiki->addToken(
+ $this->rule, array('type' => 'start')
+ );
+
+ $end = $this->wiki->addToken(
+ $this->rule, array('type' => 'end')
+ );
+
+ return $start . $matches[1] . $end;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?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/31 15:46:52 pmjones 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]
+ );
+
+ // 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);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* 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.
+*
+* $Id: Wikilink.php,v 1.1 2005/01/31 15:46:52 pmjones Exp $
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Parse_Wikilink extends Text_Wiki_Parse {
+
+
+ /**
+ *
+ * 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);
+
+ // allows numbers as "lowercase letters" in the regex
+ $this->regex =
+ "(!?" . // START WikiPage pattern (1)
+ "[A-Z]" . // 1 upper
+ "[A-Za-z0-9]*" . // 0+ alpha or digit
+ "[a-z0-9]+" . // 1+ lower or digit
+ "[A-Z]" . // 1 upper
+ "[A-Za-z0-9]*" . // 0+ or more alpha or digit
+ ")" . // END WikiPage pattern (/1)
+ "((\#" . // START Anchor pattern (2)(3)
+ "[A-Za-z]" . // 1 alpha
+ "(" . // start sub pattern (4)
+ "[-A-Za-z0-9_:.]*" . // 0+ dash, alpha, digit, underscore, colon, dot
+ "[-A-Za-z0-9_]" . // 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
+ $tmp_regex = '/(^|[^A-Za-z0-9\-_])' . $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);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render {
+
+
+ /**
+ *
+ * Configuration options for this render rule.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $conf = array();
+
+
+ /**
+ *
+ * The name of this rule's format.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $format = null;
+
+
+ /**
+ *
+ * The name of this rule's token array elements.
+ *
+ * @access public
+ *
+ * @var string
+ *
+ */
+
+ var $rule = null;
+
+
+ /**
+ *
+ * A reference to the calling Text_Wiki object.
+ *
+ * This is needed so that each rule has access to the same source
+ * text, token set, URLs, interwiki maps, page names, etc.
+ *
+ * @access public
+ *
+ * @var object
+ */
+
+ var $wiki = null;
+
+
+ /**
+ *
+ * Constructor for this render format or rule.
+ *
+ * @access public
+ *
+ * @param object &$obj The calling "parent" Text_Wiki object.
+ *
+ */
+
+ function Text_Wiki_Render(&$obj)
+ {
+ // keep a reference to the calling Text_Wiki object
+ $this->wiki =& $obj;
+
+ // get the config-key-name for this object,
+ // strip the Text_Wiki_Render_ part
+ // 01234567890123456
+ $tmp = get_class($this);
+ $tmp = substr($tmp, 17);
+
+ // split into pieces at the _ mark.
+ // first part is format, second part is rule.
+ $part = explode('_', $tmp);
+ $this->format = isset($part[0]) ? ucwords(strtolower($part[0])) : null;
+ $this->rule = isset($part[1]) ? ucwords(strtolower($part[1])) : null;
+
+ // is there a format but no rule?
+ // then this is the "main" render object, with
+ // pre() and post() methods.
+ if ($this->format && ! $this->rule &&
+ isset($this->wiki->formatConf[$this->format]) &&
+ is_array($this->wiki->formatConf[$this->format])) {
+
+ // this is a format render object
+ $this->conf = array_merge(
+ $this->conf,
+ $this->wiki->formatConf[$this->format]
+ );
+
+ }
+
+ // is there a format and a rule?
+ if ($this->format && $this->rule &&
+ isset($this->wiki->renderConf[$this->format][$this->rule]) &&
+ is_array($this->wiki->renderConf[$this->format][$this->rule])) {
+
+ // this is a rule render object
+ $this->conf = array_merge(
+ $this->conf,
+ $this->wiki->renderConf[$this->format][$this->rule]
+ );
+ }
+ }
+
+
+ /**
+ *
+ * Simple method to safely get configuration key values.
+ *
+ * @access public
+ *
+ * @param string $key The configuration key.
+ *
+ * @param mixed $default If the key does not exist, return this value
+ * instead.
+ *
+ * @return mixed The configuration key value (if it exists) or the
+ * default value (if not).
+ *
+ */
+
+ function getConf($key, $default = null)
+ {
+ if (isset($this->conf[$key])) {
+ return $this->conf[$key];
+ } else {
+ return $default;
+ }
+ }
+
+
+ /**
+ *
+ * Simple method to wrap a configuration in an sprintf() format.
+ *
+ * @access public
+ *
+ * @param string $key The configuration key.
+ *
+ * @param string $format The sprintf() format string.
+ *
+ * @return mixed The formatted configuration key value (if it exists)
+ * or null (if it does not).
+ *
+ */
+
+ function formatConf($format, $key)
+ {
+ if (isset($this->conf[$key])) {
+ return sprintf($format, $this->conf[$key]);
+ } else {
+ return null;
+ }
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* Formats parsed Text_Wiki for LaTeX rendering.
+*
+* $Id: Latex.php,v 1.2 2004/09/25 19:05:13 pmjones Exp $
+*
+* @author Jeremy Cowgar <jeremy@cowgar.com>
+*
+* @package Text_Wiki
+*
+* @todo [http://google.com] becomes 1 with a LaTeX footnote in subscript.
+* This should be a normal LaTeX footnote associated with the
+* previous word?
+*
+* @todo parse "..." to be ``...''
+*
+* @todo parse '...' to be `...'
+*
+* @todo move escape_latex to a static function, move escaping to the
+* individual .php files they are associated with
+*
+* @todo allow the user to add conf items to do things like
+* + A custom document header
+* + Custom page headings
+* + Include packages
+* + Set Title, Author, Date
+* + Include a title page
+* + Not output Document Head/Foot (maybe combinding many pages?)
+*
+*/
+
+class Text_Wiki_Render_Latex extends Text_Wiki_Render {
+ function escape_latex ($txt) {
+ $txt = str_replace("\\", "\\\\", $txt);
+ $txt = str_replace('#', '\#', $txt);
+ $txt = str_replace('$', '\$', $txt);
+ $txt = str_replace('%', '\%', $txt);
+ $txt = str_replace('^', '\^', $txt);
+ $txt = str_replace('&', '\&', $txt);
+ $txt = str_replace('_', '\_', $txt);
+ $txt = str_replace('{', '\{', $txt);
+ $txt = str_replace('}', '\}', $txt);
+
+ // Typeset things a bit prettier than normas
+ $txt = str_replace('~', '$\sim$', $txt);
+ $txt = str_replace('...', '\ldots', $txt);
+
+ return $txt;
+ }
+
+ function escape($tok, $ele) {
+ if (isset($tok[$ele])) {
+ $tok[$ele] = $this->escape_latex($tok[$ele]);
+ }
+
+ return $tok;
+ }
+
+ function pre()
+ {
+ foreach ($this->wiki->tokens as $k => $tok) {
+ if ($tok[0] == 'Code') {
+ continue;
+ }
+
+ $tok[1] = $this->escape($tok[1], 'text');
+ $tok[1] = $this->escape($tok[1], 'page');
+ $tok[1] = $this->escape($tok[1], 'href');
+
+ $this->wiki->tokens[$k] = $tok;
+ }
+
+ $this->wiki->source = $this->escape_latex($this->wiki->source);
+
+ return
+ "\\documentclass{article}\n".
+ "\\usepackage{ulem}\n".
+ "\\pagestyle{headings}\n".
+ "\\begin{document}\n";
+ }
+
+ function post()
+ {
+ return "\\end{document}\n";
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* This class renders an anchor target name in LaTeX.
+*
+* $Id: Anchor.php,v 1.2 2004/09/25 19:05:13 pmjones Exp $
+*
+* @author Jeremy Cowgar <jeremy@cowgar.com>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Render_Latex_Anchor extends Text_Wiki_Render {
+
+ function token($options)
+ {
+ extract($options); // $type, $name
+
+ if ($type == 'start') {
+ //return sprintf('<a id="%s">',$name);
+ return '';
+ }
+
+ if ($type == 'end') {
+ //return '</a>';
+ return '';
+ }
+ }
+}
+
+?>
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Blockquote extends Text_Wiki_Render {
+
+ var $conf = array('css' => null);
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ $level = $options['level'];
+
+ // starting
+ if ($type == 'start') {
+ return "\\begin{quote}\n";
+ }
+
+ // ending
+ if ($type == 'end') {
+ return "\\end{quote}\n\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Bold extends Text_Wiki_Render_Latex_Strong {}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Break extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "\\newline\n";
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Center extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return 'Center: NI';
+
+ if ($options['type'] == 'start') {
+ //return "\n<center>\n";
+ return '<div style="text-align: center;">';
+ }
+
+ if ($options['type'] == 'end') {
+ //return "</center>\n";
+ return '</div>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Code extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $text = $options['text'];
+
+ return "\\begin{verbatim}\n$text\n\\end{verbatim}\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Colortext extends Text_Wiki_Render {
+
+ var $colors = array(
+ 'aqua',
+ 'black',
+ 'blue',
+ 'fuchsia',
+ 'gray',
+ 'green',
+ 'lime',
+ 'maroon',
+ 'navy',
+ 'olive',
+ 'purple',
+ 'red',
+ 'silver',
+ 'teal',
+ 'white',
+ 'yellow'
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return 'Colortext: NI';
+
+ $type = $options['type'];
+ $color = $options['color'];
+
+ if (! in_array($color, $this->colors)) {
+ $color = '#' . $color;
+ }
+
+ if ($type == 'start') {
+ return "<span style=\"color: $color;\">";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</span>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Deflist extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_dl' => null,
+ 'css_dt' => null,
+ 'css_dd' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ switch ($type)
+ {
+ case 'list_start':
+ return "\\begin{description}\n";
+
+ case 'list_end':
+ return "\\end{description}\n\n";
+
+ case 'term_start':
+ return '\item[';
+
+ case 'term_end':
+ return '] ';
+
+ case 'narr_start':
+ return '{';
+
+ case 'narr_end':
+ return "}\n";
+
+ default:
+ return '';
+
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Delimiter extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // TODO: Is this where I can do some LaTeX escaping for items
+ // such as $ { } _ ?
+ return "Delimiter: ".$options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Embed extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "Embed: ".$options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Emphasis extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ return '\textsl{';
+ }
+
+ if ($options['type'] == 'end') {
+ return '}';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Freelink extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'pages' => array(),
+ 'view_url' => 'http://example.com/index.php?page=%s',
+ 'new_url' => 'http://example.com/new.php?page=%s',
+ 'new_text' => '?'
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // get nice variable names (page, text, anchor)
+ extract($options);
+
+ return "$text\\footnote\{$anchor} ";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Function extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "Function: NI";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Heading extends Text_Wiki_Render {
+
+ function token($options)
+ {
+ // get nice variable names (type, level)
+ extract($options);
+
+ if ($type == 'start') {
+ switch ($level)
+ {
+ case '1':
+ return '\part{';
+ case '2':
+ return '\section{';
+ case '3':
+ return '\subsection{';
+ case '4':
+ return '\subsubsection{';
+ case '5':
+ return '\paragraph{';
+ case '6':
+ return '\subparagraph{';
+ }
+ }
+
+ if ($type == 'end') {
+ return "}\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Horiz extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "\n\\noindent\\rule{\\textwidth}{1pt}\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Html extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ print_r($this);
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Latex_Image extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'base' => '/'
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return 'Image: NI';
+
+ $src = '"' .
+ $this->getConf('base', '/') .
+ $options['src'] . '"';
+
+ if (isset($options['attr']['link'])) {
+
+ // this image has a link
+ if (strpos($options['attr']['link'], '://')) {
+ // it's a URL
+ $href = $options['attr']['link'];
+ } else {
+ $href = $this->wiki->getRenderConf('xhtml', 'wikilink', 'view_url') .
+ $options['attr']['link'];
+ }
+
+ } else {
+ // image is not linked
+ $href = null;
+ }
+
+ // unset these so they don't show up as attributes
+ unset($options['attr']['link']);
+
+ $attr = '';
+ $alt = false;
+ foreach ($options['attr'] as $key => $val) {
+ if (strtolower($key) == 'alt') {
+ $alt = true;
+ }
+ $attr .= " $key=\"$val\"";
+ }
+
+ // always add an "alt" attribute per Stephane Solliec
+ if (! $alt) {
+ $attr .= ' alt="' . basename($options['src']) . '"';
+ }
+
+ if ($href) {
+ return "<a href=\"$href\"><img src=$src$attr/></a>";
+ } else {
+ return "<img src=$src$attr/>";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Latex_Include extends Text_Wiki_Render {
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Interwiki extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'sites' => array(
+ 'MeatBall' => 'http://www.usemod.com/cgi-bin/mb.pl?%s',
+ 'Advogato' => 'http://advogato.org/%s',
+ 'Wiki' => 'http://c2.com/cgi/wiki?%s'
+ ),
+ 'target' => '_blank'
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $site = $options['site'];
+ $page = $options['page'];
+ $text = $options['text'];
+
+ if (isset($this->conf['sites'][$site])) {
+ $href = $this->conf['sites'][$site];
+ } else {
+ return $text;
+ }
+
+ // old form where page is at end,
+ // or new form with %s placeholder for sprintf()?
+ if (strpos($href, '%s') === false) {
+ // use the old form
+ $href = $href . $page;
+ } else {
+ // use the new form
+ $href = sprintf($href, $page);
+ }
+
+ // allow for alternative targets
+ $target = $this->getConf('target', '');
+
+ if ($target && trim($target) != '') {
+ $target = " target=\"$target\"";
+ }
+
+ return "$text\\footnote\{$href}";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Italic extends Text_Wiki_Render_Latex_Emphasis {
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+
+class Text_Wiki_Render_Latex_List extends Text_Wiki_Render {
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * This rendering method is syntactically and semantically compliant
+ * with XHTML 1.1 in that sub-lists are part of the previous list item.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variables (type, level, count)
+ extract($options);
+
+ switch ($type)
+ {
+ case 'bullet_list_start':
+ return "\\begin{itemize}\n";
+
+ case 'bullet_list_end':
+ return "\\end{itemize}\n";
+
+ case 'number_list_start':
+ return "\\begin{enumerate}\n";
+
+ case 'number_list_end':
+ return "\\end{enumerate}\n";
+
+ case 'bullet_item_start':
+ case 'number_item_start':
+ return "\\item{";
+
+ case 'bullet_item_end':
+ case 'number_item_end':
+ return "}\n";
+
+ default:
+ // ignore item endings and all other types.
+ // item endings are taken care of by the other types
+ // depending on their place in the list.
+ return '';
+ break;
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Newline extends Text_Wiki_Render {
+
+
+ function token($options)
+ {
+ return "\n";
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Paragraph extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ extract($options); //type
+
+ if ($type == 'start') {
+ return '';
+ }
+
+ if ($type == 'end') {
+ return "\n\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Phplookup extends Text_Wiki_Render {
+
+ var $conf = array('target' => '_blank');
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return 'Phplookup: NI';
+
+ $text = trim($options['text']);
+
+ $target = $this->getConf('target', '');
+ if ($target) {
+ $target = " target=\"$target\"";
+ }
+
+ return "<a$target href=\"http://php.net/$text\">$text</a>";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | PHP version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Jeremy Cowgar <jeremy@cowgar.com> |
+// +----------------------------------------------------------------------+
+//
+// $Id: Prefilter.php,v 1.2 2004/09/25 19:05:13 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Render_Latex to "pre-filter" source text so
+* that line endings are consistently \n, lines ending in a backslash \
+* are concatenated with the next line, and tabs are converted to spaces.
+*
+* @author Jeremy Cowgar <jeremy@cowgar.com>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Render_Latex_Prefilter extends Text_Wiki_Render {
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Raw extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "Raw: ".$options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Revise extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'del_start') {
+ return '\sout{';
+ }
+
+ if ($options['type'] == 'del_end') {
+ return '}';
+ }
+
+ if ($options['type'] == 'ins_start') {
+ return '\underline{';
+ }
+
+ if ($options['type'] == 'ins_end') {
+ return '}';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Strong extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ return '\textbf{';
+ }
+
+ if ($options['type'] == 'end') {
+ return '}';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Superscript extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return 'Superscript: NI';
+
+ if ($options['type'] == 'start') {
+ return '<sup>';
+ }
+
+ if ($options['type'] == 'end') {
+ return '</sup>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Table extends Text_Wiki_Render {
+ var $cell_id = 0;
+ var $cell_count = 0;
+ var $is_spanning = false;
+
+ var $conf = array(
+ 'css_table' => null,
+ 'css_tr' => null,
+ 'css_th' => null,
+ 'css_td' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variable names (type, attr, span)
+ extract($options);
+
+ switch ($type)
+ {
+ case 'table_start':
+ $this->cell_count = $cols;
+
+ $tbl_start = '\begin{tabular}{|';
+ for ($a=0; $a < $this->cell_count; $a++) {
+ $tbl_start .= 'l|';
+ }
+ $tbl_start .= "}\n";
+
+ return $tbl_start;
+
+ case 'table_end':
+ return "\\hline\n\\end{tabular}\n";
+
+ case 'row_start':
+ $this->is_spanning = false;
+ $this->cell_id = 0;
+ return "\\hline\n";
+
+ case 'row_end':
+ return "\\\\\n";
+
+ case 'cell_start':
+ if ($span > 1) {
+ $col_spec = '';
+ if ($this->cell_id == 0) {
+ $col_spec = '|';
+ }
+ $col_spec .= 'l|';
+
+ $this->cell_id += $span;
+ $this->is_spanning = true;
+
+ return "\\multicolumn\{$span}\{$col_spec}{";
+ }
+
+ $this->cell_id += 1;
+ return '';
+
+ case 'cell_end':
+ $out = '';
+ if ($this->is_spanning) {
+ $this->is_spanning = false;
+ $out = '}';
+ }
+
+ if ($this->cell_id != $this->cell_count) {
+ $out .= ' & ';
+ }
+
+ return $out;
+
+ default:
+ return '';
+
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Latex_Tighten extends Text_Wiki_Render {
+
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Toc extends Text_Wiki_Render {
+
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if($options['type'] == 'list_start') {
+ return "\\tableofcontents\n\n";
+ }
+
+ return '';
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_tt extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ return '\texttt{';
+ }
+
+ if ($options['type'] == 'end') {
+ return '}';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+
+class Text_Wiki_Render_Latex_Url extends Text_Wiki_Render {
+
+
+ var $conf = array(
+ 'target' => false,
+ 'images' => true,
+ 'img_ext' => array('jpg', 'jpeg', 'gif', 'png')
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // create local variables from the options array (text,
+ // href, type)
+ extract($options);
+
+ return " $text\\footnote\{$href}";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Latex_Wikilink extends Text_Wiki_Render {
+ var $conf = array(
+ 'pages' => array(),
+ 'view_url' => 'http://example.com/index.php?page=%s',
+ 'new_url' => 'http://example.com/new.php?page=%s',
+ 'new_text' => '?'
+ );
+
+ /**
+ *
+ * Renders a token into XHTML.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variable names (page, anchor, text)
+ extract($options);
+
+ // are we checking page existence?
+ $list =& $this->getConf('pages');
+ if (is_array($list)) {
+ // yes, check against the page list
+ $exists = in_array($page, $list);
+ } else {
+ // no, assume it exists
+ $exists = true;
+ }
+
+ // convert *after* checking against page names so as not to mess
+ // up what the user typed and what we're checking.
+ $page = htmlspecialchars($page);
+ $anchor = htmlspecialchars($anchor);
+ $text = htmlspecialchars($text);
+
+ $href = $this->getConf('view_url');
+
+ if (strpos($href, '%s') === false) {
+ // use the old form (page-at-end)
+ $href = $href . $page . $anchor;
+ } else {
+ // use the new form (sprintf format string)
+ $href = sprintf($href, $page . $anchor);
+ }
+
+ // get the CSS class and generate output
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "$text\\footnote\{$href}";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain extends Text_Wiki_Render {
+
+ function pre()
+ {
+ return;
+ }
+
+ function post()
+ {
+ return;
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* This class renders an anchor target name in XHTML.
+*
+* @author Manuel Holtgrewe <purestorm at ggnore dot net>
+*
+* @author Paul M. Jones <pmjones at ciaweb dot net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Render_Plain_Anchor extends Text_Wiki_Render {
+
+ function token($options)
+ {
+ return $options['name'];
+ }
+}
+
+?>
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Blockquote extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ $level = $options['level'];
+
+ // set up indenting so that the results look nice; we do this
+ // in two steps to avoid str_pad mathematics. ;-)
+ $pad = str_pad('', $level + 1, "\t");
+ $pad = str_replace("\t", ' ', $pad);
+
+ // starting
+ if ($type == 'start') {
+ return "\n$pad";
+ }
+
+ // ending
+ if ($type == 'end') {
+ return "\n$pad";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Bold extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Break extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "\n";
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Center extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Code extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "\n" . $options['text'] . "\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Colortext extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Deflist extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ $pad = " ";
+
+ switch ($type) {
+
+ case 'list_start':
+ return "\n";
+ break;
+
+ case 'list_end':
+ return "\n\n";
+ break;
+
+ case 'term_start':
+
+ // done!
+ return $pad;
+ break;
+
+ case 'term_end':
+ return "\n";
+ break;
+
+ case 'narr_start':
+
+ // done!
+ return $pad . $pad;
+ break;
+
+ case 'narr_end':
+ return "\n";
+ break;
+
+ default:
+ return '';
+
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Delimiter extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Embed extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return strip_tags($options['text']);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Emphasis extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Freelink extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+// $Id: Function.php,v 1.3 2004/10/08 17:46:47 pmjones Exp $
+
+class Text_Wiki_Render_Plain_Function extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ extract($options); // access, return, name, params, throws
+
+ $output = "$access $return $name ( ";
+
+ foreach ($params as $key => $val) {
+ $output .= "{$val['type']} {$val['descr']} {$val['default']} ";
+ }
+
+ $output .= ') ';
+
+ foreach ($throws as $key => $val) {
+ $output .= "{$val['type']} {$val['descr']} ";
+ }
+
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Heading extends Text_Wiki_Render {
+
+ function token($options)
+ {
+ if ($options['type'] == 'end') {
+ return "\n\n";
+ } else {
+ return "\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Horiz extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return "\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Html extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return strip_tags($options['text']);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Plain_Image extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Plain_Include extends Text_Wiki_Render {
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Interwiki extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Italic extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+
+class Text_Wiki_Render_Plain_List extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * This rendering method is syntactically and semantically compliant
+ * with XHTML 1.1 in that sub-lists are part of the previous list item.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variables (type, level, count)
+ extract($options);
+
+ // set up indenting so that the results look nice; we do this
+ // in two steps to avoid str_pad mathematics. ;-)
+ $pad = str_pad('', $level, "\t");
+ $pad = str_replace("\t", ' ', $pad);
+
+ switch ($type) {
+
+ case 'bullet_list_start':
+ break;
+
+ case 'bullet_list_end':
+ if ($level == 0) {
+ return "\n\n";
+ }
+ break;
+
+ case 'number_list_start':
+ break;
+
+ case 'number_list_end':
+ if ($level == 0) {
+ return "\n\n";
+ }
+ break;
+
+ case 'bullet_item_start':
+ case 'number_item_start':
+ return "\n$pad";
+ break;
+
+ case 'bullet_item_end':
+ case 'number_item_end':
+ default:
+ // ignore item endings and all other types.
+ // item endings are taken care of by the other types
+ // depending on their place in the list.
+ return;
+ break;
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Newline extends Text_Wiki_Render {
+
+
+ function token($options)
+ {
+ return "\n";
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Paragraph extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ extract($options); //type
+
+ if ($type == 'start') {
+ return '';
+ }
+
+ if ($type == 'end') {
+ return "\n\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Phplookup extends Text_Wiki_Render {
+
+ var $conf = array('target' => '_blank');
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return trim($options['text']);
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | PHP version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Paul M. Jones <pmjones@ciaweb.net> |
+// +----------------------------------------------------------------------+
+//
+// $Id: Prefilter.php,v 1.2 2004/09/25 19:05:14 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Render_Xhtml to "pre-filter" source text so
+* that line endings are consistently \n, lines ending in a backslash \
+* are concatenated with the next line, and tabs are converted to spaces.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Render_Plain_Prefilter extends Text_Wiki_Render {
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Raw extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Revise extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Strong extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Superscript extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Table extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variable names (type, attr, span)
+ extract($options);
+
+ $pad = ' ';
+
+ switch ($type) {
+
+ case 'table_start':
+ return;
+ break;
+
+ case 'table_end':
+ return;
+ break;
+
+ case 'row_start':
+ return;
+ break;
+
+ case 'row_end':
+ return " ||\n";
+ break;
+
+ case 'cell_start':
+ return " || ";
+ break;
+
+ case 'cell_end':
+ return;
+ break;
+
+ default:
+ return '';
+
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Plain_Tighten extends Text_Wiki_Render {
+
+
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Toc extends Text_Wiki_Render {
+
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // type, count, level
+ extract($options);
+
+ if ($type == 'item_start') {
+
+ // build some indenting spaces for the text
+ $indent = ($level - 2) * 4;
+ $pad = str_pad('', $indent);
+ return $pad;
+ }
+
+ if ($type == 'item_end') {
+ return "\n";
+ }
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_tt extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+
+class Text_Wiki_Render_Plain_Url extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Plain_Wikilink extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into plain text.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml extends Text_Wiki_Render {
+
+ var $conf = array('translate' => HTML_ENTITIES);
+
+ function pre()
+ {
+ // attempt to translate HTML entities in the source before continuing.
+ $type = $this->getConf('translate', null);
+
+ // are we translating html?
+ if ($type !== false && $type !== null) {
+
+ // yes! get the translation table.
+ $xlate = get_html_translation_table($type);
+
+ // remove the delimiter character it doesn't get translated
+ unset($xlate[$this->wiki->delim]);
+
+ // translate!
+ $this->wiki->source = strtr($this->wiki->source, $xlate);
+ }
+
+ }
+
+ function post()
+ {
+ return;
+ }
+
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+*
+* This class renders an anchor target name in XHTML.
+*
+* @author Manuel Holtgrewe <purestorm at ggnore dot net>
+*
+* @author Paul M. Jones <pmjones at ciaweb dot net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Render_Xhtml_Anchor extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ function token($options)
+ {
+ extract($options); // $type, $name
+
+ if ($type == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ $format = "<a$css id=\"%s\">";
+ return sprintf($format ,$name);
+ }
+
+ if ($type == 'end') {
+ return '</a>';
+ }
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Blockquote extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ $level = $options['level'];
+
+ // set up indenting so that the results look nice; we do this
+ // in two steps to avoid str_pad mathematics. ;-)
+ $pad = str_pad('', $level, "\t");
+ $pad = str_replace("\t", ' ', $pad);
+
+ // pick the css type
+ $css = $this->formatConf(' class="%s"', 'css');
+
+ // starting
+ if ($type == 'start') {
+ return "$pad<blockquote$css>";
+ }
+
+ // ending
+ if ($type == 'end') {
+ return $pad . "</blockquote>\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Bold extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<b$css>";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</b>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Break extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<br$css />\n";
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Center extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ return '<div style="text-align: center;">';
+ }
+
+ if ($options['type'] == 'end') {
+ return '</div>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Code extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null, // class for <pre>
+ 'css_code' => null, // class for generic <code>
+ 'css_php' => null, // class for PHP <code>
+ 'css_html' => null // class for HTML <code>
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $text = $options['text'];
+ $attr = $options['attr'];
+ $type = strtolower($attr['type']);
+
+ $css = $this->formatConf(' class="%s"', 'css');
+ $css_code = $this->formatConf(' class="%s"', 'css_code');
+ $css_php = $this->formatConf(' class="%s"', 'css_php');
+ $css_html = $this->formatConf(' class="%s"', 'css_html');
+
+ if ($type == 'php') {
+
+ // PHP code example:
+ // add the PHP tags
+ $text = "<?php\n" . $options['text'] . "\n?>"; // <?php
+
+ // convert tabs to four spaces
+ $text = str_replace("\t", " ", $text);
+
+ // colorize the code block (also converts HTML entities and adds
+ // <code>...</code> tags)
+ ob_start();
+ highlight_string($text);
+ $text = ob_get_contents();
+ ob_end_clean();
+
+ // replace <br /> tags with simple newlines.
+ // replace non-breaking space with simple spaces.
+ // translate HTML <font> and color to XHTML <span> and style.
+ // courtesy of research by A. Kalin :-).
+ $map = array(
+ '<br />' => "\n",
+ ' ' => ' ',
+ '<font' => '<span',
+ '</font>' => '</span>',
+ 'color="' => 'style="color:'
+ );
+ $text = strtr($text, $map);
+
+ // get rid of the last newline inside the code block
+ // (becuase higlight_string puts one there)
+ if (substr($text, -8) == "\n</code>") {
+ $text = substr($text, 0, -8) . "</code>";
+ }
+
+ // replace all <code> tags with classed tags
+ if ($css_php) {
+ $text = str_replace('<code>', "<code$css_php>", $text);
+ }
+
+ // done
+ $text = "<pre$css>$text</pre>";
+
+ } elseif ($type == 'html' || $type == 'xhtml') {
+
+ // HTML code example:
+ // add <html> opening and closing tags,
+ // convert tabs to four spaces,
+ // convert entities.
+ $text = str_replace("\t", " ", $text);
+ $text = "<html>\n$text\n</html>";
+ $text = htmlentities($text);
+ $text = "<pre$css><code$css_html>$text</code></pre>";
+
+ } else {
+ // generic code example:
+ // convert tabs to four spaces,
+ // convert entities.
+ $text = str_replace("\t", " ", $text);
+ $text = htmlentities($text);
+ $text = "<pre$css><code$css_code>$text</code></pre>";
+ }
+
+ return "\n$text\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Colortext extends Text_Wiki_Render {
+
+ var $colors = array(
+ 'aqua',
+ 'black',
+ 'blue',
+ 'fuchsia',
+ 'gray',
+ 'green',
+ 'lime',
+ 'maroon',
+ 'navy',
+ 'olive',
+ 'purple',
+ 'red',
+ 'silver',
+ 'teal',
+ 'white',
+ 'yellow'
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ $color = $options['color'];
+
+ if (! in_array($color, $this->colors)) {
+ $color = '#' . $color;
+ }
+
+ if ($type == 'start') {
+ return "<span style=\"color: $color;\">";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</span>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Deflist extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_dl' => null,
+ 'css_dt' => null,
+ 'css_dd' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $type = $options['type'];
+ $pad = " ";
+
+ switch ($type) {
+
+ case 'list_start':
+ $css = $this->formatConf(' class="%s"', 'css_dl');
+ return "<dl$css>\n";
+ break;
+
+ case 'list_end':
+ return "</dl>\n\n";
+ break;
+
+ case 'term_start':
+ $css = $this->formatConf(' class="%s"', 'css_dt');
+ return $pad . "<dt$css>";
+ break;
+
+ case 'term_end':
+ return "</dt>\n";
+ break;
+
+ case 'narr_start':
+ $css = $this->formatConf(' class="%s"', 'css_dd');
+ return $pad . $pad . "<dd$css>";
+ break;
+
+ case 'narr_end':
+ return "</dd>\n";
+ break;
+
+ default:
+ return '';
+
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Delimiter extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Embed extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Emphasis extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<em$css>";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</em>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+require_once 'Text/Wiki/Render/Xhtml/Wikilink.php';
+
+class Text_Wiki_Render_Xhtml_Freelink extends Text_Wiki_Render_Xhtml_Wikilink {
+ // renders identically to wikilinks, only the parsing is different :-)
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+// $Id: Function.php,v 1.3 2004/10/08 17:46:47 pmjones Exp $
+
+class Text_Wiki_Render_Xhtml_Function extends Text_Wiki_Render {
+
+ var $conf = array(
+ // list separator for params and throws
+ 'list_sep' => ', ',
+
+ // the "main" format string
+ 'format_main' => '%access %return <b>%name</b> ( %params ) %throws',
+
+ // the looped format string for required params
+ 'format_param' => '%type <i>%descr</i>',
+
+ // the looped format string for params with default values
+ 'format_paramd' => '[%type <i>%descr</i> default %default]',
+
+ // the looped format string for throws
+ 'format_throws' => '<b>throws</b> %type <i>%descr</i>'
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ extract($options); // name, access, return, params, throws
+
+ // build the baseline output
+ $output = $this->conf['format_main'];
+ $output = str_replace('%access', htmlspecialchars($access), $output);
+ $output = str_replace('%return', htmlspecialchars($return), $output);
+ $output = str_replace('%name', htmlspecialchars($name), $output);
+
+ // build the set of params
+ $list = array();
+ foreach ($params as $key => $val) {
+
+ // is there a default value?
+ if ($val['default']) {
+ $tmp = $this->conf['format_paramd'];
+ } else {
+ $tmp = $this->conf['format_param'];
+ }
+
+ // add the param elements
+ $tmp = str_replace('%type', htmlspecialchars($val['type']), $tmp);
+ $tmp = str_replace('%descr', htmlspecialchars($val['descr']), $tmp);
+ $tmp = str_replace('%default', htmlspecialchars($val['default']), $tmp);
+ $list[] = $tmp;
+ }
+
+ // insert params into output
+ $tmp = implode($this->conf['list_sep'], $list);
+ $output = str_replace('%params', $tmp, $output);
+
+ // build the set of throws
+ $list = array();
+ foreach ($throws as $key => $val) {
+ $tmp = $this->conf['format_throws'];
+ $tmp = str_replace('%type', htmlspecialchars($val['type']), $tmp);
+ $tmp = str_replace('%descr', htmlspecialchars($val['descr']), $tmp);
+ $list[] = $tmp;
+ }
+
+ // insert throws into output
+ $tmp = implode($this->conf['list_sep'], $list);
+ $output = str_replace('%throws', $tmp, $output);
+
+ // close the div and return the output
+ $output .= '</div>';
+ return "\n$output\n\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Heading extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_h1' => null,
+ 'css_h2' => null,
+ 'css_h3' => null,
+ 'css_h4' => null,
+ 'css_h5' => null,
+ 'css_h6' => null
+ );
+
+ function token($options)
+ {
+ // get nice variable names (id, type, level)
+ extract($options);
+
+ if ($type == 'start') {
+ $css = $this->formatConf(' class="%s"', "css_h$level");
+ return "<h$level$css id=\"$id\">";
+ }
+
+ if ($type == 'end') {
+ return "</h$level>\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Horiz extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<hr$css />\n";
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Html extends Text_Wiki_Render {
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Xhtml_Image extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'base' => '/',
+ 'css' => null,
+ 'css_link' => null
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // note the image source
+ $src = $options['src'];
+
+ // is the source a local file or URL?
+ if (strpos($src, '://') === false) {
+ // the source refers to a local file.
+ // add the URL base to it.
+ $src = $this->getConf('base', '/') . $src;
+ }
+
+ // stephane@metacites.net
+ // is the image clickable?
+ if (isset($options['attr']['link'])) {
+ // yes, the image is clickable.
+ // are we linked to a URL or a wiki page?
+ if (strpos($options['attr']['link'], '://')) {
+ // it's a URL
+ $href = $options['attr']['link'];
+ } else {
+ // it's a WikiPage; assume it exists.
+ /** @todo This needs to honor sprintf wikilinks (pmjones) */
+ /** @todo This needs to honor interwiki (pmjones) */
+ /** @todo This needs to honor freelinks (pmjones) */
+ $href = $this->wiki->getRenderConf('xhtml', 'wikilink', 'view_url') .
+ $options['attr']['link'];
+ }
+ } else {
+ // image is not clickable.
+ $href = null;
+ }
+ // unset so it won't show up as an attribute
+ unset($options['attr']['link']);
+
+ // stephane@metacites.net -- 25/07/2004
+ // we make up an align="center" value for the <img> tag.
+ if (isset($options['attr']['align']) &&
+ $options['attr']['align'] == 'center') {
+
+ // unset so it won't show up as an attribute
+ unset($options['attr']['align']);
+
+ // make sure we have a style attribute
+ if (! isset($options['attr']['style'])) {
+ // no style, set up a blank one
+ $options['attr']['style'] = '';
+ } else {
+ // style exists, add a space
+ $options['attr']['style'] .= ' ';
+ }
+
+ // add a "center" style to the existing style.
+ $options['attr']['style'] .=
+ 'display: block; margin-left: auto; margin-right: auto;';
+ }
+
+ // stephane@metacites.net -- 25/07/2004
+ // try to guess width and height
+ if (! isset($options['attr']['width']) &&
+ ! isset($options['attr']['height'])) {
+
+ // does the source refer to a local file or a URL?
+ if (strpos($src,'://')) {
+ // is a URL link
+ $imageFile = $src;
+ } else {
+ // is a local file
+ $imageFile = $_SERVER['DOCUMENT_ROOT'] . $src;
+ }
+
+ // attempt to get the image size
+ $imageSize = @getimagesize($imageFile);
+
+ if (is_array($imageSize)) {
+ $options['attr']['width'] = $imageSize[0];
+ $options['attr']['height'] = $imageSize[1];
+ }
+
+ }
+
+ // start the HTML output
+ $output = '<img src="' . htmlspecialchars($src) . '"';
+
+ // get the CSS class but don't add it yet
+ $css = $this->formatConf(' class="%s"', 'css');
+
+ // add the attributes to the output, and be sure to
+ // track whether or not we find an "alt" attribute
+ $alt = false;
+ foreach ($options['attr'] as $key => $val) {
+
+ // track the 'alt' attribute
+ if (strtolower($key) == 'alt') {
+ $alt = true;
+ }
+
+ // the 'class' attribute overrides the CSS class conf
+ if (strtolower($key) == 'class') {
+ $css = null;
+ }
+
+ $key = htmlspecialchars($key);
+ $val = htmlspecialchars($val);
+ $output .= " $key=\"$val\"";
+ }
+
+ // always add an "alt" attribute per Stephane Solliec
+ if (! $alt) {
+ $alt = htmlspecialchars(basename($options['src']));
+ $output .= " alt=\"$alt\"";
+ }
+
+ // end the image tag with the automatic CSS class (if any)
+ $output .= "$css />";
+
+ // was the image clickable?
+ if ($href) {
+ // yes, add the href and return
+ $href = htmlspecialchars($href);
+ $css = $this->formatConf(' class="%s"', 'css_link');
+ $output = "<a$css href=\"$href\">$output</a>";
+ }
+
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Xhtml_Include extends Text_Wiki_Render {
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Interwiki extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'sites' => array(
+ 'MeatBall' => 'http://www.usemod.com/cgi-bin/mb.pl?%s',
+ 'Advogato' => 'http://advogato.org/%s',
+ 'Wiki' => 'http://c2.com/cgi/wiki?%s'
+ ),
+ 'target' => '_blank',
+ 'css' => null
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $site = $options['site'];
+ $page = $options['page'];
+ $text = $options['text'];
+ $css = $this->formatConf(' class="%s"', 'css');
+
+ if (isset($this->conf['sites'][$site])) {
+ $href = $this->conf['sites'][$site];
+ } else {
+ return $text;
+ }
+
+ // old form where page is at end,
+ // or new form with %s placeholder for sprintf()?
+ if (strpos($href, '%s') === false) {
+ // use the old form
+ $href = $href . $page;
+ } else {
+ // use the new form
+ $href = sprintf($href, $page);
+ }
+
+ // allow for alternative targets
+ $target = $this->getConf('target');
+
+ // build base link
+ $text = htmlspecialchars($text);
+ $output = "<a$css href=\"$href\"";
+
+ // are we targeting a specific window?
+ if ($target) {
+ // this is XHTML compliant, suggested by Aaron Kalin.
+ // code tip is actually from youngpup.net, and it
+ // uses the $target as the new window name.
+ $target = htmlspecialchars($target);
+ $output .= " onClick=\"window.open(this.href, '$target');";
+ $output .= " return false;\"";
+ }
+
+ $output .= ">$text</a>";
+
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Italic extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<i$css>";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</i>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+
+class Text_Wiki_Render_Xhtml_List extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_ol' => null,
+ 'css_ol_li' => null,
+ 'css_ul' => null,
+ 'css_ul_li' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * This rendering method is syntactically and semantically compliant
+ * with XHTML 1.1 in that sub-lists are part of the previous list item.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variables (type, level, count)
+ extract($options);
+
+ // set up indenting so that the results look nice; we do this
+ // in two steps to avoid str_pad mathematics. ;-)
+ $pad = str_pad('', $level, "\t");
+ $pad = str_replace("\t", ' ', $pad);
+
+ switch ($type) {
+
+ case 'bullet_list_start':
+
+ // build the base HTML
+ $css = $this->formatConf(' class="%s"', 'css_ul');
+ $html = "<ul$css>";
+
+ // if this is the opening block for the list,
+ // put an extra newline in front of it so the
+ // output looks nice.
+ if ($level == 0) {
+ $html = "\n$html";
+ }
+
+ // done!
+ return $html;
+ break;
+
+ case 'bullet_list_end':
+
+ // build the base HTML
+ $html = "</li>\n$pad</ul>";
+
+ // if this is the closing block for the list,
+ // put extra newlines after it so the output
+ // looks nice.
+ if ($level == 0) {
+ $html .= "\n\n";
+ }
+
+ // done!
+ return $html;
+ break;
+
+ case 'number_list_start':
+
+ // build the base HTML
+ $css = $this->formatConf(' class="%s"', 'css_ol');
+ $html = "<ol$css>";
+
+ // if this is the opening block for the list,
+ // put an extra newline in front of it so the
+ // output looks nice.
+ if ($level == 0) {
+ $html = "\n$html";
+ }
+
+ // done!
+ return $html;
+ break;
+
+ case 'number_list_end':
+
+ // build the base HTML
+ $html = "</li>\n$pad</ol>";
+
+ // if this is the closing block for the list,
+ // put extra newlines after it so the output
+ // looks nice.
+ if ($level == 0) {
+ $html .= "\n\n";
+ }
+
+ // done!
+ return $html;
+ break;
+
+ case 'bullet_item_start':
+ case 'number_item_start':
+
+ // pick the proper CSS class
+ if ($type == 'bullet_item_start') {
+ $css = $this->formatConf(' class="%s"', 'css_ul_li');
+ } else {
+ $css = $this->formatConf(' class="%s"', 'css_ol_li');
+ }
+
+ // build the base HTML
+ $html = "\n$pad<li$css>";
+
+ // for the very first item in the list, do nothing.
+ // but for additional items, be sure to close the
+ // previous item.
+ if ($count > 0) {
+ $html = "</li>$html";
+ }
+
+ // done!
+ return $html;
+ break;
+
+ case 'bullet_item_end':
+ case 'number_item_end':
+ default:
+ // ignore item endings and all other types.
+ // item endings are taken care of by the other types
+ // depending on their place in the list.
+ return '';
+ break;
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Newline extends Text_Wiki_Render {
+
+
+ function token($options)
+ {
+ return "<br />\n";
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Paragraph extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ extract($options); //type
+
+ if ($type == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<p$css>";
+ }
+
+ if ($type == 'end') {
+ return "</p>\n\n";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+// $Id: Phplookup.php,v 1.7 2004/09/25 19:05:14 pmjones Exp $
+
+class Text_Wiki_Render_Xhtml_Phplookup extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'target' => '_blank',
+ 'css' => null
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ $text = trim($options['text']);
+ $css = $this->formatConf(' class="%s"', 'css');
+
+ // start the html
+ $output = "<a$css";
+
+ // are we targeting another window?
+ $target = $this->getConf('target', '');
+ if ($target) {
+ // use a "popup" window. this is XHTML compliant, suggested by
+ // Aaron Kalin. uses the $target as the new window name.
+ $target = htmlspecialchars($target);
+ $output .= " onclick=\"window.open(this.href, '$target');";
+ $output .= " return false;\"";
+ }
+
+ // take off the final parens for functions
+ if (substr($text, -2) == '()') {
+ $q = substr($text, 0, -2);
+ } else {
+ $q = $text;
+ }
+
+ $q = htmlspecialchars($q);
+ $text = htmlspecialchars($text);
+
+ // finish and return
+ $output .= " href=\"http://php.net/$q\">$text</a>";
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | PHP version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Paul M. Jones <pmjones@ciaweb.net> |
+// +----------------------------------------------------------------------+
+//
+// $Id: Prefilter.php,v 1.5 2004/09/25 19:05:14 pmjones Exp $
+
+
+/**
+*
+* This class implements a Text_Wiki_Render_Xhtml to "pre-filter" source text so
+* that line endings are consistently \n, lines ending in a backslash \
+* are concatenated with the next line, and tabs are converted to spaces.
+*
+* @author Paul M. Jones <pmjones@ciaweb.net>
+*
+* @package Text_Wiki
+*
+*/
+
+class Text_Wiki_Render_Xhtml_Prefilter extends Text_Wiki_Render {
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Raw extends Text_Wiki_Render {
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ return $options['text'];
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Revise extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_ins' => null,
+ 'css_del' => null
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'del_start') {
+ $css = $this->formatConf(' class="%s"', 'css_del');
+ return "<del$css>";
+ }
+
+ if ($options['type'] == 'del_end') {
+ return "</del>";
+ }
+
+ if ($options['type'] == 'ins_start') {
+ $css = $this->formatConf(' class="%s"', 'css_ins');
+ return "<ins$css>";
+ }
+
+ if ($options['type'] == 'ins_end') {
+ return "</ins>";
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Strong extends Text_Wiki_Render {
+
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<strong$css>";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</strong>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Superscript extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<sup$css>";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</sup>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Table extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_table' => null,
+ 'css_tr' => null,
+ 'css_th' => null,
+ 'css_td' => null
+ );
+
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variable names (type, attr, span)
+ extract($options);
+
+ $pad = ' ';
+
+ switch ($type) {
+
+ case 'table_start':
+ $css = $this->formatConf(' class="%s"', 'css_table');
+ return "\n\n<table$css>\n";
+ break;
+
+ case 'table_end':
+ return "</table>\n\n";
+ break;
+
+ case 'row_start':
+ $css = $this->formatConf(' class="%s"', 'css_tr');
+ return "$pad<tr$css>\n";
+ break;
+
+ case 'row_end':
+ return "$pad</tr>\n";
+ break;
+
+ case 'cell_start':
+
+ // base html
+ $html = $pad . $pad;
+
+ // is this a TH or TD cell?
+ if ($attr == 'header') {
+ // start a header cell
+ $css = $this->formatConf(' class="%s"', 'css_th');
+ $html .= "<th$css";
+ } else {
+ // start a normal cell
+ $css = $this->formatConf(' class="%s"', 'css_td');
+ $html .= "<td$css";
+ }
+
+ // add the column span
+ if ($span > 1) {
+ $html .= " colspan=\"$span\"";
+ }
+
+ // add alignment
+ if ($attr != 'header' && $attr != '') {
+ $html .= " style=\"text-align: $attr;\"";
+ }
+
+ // done!
+ $html .= '>';
+ return $html;
+ break;
+
+ case 'cell_end':
+ if ($attr == 'header') {
+ return "</th>\n";
+ } else {
+ return "</td>\n";
+ }
+ break;
+
+ default:
+ return '';
+
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+class Text_Wiki_Render_Xhtml_Tighten extends Text_Wiki_Render {
+
+
+ function token()
+ {
+ return '';
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+// $Id: Toc.php,v 1.7 2004/09/25 19:05:14 pmjones Exp $
+
+class Text_Wiki_Render_Xhtml_Toc extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'css_list' => null,
+ 'css_item' => null,
+ 'title' => '<strong>Table of Contents</strong>',
+ 'div_id' => 'toc'
+ );
+
+ var $min = 2;
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // type, id, level, count, attr
+ extract($options);
+
+ switch ($type) {
+
+ case 'list_start':
+
+ $html = '<div';
+
+ $css = $this->getConf('css_list');
+ if ($css) {
+ $html .= " class=\"$css\"";
+ }
+
+ $div_id = $this->getConf('div_id');
+ if ($div_id) {
+ $html .= " id=\"$div_id\"";
+ }
+
+ $html .= '>';
+ $html .= $this->getConf('title');
+ return $html;
+ break;
+
+ case 'list_end':
+ return "</div>\n";
+ break;
+
+ case 'item_start':
+ $html = '<div';
+
+ $css = $this->getConf('css_item');
+ if ($css) {
+ $html .= " class=\"$css\"";
+ }
+
+ $pad = ($level - $this->min);
+ $html .= " style=\"margin-left: {$pad}em;\">";
+
+ $html .= "<a href=\"#$id\">";
+ return $html;
+ break;
+
+ case 'item_end':
+ return "</a></div>\n";
+ break;
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_tt extends Text_Wiki_Render {
+
+
+ var $conf = array(
+ 'css' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ if ($options['type'] == 'start') {
+ $css = $this->formatConf(' class="%s"', 'css');
+ return "<tt$css>";
+ }
+
+ if ($options['type'] == 'end') {
+ return '</tt>';
+ }
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+
+class Text_Wiki_Render_Xhtml_Url extends Text_Wiki_Render {
+
+
+ var $conf = array(
+ 'target' => '_blank',
+ 'images' => true,
+ 'img_ext' => array('jpg', 'jpeg', 'gif', 'png'),
+ 'css_inline' => null,
+ 'css_footnote' => null,
+ 'css_descr' => null,
+ 'css_img' => null
+ );
+
+ /**
+ *
+ * Renders a token into text matching the requested format.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // create local variables from the options array (text,
+ // href, type)
+ extract($options);
+
+ // find the rightmost dot and determine the filename
+ // extension.
+ $pos = strrpos($href, '.');
+ $ext = strtolower(substr($href, $pos + 1));
+ $href = htmlspecialchars($href);
+
+ // does the filename extension indicate an image file?
+ if ($this->getConf('images') &&
+ in_array($ext, $this->getConf('img_ext', array()))) {
+
+ // create alt text for the image
+ if (! isset($text) || $text == '') {
+ $text = basename($href);
+ $text = htmlspecialchars($text);
+ }
+
+ // generate an image tag
+ $css = $this->formatConf(' class="%s"', 'css_img');
+ $output = "<img$css src=\"$href\" alt=\"$text\" />";
+
+ } else {
+
+ // allow for alternative targets on non-anchor HREFs
+ if ($href{0} == '#') {
+ $target = '';
+ } else {
+ $target = $this->getConf('target');
+ }
+
+ // generate a regular link (not an image)
+ $text = htmlspecialchars($text);
+ $css = $this->formatConf(' class="%s"', "css_$type");
+ $output = "<a$css href=\"$href\"";
+
+ if ($target) {
+ // use a "popup" window. this is XHTML compliant, suggested by
+ // Aaron Kalin. uses the $target as the new window name.
+ $target = htmlspecialchars($target);
+ $output .= " onclick=\"window.open(this.href, '$target');";
+ $output .= " return false;\"";
+ }
+
+ // finish up output
+ $output .= ">$text</a>";
+
+ // make numbered references look like footnotes when no
+ // CSS class specified, make them superscript by default
+ if ($type == 'footnote' && ! $css) {
+ $output = '<sup>' . $output . '</sup>';
+ }
+ }
+
+ return $output;
+ }
+}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+class Text_Wiki_Render_Xhtml_Wikilink extends Text_Wiki_Render {
+
+ var $conf = array(
+ 'pages' => array(), // set to null or false to turn off page checks
+ 'view_url' => 'http://example.com/index.php?page=%s',
+ 'new_url' => 'http://example.com/new.php?page=%s',
+ 'new_text' => '?',
+ 'new_text_pos' => 'after', // 'before', 'after', or null/false
+ 'css' => null,
+ 'css_new' => null,
+ 'exists_callback' => null // call_user_func() callback
+ );
+
+
+ /**
+ *
+ * Renders a token into XHTML.
+ *
+ * @access public
+ *
+ * @param array $options The "options" portion of the token (second
+ * element).
+ *
+ * @return string The text rendered from the token options.
+ *
+ */
+
+ function token($options)
+ {
+ // make nice variable names (page, anchor, text)
+ extract($options);
+
+ // is there a "page existence" callback?
+ // we need to access it directly instead of through
+ // getConf() because we'll need a reference (for
+ // object instance method callbacks).
+ if (isset($this->conf['exists_callback'])) {
+ $callback =& $this->conf['exists_callback'];
+ } else {
+ $callback = false;
+ }
+
+ if ($callback) {
+ // use the callback function
+ $exists = call_user_func($callback, $page);
+ } else {
+ // no callback, go to the naive page array.
+ $list =& $this->getConf('pages');
+ if (is_array($list)) {
+ // yes, check against the page list
+ $exists = in_array($page, $list);
+ } else {
+ // no, assume it exists
+ $exists = true;
+ }
+ }
+
+ // convert *after* checking against page names so as not to mess
+ // up what the user typed and what we're checking.
+ $page = htmlspecialchars($page);
+ $anchor = htmlspecialchars($anchor);
+ $text = htmlspecialchars($text);
+
+ // does the page exist?
+ if ($exists) {
+
+ // PAGE EXISTS.
+
+ // link to the page view, but we have to build
+ // the HREF. we support both the old form where
+ // the page always comes at the end, and the new
+ // form that uses %s for sprintf()
+ $href = $this->getConf('view_url');
+
+ if (strpos($href, '%s') === false) {
+ // use the old form (page-at-end)
+ $href = $href . $page . $anchor;
+ } else {
+ // use the new form (sprintf format string)
+ $href = sprintf($href, $page . $anchor);
+ }
+
+ // get the CSS class and generate output
+ $css = $this->formatConf(' class="%s"', 'css');
+ $output = "<a$css href=\"$href\">$text</a>";
+
+ } else {
+
+ // PAGE DOES NOT EXIST.
+
+ // link to a create-page url, but only if new_url is set
+ $href = $this->getConf('new_url', null);
+
+ // set the proper HREF
+ if (! $href || trim($href) == '') {
+
+ // no useful href, return the text as it is
+ $output = $text;
+
+ } else {
+
+ // yes, link to the new-page href, but we have to build
+ // it. we support both the old form where
+ // the page always comes at the end, and the new
+ // form that uses sprintf()
+ if (strpos($href, '%s') === false) {
+ // use the old form
+ $href = $href . $page;
+ } else {
+ // use the new form
+ $href = sprintf($href, $page);
+ }
+ }
+
+ // get the appropriate CSS class and new-link text
+ $css = $this->formatConf(' class="%s"', 'css_new');
+ $new = $this->getConf('new_text');
+
+ // what kind of linking are we doing?
+ $pos = $this->getConf('new_text_pos');
+ if (! $pos || ! $new) {
+ // no position (or no new_text), use css only on the page name
+ $output = "<a$css href=\"$href\">$page</a>";
+ } elseif ($pos == 'before') {
+ // use the new_text BEFORE the page name
+ $output = "<a$css href=\"$href\">$new</a>$text";
+ } else {
+ // default, use the new_text link AFTER the page name
+ $output = "$text<a$css href=\"$href\">$new</a>";
+ }
+ }
+ return $output;
+ }
+}
+?>
\ No newline at end of file