--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/wikiengine/Parse/Default/Table.php Wed Jun 13 16:07:17 2007 -0400
@@ -0,0 +1,226 @@
+<?php
+
+/**
+*
+* Parses for table markup.
+*
+* @category Text
+*
+* @package Text_Wiki
+*
+* @author Paul M. Jones <pmjones@php.net>
+*
+* @license LGPL
+*
+* @version $Id: Table.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $
+*
+*/
+
+/**
+*
+* 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 ends with double-pipes (||)
+* and uses double-pipes to separate table cells. The rows must be on
+* sequential lines (no blank lines between them) -- a blank line
+* indicates the beginning of a new table.
+*
+* @category Text
+*
+* @package Text_Wiki
+*
+* @author Paul M. Jones <pmjones@php.net>
+*
+*/
+
+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 ++;
+
+ // start a new row
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'row_start')
+ );
+
+ // cells are separated by double-pipes
+ $cell = explode("||", $row);
+
+ // get the number of cells (columns) in this row
+ $last = count($cell) - 1;
+
+ // is this more than the current column count?
+ // (we decrease by 1 because we never use cell zero)
+ if ($last - 1 > $num_cols) {
+ // increase the column count
+ $num_cols = $last - 1;
+ }
+
+ // by default, cells span only one column (their own)
+ $span = 1;
+
+ // ignore cell zero, and ignore the "last" cell; cell zero
+ // is before the first double-pipe, and the "last" cell is
+ // after the last double-pipe. both are always empty.
+ for ($i = 1; $i < $last; $i ++) {
+
+ // if there is no content at all, then it's an instance
+ // of two sets of || next to each other, indicating a
+ // span.
+ if ($cell[$i] == '') {
+
+ // add to the span and loop to the next cell
+ $span += 1;
+ continue;
+
+ } else {
+
+ // this cell has content.
+
+ // find any special "attr"ibute cell markers
+ if (substr($cell[$i], 0, 2) == '> ') {
+ // right-align
+ $attr = 'right';
+ $cell[$i] = substr($cell[$i], 2);
+ } elseif (substr($cell[$i], 0, 2) == '= ') {
+ // center-align
+ $attr = 'center';
+ $cell[$i] = substr($cell[$i], 2);
+ } elseif (substr($cell[$i], 0, 2) == '< ') {
+ // left-align
+ $attr = 'left';
+ $cell[$i] = substr($cell[$i], 2);
+ } elseif (substr($cell[$i], 0, 2) == '~ ') {
+ $attr = 'header';
+ $cell[$i] = substr($cell[$i], 2);
+ } else {
+ $attr = null;
+ }
+
+ // start a new cell...
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => 'cell_start',
+ 'attr' => $attr,
+ 'span' => $span
+ )
+ );
+
+ // ...add the content...
+ $return .= trim($cell[$i]);
+
+ // ...and end the cell.
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array (
+ 'type' => 'cell_end',
+ 'attr' => $attr,
+ 'span' => $span
+ )
+ );
+
+ // reset the span.
+ $span = 1;
+ }
+
+ }
+
+ // end the row
+ $return .= $this->wiki->addToken(
+ $this->rule,
+ array('type' => 'row_end')
+ );
+
+ }
+
+ // wrap the return value in start and end tokens
+ $return =
+ $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'
+ )
+ );
+
+ // we're done!
+ return "\n$return\n\n";
+ }
+}
+?>
\ No newline at end of file