includes/wikiengine/Parse/Mediawiki/Toc.php
changeset 1 fe660c52c48f
--- /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 @@
+<?php
+
+/**
+* 
+* Looks through parsed text and builds a table of contents.
+* 
+* @category Text
+* 
+* @package Text_Wiki
+* 
+* @author Paul M. Jones <pmjones@php.net>
+* 
+* @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 <pmjones@php.net>
+* 
+*/
+
+
+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