diff options
Diffstat (limited to 'includes/pear/Text/Wiki/Parse/Creole/Table.php')
| -rw-r--r-- | includes/pear/Text/Wiki/Parse/Creole/Table.php | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/includes/pear/Text/Wiki/Parse/Creole/Table.php b/includes/pear/Text/Wiki/Parse/Creole/Table.php new file mode 100644 index 0000000..2ab3284 --- /dev/null +++ b/includes/pear/Text/Wiki/Parse/Creole/Table.php @@ -0,0 +1,207 @@ +<?php + +/** + * + * Parses for table markup. + * + * This class implements a Text_Wiki_Parse to find source text marked as + * a set of table rows, where a line start (and optionally ends) with a + * single-pipe (|) and uses single-pipes to separate table cells. + * The rows must be on sequential lines (no blank lines between them). + * A blank line indicates the beginning of other text or another table. + * + * @category Text + * + * @package Text_Wiki + * + * @author Michele Tomaiuolo <tomamic@yahoo.it> + * @author Paul M. Jones <pmjones@php.net> + * + * @license LGPL + * + * @version $Id: Table.php 243077 2007-09-28 17:14:58Z mic $ + * + */ + + +class Text_Wiki_Parse_Table 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((\|).*)(\n)(?!(\|))/Us'; + + + /** + * + * Generates a replacement for the matched text. + * + * Token options are: + * + * 'type' => + * 'table_start' : the start of a bullet list + * 'table_end' : the end of a bullet list + * 'row_start' : the start of a number list + * 'row_end' : the end of a number list + * 'cell_start' : the start of item text (bullet or number) + * 'cell_end' : the end of item text (bullet or number) + * + * 'cols' => the number of columns in the table (for 'table_start') + * + * 'rows' => the number of rows in the table (for 'table_start') + * + * 'span' => column span (for 'cell_start') + * + * 'attr' => column attribute flag (for 'cell_start') + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A series of text and delimited tokens marking the different + * table elements and cell text. + * + */ + + function process(&$matches) + { + // our eventual return value + $return = ''; + + // the number of columns in the table + $num_cols = 0; + + // the number of rows in the table + $num_rows = 0; + + // rows are separated by newlines in the matched text + $rows = explode("\n", $matches[1]); + + // loop through each row + foreach ($rows as $row) { + + // increase the row count + $num_rows ++; + + // remove first and last (optional) pipe + $row = substr($row, 1); + if ($row[strlen($row) - 1] == '|') { + $row = substr($row, 0, -1); + } + + // cells are separated by pipes + $cells = explode("|", $row); + + if (count($cells) == 1 && $cells[0][0] == '=' && ($num_rows == 1 || $num_rows == count($rows)) && ! isset($caption)) { + $caption = trim(trim($cells[0], '=')); + + // start the caption... + $return .= $this->wiki->addToken( + $this->rule, + array ('type' => 'caption_start') + ); + + // ...add the content... + $return .= $caption; + + // ...and end the caption. + $return .= $this->wiki->addToken( + $this->rule, + array ('type' => 'caption_end') + ); + } + else { + + // update the column count + if (count($cells) > $num_cols) { + $num_cols = count($cells); + } + + // start a new row + $return .= $this->wiki->addToken( + $this->rule, + array('type' => 'row_start') + ); + + for ($i = 0; $i < count($cells); $i++) { + $cell = $cells[$i]; + + // by default, cells span only one column (their own) + $span = 1; + $attr = ''; + + while ($i + 1 < count($cells) && ! strlen($cells[$i + 1])) { + $i++; + $span++; + } + + if (strlen($cell) > 0 && $cell[0] == '=') { + $attr = 'header'; + $cell = trim($cell, '='); + } + + // start a new cell... + $return .= $this->wiki->addToken( + $this->rule, + array ( + 'type' => 'cell_start', + 'attr' => $attr, + 'span' => $span + ) + ); + + // ...add the content... + $return .= trim($cell); + + // ...and end the cell. + $return .= $this->wiki->addToken( + $this->rule, + array ( + 'type' => 'cell_end', + 'attr' => $attr, + 'span' => $span + ) + ); + } + + // end the row + $return .= $this->wiki->addToken( + $this->rule, + array('type' => 'row_end') + ); + } + } + + // we're done! + return + "\n\n". + $this->wiki->addToken( + $this->rule, + array( + 'type' => 'table_start', + 'rows' => $num_rows, + 'cols' => $num_cols + ) + ). + $return. + $this->wiki->addToken( + $this->rule, + array( + 'type' => 'table_end' + ) + ). + "\n\n"; + } +} +?>
\ No newline at end of file |
