Source for file ParserDescCleanup.inc
Documentation is available at ParserDescCleanup.inc
* 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
* Copyright (c) 2002-2006 Gregory Beaver
* 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
* 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
* @copyright 2002-2006 Gregory Beaver
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @version CVS: $Id: ParserDescCleanup.inc,v 1.9 2006/05/23 13:06:57 cellog Exp $
* @link http://www.phpdoc.org
* @link http://pear.php.net/PhpDocumentor
* @see Parser, WordParser
* {@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
define('PHPDOCUMENTOR_PDP_EVENT_SIMLIST',614);
/** when a simple list is found in a desc
define('PHPDOCUMENTOR_PDP_STATE_SIMLIST',714);
* Like WordParser but designed to handle an array with strings and
* {@link parserInlineTag}s
* @subpackage WordParsers
* Determines whether text searching is case-sensitive or not
var $_casesensitive = false;
$this->_casesensitive = $casesensitive;
* Set the word parser to go.
* @param array {@link parserStringWithInlineTags::$value} style-array, with
* alternating text and inline tags
// if (is_string($input[0])) $input[0] = ltrim($input[0]);
list ($this->index,) = each($this->data);
$this->size = strlen($this->data[$this->index]);
//$this->word = WORD_PARSER_RET_WORD;
if (!isset ($this->data[$this->index])) return false;
// return any inline tags unchanged
list ($this->index,) = each($this->data);
$this->size = strlen($this->data[$this->index]);
return $this->data[$index];
if ($this->size == $this->pos)
// cycle to next line in the array
list ($this->index,) = each($this->data);
if (!$this->index) return false;
$this->size = strlen($this->data[$this->index]);
//$this->wordseperators = array();
foreach($this->wordseperators as $sep)
if (isset ($this->cache[$sep]))
$tpos = $this->cache[$sep];
if ($tpos < $this->pos || !is_int($tpos))
if ($this->_casesensitive)
$tpos = strpos($this->data[$this->index],$sep,$this->pos);
if ( ($tpos < $npos) && !($tpos === false))
//echo trim($sep) . "=$tpos\n";
else if (!($tpos === false))
$this->cache[$sep] = $tpos;
$len = $npos - $this->pos;
$word = substr($this->data[$this->index],$this->pos,$len);
// Change random other os newlines to the unix one
if ($word == "\r" || $word == "\r\n")
if ($this->linenumpos <= $this->pos)
$this->linenumpos = $this->pos + $len;
$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)
//$this->time3 = $this->time3 + ($this->mtime() - $st3);
//$this->time = $this->time + ($this->mtime() - $st);
* Determine if the next word is an inline tag
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
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',
* Determines whether parsing of <p> tags will occur, or double CR will
* 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 $_context = array('normal');
* sets $wp to be a {@link ObjectWordParser}
* $wp is the word parser that retrieves tokens
function parserDescParser()
* 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')
global $_phpDocumentor_setting;
$this->p_vars['indtype'] = $ind_type;
$this->setupStates($sdesc);
if (isset ($_phpDocumentor_setting['javadocdesc']) && $_phpDocumentor_setting['javadocdesc'] == 'on')
// initialize variables so E_ALL error_reporting doesn't complain
$this->p_vars['curpar'] = 0;
$this->p_vars['start'] = true;
$this->wp->setup($parse_data,$sdesc);
$this->wp->setWhitespace(true);
$this->p_vars['list_count'] = 0;
if ($sdesc) $this->p_vars['start'] = false;
if (!isset ($this->pars[$this->p_vars['curpar']])) $this->pars[$this->p_vars['curpar']] = new $ind_type;
$pevent = $this->p_vars['event_stack']->getEvent();
$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 (0)//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";
if (isset ($this->eventHandlers[$pevent]))
$handle = $this->eventHandlers[$pevent];
if ($word !== false) $this->$handle($word, $pevent);
if (!count($this->pars[$this->p_vars['curpar']]->value)) unset ($this->pars[$this->p_vars['curpar']]);
debug('WARNING: possible error, no ParserDescParser handler for event number '. $pevent);
die("FATAL ERROR, recursion limit reached");
$this->p_vars['start'] = false;
} 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]);
$this->publishEvent(2,$this->pars);
$this->publishEvent(1,$this->pars);
/**#@+ @access private */
* 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
* It also removes extra whitespace
function defaultHandler($word, $pevent)
$context = $this->getContext();
if ($context != 'normal') $this->setContext('normal');
if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
// if (!isset($this->parse_Ps) || !$this->parse_Ps)
($word == ' ' && $this->p_vars['last_word'] == ' ')) return;
if ($this->doSimpleList($word)) return;
* Retrieve the current top-level tag to add text into
* Pop a context off of the context stack
if (count($this->_context) == 0)
$this->_context = array('normal');
* @param string context name
function setContext($context)
* add input as text to the current paragraph or list
* @param string|parserInlineTag
$context = $this->getContext();
// debug('aded to '.$context);
if (!is_object($this->p_vars['list_item'][$this->p_vars['list_count']])) {
$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);
// 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);
* @param string|parserInlineTagtoken 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();
$this->wp->backupPos($word. $word);
$this->wp->backupPos($word);
* Just like {@link handleEscape}, except the only valid escape is
function handleEscapePre($word, $pevent)
$this->p_vars['event_stack']->popEvent();
$this->addText('</pre>');
* Just like {@link handleEscape}, except the only valid escape is
function handleEscapeCode($word, $pevent)
$this->p_vars['event_stack']->popEvent();
$this->addText('</code>');
* Add a new {@link parserBr}
function handleBr($word, $pevent)
if (is_string($word) && $this->checkEventPop($word, $pevent))
* phpEdit has an ingenious facility to handle simple lists used in a
* 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);
if (is_string($word) && $this->checkEventPush($word, $pevent))
$this->p_flags['in_event'] = true;
if ($this->wp->nextIsObjectOrNonNL())
if ($word == "\n" && is_string($this->p_vars['last_word'])
&& $this->p_vars['last_word']{strlen($this->p_vars['last_word']) - 1}
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');
$this->wp->backuppos($word);
$this->p_vars['event_stack']->popEvent();
$this->p_flags['in_item'] = false;
// debug('not a list 2');
$start_list = $this->getStartList($word);
|| $this->p_flags['in_event'] || is_object($this->p_vars['last_word']))
|| $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');
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');
$this->wp->backuppos($word);
$this->p_vars['event_stack']->popEvent();
$this->p_flags['in_item'] = false;
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');
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_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
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 = ($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
$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
* @param string token for next list marker
function resetStartList($start)
if (!isset ($this->p_vars['save_list'])) return false;
$this->p_vars['last_list'] = $this->p_vars['save_list'];
* @param string|parserInlineTagtoken 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))
if (!is_object($this->p_vars['last_word']) && strtolower($this->p_vars['last_word']) == '<ol>')
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 ($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']]);
$this->p_flags['in_item'] = true;
if (isset ($this->p_vars['list_item'][$this->p_vars['list_count']]))
$this->p_vars['last_word'] == ' ') return;
$this->p_vars['list_item'][$this->p_vars['list_count']]->add($word);
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])) {
$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;
// 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;
// check to make sure our list item is not unclosed
if (!$this->p_flags['in_item'])
// 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');
if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
if ($this->checkEventPop($word,$pevent))
$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');
if (is_string($word) && $this->checkEventPush($word, $pevent)) return;
if ($this->checkEventPop($word,$pevent))
$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 ($this->checkEventPop($word,$pevent))
$this->addText($this->p_vars['my_b']);
unset ($this->p_vars['my_b']);
$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 ($this->checkEventPop($word,$pevent))
$this->addText($this->p_vars['my_i']);
unset ($this->p_vars['my_i']);
$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');
if ($this->checkEventPop($word,$pevent))
$this->addText($this->p_vars['my_var']);
unset ($this->p_vars['my_var']);
$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');
if ($this->checkEventPop($word,$pevent))
$this->addText($this->p_vars['my_samp']);
unset ($this->p_vars['my_samp']);
$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');
if ($this->checkEventPop($word,$pevent))
$this->addText($this->p_vars['my_kbd']);
unset ($this->p_vars['my_kbd']);
$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) && $this->checkEventPush($word, $pevent)) return;
$this->p_vars['event_stack']->popEvent();
if (!is_object($word) && strtolower($this->p_vars['last_word']) == '<p>') $this->addText('<p>');
if (is_string($word) && $word == "\n") $word = " ";
if ($this->checkEventPop($word, $pevent))
$this->p_vars['curpar']++ ;
// if no closing tag, pretend there was one
$this->p_vars['curpar']++ ;
if ($this->p_vars['start'])
{// if the <p> is not at the beginning of the desc, then it is not
// possible to parse into paragraphs using this tag
if (is_string($word) && $word == ' ' && $this->p_vars['last_word'] == ' ') return;
* Handles \n\n as a paragraph marker
function handleDoubleCR($word, $pevent)
$this->p_vars['event_stack']->popEvent();
// 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']++ ;
if (is_string($word) && !$this->checkEventPush($word, $pevent))
if ($word == ' ' && $this->p_vars['last_word'] == ' ') return;
if (is_string($word) && !$this->checkEventPush($word, $pevent))
if ($word == ' ' && $this->p_vars['last_word'] == ' ') return;
if ($this->p_vars['last_word'] == "\n")
if ((!isset ($this->parse_Ps) || !$this->parse_Ps))
if (is_string($word) && !($e = $this->checkEventPush($word, $pevent)))
if ($word == ' ' && $this->p_vars['last_word'] == ' ') return;
if ($this->doSimpleList($word)) return;
* 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;
$ltrimword = ltrim($word);
&& ((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['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;
if (substr($ltrimword,0,2) == '1.')
$this->p_vars['start_list'] = '1.';
$this->p_flags['orderedlist'] = true;
$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;
* 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 (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>');
$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>', '<<');
'<var>', '<kbd>', '<samp>');
'<var>', '</kbd>', '<samp>');
'</var>', '<kbd>', '<samp>');
'<var>', '<kbd>', '</samp>');
'<var>', '<kbd>', '<samp>');
'i>>', '/i>>', 'ol>>', '/ol>>', 'ul>>', '/ul>>', 'li>>', '/li>>',
'br>>', 'br />>', 'p>>', '/p>>', 'samp>>', '/samp>>',
'kbd>>', '/kbd>>', 'var>>', '/var>>');
// For each event word to event mapings
##########################
##########################
##########################
##########################
##########################
##########################
##########################
##########################
##########################
##########################
##########################
##########################
function getParserEventName ($value)
if (isset ($lookup[$value]))
|