Blame | Letzte Änderung | Log anzeigen | RSS feed
<?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 unchangedif (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 arraylist($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 cyclereturn "";}$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 oneif ($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 <p> 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 foundif (!$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 stringif (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 savereturn $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 listif (!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 textif (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 listif (!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 listunset($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 unclosedif (!$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 oneif (!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 tagif ($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 usedif ((!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;}}?>