summaryrefslogtreecommitdiff
path: root/includes/pear/Text/Wiki/Parse/BBCode/List.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/pear/Text/Wiki/Parse/BBCode/List.php')
-rwxr-xr-xincludes/pear/Text/Wiki/Parse/BBCode/List.php187
1 files changed, 187 insertions, 0 deletions
diff --git a/includes/pear/Text/Wiki/Parse/BBCode/List.php b/includes/pear/Text/Wiki/Parse/BBCode/List.php
new file mode 100755
index 0000000..93cd539
--- /dev/null
+++ b/includes/pear/Text/Wiki/Parse/BBCode/List.php
@@ -0,0 +1,187 @@
+<?php
+// vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
+/**
+ * BBCode: Parses for code blocks.
+ *
+ * This class implements a Text_Wiki_Rule to find source text marked as
+ * bulleted or numbered lists as defined by text surrounded by [list] [*] ... [/list]
+ * Numebering is obtained thru [list=1] or [list=a] defining the first item "number"
+ * On parsing, the text itself is left in place, but the starting, element and ending
+ * tags are replaced with tokens. (nested lists enabled)
+ *
+ * PHP versions 4 and 5
+ *
+ * @category Text
+ * @package Text_Wiki
+ * @author Bertrand Gugger <bertrand@toggg.com>
+ * @copyright 2005 bertrand Gugger
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
+ * @version CVS: $Id: List.php,v 1.6 2006/12/22 14:43:06 toggg Exp $
+ * @link http://pear.php.net/package/Text_Wiki
+ */
+
+/**
+ * List rule parser class for BBCode.
+ *
+ * @category Text
+ * @package Text_Wiki
+ * @author Bertrand Gugger <bertrand@toggg.com>
+ * @copyright 2005 bertrand Gugger
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Text_Wiki
+ * @see Text_Wiki_Parse::Text_Wiki_Parse()
+ */
+class Text_Wiki_Parse_List 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 = "#\[list(?:=(.+?))?]\n?((?:((?R))|.)*?)\[/list]\n?#msi";
+
+ /**
+ * The regular expression used in second stage to find list's elements
+ * used by process() to call back processElement()
+ *
+ * @access public
+ * @var string
+ * @see process()
+ * @see processElement()
+ */
+ var $regexElement = '#\[\*](.*?)(?=\[\*]|$)\n?#msi';
+
+ /**
+ * The current list nesting depth, starts by zero
+ *
+ * @access private
+ * @var int
+ */
+ var $_level = 0;
+
+ /**
+ * The count of items for this level
+ *
+ * @access private
+ * @var int
+ */
+ var $_count = array();
+
+ /**
+ * The type of list for this level ('bullet' or 'number')
+ *
+ * @access private
+ * @var int
+ */
+ var $_type = array();
+
+ /**
+ * Generates a replacement for the matched text. Returned token options are:
+ * 'type' =>
+ * 'bullet_list_start' : the start of a bullet list
+ * 'bullet_list_end' : the end of a bullet list
+ * 'number_list_start' : the start of a number list
+ * 'number_list_end' : the end of a number list
+ * 'item_start' : the start of item text (bullet or number)
+ * 'item_end' : the end of item text (bullet or number)
+ * 'unknown' : unknown type of list or item
+ *
+ * 'level' => the indent level (0 for the first level, 1 for the
+ * second, etc)
+ *
+ * 'count' => the list item number at this level. not needed for
+ * xhtml, but very useful for PDF and RTF.
+ *
+ * 'format' => the optional enumerating type : A, a, I, i, or 1 (default)
+ * as HTML <ol> tag's type attribute (only for number_... type)
+ *
+ * 'key' => the optional starting number/letter (not for items)
+ *
+ * @param array &$matches The array of matches from parse().
+ * @return A delimited token to be used as a placeholder in
+ * the source text and containing the original block of text
+ * @access public
+ */
+ function process(&$matches)
+ {
+ if (!empty($matches[3])) {
+ $this->_level++;
+ $expsub = preg_replace_callback(
+ $this->regex,
+ array(&$this, "process"),
+ $matches[2]
+ );
+ $this->_level--;
+ } else {
+ $expsub = $matches[2];
+ }
+ if ($matches[1]) {
+ $this->_type[$this->_level] = "number";
+ if (is_numeric($matches[1])) {
+ $format = "1";
+ $key = $matches[1] + 0;
+ } elseif (($matches[1] == "i") || ($matches[1] == "I")) {
+ $format = $matches[1];
+ } else {
+ $format =
+ ($matches[1] >= "a") && ($matches[1] <="z") ? "a" : "A";
+ $key = $matches[1];
+ }
+ } else {
+ $this->_type[$this->_level] = "bullet";
+ }
+ $this->_count[$this->_level] = -1;
+ $sub = preg_replace_callback(
+ $this->regexElement,
+ array(&$this, "processElement"),
+ $expsub
+ );
+ $param = array(
+ "level" => $this->_level,
+ "count" => $this->_count[$this->_level] );
+ $param["type"] = $this->_type[$this->_level]."_list_start";
+ if (isset($format)) {
+ $param["format"] = $format;
+ }
+ if (isset($key)) {
+ $param["key"] = $key;
+ }
+ $ret = $this->wiki->addToken($this->rule, $param );
+ $param["type"] = $this->_type[$this->_level]."_list_end";
+ return $ret . $sub . $this->wiki->addToken($this->rule, $param );
+ }
+
+ /**
+ * Generates a replacement for the matched list elements. Token options are:
+ * 'type' =>
+ * '[listType]_item_start' : the start of item text (bullet or number)
+ * '[listType]_item_end' : the end of item text (bullet or number)
+ * where [listType] is bullet or number
+ *
+ * 'level' => the indent level (0 for the first level, 1 for the
+ * second, etc)
+ *
+ * 'count' => the item ordeer at this level.
+ *
+ * @param array &$matches The array of matches from parse().
+ * @return A delimited token to be used as a placeholder in
+ * the source text and containing the original block of text
+ * @access public
+ */
+ function processElement(&$matches)
+ {
+ return $this->wiki->addToken($this->rule, array(
+ "type" => $this->_type[$this->_level] . "_item_start",
+ "level" => $this->_level,
+ "count" => ++$this->_count[$this->_level]) ) .
+ rtrim($matches[1]) .
+ $this->wiki->addToken($this->rule, array(
+ "type" => $this->_type[$this->_level] . "_item_end",
+ "level" => $this->_level,
+ "count" => $this->_count[$this->_level]) );
+ }
+}