diff -r 902822492a68 -r fe660c52c48f includes/wikiengine/Parse/Mediawiki/Toc.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/includes/wikiengine/Parse/Mediawiki/Toc.php Wed Jun 13 16:07:17 2007 -0400 @@ -0,0 +1,130 @@ + +* +* @license LGPL +* +* @version $Id: Toc.php,v 1.4 2005/05/28 21:33:02 pmjones Exp $ +* +*/ + +/** +* +* Looks through parsed text and builds a table of contents. +* +* 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. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + + +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 "\n$output\n"; + } +} +?> \ No newline at end of file