import of Diogenes 0.9.18
[diogenes.git] / include / Text / Wiki / Parse / Default / Toc.php
1 <?php
2
3 /**
4 *
5 * Looks through parsed text and builds a table of contents.
6 *
7 * @category Text
8 *
9 * @package Text_Wiki
10 *
11 * @author Paul M. Jones <pmjones@php.net>
12 *
13 * @license LGPL
14 *
15 * @version $Id: Toc.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $
16 *
17 */
18
19 /**
20 *
21 * Looks through parsed text and builds a table of contents.
22 *
23 * This class implements a Text_Wiki_Parse to find all heading tokens and
24 * build a table of contents. The [[toc]] tag gets replaced with a list
25 * of all the level-2 through level-6 headings.
26 *
27 * @category Text
28 *
29 * @package Text_Wiki
30 *
31 * @author Paul M. Jones <pmjones@php.net>
32 *
33 */
34
35
36 class Text_Wiki_Parse_Toc extends Text_Wiki_Parse {
37
38
39 /**
40 *
41 * The regular expression used to parse the source text and find
42 * matches conforming to this rule. Used by the parse() method.
43 *
44 * @access public
45 *
46 * @var string
47 *
48 * @see parse()
49 *
50 */
51
52 var $regex = "/\n\[\[toc( .*)?\]\]\n/m";
53
54
55 /**
56 *
57 * Generates a replacement for the matched text.
58 *
59 * Token options are:
60 *
61 * 'type' => ['list_start'|'list_end'|'item_start'|'item_end'|'target']
62 *
63 * 'level' => The heading level (1-6).
64 *
65 * 'count' => Which entry number this is in the list.
66 *
67 * @access public
68 *
69 * @param array &$matches The array of matches from parse().
70 *
71 * @return string A token indicating the TOC collection point.
72 *
73 */
74
75 function process(&$matches)
76 {
77 $count = 0;
78
79 if (isset($matches[1])) {
80 $attr = $this->getAttrs(trim($matches[1]));
81 } else {
82 $attr = array();
83 }
84
85 $output = $this->wiki->addToken(
86 $this->rule,
87 array(
88 'type' => 'list_start',
89 'level' => 0,
90 'attr' => $attr
91 )
92 );
93
94 foreach ($this->wiki->getTokens('Heading') as $key => $val) {
95
96 if ($val[1]['type'] != 'start') {
97 continue;
98 }
99
100 $options = array(
101 'type' => 'item_start',
102 'id' => $val[1]['id'],
103 'level' => $val[1]['level'],
104 'count' => $count ++
105 );
106
107 $output .= $this->wiki->addToken($this->rule, $options);
108
109 $output .= $val[1]['text'];
110
111 $output .= $this->wiki->addToken(
112 $this->rule,
113 array(
114 'type' => 'item_end',
115 'level' => $val[1]['level']
116 )
117 );
118 }
119
120 $output .= $this->wiki->addToken(
121 $this->rule, array(
122 'type' => 'list_end',
123 'level' => 0
124 )
125 );
126
127 return $output;
128 }
129 }
130 ?>