| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491 |
- <?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: Wiki.php,v 1.4 2004/01/31 15:51:54 pmjones Exp $
- require_once 'Text/Wiki/Rule.php';
- /**
- *
- * This is the "master" class for handling the management and convenience
- * functions to transform Wiki-formatted text.
- *
- * @author Paul M. Jones <pmjones@ciaweb.net>
- *
- * @version 0.8 alpha
- *
- */
- class Text_Wiki {
-
-
- /**
- *
- * The array of rules to apply to the source text, in order.
- *
- * This is an associative array where the key is the token-name
- * to be used for the rule, and the value is the path to the
- * rule class file.
- *
- * @access public
- *
- * @var array
- *
- */
-
- var $rules = array(
-
- // pre-filters
- 'prefilter' => 'Text/Wiki/Rule/prefilter.php',
- 'delimiter' => 'Text/Wiki/Rule/delimiter.php',
-
- // capturing block elements
- 'code' => 'Text/Wiki/Rule/code.php',
- 'phpcode' => 'Text/Wiki/Rule/phpcode.php',
- 'html' => 'Text/Wiki/Rule/html.php',
-
- // non-capturing block elements
- 'heading' => 'Text/Wiki/Rule/heading.php',
- 'horiz' => 'Text/Wiki/Rule/horiz.php',
- 'blockquote' => 'Text/Wiki/Rule/blockquote.php',
- 'deflist' => 'Text/Wiki/Rule/deflist.php',
- 'table' => 'Text/Wiki/Rule/table.php',
- 'list' => 'Text/Wiki/Rule/list.php',
- 'toc' => 'Text/Wiki/Rule/toc.php',
-
- // mark paragraph blocks
- 'paragraph' => 'Text/Wiki/Rule/paragraph.php',
-
- // inline elements
- 'raw' => 'Text/Wiki/Rule/raw.php',
- 'phplookup' => 'Text/Wiki/Rule/phplookup.php',
- 'url' => 'Text/Wiki/Rule/url.php',
- 'interwiki' => 'Text/Wiki/Rule/interwiki.php',
- 'freelink' => 'Text/Wiki/Rule/freelink.php',
- 'wikilink' => 'Text/Wiki/Rule/wikilink.php',
- 'strong' => 'Text/Wiki/Rule/strong.php',
- 'bold' => 'Text/Wiki/Rule/bold.php',
- 'emphasis' => 'Text/Wiki/Rule/emphasis.php',
- 'italic' => 'Text/Wiki/Rule/italic.php',
- 'tt' => 'Text/Wiki/Rule/tt.php',
- 'superscript' => 'Text/Wiki/Rule/superscript.php',
- 'revise' => 'Text/Wiki/Rule/revise.php',
-
- // post-filters
- 'entities' => 'Text/Wiki/Rule/entities.php',
- 'tighten' => 'Text/Wiki/Rule/tighten.php'
- );
-
-
- /**
- *
- * An associative array of Interwiki mappings where the key is the
- * Interwiki name as entered on a wiki page, and the value is the
- * replacement URL for the target wiki web.
- *
- * @access public
- *
- * @var array
- *
- */
-
- var $interwiki = array(
- 'MeatBall' => 'http://www.usemod.com/cgi-bin/mb.pl?',
- 'Advogato' => 'http://advogato.org/',
- 'Wiki' => 'http://c2.com/cgi/wiki?'
- );
-
-
- /**
- *
- * An array of all pages that currently exist in the wiki. The source
- * of the pages does not matter (database, file system, whatever). All
- * that Text_Wiki needs to know is what pages are already in the system
- * so that it can decide what kind of link to show when that page name
- * appears in the source text.
- *
- * @access public
- *
- * @var array
- *
- */
-
- var $pages = array();
-
-
- /**
- *
- * The URL used to view an existing page in the wiki; the page name
- * will be appended to this base URL.
- *
- * @access public
- *
- * @var string
- *
- */
-
- var $view_url = 'http://example.com/index.php?page=';
-
-
- /**
- *
- * The URL used to create a page that does not exist in the wiki; the
- * page name will be appended to this base URL.
- *
- * @access public
- *
- * @var string
- *
- */
-
- var $new_url = 'http://example.com/new.php?page=';
-
-
- /**
- *
- * When a page does not exist in the wiki, this is the text for the
- * link to the "create" URL. (Typically, the page name itself is not
- * the linked text; instead, a question mark or an inline image is
- * used to indicate the page does not exist.)
- *
- * @access public
- *
- * @var string
- *
- */
-
- var $new_text = '?';
-
-
- /**
- *
- * The delimiter that surrounds a token number embedded in the source
- * wiki text.
- *
- * @access public
- *
- * @var string
- *
- */
-
- var $delim = "\xFF";
-
-
- /**
- *
- * An array of tokens generated by rules as the source text is
- * parsed.
- *
- * As Text_Wiki applies rule classes to the source text, it will
- * replace portions of the text with a delimited token number. This
- * is the array of those tokens, representing the replaced text and
- * any options set by the parser for that replaced text.
- *
- * The tokens array is seqential; each element is itself a sequential
- * array where element 0 is the name of the rule that generated the
- * token, and element 1 is an associative array where the key is an
- * option name and the value is an option value.
- *
- * @access private
- *
- * @var string
- *
- */
-
- var $_tokens = array();
-
-
- /**
- *
- * The source text to which rules will be applied. This text will be
- * transformed in-place, which means that it will change as the rules
- * are applied.
- *
- * @access private
- *
- * @var string
- *
- */
-
- var $_source = '';
-
-
- /**
- *
- * Text_Wiki creates one instance of every rule that is applied to
- * the source text; this array holds those instances. The array key
- * is the rule name, and the array value is an instance of the rule
- * class.
- *
- * @access private
- *
- * @var string
- *
- */
-
- var $_rule_obj = array();
-
-
- /**
- *
- * Constructor.
- *
- * @access public
- *
- * @param array $options An associative array of options where the
- * key is the option name and the value is the option value. Each
- * option key corresponds to a public property of Text_Wiki; e.g.,
- * 'rules', 'interwiki', 'pages', 'rule_dir', and so on.
- *
- */
-
- function Text_Wiki($options = array())
- {
- if (isset($options) && is_array($options)) {
- foreach ($options as $key => $val) {
- // don't override private properties
- if (substr($key, 0, 1) != '_') {
- $this->$key = $val;
- }
- }
- }
- }
-
-
- /**
- *
- * Transforms the source text in-place.
- *
- * First, the method parses the source text, applying rules to the
- * text as it goes. These rules will modify the source text
- * in-place, replacing some text with delimited tokens (and
- * populating the $this->_tokens array as it goes).
- *
- * Next, the method renders the in-place tokens into the requested
- * output format.
- *
- * Finally, the method returns the transformed text. Note that the
- * source text is transformed in place; once it is transformed, it is
- * no longer the same as the original source text.
- *
- * @access public
- *
- * @param string $text The source text to which wiki rules should be
- * applied, both for parsing and for rendering.
- *
- * @param string $format The target output format, typically 'xhtml'.
- * If a rule does not support a given format, the output from that
- * rule is rule-specific.
- *
- * @return string The transformed wiki text.
- *
- */
-
- function transform($text, $format = 'xhtml')
- {
- $this->parse($text);
- return $this->render($format);
- }
-
-
- /**
- *
- * Sets the $_source text property, then parses it in place and
- * retains tokens in the $_tokens array property.
- *
- * @access public
- *
- * @param string $text The source text to which wiki rules should be
- * applied, both for parsing and for rendering.
- *
- * @return void
- *
- */
-
- function parse($text)
- {
- // set the object property for the source text
- $this->_source = $text;
-
- // apply the parse() method of each requested rule to the source
- // text. load each rule class file as we go.
- foreach ($this->rules as $name => $file) {
- $this->_loadRule($name, $file);
- $this->_rule_obj[$name]->parse();
- }
- }
-
-
- /**
- *
- * Renders tokens back into the source text, based on the requested format.
- *
- * @access public
- *
- * @param string $format The target output format, typically 'xhtml'.
- * If a rule does not support a given format, the output from that
- * rule is rule-specific.
- *
- * @return string The transformed wiki text.
- *
- */
-
- function render($format = 'Xhtml')
- {
- // the rendering method we're going to use from each rule
- $method = "render$format";
-
- // the eventual output text
- $output = '';
-
- // when passing through the parsed source text, keep track of when
- // we are in a delimited section
- $in_delim = false;
-
- // when in a delimited section, capture the token key number
- $key = '';
-
- // pass through the parsed source text character by character
- $k = strlen($this->_source);
- for ($i = 0; $i < $k; $i++) {
-
- // the current character
- $char = $this->_source{$i};
-
- // are alredy in a delimited section?
- if ($in_delim) {
-
- // yes; are we ending the section?
- if ($char == $this->delim) {
-
- // yes, get the replacement text for the delimited
- // token number and unset the flag.
- $key = (int)$key;
- $rule = $this->_tokens[$key][0];
- $opts = $this->_tokens[$key][1];
- $output .= $this->_rule_obj[$rule]->$method($opts);
- $in_delim = false;
-
- } else {
-
- // no, add to the dlimited token key number
- $key .= $char;
-
- }
-
- } else {
-
- // not currently in a delimited section.
- // are we starting into a delimited section?
- if ($char == $this->delim) {
- // yes, reset the previous key and
- // set the flag.
- $key = '';
- $in_delim = true;
- } else {
- // no, add to the output as-is
- $output .= $char;
- }
- }
- }
-
- // return the rendered source text
- return $output;
- }
-
-
- /**
- *
- * Returns the parsed source text with delimited token placeholders.
- *
- * @access public
- *
- * @return string The parsed source text.
- *
- */
-
- function getSource()
- {
- return $this->_source;
- }
-
-
- /**
- *
- * Returns tokens that have been parsed out of the source text.
- *
- * @access public
- *
- * @param array $rules If an array of rule names is passed, only return
- * tokens matching these rule names. If no array is passed, return all
- * tokens.
- *
- * @return array An array of tokens.
- *
- */
-
- function getTokens($rules = null)
- {
- if (! is_array($rules)) {
- return $this->_tokens;
- } else {
- $result = array();
- foreach ($this->_tokens as $key => $val) {
- if (in_array($val[0], $rules)) {
- $result[] = $val;
- }
- }
- return $result;
- }
- }
-
-
- /**
- *
- * Loads a rule class file and creates an instance of the rule
- * object.
- *
- * @access private
- *
- * @param string $name The token name to use for the rule.
- *
- * @param string $file The file name of the rule class.
- *
- * @return void
- *
- */
-
- function _loadRule($name, $file)
- {
- // load the class definition.
- include_once($file);
-
- // dynamically determine the name of the class
- // we just loaded
- $tmp = get_declared_classes();
- $k = count($tmp) - 1;
- $class = $tmp[$k];
- unset($tmp);
-
- // instantiate the rule object and add to the set
- $this->_rule_obj[$name] =& new $class($this, $name);
- }
- }
- ?>
|