|
1 <?php |
|
2 |
|
3 /** |
|
4 * |
|
5 * Parses for table markup. |
|
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: Table.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ |
|
16 * |
|
17 */ |
|
18 |
|
19 /** |
|
20 * |
|
21 * Parses for table markup. |
|
22 * |
|
23 * This class implements a Text_Wiki_Parse to find source text marked as a |
|
24 * set of table rows, where a line start and ends with double-pipes (||) |
|
25 * and uses double-pipes to separate table cells. The rows must be on |
|
26 * sequential lines (no blank lines between them) -- a blank line |
|
27 * indicates the beginning of a new table. |
|
28 * |
|
29 * @category Text |
|
30 * |
|
31 * @package Text_Wiki |
|
32 * |
|
33 * @author Paul M. Jones <pmjones@php.net> |
|
34 * |
|
35 */ |
|
36 |
|
37 class Text_Wiki_Parse_Table extends Text_Wiki_Parse { |
|
38 |
|
39 |
|
40 /** |
|
41 * |
|
42 * The regular expression used to parse the source text and find |
|
43 * matches conforming to this rule. Used by the parse() method. |
|
44 * |
|
45 * @access public |
|
46 * |
|
47 * @var string |
|
48 * |
|
49 * @see parse() |
|
50 * |
|
51 */ |
|
52 |
|
53 var $regex = '/\n((\|\|).*)(\n)(?!(\|\|))/Us'; |
|
54 |
|
55 |
|
56 /** |
|
57 * |
|
58 * Generates a replacement for the matched text. |
|
59 * |
|
60 * Token options are: |
|
61 * |
|
62 * 'type' => |
|
63 * 'table_start' : the start of a bullet list |
|
64 * 'table_end' : the end of a bullet list |
|
65 * 'row_start' : the start of a number list |
|
66 * 'row_end' : the end of a number list |
|
67 * 'cell_start' : the start of item text (bullet or number) |
|
68 * 'cell_end' : the end of item text (bullet or number) |
|
69 * |
|
70 * 'cols' => the number of columns in the table (for 'table_start') |
|
71 * |
|
72 * 'rows' => the number of rows in the table (for 'table_start') |
|
73 * |
|
74 * 'span' => column span (for 'cell_start') |
|
75 * |
|
76 * 'attr' => column attribute flag (for 'cell_start') |
|
77 * |
|
78 * @access public |
|
79 * |
|
80 * @param array &$matches The array of matches from parse(). |
|
81 * |
|
82 * @return A series of text and delimited tokens marking the different |
|
83 * table elements and cell text. |
|
84 * |
|
85 */ |
|
86 |
|
87 function process(&$matches) |
|
88 { |
|
89 // our eventual return value |
|
90 $return = ''; |
|
91 |
|
92 // the number of columns in the table |
|
93 $num_cols = 0; |
|
94 |
|
95 // the number of rows in the table |
|
96 $num_rows = 0; |
|
97 |
|
98 // rows are separated by newlines in the matched text |
|
99 $rows = explode("\n", $matches[1]); |
|
100 |
|
101 // loop through each row |
|
102 foreach ($rows as $row) { |
|
103 |
|
104 // increase the row count |
|
105 $num_rows ++; |
|
106 |
|
107 // start a new row |
|
108 $return .= $this->wiki->addToken( |
|
109 $this->rule, |
|
110 array('type' => 'row_start') |
|
111 ); |
|
112 |
|
113 // cells are separated by double-pipes |
|
114 $cell = explode("||", $row); |
|
115 |
|
116 // get the number of cells (columns) in this row |
|
117 $last = count($cell) - 1; |
|
118 |
|
119 // is this more than the current column count? |
|
120 // (we decrease by 1 because we never use cell zero) |
|
121 if ($last - 1 > $num_cols) { |
|
122 // increase the column count |
|
123 $num_cols = $last - 1; |
|
124 } |
|
125 |
|
126 // by default, cells span only one column (their own) |
|
127 $span = 1; |
|
128 |
|
129 // ignore cell zero, and ignore the "last" cell; cell zero |
|
130 // is before the first double-pipe, and the "last" cell is |
|
131 // after the last double-pipe. both are always empty. |
|
132 for ($i = 1; $i < $last; $i ++) { |
|
133 |
|
134 // if there is no content at all, then it's an instance |
|
135 // of two sets of || next to each other, indicating a |
|
136 // span. |
|
137 if ($cell[$i] == '') { |
|
138 |
|
139 // add to the span and loop to the next cell |
|
140 $span += 1; |
|
141 continue; |
|
142 |
|
143 } else { |
|
144 |
|
145 // this cell has content. |
|
146 |
|
147 // find any special "attr"ibute cell markers |
|
148 if (substr($cell[$i], 0, 2) == '> ') { |
|
149 // right-align |
|
150 $attr = 'right'; |
|
151 $cell[$i] = substr($cell[$i], 2); |
|
152 } elseif (substr($cell[$i], 0, 2) == '= ') { |
|
153 // center-align |
|
154 $attr = 'center'; |
|
155 $cell[$i] = substr($cell[$i], 2); |
|
156 } elseif (substr($cell[$i], 0, 2) == '< ') { |
|
157 // left-align |
|
158 $attr = 'left'; |
|
159 $cell[$i] = substr($cell[$i], 2); |
|
160 } elseif (substr($cell[$i], 0, 2) == '~ ') { |
|
161 $attr = 'header'; |
|
162 $cell[$i] = substr($cell[$i], 2); |
|
163 } else { |
|
164 $attr = null; |
|
165 } |
|
166 |
|
167 // start a new cell... |
|
168 $return .= $this->wiki->addToken( |
|
169 $this->rule, |
|
170 array ( |
|
171 'type' => 'cell_start', |
|
172 'attr' => $attr, |
|
173 'span' => $span |
|
174 ) |
|
175 ); |
|
176 |
|
177 // ...add the content... |
|
178 $return .= trim($cell[$i]); |
|
179 |
|
180 // ...and end the cell. |
|
181 $return .= $this->wiki->addToken( |
|
182 $this->rule, |
|
183 array ( |
|
184 'type' => 'cell_end', |
|
185 'attr' => $attr, |
|
186 'span' => $span |
|
187 ) |
|
188 ); |
|
189 |
|
190 // reset the span. |
|
191 $span = 1; |
|
192 } |
|
193 |
|
194 } |
|
195 |
|
196 // end the row |
|
197 $return .= $this->wiki->addToken( |
|
198 $this->rule, |
|
199 array('type' => 'row_end') |
|
200 ); |
|
201 |
|
202 } |
|
203 |
|
204 // wrap the return value in start and end tokens |
|
205 $return = |
|
206 $this->wiki->addToken( |
|
207 $this->rule, |
|
208 array( |
|
209 'type' => 'table_start', |
|
210 'rows' => $num_rows, |
|
211 'cols' => $num_cols |
|
212 ) |
|
213 ) |
|
214 . $return . |
|
215 $this->wiki->addToken( |
|
216 $this->rule, |
|
217 array( |
|
218 'type' => 'table_end' |
|
219 ) |
|
220 ); |
|
221 |
|
222 // we're done! |
|
223 return "\n$return\n\n"; |
|
224 } |
|
225 } |
|
226 ?> |