summaryrefslogtreecommitdiff
path: root/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc')
-rwxr-xr-xbuildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc1488
1 files changed, 1488 insertions, 0 deletions
diff --git a/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc b/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc
new file mode 100755
index 00000000..f58be00e
--- /dev/null
+++ b/buildscripts/PhpDocumentor/phpDocumentor/ParserDescCleanup.inc
@@ -0,0 +1,1488 @@
+<?php
+/**
+ * All of the functions to clean up and handle the long description
+ * of a DocBlock are in this file.
+ *
+ * The primary functionality is based on Parser and WordParser, and modified to recognize
+ * only the tokens defined in the PHPDOCUMENTOR_PDP_* constants
+ *
+ * phpDocumentor :: automatic documentation generator
+ *
+ * PHP versions 4 and 5
+ *
+ * Copyright (c) 2002-2006 Gregory Beaver
+ *
+ * LICENSE:
+ *
+ * This library is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General
+ * Public License as published by the Free Software Foundation;
+ * either version 2.1 of the License, or (at your option) any
+ * later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package phpDocumentor
+ * @subpackage Parsers
+ * @author Gregory Beaver <cellog@php.net>
+ * @copyright 2002-2006 Gregory Beaver
+ * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
+ * @version CVS: $Id: ParserDescCleanup.inc 286923 2009-08-08 06:00:39Z ashnazg $
+ * @link http://www.phpdoc.org
+ * @link http://pear.php.net/PhpDocumentor
+ * @see Parser, WordParser
+ * @since 1.2
+ */
+
+/**#@+
+ * {@link parserDescParser} token constants
+ */
+/** when <<code>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_CODE', 600);
+/** when <<code>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_CODE', 700);
+/** when <<p>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_P', 601);
+/** when <<p>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_P', 701);
+/** when \n\n is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_DOUBLECR', 602);
+/** when \n\n is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_DOUBLECR', 702);
+/** when <<pre>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_PRE', 603);
+/** when <<pre>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_PRE', 703);
+/** when <<ul>>/<<ol>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_LIST', 604);
+/** when <<ul>>/<<ol>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_LIST', 704);
+/** when <<b>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_B', 605);
+/** when <<b>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_B', 705);
+/** when <<i>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_I', 606);
+/** when <<i>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_I', 706);
+/** when <<br>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_BR', 607);
+/** when <<br>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_BR', 707);
+/** when the << potential escape for tags is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_ESCAPE',608);
+/** when the << potential escape for tags is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_ESCAPE',708);
+/** when << /pre>> is found in a <<pre>><</pre>> section */
+define('PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE',609);
+/** when << /pre>> is found in a <<pre>><</pre>> section */
+define('PHPDOCUMENTOR_PDP_STATE_ESCAPE_PRE',709);
+/** when << /code>> is found in a <<code>><</code>> section */
+define('PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE',610);
+/** when << /code>> is found in a <<code>><</code>> section */
+define('PHPDOCUMENTOR_PDP_STATE_ESCAPE_CODE',710);
+/** when <<var>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_VAR',611);
+/** when <<var>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_VAR',711);
+/** when <<samp>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_SAMP',612);
+/** when <<samp>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_SAMP',712);
+/** when <<kbd>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_EVENT_KBD',613);
+/** when <<kbd>> is found in a desc */
+define('PHPDOCUMENTOR_PDP_STATE_KBD',713);
+/** when a simple list is found in a desc
+ *
+ * like
+ * <pre>
+ * o item 1
+ * o item 2
+ * </pre>
+ */
+define('PHPDOCUMENTOR_PDP_EVENT_SIMLIST',614);
+/** when a simple list is found in a desc
+ *
+ * like
+ * <pre>
+ * o item 1
+ * o item 2
+ * </pre>
+ */
+define('PHPDOCUMENTOR_PDP_STATE_SIMLIST',714);
+/**#@-*/
+/**
+* Like WordParser but designed to handle an array with strings and
+* {@link parserInlineTag}s
+* @package phpDocumentor
+* @subpackage WordParsers
+* @author Greg Beaver <cellog@php.net>
+* @since 1.2
+*/
+class ObjectWordParser extends WordParser
+{
+ /**
+ * Determines whether text searching is case-sensitive or not
+ * @access private
+ */
+ var $_casesensitive = false;
+
+ function ObjectWordParser($casesensitive = false)
+ {
+ $this->_casesensitive = $casesensitive;
+ }
+
+ /**
+ * Set the word parser to go.
+ *
+ * @param array {@link parserStringWithInlineTags::$value} style-array, with
+ * alternating text and inline tags
+ */
+ function setup(&$input)
+ {
+// if (is_string($input[0])) $input[0] = ltrim($input[0]);
+ $this->data = & $input;
+ $this->pos = 0;
+ $this->linenum = 0;
+ $this->linenumpos = 0;
+ $this->cache = array();
+ reset($this->data);
+ list($this->index,) = each($this->data);
+ if (!is_object($this->data[$this->index]))
+ $this->size = strlen($this->data[$this->index]);
+ else $this->size = 0;
+ //$this->run = 0;
+ //$this->word = WORD_PARSER_RET_WORD;
+ }
+
+ function getWord()
+ {
+ if (!isset($this->data[$this->index])) return false;
+ // return any inline tags unchanged
+ if (is_object($this->data[$this->index]))
+ {
+ $index = $this->index;
+ list($this->index,) = each($this->data);
+ $this->pos = 0;
+ if ($this->index)
+ {
+ if (!is_object($this->data[$this->index]))
+ $this->size = strlen($this->data[$this->index]);
+ else $this->size = 0;
+ $this->cache = array();
+ return $this->data[$index];
+ } else
+ {
+ return false;
+ }
+ }
+ //$st = $this->mtime();
+ if ($this->size == $this->pos)
+ {
+ // cycle to next line in the array
+ list($this->index,) = each($this->data);
+ if (!$this->index) return false;
+ $this->pos = 0;
+ if (!is_object($this->data[$this->index]))
+ $this->size = strlen($this->data[$this->index]);
+ else $this->size = 0;
+ $this->cache = array();
+ return $this->getWord();
+ }
+
+ $npos = $this->size;
+ if (is_array($this->wordseperators))
+ {
+ //$this->wordseperators = array();
+ foreach($this->wordseperators as $sep)
+ {
+ if (isset($this->cache[$sep]))
+ $tpos = $this->cache[$sep];
+ else
+ $tpos = false;
+ if ($tpos < $this->pos || !is_int($tpos))
+ {
+ if ($this->_casesensitive)
+ $tpos = strpos($this->data[$this->index],$sep,$this->pos);
+ else
+ $tpos = strpos(strtolower($this->data[$this->index]),$sep,$this->pos);
+ }
+
+ if ( ($tpos < $npos) && !($tpos === false))
+ {
+ //echo trim($sep) . "=$tpos\n";
+ $npos = $tpos;
+ $seplen = strlen($sep);
+ }
+ else if (!($tpos === false))
+ {
+ $this->cache[$sep] = $tpos;
+ }
+ }
+ } else {
+ // its time to cycle
+ return "";
+ }
+
+ $len = $npos - $this->pos;
+ if ($len == 0)
+ {
+ $len = $seplen;
+ }
+
+ //$st3 = $this->mtime();
+ $word = substr($this->data[$this->index],$this->pos,$len);
+
+ // Change random other os newlines to the unix one
+ if ($word == "\r" || $word == "\r\n")
+ {
+ $word = "\n";
+ }
+
+ if ($this->linenumpos <= $this->pos)
+ {
+ $this->linenumpos = $this->pos + $len;
+ $this->linenum += count(explode("\n",$word)) - 1;
+ }
+
+ if ($this->getsource)
+ {
+ $this->source .= $word;
+ }
+ $this->pos = $this->pos + $len;
+ //$this->word = WORD_PARSER_RET_SEP;
+
+ // Things like // commenats rely on the newline to find their end so im going to have to return them
+ // never return worthless white space /t ' '
+ if ($this->returnWhiteSpace == false)
+ {
+ if (strlen(trim($word)) == 0 && $word != "\n")
+ {
+ $word = $this->getWord();
+ }
+ }
+ //$this->time3 = $this->time3 + ($this->mtime() - $st3);
+ //$this->time = $this->time + ($this->mtime() - $st);
+ return $word;
+ }
+
+ /**
+ * Determine if the next word is an inline tag
+ * @return boolean
+ */
+ function nextIsObjectOrNonNL()
+ {
+ return (($this->size == $this->pos) && isset($this->data[$this->index + 1])
+ && is_object($this->data[$this->index + 1])) ||
+ (($this->size > $this->pos) && !in_array($this->data[$this->index]{$this->pos}, array("\n", "\r")));
+ }
+}
+
+/**
+ * Parses a DocBlock description to retrieve abstract representations of
+ * <<pre>>,<<code>>,<<p>>,<<ul>>,<<ol>>,<<li>>,<<b>>,<<i>>
+ * @tutorial phpDocumentor.howto.pkg#basics.desc
+ * @package phpDocumentor
+ * @subpackage Parsers
+ * @author Greg Beaver <cellog@php.net>
+ * @since 1.2
+ */
+class parserDescParser extends Parser
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * @var array
+ */
+ var $eventHandlers = array(PHPDOCUMENTOR_PDP_EVENT_CODE => 'handleCode',
+ PHPDOCUMENTOR_PDP_EVENT_PRE => 'handlePre',
+ PHPDOCUMENTOR_PDP_EVENT_P => 'handleP',
+ PHPDOCUMENTOR_PDP_EVENT_DOUBLECR => 'handleDoubleCR',
+ PHPDOCUMENTOR_PDP_EVENT_LIST => 'handleList',
+ PHPDOCUMENTOR_PDP_EVENT_B => 'handleB',
+ PHPDOCUMENTOR_PDP_EVENT_I => 'handleI',
+ PHPDOCUMENTOR_PDP_EVENT_VAR => 'handleVar',
+ PHPDOCUMENTOR_PDP_EVENT_KBD => 'handleKbd',
+ PHPDOCUMENTOR_PDP_EVENT_SAMP => 'handleSamp',
+ PHPDOCUMENTOR_PDP_EVENT_BR => 'handleBr',
+ PHPDOCUMENTOR_PDP_EVENT_ESCAPE => 'handleEscape',
+ PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE => 'handleEscapeCode',
+ PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE => 'handleEscapePre',
+ PHPDOCUMENTOR_PDP_EVENT_SIMLIST => 'handleSimpleList',
+ PARSER_EVENT_NOEVENTS => 'defaultHandler',
+ );
+
+ /**
+ * @var array
+ */
+ var $pars = array();
+ /**
+ * Determines whether parsing of &lt;p&gt; tags will occur, or double CR will
+ * be used
+ * @var boolean
+ */
+ var $parse_Ps;
+ /**
+ * Context stack.
+ *
+ * Values can be 'normal', or any tag container like 'my_i', 'my_b'. This
+ * is used to determine which tag text or nested tags should be added to
+ * @var array
+ */
+ var $_context = array('normal');
+ /**#@-*/
+
+ /**
+ * sets $wp to be a {@link ObjectWordParser}
+ *
+ * $wp is the word parser that retrieves tokens
+ */
+ function parserDescParser()
+ {
+ $this->wp = new ObjectWordParser;
+ }
+
+ /**
+ * Parse a long or short description for tags
+ *
+ * @param array array of strings or {@link parserInlineTag}s
+ * @param boolean true if the description is a short description. (only 1 paragraph allowed in short desc)
+ * @param string name of the class to instantiate for each paragraph. parserDesc for desc/sdesc,
+ * parserStringWithInlineTags for tag data
+ * @staticvar integer used for recursion limiting if a handler for an event is not found
+ */
+ function parse (&$parse_data,$sdesc = false,$ind_type = 'parserDesc')
+ {
+ static $endrecur = 0;
+ global $_phpDocumentor_setting;
+ if (!is_array($parse_data) || count($parse_data) == 0)
+ {
+ return false;
+ }
+ $this->p_vars['indtype'] = $ind_type;
+ $this->setupStates($sdesc);
+ if (isset($_phpDocumentor_setting['javadocdesc']) && $_phpDocumentor_setting['javadocdesc'] == 'on')
+ $this->parse_Ps = true;
+
+ // initialize variables so E_ALL error_reporting doesn't complain
+ $pevent = 0;
+ $word = 0;
+ $this->p_vars['curpar'] = 0;
+ $this->pars = array();
+ $this->p_vars['start'] = true;
+ $this->p_vars['event_stack'] = new EventStack;
+
+ $this->wp->setup($parse_data,$sdesc);
+ $this->wp->setWhitespace(true);
+ $this->p_vars['list_count'] = 0;
+ if ($sdesc) $this->p_vars['start'] = false;
+
+ // beware of infinite loops
+ $infiniteLoopCatcher = 0;
+ do
+ {
+ $infiniteLoopCatcher++;
+ if (!isset($this->pars[$this->p_vars['curpar']])) $this->pars[$this->p_vars['curpar']] = new $ind_type;
+ $lpevent = $pevent;
+ $pevent = $this->p_vars['event_stack']->getEvent();
+ if ($lpevent != $pevent)
+ {
+ $this->p_vars['last_pevent'] = $lpevent;
+ }
+
+ if ($this->p_vars['last_pevent'] != $pevent)
+ {
+ // its a new event so the word parser needs to be reconfigured
+ $this->configWordParser($pevent);
+ }
+
+
+ $this->p_vars['last_word'] = $word;
+ $word = $this->wp->getWord();
+
+ if (PHPDOCUMENTOR_DEBUG == true)
+ {
+ echo "----------------\n";
+ echo "LAST: |" . htmlentities($this->p_vars['last_word']) . "|\n";
+// echo "INDEX: ".$this->p_vars['curpar']."\n";
+ echo "PEVENT: " . $this->getParserEventName($pevent) . "\n";
+ echo "LASTPEVENT: " . $this->getParserEventName($this->p_vars['last_pevent']) . "\n";
+ echo $this->wp->getPos() . " WORD: |".htmlentities($word)."|\n\n";
+ var_dump($this->_context);
+ }
+ if (isset($this->eventHandlers[$pevent]))
+ {
+ $handle = $this->eventHandlers[$pevent];
+ if ($word !== false) $this->$handle($word, $pevent);
+ else
+ {
+ if (!count($this->pars[$this->p_vars['curpar']]->value)) unset($this->pars[$this->p_vars['curpar']]);
+ }
+ } else
+ {
+ debug('WARNING: possible error, no ParserDescParser handler for event number '.$pevent);
+ if ($endrecur++ == 25)
+ {
+ addErrorDie(PDERROR_LOOP_RECURSION_LIMIT_REACHED);
+ }
+ }
+ if (is_object($word) || trim($word) != '')
+ {
+ $this->p_vars['start'] = false;
+ }
+
+ if ($infiniteLoopCatcher > 10000) {
+ echo PHP_EOL . "FATAL ERROR: Somehow we got into an infinite loop in parserDescCleanup->parse()'s do-while loop...";
+ echo PHP_EOL . " The line being parsed was: " . $word . PHP_EOL . PHP_EOL;
+ addErrorDie(PDERROR_LOOP_RECURSION_LIMIT_REACHED);
+ }
+ } while (is_object($word) || !($word === false) && $word != '');
+ $context = $this->getContext();
+ if ($context != 'normal')
+ {
+ if ($context == 'list' && $this->p_flags['simplelist'])
+ {
+ $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]);
+ unset($this->p_vars['list_item'][0]);
+ $this->setContext('normal');
+ $this->addText($this->p_vars['lists'][0]);
+ } else addError(PDERROR_UNCLOSED_TAG,str_replace('my_','',$context));
+ }
+ if ($this->p_vars['list_count'] > 0) addError(PDERROR_UNMATCHED_LIST_TAG);
+ if ($sdesc)
+ $this->publishEvent(2,$this->pars);
+ else
+ $this->publishEvent(1,$this->pars);
+ }
+ /**#@+ @access private */
+ /**
+ * basic handling
+ *
+ * This function checks to see if the first thing in
+ * a description is the <p> tag. If so, it will switch
+ * into a mode of parsing out paragraphs by <p> instead
+ * of a double line-break
+ *
+ * It also removes extra whitespace
+ * @uses doSimpleList()
+ */
+ function defaultHandler($word, $pevent)
+ {
+ $context = $this->getContext();
+ if ($context != 'normal') $this->setContext('normal');
+ if ($this->p_vars['start'] && is_string($word) && strtolower($word) == '<p>')
+ {
+ $this->parse_Ps = true;
+ }
+ if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
+// if (!isset($this->parse_Ps) || !$this->parse_Ps)
+ {
+ if (is_string($word) && is_string($this->p_vars['last_word']) &&
+ ($word == ' ' && $this->p_vars['last_word'] == ' ')) return;
+ if ($pevent == PARSER_EVENT_NOEVENTS)
+ {
+ if ($this->doSimpleList($word)) return;
+ }
+ $this->addText($word);
+ }
+ }
+
+ /**
+ * Retrieve the current top-level tag to add text into
+ * @uses $_context
+ */
+ function getContext()
+ {
+ array_push($this->_context,$a = array_pop($this->_context));
+ return $a;
+ }
+
+ /**
+ * Pop a context off of the context stack
+ * @uses $_context
+ */
+ function dropContext()
+ {
+ array_pop($this->_context);
+ if (count($this->_context) == 0)
+ $this->_context = array('normal');
+ }
+
+ /**
+ * @uses $_context
+ * @param string context name
+ */
+ function setContext($context)
+ {
+ array_push($this->_context,$context);
+ }
+
+ /**
+ * add input as text to the current paragraph or list
+ * @param string|parserInlineTag
+ */
+ function addText($text)
+ {
+ $context = $this->getContext();
+ if ($context == 'list')
+ {
+// debug('aded to '.$context);
+ if (!is_object($this->p_vars['list_item'][$this->p_vars['list_count']])) {
+ addErrorDie(PDERROR_UL_IN_UL);
+ }
+ $this->p_vars['list_item'][$this->p_vars['list_count']]->add($text);
+ } elseif ($context != 'normal')
+ {
+// debug('added to '.$context);
+ $this->p_vars[$context]->add($text);
+ } else
+ {
+// debug('added to normal ');
+ $indtype = $this->p_vars['indtype'];
+ if (!isset($this->pars[$this->p_vars['curpar']]))
+ $this->pars[$this->p_vars['curpar']] = new $indtype;
+ $this->pars[$this->p_vars['curpar']]->add($text);
+ }
+ }
+
+ /**#@-*/
+ /**#@+
+ * @access private
+ * @param string|parserInlineTag token from the ObjectWordParser
+ * @param integer parser event from {@link ParserDescCleanup.inc}
+ */
+ /**
+ * Handles special case where a description needs the text "<tag>" and tag
+ * is one of code, b, i, pre, var, or any other valid in-DocBlock html tag.
+ *
+ * the text <<<code>>> in a DocBlock will parse out as <<code>>, instead
+ * of being parsed as markup.
+ */
+ function handleEscape($word, $pevent)
+ {
+ $this->p_vars['event_stack']->popEvent();
+ if (!in_array($word, $this->tokens[PHPDOCUMENTOR_PDP_STATE_ESCAPE]))
+ {
+ if ($word == '<')
+ {
+ $this->addText($word);
+ $this->wp->backupPos($word.$word);
+ } else {
+ $this->addText('<<');
+ $this->wp->backupPos($word);
+ }
+ return;
+ }
+ $this->addText('<'.str_replace('>>','>',$word));
+ }
+
+ /**
+ * Just like {@link handleEscape}, except the only valid escape is
+ * <<</pre>>>
+ */
+ function handleEscapePre($word, $pevent)
+ {
+ $this->p_vars['event_stack']->popEvent();
+ $this->addText('</pre>');
+ }
+
+ /**
+ * Just like {@link handleEscape}, except the only valid escape is
+ * <<</code>>>
+ */
+ function handleEscapeCode($word, $pevent)
+ {
+ $this->p_vars['event_stack']->popEvent();
+ $this->addText('</code>');
+ }
+
+ /**
+ * Handle "<<br>>"
+ * Add a new {@link parserBr}
+ * @uses addText()
+ */
+ function handleBr($word, $pevent)
+ {
+ if (is_string($word) && $this->checkEventPop($word, $pevent))
+ {
+ $this->addText(new parserBr);
+ }
+ }
+
+ /**
+ * Handles simple lists
+ *
+ * phpEdit has an ingenious facility to handle simple lists used in a
+ * DocBlock like this:
+ *
+ * - item 1
+ * - item 2
+ * - item 3
+ *
+ * The DocBlock is:
+ * <pre>
+ * * - item 1
+ * * - item 2
+ * * - item 3
+ * </pre>
+ * This function converts these simple lists into the parserList class
+ * @param boolean true if this is the first list item in the list
+ */
+ function handleSimpleList($word, $pevent, $start = false)
+ {
+ if (is_object($word) && $this->p_flags['in_item'])
+ {
+ $this->p_vars['list_item'][0]->add($word);
+ return;
+ }
+ if (is_string($word) && $this->checkEventPush($word, $pevent))
+ {
+ $this->p_flags['in_event'] = true;
+ return;
+ }
+ $ltrimword = @substr($word, @strpos($word, ltrim($word)));
+ $is_valid = false;
+ if (strlen(trim($word)) == 0)
+ {
+ if ($this->wp->nextIsObjectOrNonNL())
+ {
+ $is_valid = true;
+ }
+ }
+ if ($word == "\n" && is_string($this->p_vars['last_word'])
+ && $this->p_vars['last_word']{strlen($this->p_vars['last_word']) - 1}
+ == "\n")
+ {
+ if ($this->p_flags['in_item'])
+ {
+ $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]);
+ unset($this->p_vars['list_item'][0]);
+ $this->setContext('normal');
+ $this->p_flags['simplelist'] = false;
+ $this->addText($this->p_vars['lists'][0]);
+ unset($this->p_vars['lists']);
+ unset($this->p_vars['last_list']);
+ $this->wp->backuppos($word);
+ $this->p_vars['event_stack']->popEvent();
+ $this->p_flags['in_item'] = false;
+// debug('end of list 3');
+ return;
+ } else
+ {
+ $this->wp->backuppos($word);
+ $this->p_vars['event_stack']->popEvent();
+ $this->p_flags['in_item'] = false;
+// debug('not a list 2');
+ return;
+ }
+ }
+ $start_list = $this->getStartList($word);
+ if (substr($ltrimword,0,strlen($start_list)) != $start_list
+ || $this->p_flags['in_event'] || is_object($this->p_vars['last_word']))
+ {
+ if (((strlen($this->p_vars['whitespace']) + 1) < strlen(substr($word,0,strpos($word, $ltrimword))))
+ || $word == "\n"
+ || $is_valid
+ || $this->p_flags['in_event']
+ || (is_object($this->p_vars['last_word']) && $this->p_flags['in_item']))
+ {
+ $this->p_vars['list_item'][0]->add($word);
+ $this->resetStartList($start_list);
+ $this->p_flags['in_event'] = false;
+// debug('middle of list');
+ } else
+ {
+ if ($this->p_flags['in_item'])
+ {
+ $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]);
+ unset($this->p_vars['list_item'][0]);
+ $this->setContext('normal');
+ $this->p_flags['simplelist'] = false;
+ $this->addText($this->p_vars['lists'][0]);
+ unset($this->p_vars['lists']);
+ unset($this->p_vars['last_list']);
+ $this->wp->backuppos($word);
+ $this->p_vars['event_stack']->popEvent();
+ $this->p_flags['in_item'] = false;
+// debug('end of list 1');
+ return;
+ } else
+ {
+ $this->wp->backuppos($word);
+ $this->p_vars['event_stack']->popEvent();
+ $this->p_flags['in_item'] = false;
+// debug('not a list');
+ return;
+ }
+ }
+ } else
+ {
+ if ($this->p_vars['whitespace'] != substr($word,0,strpos($word, $start_list)))
+ { // if the whitespace is greater than that preceding the list
+ // delimiter, it's a multi-line list item
+ $this->setContext('normal');
+ $this->p_flags['simplelist'] = false;
+ $this->addText($this->p_vars['lists'][0]);
+ unset($this->p_vars['lists']);
+ $this->wp->backuppos($word);
+ $this->p_vars['event_stack']->popEvent();
+ unset($this->p_vars['last_list']);
+ $this->p_flags['in_item'] = false;
+// debug('end of list 2');
+ return;
+ } else
+ {
+ if ($this->p_flags['in_item'])
+ {
+ // end of a list item, add it to the list
+ $this->p_vars['lists'][0]->addItem($this->p_vars['list_item'][0]);
+ unset($this->p_vars['list_item'][0]);
+ }
+// debug('next list item');
+ $this->p_vars['list_item'][0] = new parserStringWithInlineTags;
+ $this->p_vars['list_item'][0]->add(ltrim(substr($ltrimword,strlen($start_list))));
+ $this->p_flags['in_item'] = true;
+ }
+ }
+ }
+ /**#@-*/
+ /**
+ * Get the next list marker
+ *
+ * In unordered lists, this will be something like "o", "-"
+ *
+ * In ordered lists, this will be either the number "3", "5" or "3.", "5."
+ * @return string text of the next list marker to look for
+ * @param string current word from the parser
+ * @access private
+ */
+ function getStartList($word)
+ {
+ // unordered, return the first marker found
+ if (!$this->p_flags['orderedlist']) return $this->p_vars['start_list'];
+ if (isset($this->p_vars['last_list']))
+ {
+ $this->p_vars['save_list'] = $this->p_vars['last_list'];
+ $next = $this->p_vars['last_list'];
+ // increment to next list number, convert to string
+ if (substr($this->p_vars['start_list'], strlen($this->p_vars['start_list']) - 1) == '.')
+ $next = (substr($next, 0, strpos($next,'.')) + 1) . '.';
+ else
+ $next = ($next + 1) . '';
+// debug("next is '$next'");
+ if ($this->p_vars['whitespace'] == substr($word,0,strpos($word, $next)))
+ return $this->p_vars['last_list'] = $next;
+ // the next number is not in this word, so return but don't save
+ return $next;
+ } else
+ {
+ $this->p_vars['last_list'] = $this->p_vars['start_list'];
+ return $this->p_vars['start_list'];
+ }
+ }
+
+ /**
+ * Set the next list marker to the current list marker
+ *
+ * In ordered lists, this will ensure that the next number returned is the
+ * right number
+ * @param string token for next list marker
+ * @access private
+ */
+ function resetStartList($start)
+ {
+ if (!isset($this->p_vars['save_list'])) return false;
+ $this->p_vars['last_list'] = $this->p_vars['save_list'];
+ }
+
+ /**#@+
+ * @access private
+ * @param string|parserInlineTag token from the ObjectWordParser
+ * @param integer parser event from {@link ParserDescCleanup.inc}
+ */
+ /**
+ * Handles <<ol>>,<<li>>,<<ul>>
+ *
+ * This allows parsing of lists nested to any level. Using
+ * the lists and list_item temporary variables and using
+ * list_count to control nesting, the method creates a {@link parserList}
+ * for each <<ol>> or <<ul>> tag, and a
+ * standard {@link parserStringWithInlineTags} for all the text, adding
+ * in nested lists as if they were inline tags (the conversion interface
+ * is the same for both object types)
+ */
+ function handleList($word, $pevent)
+ {
+ if (is_string($word) && $this->checkEventPush($word, $pevent))
+ {
+ return;
+ }
+ $ordered = false;
+ if (!is_object($this->p_vars['last_word']) && strtolower($this->p_vars['last_word']) == '<ol>')
+ {
+ // ordered list
+ $ordered = true;
+ }
+ // start a new list
+ if (!is_object($this->p_vars['last_word']) && (strtolower($this->p_vars['last_word']) == '<ol>' || strtolower($this->p_vars['last_word']) == '<ul>'))
+ {
+ $this->p_flags['in_item'] = false;
+ $this->setContext('list');
+ $this->p_vars['lists'][++$this->p_vars['list_count']] = new parserList($ordered);
+ }
+ if (!is_object($word) && strtolower($word) == '<li>')
+ {
+ if ($this->p_flags['in_item'])
+ {
+ // end of a list item (no end tag), add it to the list
+ $this->p_vars['lists'][$this->p_vars['list_count']]->addItem($this->p_vars['list_item'][$this->p_vars['list_count']]);
+ unset($this->p_vars['list_item'][$this->p_vars['list_count']]);
+ }
+ // start a new list item
+ $this->p_vars['list_item'][$this->p_vars['list_count']] = new parserStringWithInlineTags;
+ $this->p_flags['in_item'] = true;
+ } else
+ {
+ if (is_object($word) || (strtolower($word) != '</li>'))
+ {
+ if (is_object($word) || (strtolower($word) != '</ul>' && strtolower($word) != '</ol>'))
+ {
+ // item text
+ if (isset($this->p_vars['list_item'][$this->p_vars['list_count']]))
+ {
+ if (is_string($word) && $word == ' ' &&
+ $this->p_vars['last_word'] == ' ') return;
+ $this->p_vars['list_item'][$this->p_vars['list_count']]->add($word);
+ }
+ } else
+ {
+ if ($this->p_flags['in_item'])
+ {
+ // end the current list item before ending a list
+ $this->p_vars['lists'][$this->p_vars['list_count']]->addItem($this->p_vars['list_item'][$this->p_vars['list_count']]);
+ unset($this->p_vars['list_item'][$this->p_vars['list_count']]);
+ $this->p_flags['in_item'] = false;
+ }
+ if (is_string($word) && $this->checkEventPop($word, $pevent))
+ {
+ if ($this->p_vars['list_count'] > 1)
+ {
+ // this is a sublist, add it to the list item of the parent list
+ if (!isset($this->p_vars['list_item'][$this->p_vars['list_count'] - 1])) {
+ addErrorDie(PDERROR_UL_IN_UL);
+ }
+ $this->p_vars['list_item'][$this->p_vars['list_count'] - 1]->add($this->p_vars['lists'][$this->p_vars['list_count']]);
+ // remove the sublist item and sublist, drop to parent list
+ unset($this->p_vars['lists'][$this->p_vars['list_count']]);
+ unset($this->p_vars['lists'][$this->p_vars['list_count']]);
+ $this->p_vars['list_count']--;
+ $this->p_flags['in_item'] = true;
+ } else
+ {
+ // this is a primary list and it has concluded
+ $this->pars[$this->p_vars['curpar']]->add($this->p_vars['lists'][$this->p_vars['list_count']]);
+ unset($this->p_vars['lists']);
+ unset($this->p_vars['list_item']);
+ $this->p_vars['list_count'] = 0;
+ $this->dropContext();
+ }
+ }
+ }
+ } else
+ {
+ // check to make sure our list item is not unclosed
+ if (!$this->p_flags['in_item'])
+ {
+ addError(PDERROR_TEXT_OUTSIDE_LI);
+ } else
+ {
+ // end of a list item, add it to the list
+ $this->p_vars['lists'][$this->p_vars['list_count']]->addItem($this->p_vars['list_item'][$this->p_vars['list_count']]);
+ unset($this->p_vars['list_item'][$this->p_vars['list_count']]);
+ $this->p_flags['in_item'] = false;
+ }
+ }
+ }
+ }
+
+ /**
+ * Handles <<code>><</code>> blocks
+ */
+ function handleCode($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_code']))
+ {
+ $this->setContext('my_code');
+ $this->p_vars['my_code'] = new parserCode;
+ }
+ if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
+ if (is_object($word) || strtolower($word) != '</code>') $this->p_vars['my_code']->add($word);
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_code']);
+ unset($this->p_vars['my_code']);
+ }
+ }
+ }
+
+ /**
+ * Handles <<pre>><</pre>> blocks
+ */
+ function handlePre($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_pre']))
+ {
+ $this->setContext('my_pre');
+ $this->p_vars['my_pre'] = new parserPre;
+ }
+ if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
+ if (is_object($word) || strtolower($word) != '</pre>') $this->p_vars['my_pre']->add($word);
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_pre']);
+ unset($this->p_vars['my_pre']);
+ }
+ }
+ }
+
+ /**
+ * Handles <<b>><</b>> blocks
+ */
+ function handleB($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_b']))
+ {
+ $this->setContext('my_b');
+ $this->p_vars['my_b'] = new parserB;
+ }
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_b']);
+ unset($this->p_vars['my_b']);
+ } else
+ {
+ $this->p_vars['my_b']->add($word);
+ }
+ } else $this->p_vars['my_b']->add($word);
+ }
+
+ /**
+ * Handles <<i>><</i>> blocks
+ */
+ function handleI($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_i']))
+ {
+ $this->p_vars['my_i'] = new parserI;
+ $this->setContext('my_i');
+ }
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_i']);
+ unset($this->p_vars['my_i']);
+ } else
+ {
+ $this->p_vars['my_i']->add($word);
+ }
+ } else $this->p_vars['my_i']->add($word);
+ }
+
+ /**
+ * Handles <<var>><</var>> blocks
+ */
+ function handleVar($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_var']))
+ {
+ $this->setContext('my_var');
+ $this->p_vars['my_var'] = new parserDescVar;
+ }
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_var']);
+ unset($this->p_vars['my_var']);
+ } else
+ {
+ $this->p_vars['my_var']->add($word);
+ }
+ } else $this->p_vars['my_var']->add($word);
+ }
+
+ /**
+ * Handles <<samp>><</samp>> blocks
+ */
+ function handleSamp($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_samp']))
+ {
+ $this->setContext('my_samp');
+ $this->p_vars['my_samp'] = new parserSamp;
+ }
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_samp']);
+ unset($this->p_vars['my_samp']);
+ } else
+ {
+ $this->p_vars['my_samp']->add($word);
+ }
+ } else $this->p_vars['my_samp']->add($word);
+ }
+
+ /**
+ * Handles <<kbd>><</kbd>> blocks
+ */
+ function handleKbd($word, $pevent)
+ {
+ if (!isset($this->p_vars['my_kbd']))
+ {
+ $this->setContext('my_kbd');
+ $this->p_vars['my_kbd'] = new parserKbd;
+ }
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word,$pevent))
+ {
+ $this->dropContext();
+ $this->addText($this->p_vars['my_kbd']);
+ unset($this->p_vars['my_kbd']);
+ } else
+ {
+ $this->p_vars['my_kbd']->add($word);
+ }
+ } else $this->p_vars['my_kbd']->add($word);
+ }
+
+ /**
+ * Handles <<p>><</p>> blocks
+ *
+ * Note that the only time <<p>> will be interpreted as delimiting a
+ * paragraph is if it is the first thing in the description.
+ */
+ function handleP($word, $pevent)
+ {
+ if (!isset($this->parse_Ps)) $this->parse_Ps = false;
+ if (is_string($word))
+ {
+ if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
+ }
+ if (!$this->parse_Ps)
+ {
+ $this->p_vars['event_stack']->popEvent();
+ if (!is_object($word) && strtolower($this->p_vars['last_word']) == '<p>') $this->addText('<p>');
+ $this->addText($word);
+ return;
+ }
+ if (is_string($word) && $word == "\n") $word = " ";
+ if (is_string($word))
+ {
+ if ($this->checkEventPop($word, $pevent))
+ {
+ $this->p_vars['curpar']++;
+ return;
+ }
+ // if no closing tag, pretend there was one
+ if (!is_object($word) && strtolower($word) == '<p>' && $this->parse_Ps)
+ {
+ $this->p_vars['curpar']++;
+ return;
+ }
+ }
+ if ($this->p_vars['start'])
+ {
+ $this->addText($word);
+ } else
+ {// if the <p> is not at the beginning of the desc, then it is not
+ // possible to parse into paragraphs using this tag
+ if ($word === ' ' && $this->p_vars['last_word'] === ' ') return;
+ $this->addText($word);
+ }
+ }
+
+ /**
+ * Handles \n\n as a paragraph marker
+ * @uses doSimpleList()
+ */
+ function handleDoubleCR($word, $pevent)
+ {
+ $this->p_vars['event_stack']->popEvent();
+ if ($word == "\n")
+ {
+ // only use this if <p> isn't being used
+ if ((!isset($this->parse_Ps) || !$this->parse_Ps))
+ {
+ if ($this->p_vars['last_word'] == "\n")
+ {
+ $this->p_vars['curpar']++;
+ $this->parse_Ps = false;
+ } else
+ {
+ if (is_string($word) && !$this->checkEventPush($word, $pevent))
+ {
+ if ($word == ' ' && $this->p_vars['last_word'] == ' ') return;
+ $this->addText($word);
+ }
+ }
+ } else
+ {
+ if (is_string($word) && !$this->checkEventPush($word, $pevent))
+ {
+ if ($word == ' ' && $this->p_vars['last_word'] == ' ') return;
+ $this->addText($word);
+ }
+ }
+ } else
+ {
+ if ($this->p_vars['last_word'] == "\n")
+ {
+ if ((!isset($this->parse_Ps) || !$this->parse_Ps))
+ {
+ $this->addText(' ');
+ }
+ }
+ if (is_string($word) && !($e = $this->checkEventPush($word, $pevent)))
+ {
+ if ($word == ' ' && $this->p_vars['last_word'] == ' ') return;
+ if ($this->doSimpleList($word)) return;
+ $this->addText($word);
+ }
+ }
+ }
+
+ /**#@-*/
+ /**
+ * Return a simple list, if found
+ *
+ * This helper function extracts a simple list beginning with any of
+ * 'o','-'.'#','+','0','1','0.','1.' and starts parsing it.
+ * @param string line that may contain a simple list
+ * @return boolean true if a list is found, false otherwise
+ */
+ function doSimpleList($word)
+ {
+ if ($this->p_flags['in_event']) return true;
+ if (is_object($word)) return false;
+ $ltrimword = ltrim($word);
+ if ((strlen($ltrimword) != strlen($word))
+ && strlen($ltrimword) > 1
+ && ((in_array($ltrimword{0},array('o','-','1','0','#','+')) && $ltrimword{1} == ' '))
+ || ((strlen($ltrimword) >= 2) && (substr($ltrimword,0,2) === '1.' || substr($ltrimword,0,2) === '0.') && $ltrimword{2} == ' '))
+ {
+ // save the whitespace for comparison
+ $this->p_vars['whitespace'] = substr($word,0,strlen($word) - strlen($ltrimword));
+ $this->p_vars['start_list'] = $ltrimword{0};
+ if ($this->p_vars['start_list'] != '1' && $this->p_vars['start_list'] != '1.' &&
+ $this->p_vars['start_list'] != '0' && $this->p_vars['start_list'] != '0.')
+ {
+ $this->p_flags['orderedlist'] = false;
+ } else
+ {
+ if (substr($ltrimword,0,2) == '1.')
+ {
+ $this->p_vars['start_list'] = '1.';
+ }
+ $this->p_flags['orderedlist'] = true;
+ }
+ $this->p_vars['event_stack']->pushEvent(PHPDOCUMENTOR_PDP_EVENT_SIMLIST);
+ $this->setContext('list');
+ $this->p_flags['simplelist'] = true;
+ $this->p_vars['lists'][0] = new parserList($this->p_flags['orderedlist']);
+ $this->p_vars['list_count'] = 0;
+ $this->handleSimpleList($word, PHPDOCUMENTOR_PDP_EVENT_SIMLIST, true);
+ return true;
+ }
+ return false;
+ }
+ /**
+ * setup the parser tokens, and the pushEvent/popEvent arrays
+ * @see $tokens, $pushEvent, $popEvent
+ * @param boolean determines whether to allow paragraph parsing
+ * @global boolean used to determine whether to slow things down or not by
+ * eliminating whitespace from comments
+ */
+
+ function setupStates($sdesc)
+ {
+ $this->p_flags['in_item'] = false;
+ $this->p_flags['in_event'] = false;
+ $this->p_flags['simplelist'] = false;
+ $this->_context = array('normal');
+ $this->tokens[STATE_NOEVENTS] = array("\n", "<code>", "<pre>", "<ol>", "<ul>",
+ "<b>", "<i>", '<var>', '<kbd>', '<samp>', "<br", '<<');
+ if (!$sdesc)
+ {
+ $this->tokens[STATE_NOEVENTS][] = "<p>";
+ $this->tokens[STATE_NOEVENTS][] = "</p>";
+ }
+ if (PHPDOCUMENTOR_KILL_WHITESPACE) $this->tokens[STATE_NOEVENTS][] = ' ';
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_P] = array("</p>","<code>","<pre>","\n","<ol>","<ul>","<b>","<i>","<br","<p>", '<<',
+ '<var>', '<kbd>', '<samp>');
+ if (PHPDOCUMENTOR_KILL_WHITESPACE) $this->tokens[PHPDOCUMENTOR_PDP_STATE_P][] = ' ';
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_CODE] = array("</code>", '<</code>>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_PRE] = array("</pre>", '<</pre>>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_LIST] = array("<ul>","<ol>","</ul>","</ol>","<li>","</li>","<b>","<i>","<br", '<<',"<code>","<pre>","<br",
+ '<var>', '<kbd>', '<samp>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_DOUBLECR] = array("\n","<ol>","<ul>","<code>","<pre>","<b>","<i>","<br","<p>","</p>",
+ '<var>', '<kbd>', '<samp>', '<<');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_SIMLIST] = array("\n",'<var>', '<kbd>', '<samp>','<b>','<i>', '<pre>', '<code>',
+ '<br', '<<');
+
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_B] = array("<code>","\n","<pre>","<ol>","<ul>","</b>","<i>","<br", '<<',
+ '<var>', '<kbd>', '<samp>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_KBD] = array("<code>","\n","<pre>","<ol>","<ul>","<b>","<i>","<br", '<<',
+ '<var>', '</kbd>', '<samp>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_VAR] = array("<code>","\n","<pre>","<ol>","<ul>","<b>","<i>","<br", '<<',
+ '</var>', '<kbd>', '<samp>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_SAMP] = array("<code>","\n","<pre>","<ol>","<ul>","<b>","<i>","<br", '<<',
+ '<var>', '<kbd>', '</samp>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_I] = array("<code>","\n","<pre>","<ol>","<ul>","<b>","</i>","<br", '<<',
+ '<var>', '<kbd>', '<samp>');
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_BR] = array(">","/>");
+ $this->tokens[PHPDOCUMENTOR_PDP_STATE_ESCAPE] = array('code>>', '/code>>', 'pre>>', '/pre>>', 'b>>', '/b>>',
+ 'i>>', '/i>>', 'ol>>', '/ol>>', 'ul>>', '/ul>>', 'li>>', '/li>>',
+ 'br>>', 'br />>', 'p>>', '/p>>', 'samp>>', '/samp>>',
+ 'kbd>>', '/kbd>>', 'var>>', '/var>>');
+ if (PHPDOCUMENTOR_KILL_WHITESPACE) $this->tokens[PHPDOCUMENTOR_PDP_STATE_DOUBLECR][] = ' ';
+
+ // For each event word to event mapings
+ $this->pushEvent[PARSER_EVENT_NOEVENTS] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<p>" => PHPDOCUMENTOR_PDP_EVENT_P,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<b>" => PHPDOCUMENTOR_PDP_EVENT_B,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ "\n" => PHPDOCUMENTOR_PDP_EVENT_DOUBLECR,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_CODE] =
+ array(
+ '<</code>>' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_CODE] = array("</code>");
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_PRE] =
+ array(
+ '<</pre>>' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_PRE] = array("</pre>");
+##########################
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_BR] = array(">","/>");
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_P] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<b>" => PHPDOCUMENTOR_PDP_EVENT_B,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_P] = array("</p>");
+##########################
+
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_LIST] =
+ array(
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<b>" => PHPDOCUMENTOR_PDP_EVENT_B,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_LIST] = array("</ul>","</ol>");
+##########################
+
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_SIMLIST] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<p>" => PHPDOCUMENTOR_PDP_EVENT_P,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<b>" => PHPDOCUMENTOR_PDP_EVENT_B,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+##########################
+
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_DOUBLECR] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<b>" => PHPDOCUMENTOR_PDP_EVENT_B,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ "<p>" => PHPDOCUMENTOR_PDP_EVENT_P,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_B] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<i>' => PHPDOCUMENTOR_PDP_EVENT_I,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_B] = array("</b>");
+
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_I] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<b>' => PHPDOCUMENTOR_PDP_EVENT_B,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_I] = array("</i>");
+
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_VAR] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<b>' => PHPDOCUMENTOR_PDP_EVENT_B,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_VAR] = array("</var>");
+
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_SAMP] =
+ array(
+ "<code>" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<pre>" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<kbd>" => PHPDOCUMENTOR_PDP_EVENT_KBD,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<b>' => PHPDOCUMENTOR_PDP_EVENT_B,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_SAMP] = array("</samp>");
+
+##########################
+ $this->pushEvent[PHPDOCUMENTOR_PDP_EVENT_KBD] =
+ array(
+ "<code" => PHPDOCUMENTOR_PDP_EVENT_CODE,
+ "<ol>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<ul>" => PHPDOCUMENTOR_PDP_EVENT_LIST,
+ "<pre" => PHPDOCUMENTOR_PDP_EVENT_PRE,
+ "<var>" => PHPDOCUMENTOR_PDP_EVENT_VAR,
+ "<samp>" => PHPDOCUMENTOR_PDP_EVENT_SAMP,
+ "<i>" => PHPDOCUMENTOR_PDP_EVENT_I,
+ "<br" => PHPDOCUMENTOR_PDP_EVENT_BR,
+ '<b>' => PHPDOCUMENTOR_PDP_EVENT_B,
+ '<<' => PHPDOCUMENTOR_PDP_EVENT_ESCAPE,
+ );
+
+ $this->popEvent[PHPDOCUMENTOR_PDP_EVENT_KBD] = array("</kbd>");
+ }
+
+ function getParserEventName ($value)
+ {
+ $lookup = array(
+ PARSER_EVENT_NOEVENTS => "PARSER_EVENT_NOEVENTS",
+ PHPDOCUMENTOR_PDP_EVENT_CODE => "PHPDOCUMENTOR_PDP_EVENT_CODE",
+ PHPDOCUMENTOR_PDP_EVENT_P => "PHPDOCUMENTOR_PDP_EVENT_P",
+ PHPDOCUMENTOR_PDP_EVENT_B => "PHPDOCUMENTOR_PDP_EVENT_B",
+ PHPDOCUMENTOR_PDP_EVENT_I => "PHPDOCUMENTOR_PDP_EVENT_I",
+ PHPDOCUMENTOR_PDP_EVENT_BR => "PHPDOCUMENTOR_PDP_EVENT_BR",
+ PHPDOCUMENTOR_PDP_EVENT_VAR => "PHPDOCUMENTOR_PDP_EVENT_VAR",
+ PHPDOCUMENTOR_PDP_EVENT_SAMP => "PHPDOCUMENTOR_PDP_EVENT_SAMP",
+ PHPDOCUMENTOR_PDP_EVENT_KBD => "PHPDOCUMENTOR_PDP_EVENT_KBD",
+ PHPDOCUMENTOR_PDP_EVENT_ESCAPE => "PHPDOCUMENTOR_PDP_EVENT_ESCAPE",
+ PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE => "PHPDOCUMENTOR_PDP_EVENT_ESCAPE_CODE",
+ PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE => "PHPDOCUMENTOR_PDP_EVENT_ESCAPE_PRE",
+ PHPDOCUMENTOR_PDP_EVENT_DOUBLECR => "PHPDOCUMENTOR_PDP_EVENT_DOUBLECR",
+ PHPDOCUMENTOR_PDP_EVENT_LIST => "PHPDOCUMENTOR_PDP_EVENT_LIST",
+ PHPDOCUMENTOR_PDP_EVENT_PRE => "PHPDOCUMENTOR_PDP_EVENT_PRE",
+ PHPDOCUMENTOR_PDP_EVENT_SIMLIST => "PHPDOCUMENTOR_PDP_EVENT_SIMLIST",
+ );
+ if (isset($lookup[$value]))
+ return $lookup[$value];
+ else return $value;
+ }
+}
+
+?>