Commit | Line | Data |
---|---|---|
6855525e JL |
1 | <?php |
2 | ||
3 | /** | |
4 | * | |
5 | * Parse for block-quoted text. | |
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: Blockquote.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ | |
16 | * | |
17 | */ | |
18 | ||
19 | /** | |
20 | * | |
21 | * Parse for block-quoted text. | |
22 | * | |
23 | * Find source text marked as a blockquote, identified by any number of | |
24 | * greater-than signs '>' at the start of the line, followed by a space, | |
25 | * and then the quote text; each '>' indicates an additional level of | |
26 | * quoting. | |
27 | * | |
28 | * @category Text | |
29 | * | |
30 | * @package Text_Wiki | |
31 | * | |
32 | * @author Paul M. Jones <pmjones@php.net> | |
33 | * | |
34 | */ | |
35 | ||
36 | class Text_Wiki_Parse_Blockquote extends Text_Wiki_Parse { | |
37 | ||
38 | ||
39 | /** | |
40 | * | |
41 | * Regex for parsing the source text. | |
42 | * | |
43 | * @access public | |
44 | * | |
45 | * @var string | |
46 | * | |
47 | * @see parse() | |
48 | * | |
49 | */ | |
50 | ||
51 | var $regex = '/\n((\>).*\n)(?!(\>))/Us'; | |
52 | ||
53 | ||
54 | /** | |
55 | * | |
56 | * Generates a replacement for the matched text. | |
57 | * | |
58 | * Token options are: | |
59 | * | |
60 | * 'type' => | |
61 | * 'start' : the start of a blockquote | |
62 | * 'end' : the end of a blockquote | |
63 | * | |
64 | * 'level' => the indent level (0 for the first level, 1 for the | |
65 | * second, etc) | |
66 | * | |
67 | * @access public | |
68 | * | |
69 | * @param array &$matches The array of matches from parse(). | |
70 | * | |
71 | * @return A series of text and delimited tokens marking the different | |
72 | * list text and list elements. | |
73 | * | |
74 | */ | |
75 | ||
76 | function process(&$matches) | |
77 | { | |
78 | // the replacement text we will return to parse() | |
79 | $return = ''; | |
80 | ||
81 | // the list of post-processing matches | |
82 | $list = array(); | |
83 | ||
84 | // $matches[1] is the text matched as a list set by parse(); | |
85 | // create an array called $list that contains a new set of | |
86 | // matches for the various list-item elements. | |
87 | preg_match_all( | |
88 | '=^(\>+) (.*\n)=Ums', | |
89 | $matches[1], | |
90 | $list, | |
91 | PREG_SET_ORDER | |
92 | ); | |
93 | ||
94 | // a stack of starts and ends; we keep this so that we know what | |
95 | // indent level we're at. | |
96 | $stack = array(); | |
97 | ||
98 | // loop through each list-item element. | |
99 | foreach ($list as $key => $val) { | |
100 | ||
101 | // $val[0] is the full matched list-item line | |
102 | // $val[1] is the number of initial '>' chars (indent level) | |
103 | // $val[2] is the quote text | |
104 | ||
105 | // we number levels starting at 1, not zero | |
106 | $level = strlen($val[1]); | |
107 | ||
108 | // get the text of the line | |
109 | $text = $val[2]; | |
110 | ||
111 | // add a level to the list? | |
112 | while ($level > count($stack)) { | |
113 | ||
114 | // the current indent level is greater than the number | |
115 | // of stack elements, so we must be starting a new | |
116 | // level. push the new level onto the stack with a | |
117 | // dummy value (boolean true)... | |
118 | array_push($stack, true); | |
119 | ||
120 | $return .= "\n"; | |
121 | ||
122 | // ...and add a start token to the return. | |
123 | $return .= $this->wiki->addToken( | |
124 | $this->rule, | |
125 | array( | |
126 | 'type' => 'start', | |
127 | 'level' => $level - 1 | |
128 | ) | |
129 | ); | |
130 | ||
131 | $return .= "\n\n"; | |
132 | } | |
133 | ||
134 | // remove a level? | |
135 | while (count($stack) > $level) { | |
136 | ||
137 | // as long as the stack count is greater than the | |
138 | // current indent level, we need to end list types. | |
139 | // continue adding end-list tokens until the stack count | |
140 | // and the indent level are the same. | |
141 | array_pop($stack); | |
142 | ||
143 | $return .= "\n\n"; | |
144 | ||
145 | $return .= $this->wiki->addToken( | |
146 | $this->rule, | |
147 | array ( | |
148 | 'type' => 'end', | |
149 | 'level' => count($stack) | |
150 | ) | |
151 | ); | |
152 | ||
153 | $return .= "\n"; | |
154 | } | |
155 | ||
156 | // add the line text. | |
157 | $return .= $text; | |
158 | } | |
159 | ||
160 | // the last line may have been indented. go through the stack | |
161 | // and create end-tokens until the stack is empty. | |
162 | $return .= "\n"; | |
163 | ||
164 | while (count($stack) > 0) { | |
165 | array_pop($stack); | |
166 | $return .= $this->wiki->addToken( | |
167 | $this->rule, | |
168 | array ( | |
169 | 'type' => 'end', | |
170 | 'level' => count($stack) | |
171 | ) | |
172 | ); | |
173 | } | |
174 | ||
175 | // we're done! send back the replacement text. | |
176 | return "\n$return\n\n"; | |
177 | } | |
178 | } | |
179 | ?> |