Source for file HighlightParser.inc
Documentation is available at HighlightParser.inc
 * Source Code Highlighting  
 * The classes in this file are responsible for the dynamic @example, @filesource  
 * and {@}source} tags output.  Using the phpDocumentor_HighlightWordParser,  
 * the phpDocumentor_HighlightParser retrieves PHP tokens one by one from the  
 * array generated by {@link phpDocumentorTWordParser} source retrieval functions  
 * and then highlights them individually.  
 * It accomplishes this highlighting through the assistance of methods in  
 * the output Converter passed to its parse() method, and then returns the  
 * fully highlighted source as a string  
 * phpDocumentor :: automatic documentation generator  
 * Copyright (c) 2002-2008 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  
 * @category   ToolsAndUtilities  
 * @copyright  2002-2008 Gregory Beaver  
 * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL  
 * @version    CVS: $Id: HighlightParser.inc 253641 2008-02-24 02:35:44Z ashnazg $  
 * @link       http://www.phpdoc.org  
 * @link       http://pear.php.net/PhpDocumentor  
 * @tutorial   tags.example.pkg, tags.filesource.pkg, tags.inlinesource.pkg  
 * @todo       CS cleanup - change package to PhpDocumentor  
 * Retrieve tokens from an array of tokens organized by line numbers  
 * @category   ToolsAndUtilities  
 * @copyright  2002-2008 Gregory Beaver  
 * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL  
 * @version    Release: @VER@  
 * @link       http://www.phpdoc.org  
 * @link       http://pear.php.net/PhpDocumentor  
 * @todo       CS cleanup - change package to PhpDocumentor  
 * @todo       CS cleanup - change class name to PhpDocumentor_*  
     * Hash used to keep track of line numbers that have already been initialized  
    var $_listLineNums = 
array();  
     * Initialize the parser object  
     * @param array                         &$input  the input  
     * @param phpDocumentor_HighlightParser &$parser the parser  
    function setup(&$input, &$parser)  
        $this->_parser     = 
&$parser;  
        $linenum = 
$this->linenum;  
        if (!isset
($this->_all[$this->linenum][$this->pos])) {  
        $token   = 
$this->_all[$linenum][$pos];  
        debug('Next Token ' . 
$this->linenum . 
'-' . 
$this->pos . 
':' . 
$details);  
     * Retrieve the position of the next token that will be parsed  
     * in the internal token array  
     * @return array format: array(line number, position)  
        $linenum = 
$this->linenum;  
        if (!isset
($this->_all[$this->linenum][$this->pos])) {  
        if (!isset
($this->_all[$linenum][$pos])) {  
        return array($linenum, $pos);  
     * Retrieve the next token  
     * @return array|stringeither array(PHP token constant, token) or string  
        if (!isset
($this->_all[$this->linenum][$this->pos])) {  
            if (!isset
($this->_all[$this->linenum])) {  
            $this->_parser->newLineNum();  
        $word = 
$this->_all[$this->linenum][$this->pos++
];  
     * back the word parser to the previous token as defined by $last_token  
     * @param array|string$last_token token, or output from {@link nextToken()}  
     * @param bool         $is_pos     if true, backupPos interprets $last_token  
     *                                  to be the position in the internal token  
     *                                  array of the last token  
    function backupPos($last_token, $is_pos = 
false)  
            $this->linenum = 
$last_token[0];  
            $this->pos     = 
$last_token[1];  
        if ($last_token === 
false) {  
        //fancy_debug('before', $this->linenum, $this->pos,   
        //    token_name($this->_all[$this->linenum][$this->pos][0]),  
        //    htmlentities($this->_all[$this->linenum][$this->pos][1]),  
        //    $this->_all[$this->linenum]);  
                if ($this->linenum < 
0) {  
                $this->pos = 
count($this->_all[$this->linenum]) - 
1;  
            $this->_all[$this->linenum][$this->pos])));  
        //fancy_debug('after', $this->linenum, $this->pos,  
        //    token_name($this->_all[$this->linenum][$this->pos][0]),  
        //    htmlentities($this->_all[$this->linenum][$this->pos][1]));  
 * Highlights source code using {@link parse()}  
 * @category   ToolsAndUtilities  
 * @copyright  2002-2008 Gregory Beaver  
 * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL  
 * @version    Release: @VER@  
 * @link       http://www.phpdoc.org  
 * @link       http://pear.php.net/PhpDocumentor  
 * @todo       CS cleanup - change package to PhpDocumentor  
 * @todo       CS cleanup - change class name to PhpDocumentor_*  
     * Highlighted source is built up in this string  
     * contents of the current source code line as it is parsed  
     * Used to retrieve highlighted tokens  
     * @var Converter a descendant of Converter  
     * Path to file being highlighted, if this is from a @filesource tag  
     * @var false|stringfull path  
        PARSER_EVENT_ARRAY                      => 
'defaultHandler',  
        PARSER_EVENT_CLASS                      => 
'handleClass',  
        PARSER_EVENT_COMMENT                    => 
'handleComment',  
        PARSER_EVENT_DOCBLOCK_TEMPLATE          => 
'handleDocBlockTemplate',  
        PARSER_EVENT_END_DOCBLOCK_TEMPLATE      => 
'handleEndDocBlockTemplate',  
        PARSER_EVENT_LOGICBLOCK                 => 
'handleLogicBlock',  
        PARSER_EVENT_METHOD_LOGICBLOCK          => 
'handleMethodLogicBlock',  
        PARSER_EVENT_NOEVENTS                   => 
'defaultHandler',  
        PARSER_EVENT_OUTPHP                     => 
'defaultHandler',  
        PARSER_EVENT_CLASS_MEMBER               => 
'handleClassMember',  
        PARSER_EVENT_DEFINE                     => 
'defaultHandler',  
        PARSER_EVENT_DEFINE_PARAMS              => 
'defaultHandler',  
        PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS  => 
'defaultHandler',  
        PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS => 
'defaultHandler',  
        PARSER_EVENT_DOCBLOCK                   => 
'handleDocBlock',  
        PARSER_EVENT_TAGS                       => 
'handleTags',  
        PARSER_EVENT_DESC                       => 
'handleDesc',  
        PARSER_EVENT_DOCKEYWORD                 => 
'handleTag',  
        PARSER_EVENT_DOCKEYWORD_EMAIL           => 
'handleDockeywordEmail',  
        PARSER_EVENT_EOFQUOTE                   => 
'handleQuote',  
        PARSER_EVENT_FUNCTION                   => 
'handleFunction',  
        PARSER_EVENT_METHOD                     => 
'handleMethod',  
        PARSER_EVENT_FUNCTION_PARAMS            => 
'handleFunctionParams',  
        PARSER_EVENT_FUNC_GLOBAL                => 
'handleFuncGlobal',  
        PARSER_EVENT_INLINE_DOCKEYWORD          => 
'handleInlineDockeyword',  
        PARSER_EVENT_INCLUDE                    => 
'defaultHandler',  
        PARSER_EVENT_INCLUDE_PARAMS             => 
'defaultHandler',  
        PARSER_EVENT_QUOTE                      => 
'handleQuote',  
        PARSER_EVENT_QUOTE_VAR                  => 
'handleQuoteVar',  
        PARSER_EVENT_PHPCODE                    => 
'handlePhpCode',  
        PARSER_EVENT_SINGLEQUOTE                => 
'handleSingleQuote',  
        PARSER_EVENT_STATIC_VAR                 => 
'defaultHandler',  
        PARSER_EVENT_STATIC_VAR_VALUE           => 
'defaultHandler',  
        PARSER_EVENT_VAR                        => 
'handleVar',  
     * event handlers for @tags  
    var $tagHandlers = 
array(  
        '*'              => 
'defaultTagHandler',  
        'abstract'       => 
'coreTagHandler',  
        'access'         => 
'coreTagHandler',  
        'author'         => 
'coreTagHandler',  
        'category'       => 
'coreTagHandler',  
        'copyright'      => 
'coreTagHandler',  
        'deprecated'     => 
'coreTagHandler',  
        'example'        => 
'coreTagHandler',  
        'filesource'     => 
'coreTagHandler',  
        'final'          => 
'coreTagHandler',  
        'global'         => 
'globalTagHandler',  
        'ignore'         => 
'coreTagHandler',  
        'license'        => 
'coreTagHandler',  
        'link'           => 
'coreTagHandler',  
        'name'           => 
'coreTagHandler',  
        'package'        => 
'coreTagHandler',  
        'param'          => 
'paramTagHandler',  
        'parameter'      => 
'paramTagHandler',  
        'see'            => 
'coreTagHandler',  
        'since'          => 
'coreTagHandler',  
        'subpackage'     => 
'coreTagHandler',  
        'internal'       => 
'coreTagHandler',  
        'return'         => 
'returnTagHandler',  
        'static'         => 
'coreTagHandler',  
        'staticvar'      => 
'staticvarTagHandler',  
        'throws'         => 
'coreTagHandler',  
        'todo'           => 
'coreTagHandler',  
        'tutorial'       => 
'coreTagHandler',  
        'uses'           => 
'coreTagHandler',  
        'var'            => 
'varTagHandler',  
        'version'        => 
'coreTagHandler',  
        'property'       => 
'propertyTagHandler',  
        'property-read'  => 
'propertyTagHandler',  
        'property-write' => 
'propertyTagHandler',  
        'method'         => 
'propertyTagHandler'  
     * wraps the current line (via the converter) and resets it to empty  
     * @uses Converter::SourceLine() encloses {@link $_line} in a  
     *                                converter-specific format  
        if ($this->_pf_no_output_yet) {  
        $this->_line   .= 
$this->_converter->flushHighlightCache();  
        $this->_output .= 
$this->_converter->SourceLine($this->_wp->linenum,  
            $this->_line, $this->_path);  
     * Start the parsing at a certain line number  
     * @param int $num line number  
        $this->_wp->linenum = 
$num;  
     * The parse() method is a do...while() loop that retrieves tokens one by  
     * one from the {@link $_event_stack}, and uses the token event array set up  
     * by the class constructor to call event handlers.  
     * The event handlers each process the tokens passed to them, and use the  
     * {@link _addoutput()} method to append the processed tokens to the  
     * {@link $_line} variable.  The word parser calls {@link newLineNum()}  
     * every time a line is reached.  
     * In addition, the event handlers use special linking functions  
     * {@link _link()} and its cousins (_classlink(), etc.) to create in-code  
     * hyperlinks to the documentation for source code elements that are in the  
     * @param array         &$parse_data       the parse data  
     * @param Converter     &$converter        the converter object  
     * @param bool          $inlinesourceparse whether this data is from an  
     * @param string|false $class             if a string, it is the name of the  
     *                                          class whose method we are parsing  
     *                                          containing a {@}source} tag  
     * @param false|integer$linenum           starting line number from  
     * @param false|string $filesourcepath    full path to file with @filesource  
     *                                          tag, if this is a @filesource parse  
     * @staticvar int used for recursion limiting if a handler for  
     * @uses setupStates() initialize parser state variables  
     * @uses configWordParser() pass $parse_data to prepare retrieval of tokens  
     * @todo CS cleanup - rename tokenizer_ext constant to uppercase  
    function parse (&$parse_data, &$converter, $inlinesourceparse = 
false,  
        $class = 
false, $linenum = 
false, $filesourcepath = 
false)  
                $parse_data = 
join($parse_data, '');  
            $parse_data    = 
explode("\n", $parse_data);  
            foreach ($parse_data as $linenum => 
$line) {  
                    $this->_output .= 
$converter->SourceLine($linenum,  
            return $converter->PreserveWhiteSpace($this->_output);  
        $this->_converter = 
&$converter;  
        $converter->startHighlight();  
        $this->_path = 
$filesourcepath;  
        if ($linenum !== 
false) {  
        // initialize variables so E_ALL error_reporting doesn't complain  
            $pevent  = 
$this->_event_stack->getEvent();  
            if ($lpevent != 
$pevent) {  
                $this->_last_pevent = 
$lpevent;  
                $this->_wp->setWhitespace(true);  
                $this->_wp->setWhitespace(false);  
            if (is_array($word) && 
$word[0] != 
T_WHITESPACE) {  
            $dbg_linenum = 
$this->_wp->linenum;  
            $dbg_pos     = 
$this->_wp->getPos();  
            $word        = 
$this->_wp->getWord();  
            if (is_array($word) && 
($word[0] == 
T_WHITESPACE || 
  
                $word[0] == 
T_COMMENT) && 
  
                //debug("added " . $this->_wp->linenum . '-' . $this->_wp->pos);  
                $this->_addoutput($word);  
                $this->_pv_last_word = 
$lw;  
                $this->_pv_last_next_word = 
$this->_pv_next_word;  
                $this->_pv_next_word      = 
$this->_wp->nextToken();  
            // in wordparser, have to keep track of lines  
            //$this->publishEvent(PHPDOCUMENTOR_EVENT_NEWLINENUM,   
            if (PHPDOCUMENTOR_DEBUG == 
true) {  
                    echo 
"|" . 
$this->_pv_last_word; 
                //echo "LINE: "   . $this->_line   . "\n";  
                //echo "OUTPUT: " . $this->_output . "\n";  
                echo 
$dbg_linenum . 
'-' . 
$dbg_pos . 
": "; 
                $this->_wp->printState();  
                $tok1 = 
$this->_pv_next_word;  
                $tok  = 
$this->_wp->_all[$tok1[0]][$tok1[1]];  
                    echo 
token_name($tok[0]) . 
' => ' . 
$tok1[0] . 
'-' . 
$tok1[1] .
 
                echo 
"-------------------\n\n\n"; 
                $this->$handle($word, $pevent);  
            } elseif ($word !== 
false) {  
                debug('WARNING: possible error, no handler for event number '  
                    die("FATAL ERROR, recursion limit reached");  
        } while (!($word === 
false));  
     * All Event Handlers use {@link checkEventPush()} and  
     * {@link checkEventPop()} to set up the event stack and parser state.  
     * @param string|array $word   token value  
     * @param int          $pevent parser event from {@link Parser.inc}  
     * Most tokens only need highlighting, and this method handles them  
    function defaultHandler($word, $pevent)  
        $this->_addoutput($word);  
     * Handles global declarations in a function, like:  
     *     global $_phpDocumentor_setting;  
     * @uses _globallink() instead of _addoutput(), to link to global variables  
     *        if they are used in a function  
    function handleFuncGlobal($word, $pevent)  
        $this->_globallink($word);  
     * Handles strings in quotation marks and heredoc  
     * Special handling is needed for strings that contain variables like:  
     * <code>$a = "$test string"</code>  
     * The tokenizer parses out tokens '"',array(T_VARIABLE,'$test'),' string',  
     * and '"'.  Since it is possible to have $this->classvar in a string,  
     * we save a variable name just in case the next token is -> to allow linking  
     * to class members.  Otherwise, the string is simply highlighted.  
     * constant strings (with no $variables in them) are passed as a single  
     * entity, and so will be saved in the last token parsed.  This means the  
     * event handler must tell the word parser to re-retrieve the current token  
     * so that the correct event handler can process it.  
    function handleQuote($word, $pevent)  
        if ($this->_pf_inmethod && 
is_array($word) && 
$word[0] == 
T_VARIABLE) {  
            $this->_pv_lastvar = 
$word;  
            $this->_addoutput($word);  
        if ($this->_pf_quote_active &&
  
            (($this->_pv_last_word == 
'"' && 
  
            $this->_pv_last_word[0] == 
T_END_HEREDOC &&
  
            $this->_pf_quote_active = 
false;  
            $this->_wp->backupPos($word);  
            $this->_event_stack->popEvent();  
        if (!$this->_pf_quote_active && 
  
            (($this->_pv_last_word == 
'"' && 
  
            $this->_pv_last_word[0] == 
T_END_HEREDOC &&
  
            if (is_array($word) && 
$word[0] == 
T_VARIABLE) {  
                $this->_pv_lastvar = 
$word;  
            $this->_pf_quote_active      = 
true;  
            $this->_save_highlight_state = 
$this->_converter->getHighlightState();  
            $this->_converter->startHighlight();  
            $this->_addoutput($word);  
        } elseif (is_array($this->_pv_last_word) && 
  
            $this->_pv_last_word[0] == 
T_CONSTANT_ENCAPSED_STRING  
            //$this->_pv_quote_data = $this->_pv_last_word[1];  
            $this->_event_stack->popEvent();  
            $this->_wp->backupPos($word);  
            $this->_pf_quote_active = 
false;  
        $this->_addoutput($word);  
     * Handles {$variable} within a "quote"  
     * This is a simple handler, for a very complex  
     * array of legal syntax.  It is legal to nest control structures  
     * inside the {}, and other weird stuff.  
    function handleQuoteVar($word, $pevent)  
            $this->_pf_quote_active = 
true;  
            $this->_addoutput($word);  
        if ($this->_pf_inmethod && 
is_array($word) && 
$word[0] == 
T_VARIABLE) {  
            $this->_pv_lastvar = 
$word;  
            $this->_pf_quote_active = 
false;  
            if (is_string($word) && 
($word == 
'{' || 
$word == 
'"' || 
$word == 
"'")  
                $this->_pf_quote_active = 
true;  
                $this->_pv_lastvar      = 
false;  
        $this->_addoutput($word);  
     * Handles define() statements  
     * The only thing this handler cares about is retrieving the name of the  
     * define variable, and the end of the define statement, so after the name  
     * is found, it simply makes sure parentheses are matched as in this case:  
     * define("test",array("hello",6 => 4, 5 => array('there')));  
     * This handler and the DEFINE_PARAMS_PARENTHESIS handler (which is just  
     * {@link defaultHandler()} in this version, as nothing fancy is needed)  
     * work together to ensure proper parenthesis matching.  
     * If the define variable is documented, a link will be created to its  
     * documentation using the Converter passed.  
    function handleDefine($word, $pevent)  
        if (!isset
($token_save)) {  
        if (!isset
($this->_pv_define_params_data)) {  
            $this->_pv_define_params_data = 
'';  
            $this->_addoutput($word);  
        if ($this->_pf_definename_isset) {  
            $this->_addoutput($word);  
                $this->_pv_define_params_data .= 
$word;  
                if (substr($this->_pv_define_params_data, 0, 1) ==
  
                    substr($this->_pv_define_params_data,  
                        strlen($this->_pv_define_params_data) - 
1) &&
  
                    // remove leading and ending quotation marks   
                    $a = 
substr($this->_pv_define_params_data, 0, 1);  
                    $b = 
substr($this->_pv_define_params_data, 1,   
                        strlen($this->_pv_define_params_data) - 
2);  
                    if (strpos($b, $a) === 
false) {  
                        $this->_pv_define_params_data = 
$b;  
                $this->_pf_definename_isset = 
true;  
                $link = 
$this->_converter->getLink($this->_pv_define_params_data);  
                foreach ($token_save as $token) {  
                        $this->_addoutput($this->_converter->returnSee($link,  
                        $this->_addoutput($save, $token);  
                $this->_pv_define_params_data = 
'';  
     * Handles normal global code.  Special consideration is taken for DocBlocks  
     * as they need to retrieve the whole DocBlock before doing any output, so  
     * the parser flag {@link $_pf_no_output_yet} is set to tell  
     * {@link _addoutput()} not to spit anything out yet.  
     * @uses _link() make any global code that is a documentable element link  
     *        to the php manual or its documentation  
    function handlePhpCode($word, $pevent)  
            if (substr($word[1], 0, 2) == 
'/*' && 
strpos($word[1], '*/')) {  
                $this->_pv_last_word = 
$word;  
                if ($word[1] == 
'/**#@-*/') {  
                    $this->_pf_docblock_template = 
true;  
                    $this->_pf_docblock = 
true;  
            $this->_pf_no_output_yet = 
true;  
            $this->_pv_saveline      = 
$this->_wp->linenum + 
1;  
        if (is_array($word) && 
$word[0] == 
T_DOUBLE_COLON) {  
            $this->_pf_colon_colon = 
true;  
        if (!$this->_pf_colon_colon && 
is_array($word) && 
$word[0] == 
T_STRING) {  
            $this->_pv_last_string = 
$word;  
     * Handle the function declaration header  
     * This handler only sees the "function name" portion of the function  
     * declaration.  Handling of the function parameters is by  
     * {@link handleFunctionParams()}, and the function body is handled by  
     * {@link handleLogicBlock()}  
    function handleFunction($word, $pevent)  
            $this->_addoutput($word);  
     * Handle the method declaration header  
     * This handler only sees the "function name" portion of the method  
     * declaration.  Handling of the method parameters is by  
     * {@link handleFunctionParams()}, and the method body is handled by  
     * {@link handleMethodLogicBlock()}  
    function handleMethod($word, $pevent)  
            $this->_addoutput($word);  
                $this->_addoutput($word);  
        $this->_methodlink($word);  
     * Handler for the stuff between ( and ) in a function declaration  
     * function handles($only,$these,$parameters){...}  
    function handleFunctionParams($word, $pevent)  
            $this->_addoutput($word);  
        $this->_addoutput($word);  
     * Handler for function body.  
     * The function body is checked for php functions, documented constants,  
     * functions, and indirectly for global statements.  It hyperlinks to the  
     * documentation for detected elements is created.  Everything else is  
    function handleLogicBlock($word, $pevent)  
            $this->_addoutput($word);  
        if (is_array($word) && 
$word[0] == 
T_DOUBLE_COLON) {  
            $this->_pf_colon_colon = 
true;  
        if (!$this->_pf_colon_colon && 
is_array($word) && 
$word[0] == 
T_STRING) {  
            $this->_pv_last_string = 
$word;  
            $e = 
$this->_event_stack->popEvent();  
            $this->_event_stack->pushEvent($e);  
                $this->_wp->backupPos($word);   
     * Handler for method body.  
     * Like functions, the method body is checked for php functions, documented  
     * constants, functions, and indirectly for global statements.  It also  
     * checks for "$this->XXXX" where XXXX is a class variable or method, and  
     * links to the documentation for detected elements is created.  Everything  
     * else is highlighted normally.  
    function handleMethodLogicBlock($word, $pevent)  
        if (isset
($this->_pv_prev_var_type)) {  
            //debug('prevtype is set');  
                unset
($this->_pv_prev_var_type); 
                if ($word[0] != 
T_WHITESPACE && 
  
                    $word[0] != 
T_STRING && 
$word[0] != 
T_OBJECT_OPERATOR  
                    //fancy_debug('unset', $word);  
                    unset
($this->_pv_prev_var_type); 
        $this->_pf_inmethod = 
true;  
            $this->_addoutput($word);  
                $this->_pf_no_output_yet = 
true;  
        if (is_array($word) && 
$word[0] == 
T_DOUBLE_COLON) {  
            $this->_pf_colon_colon = 
true;  
        if (!$this->_pf_colon_colon && 
is_array($word) && 
$word[0] == 
T_STRING) {  
            $this->_pv_last_string = 
$word;  
        if (is_array($word) && 
$word[0] == 
T_VARIABLE) {  
            $this->_pv_lastvar = 
$word;  
            $this->_pf_inmethod = 
false;  
            $e                  = 
$this->_event_stack->popEvent();  
            $this->_event_stack->pushEvent($e);  
                $this->_wp->backupPos($word);   
     * Handles $obj->classmember in a method body  
     * This handler is responsible for linking to the documentation of a  
     * class member when it is used directly in a method body.  
     * There are two methods of determining whether to link:  
     * - $this->member->submember  
     * The first case is handled by the $_pv_lastvar variable, and the  
     * second case is handled by the $_pv_prev_var_type variable.  $_pv_lastvar  
     * is always set to the value of the last T_VARIABLE token, if and only if  
     * no text has occurred between the variable and a T_OBJECT_OPERATOR token  
     * "->".  handleClassMember will only link if the last variable encountered  
     * When $this->variable is encountered, the variable is looked up to see  
     * if it can be found, and if so, the contents of its @var tag are processed  
     * to see if the member variable is defined to have 1 and only 1 class.  
     * If so, the $_pv_prev_var_type variable is set to this classname.  When  
     * submember is processed, the HighlightParser checks to see if  
     * $_pv_prev_var_type::submember() or $_pv_prev_var_type::$submember exists,  
     * and if it does, it is linked to.  
    function handleClassMember($word, $pevent)  
        if (!isset
($this->_pv_lastvar) && 
!isset
($this->_pv_prev_var_type)) {  
            //fancy_debug('returned from', $word, $this->_pv_prev_var_type);  
            $this->_pf_no_output_yet = 
false;  
            $this->_event_stack->popEvent();  
            return $this->defaultHandler($word, $pevent);  
        if (isset
($this->_pv_cm_name)) {  
            $this->_pf_obj_op = 
false;  
            $name             = 
$this->_pv_cm_name;  
            unset
($this->_pv_cm_name); 
            //debug('unset pvcmname');  
            $this->_event_stack->popEvent();  
            // control variable for _pv_prev_var_type  
            if ((isset
($this->_pv_lastvar) && 
$this->_pv_lastvar[1] == 
'$this') ||
  
                isset
($this->_pv_prev_var_type) 
                if (is_array($word) && 
$word[0] == 
T_WHITESPACE) {  
                    // preserve value of _pv_prev_var_type  
                    $save   = 
$this->_wp->nextToken();  
                    $temp   = 
$this->_wp->getWord();  
                    $this->_wp->backupPos($save, true);  
                if ((is_string($word) && 
$word == 
'(') || 
(isset
($temp) && 
  
                    $this->_pf_no_output_yet = 
false;  
                    $this->_methodlink($name);  
                    unset
($this->_pv_prev_var_type); 
                    //fancy_debug('name is ', $name);  
                    $this->_pf_no_output_yet = 
false;  
                    $this->_varlink($name, true);  
                        $this->_converter->getLink('object ' . 
$this->_pv_class);  
                        $class = 
$this->_converter->classes  
                            ->getClass($templink->name, $templink->path);  
                        if ($varname{0} != 
'$') {  
                        $var = 
$class->getVar($this->_converter, $varname);  
                        if (is_object($var) && 
$var->docblock->var) {  
                            $type = 
$var->docblock->var->returnType;  
                            if (strpos($type, 'object') === 
false) {  
                            $type = 
$this->_converter->getLink($type);  
                                // the variable's type is a class,   
                                //fancy_debug('set prev_var_type!', $type->name);  
                                $this->_pv_prev_var_type = 
$type->name;  
                                unset
($this->_pv_prev_var_type); 
                            unset
($this->_pv_prev_var_type); 
                        unset
($this->_pv_prev_var_type); 
                $this->_pf_no_output_yet = 
false;  
                // this does NewLinenum if necessary  
                $this->_wp->backupPos($word);  
                $this->_addoutput($name);  
                //debug('unset prevtype, no setnow');  
                unset
($this->_pv_prev_var_type); 
            unset
($this->_pv_lastvar); 
            $this->_pf_no_output_yet = 
false;  
            // this does NewLinenum if necessary  
            $this->_wp->backupPos($word);  
            if ($word[0] == 
T_OBJECT_OPERATOR) {  
                $this->_wp->backupPos($word);  
                $this->_addoutput($word);  
        if (!$this->_pf_obj_op && 
is_array($this->_pv_last_word) && 
  
            $this->_pv_last_word[0] == 
T_OBJECT_OPERATOR  
            if ((isset
($this->_pv_lastvar) && 
$this->_pv_lastvar[1] == 
'$this') ||
  
                isset
($this->_pv_prev_var_type) 
                $this->_pf_obj_op = 
true;  
                $this->_pf_no_output_yet = 
false;  
                // this does NewLinenum if necessary  
                $this->_wp->backupPos($word);  
                $this->_addoutput($word);  
                $this->_event_stack->popEvent();  
        if (is_array($word) && 
$word == 
T_WHITESPACE) {  
            $this->_pf_no_output_yet = 
false;  
            // this does NewLinenum if necessary  
            $this->_wp->backupPos($word);  
            $this->_addoutput($word);  
            if (!(is_array($word) && 
($word[0] == 
T_STRING || 
  
                $word[0] == 
T_WHITESPACE))  
                unset
($this->_pv_lastvar); 
                //debug('unset lastvar');  
                $this->_event_stack->popEvent();  
                $this->_pf_no_output_yet = 
false;  
                // this does NewLinenum if necessary  
                $this->_wp->backupPos($word);  
                $this->_addoutput($word);  
            if ($word[0] == 
T_STRING) {  
                //fancy_debug('set pvcmname to', $word);  
                $this->_pv_cm_name = 
$word;  
                $this->_pf_no_output_yet = 
false;  
                // this does NewLinenum if necessary  
                $this->_wp->backupPos($word);  
                $this->_addoutput($word);  
     * Comments are almost always single-line tokens, and so will be  
     * in the last word.  This handler checks to see if the current token  
     * is in fact a comment, and if it isn't, it backs up and returns control  
     * to the parent event handler with that word.  
    function handleComment($word, $pevent)  
        $w = 
$this->_pv_last_word;  
        // don't perform this check if this is a normal comment.  Docblocks  
        // have the _pf_no_output_yet variable set to true  
        if ($this->_pf_no_output_yet && 
is_array($w) && 
  
            $this->_event_stack->popEvent();  
        if ($this->_pf_no_output_yet) {  
            $this->_pf_no_output_yet = 
false;  
            $this->_addoutput($this->_pv_last_word);  
            strpos($word[1], '/**') === 
0)  
            $this->_event_stack->popEvent();  
            if (strpos($this->_pv_last_word[1], "\n") !== 
false) {  
            $this->_wp->backupPos($this->_pv_last_word);  
            //var_dump($this->_wp->nextToken());  
        } elseif (isset
($flag)) {  
        $this->_addoutput($word);  
            $this->_event_stack->popEvent();  
     * Handle class declarations  
     * Handles the initial declaration line:  
     * <code>class X extends Y implements I</code>  
     * @uses _classlink() to link to documentation for X and for Y class in  
    function handleClass($word, $pevent)  
        $this->_pf_in_class = 
true;  
        if (!isset
($this->_pv_class) && 
is_array($word) && 
$word[0] == 
T_STRING) {  
            $this->_pv_class = 
$this->_converter->class = 
$word[1];  
            $this->_classlink($word);  
            $starttok = 
$this->_wp->nextToken();  
            $test     = 
array(T_WHITESPACE);  
            while ($test && 
$test[0] == 
T_WHITESPACE) {  
                $tok  = 
$this->_wp->nextToken();  
                $test = 
$this->_wp->getWord();  
            if (is_array($test) && 
$test[0] == 
T_VARIABLE) {  
                $this->_wp->backupPos($tok, true);  
            $this->_wp->backupPos($starttok, true);  
            if (is_array($word) && 
$word[0] == 
T_VARIABLE) {  
                $this->_wp->backupPos($this->_pv_last_word);  
        if ($this->_pf_extends_found && 
is_array($word) && 
$word[0] == 
T_STRING) {  
            $this->_classlink($word);  
        if (is_array($word) && 
$word[0] == 
T_EXTENDS) {  
            $this->_pf_extends_found = 
true;  
            $this->_pf_no_output_yet = 
true;  
            $this->_pv_saveline      = 
$this->_wp->linenum + 
1;  
        $this->_addoutput($word);  
            $this->_pf_in_class = 
false;  
     * Handles class variable declaration  
     * @uses _varlink() make a link to $Y documentation in class variable  
    function handleVar($word, $pevent)  
            $this->_addoutput($word);  
        if (is_array($word) && 
$word[0] == 
T_VARIABLE) {  
            return $this->_varlink($word);  
        $this->_addoutput($word);  
     * This handler is responsible for highlighting DocBlocks  
     * handleDocBlock determines whether the docblock is normal or a template,  
     * and gathers all the lines of the docblock together before doing any  
     * As it is not possible to distinguish any comment token from a docblock  
     * token, this handler is also called for comments, and will pass control  
     * to {@link handleComment()} if the comment is not a DocBlock  
     * @uses commonDocBlock() once all lines of the DocBlock have been retrieved  
    function handleDocBlock($word, $pevent)  
        if (!($this->_pf_docblock || 
$this->_pf_docblock_template)) {  
            if (strpos($this->_pv_last_word[1], '/**') !== 
0) {  
                $this->_wp->backupPos($this->_pv_last_word);  
                $this->_event_stack->popEvent();  
                $this->_pf_no_output_yet = 
false;  
                $this->_pf_no_output_yet = 
true;  
                $this->_pv_db_lines      = 
array();  
        $last_word = 
$this->_pv_last_word[1];  
        if ($last_word == 
'/**#@-*/') {  
            // stop using docblock template  
            $this->_pf_no_output_yet = 
false;  
            $this->_addDocBlockoutput('closetemplate', $last_word);  
            if ($this->_pv_next_word !== 
false) {  
                $this->_wp->backupPos($this->_pv_next_word, true);  
            $this->_event_stack->popEvent();  
        if (!($this->_pf_docblock || 
$this->_pf_docblock_template)) {  
            $this->_pv_db_lines = 
array();  
            if (strpos($last_word, '/**#@+') === 
0) {  
                // docblock template definition  
                $this->_pf_docblock_template = 
true;  
                $this->_pf_docblock = 
true;  
            $this->_pv_db_lines[] = 
$last_word;  
            if (strpos($last_word, '*/') !== 
false) {  
            $this->_pv_db_lines[] = 
$word[1];  
            if (strpos($word[1], '*/') !== 
false) {  
            $this->_pv_db_lines[] = 
$word[1];  
        if (($this->_pf_docblock || 
$this->_pf_docblock_template) && 
  
            (strpos($word[1], '*/') !== 
false)  
     * This continuation of handleDocBlock splits DocBlock comments up into  
     * phpDocumentor tokens.  It highlights DocBlock templates in a different  
     * manner from regular DocBlocks, recognizes inline tags, regular tags,  
     * and distinguishes between standard core tags and other tags, and  
     * recognizes parameters to tags like @var.  
     * the type in "@var type description" will be highlighted as a php type,  
     * and the var in "@param type $var description" will be highlighted as a  
     * @uses handleDesc() highlight inline tags in the description  
     * @uses handleTags() highlight all tags  
    function commonDocBlock()  
        $this->_event_stack->popEvent();  
        $lines = 
$this->_pv_db_lines;  
        $go    = 
count($this->_pv_db_lines);  
        for ($i=
0; $i < 
$go; $i++
) {  
                $lines[$i] = 
array($lines[$i], false);  
            } elseif (substr(trim($lines[$i]), 0, 3) == 
'/**') {  
        for ($i = 
0; $i < 
count($lines); $i++
) {  
            if ($lines[$i][1] === 
false) {  
        //var_dump($desc, $tags);  
        $this->_pf_no_output_yet = 
false;  
        $save                    = 
$this->_wp->linenum;  
        $this->_wp->linenum      = 
$this->_pv_saveline;  
        $this->handleDesc($desc);  
        $this->handleTags($tags);  
        $this->_pv_db_lines = 
array();  
        $this->_wp->linenum = 
$save;  
        if (strpos($this->_pv_last_word[1], '*/') !== 
false) {  
            $this->_wp->backupPos($this->_pv_next_word, true);  
        $this->_pf_docblock = 
$this->_pf_docblock_template = 
false;  
     * Handle the description area of a DocBlock  
     * This method simply finds inline tags and highlights them  
     * separately from the rest of the description.  
     * @param mixed $desc the description piece(s)  
    function handleDesc($desc)  
        $dbtype .= 
($this->_pf_docblock ? 
'' : 
'template');  
        foreach ($desc as $line) {  
            $this->getInlineTags($line[0] . 
$line[1]);  
            if (strpos($line[0], '*/') === 
false &&
  
                !(substr($line[0], 0, 2) == 
'/*' && 
  
                strpos($line[1], '*/') !== 
false)  
        if ($this->_pf_internal) {  
            $this->_pf_internal = 
false;  
     * Handle phpDocumentor tags in a DocBlock  
     * This method uses the {@link $tagHandlers} array to determine which  
     * method will handle tags found in the docblock, and passes the data to  
     * the individual handlers one by one  
     * @param array $tags array of tags to handle  
    function handleTags($tags)  
        for ($i=
0; $i < 
count($tags); $i++
) {  
            $tagsi = 
trim($tags[$i][1]);  
            if (substr($tagsi, 0, 1) == 
'@' && 
substr($tagsi, 0, 2) != 
'@ ') {  
                $tags[$i][1] = 
array(substr($tags[$i][1], 0,   
                    strpos($tags[$i][1], $tagsi)), $tagsi);  
        foreach ($newtags as $tag) {  
            foreach ($tag as $i => 
$t) {  
            if (isset
($this->tagHandlers[$tagname])) {  
                $handle = 
$this->tagHandlers[$tagname];  
                $handle = 
$this->tagHandlers['*'];  
            $this->$handle($tagname, $restoftag);  
     * This handler recognizes all {@}inline} tags  
     * Normal inline tags are simply highlighted.  the {@}internal}} inline  
     * tag {@tutorial tags.inlineinternal.pkg} is highlighted differently  
     * to distinguish it from other inline tags.  
     * @param mixed $value       the tag value  
     * @param bool  $endinternal indicates the end of an @internal tag  
    function getInlineTags($value, $endinternal = 
false)  
        if ($this->_pf_internal && 
!$endinternal) {  
            if (strpos($value, '}}') !== 
false) {  
                // add the rest of internal  
                $this->getInlineTags(substr($value, 0, $x + 
3), true);  
                // strip internal from value  
                $this->_pf_internal = 
false;  
        $dbtype .= 
($this->_pf_docblock ? 
'' : 
'template');  
        // everything before the first {@ is normal text  
        $this->_addDocBlockoutput($dbtype, $value[0]);  
        for ($i=
1; $i < 
count($value); $i++
) {  
            if (substr($value[$i], 0, 1) == 
'}') {  
                $this->_addDocBlockoutput($dbtype, '{@}' . 
substr($value[$i], 1));  
                $value[$i] = 
explode(" ", $value[$i]);  
                $val       = 
join(' ', $value[$i]);  
                if ($word == 
'internal') {  
                    $this->_pf_internal = 
true;  
                    $this->_addDocBlockoutput($dbtype, '{@internal ');  
                    // strip internal and cycle as if it were normal text.  
                    $this->_addDocBlockoutput($dbtype, $value[$i]);  
                         //addError(PDERROR_UNTERMINATED_INLINE_TAG,  
                        $rest = 
join('}', $rest);  
                        $rest = 
join(' ', $rest);  
                    $this->$handle($word, $val);  
                    $this->_addDocBlockoutput($dbtype, $rest);  
                    $val = 
$word . 
' ' . 
$val;  
                    $this->_addDocBlockoutput($dbtype, '{@' . 
$val);  
     * Handles all inline tags  
     * @param string $name  the tag name  
     * @param mixed  $value the tag value  
    function handleDefaultInlineTag($name, $value)  
        $this->_addDocBlockoutput('inlinetag', '{@' . 
$name . 
' ' . 
$value . 
'}');  
     * phpDocumentor DocBlock tag handlers  
     * @param string $name    tag name  
     * @param array  $value   array of lines contained in the tag description  
     * This handler adds to outpu all comment information before the tag begins  
     * as in " * " before "@todo" in " * @todo"  
     * Then, it highlights the tag as a regular or coretag based on $coretag.  
     * Finally, it uses getInlineTags to highlight the description  
     * @param bool $coretag whether this tag is a core tag or not  
     * @uses getInlineTags() highlight a tag description  
        $dbtype .= 
($this->_pf_docblock ? 
'' : 
'template');  
        foreach ($value as $line) {  
            $this->_addDocBlockoutput($dbtype, $line[0]);  
            if ($line[1] === 
false) {  
                if (trim($line[0]) != 
'*/') {  
            $this->_addDocBlockoutput($dbtype, $line[1][0]);  
                foreach ($line[1][1] as $i => 
$tpart) {  
                    if ($tpart == 
'@' . 
$name && 
$i == 
0) {  
                        $this->_addDocBlockoutput($tagname, '@' . 
$name);  
            $this->getInlineTags($stored);  
            if (strpos($stored, '*/') === 
false) {  
     * main handler for "core" tags  
     * @see defaultTagHandler()  
    function coreTagHandler($name, $value)  
     * This handler works like {@link defaultTagHandler()} except it highlights  
     * the type and variable (if present) in "@global type $variable" or  
     * "@global type description"  
     * This handler works like {@link defaultTagHandler()} except it highlights  
     * the type and variable (if present) in "@param type $variable description"  
     * or "@param type description"  
     * @param bool $checkforvar private parameter, checks for $var or not  
        $dbtype .= 
($this->_pf_docblock ? 
'' : 
'template');  
        $ret     = 
$this->retrieveType($value, 0, $checkforvar);  
        foreach ($value as $num => 
$line) {  
            $this->_addDocBlockoutput($dbtype, $line[0]);  
            if ($line[1] === 
false) {  
                if (trim($line[0]) != 
'*/') {  
            $this->_addDocBlockoutput($dbtype, $line[1][0]);  
                $this->_addDocBlockoutput('coretag', '@' . 
$name . 
' ');  
                foreach ($ret[0] as $text) {  
                        $this->_addDocBlockoutput($dbtype, $text);  
                        if ($text[0] != 
'desc') {  
                            $this->_addDocBlockoutput($text[0], $text[1]);  
                    foreach ($ret[$num] as $text) {  
                            $this->_addDocBlockoutput($dbtype, $text);  
                            if ($text[0] != 
'desc') {  
                                $this->_addDocBlockoutput($text[0], $text[1]);  
            $this->getInlineTags($stored);  
            if (strpos($stored, '*/') === 
false) {  
     * handles the @staticvar tag  
     * This handler works like {@link defaultTagHandler()} except it highlights  
     * the type in "@return type description"  
     * Handles @property(-read or -write) and @method magic tags  
     * Retrieve the type portion of a @tag type description  
     * Tags like @param, @return and @var all have a PHP type portion in their  
     * description.  Since the type may contain the expression "object blah"  
     * where blah is a classname, it makes parsing out the type field complex.  
     * Even more complicated is the case where a tag variable can contain  
     * multiple types, such as object blah|object blah2|false, and so this  
     * method handles these cases.  
     * @param array $value       array of words that were separated by spaces  
     * @param 0
|1  $state       0 = find the type, 1 = find the var, if present  
     * @param bool  $checkforvar flag to determine whether to check for the end of a  
     *                            type is defined by a $varname  
     * @return array Format: array(state (0 [find type], 1 [var], 2 [done]),  
    function retrieveType($value, $state = 
0, $checkforvar = 
false)  
            if (!isset
($value[$index][1])) {  
            $val = 
$value[$index][1];  
            $ret              = 
$this->_retrieveType($val, $state, $checkforvar);  
            $result[$index++
] = 
$ret[1];  
        } while ((!$checkforvar && 
$state < 
1) || 
($state < 
2 && 
$checkforvar));  
     * used by {@link retrieveType()} in its work  
     * @param array $value       array of words that were separated by spaces  
     * @param 0
|1  $state       0 = find the type, 1 = find the var, if present  
     * @param bool  $checkforvar flag to determine whether to check for the end of a  
     *                            type is defined by a $varname  
    function _retrieveType($value, $state, $checkforvar)  
        $result[] = 
$this->_removeWhiteSpace($value, 0);  
                return array(2, $result);  
            if (trim($value[0]) == 
'object') {  
                $result[] = 
array('tagphptype', $value[0] . 
' ');  
                $result[] = 
$this->_removeWhiteSpace($value, 0);  
                    // was just passed "object"  
                    return array(2, $result);  
                if ($value[0]{0} == 
'$' || 
substr($value[0], 0, 2) == 
'&$') {  
                    // was just passed "object"  
                    // and the next thing is a variable name  
                        $result[] = 
array('tagvarname' , $value[0] . 
' ');  
                    $result[] = 
array('desc', join(' ', $value));  
                    return array(2, $result);  
                // this loop checks for type|type|type and for  
                // type|object classname|type|object classname2  
                    $temptypes = 
explode('|', $value[0]);  
                    while (count($temptypes)) {  
                        $result[] = 
array('tagphptype', $type);  
                    if (trim($type) == 
'object') {  
                        $result[] = 
array('tagphptype', $types . 
' ');  
                        $result[] = 
$this->_removeWhiteSpace($value, 0);  
                    if (count($value) && 
strlen($value[0]) && isset 
($value[0]) && 
  
                        ($value[0]{0} == 
'$' || 
substr($value[0], 0, 2) == 
'&$')  
                        // was just passed "object"  
                        // and the next thing is a variable name  
                        $result[] = 
array('tagvarname' , $value[0] . 
' ');  
                        $result[] = 
array('desc', join(' ', $value));  
                        return array(2, $result);  
                    $result[] = 
array('tagphptype', $value[0] . 
' ');  
            } while (!$done && 
count($value));  
            // still searching for type  
            if (!$done && 
!count($value)) {  
                return array(0, $result);  
            // still searching for var  
            if ($done && 
!count($value)) {  
                return array(1, $result);  
        $result[] = 
$this->_removeWhiteSpace($value, 0);  
                if (substr($value[0], 0, 1) == 
'$' || 
  
                    substr($value[0], 0, 2) == 
'&$'  
                    $result[] = 
array('tagvarname' , $value[0] . 
' ');  
        $result[] = 
array('desc', join(' ', $value));  
        return array($state, $result);  
     * captures trailing whitespace  
     * @param array &$value array of string  
     * @param int   $index  index to seek non-whitespace to  
     * @return string whitespace  
    function _removeWhiteSpace(&$value, $index)  
        if (count($value) > 
$index && 
empty($value[$index])) {  
            for ($i = 
$index; $i < 
count($value) && 
!strlen($value[$i]); $i++
) {  
     * Link generation methods  
     * @param string|array $word token to try to link  
     * Generate a link to documentation for an element  
     * This method tries to link to documentation for functions, methods,  
     * PHP functions, class names, and if found, adds the links to output  
        if (is_array($word) && 
$word[0] == 
T_STRING) {  
            if ($this->_pf_colon_colon) {  
                $this->_pf_colon_colon = 
false;  
                $combo = 
$this->_pv_last_string[1] . 
'::' . 
$word[1] . 
'()';  
                //debug('testing ' . $combo);  
                $link = 
$this->_converter->getLink($combo);  
                    $this->_addoutput($this->_converter->returnSee($link,  
                $this->_addoutput($word);  
            $link = 
$this->_converter->getLink($word[1] . 
'()');  
                $this->_addoutput($this->_converter->returnSee($link,  
                $this->_addoutput($this->_converter->returnLink($link,  
                $link = 
$this->_converter->getLink($word[1]);  
                    $word[1] = 
$this->_converter->returnSee($link, $word[1]);  
                $this->_addoutput($word, true);  
        $this->_addoutput($word);  
     * Works like {@link _link()} except it only links to global variables  
    function _globallink($word)  
            return $this->_addoutput($word);  
        if ($word[0] != 
T_VARIABLE) {  
            return $this->_addoutput($word);  
        if (is_array($word) && 
$word[0] == 
T_VARIABLE) {  
            $link = 
$this->_converter->getLink('global ' . 
$word[1]);  
                $this->_addoutput($this->_converter->returnSee($link,  
        $this->_addoutput($word);  
     * Works like {@link _link()} except it only links to classes  
    function _classlink($word)  
        //debug("checking class " . $word[1]);  
        if (is_array($word) && 
$word[0] == 
T_STRING) {  
            $link = 
$this->_converter->getLink($word[1]);  
                $this->_addoutput($this->_converter->returnSee($link,  
        $this->_addoutput($word);  
     * Works like {@link _link()} except it only links to methods  
    function _methodlink($word)  
        if (is_array($word) && 
$word[0] == 
T_STRING) {  
            //debug("checking method " . $this->_pv_class . '::' . $word[1] . '()');  
            if (isset
($this->_pv_prev_var_type)) {  
                $link = 
$this->_converter->getLink($this->_pv_prev_var_type . 
'::' .
  
                $link = 
$this->_converter->getLink($this->_pv_class . 
'::' . 
  
                $this->_addoutput($this->_converter->returnSee($link,  
            if (isset
($this->_pv_prev_var_type)) {  
                $this->_addoutput($word);  
            //debug("checking method " . $word[1] . '()');  
            $link = 
$this->_converter->getLink($word[1] . 
'()');  
                $this->_addoutput($this->_converter->returnSee($link,  
        $this->_addoutput($word);  
     * Works like {@link _link()} except it only links to class variables  
     * @param bool $justastring true if the $word is only a string  
    function _varlink($word, $justastring=
false)  
        if (is_array($word) && 
$word[0] == 
T_VARIABLE) {  
            $x = 
($justastring ? 
'$' : 
'');  
            //debug("checking var " . $this->_pv_class . '::' . $x . $word[1]);  
            if (isset
($this->_pv_prev_var_type)) {  
                //debug("checking var " . $this->_pv_prev_var_type . '::' .  
                $link = 
$this->_converter->getLink($this->_pv_prev_var_type . 
'::' .
  
                $link = 
$this->_converter->getLink($this->_pv_class . 
'::' . 
  
                $this->_addoutput($this->_converter->returnSee($link,  
            //debug("checking var " . $x . $word[1]);  
            if (isset
($this->_pv_prev_var_type)) {  
                $this->_addoutput($word);  
            $link = 
$this->_converter->getLink($x . 
$word[1]);  
                $this->_addoutput($this->_converter->returnSee($link,  
        $this->_addoutput($word);  
     * This method adds output to {@link $_line}  
     * If a string with variables like "$test this" is present, then special  
     * handling is used to allow processing of the variable in context.  
     * @param mixed $word         the string|array tag token and value  
     * @param bool  $preformatted whether or not the $word is already formatted  
    function _addoutput($word, $preformatted = 
false)  
        if ($this->_pf_no_output_yet) {  
        if ($this->_pf_quote_active) {  
                $this->_save .= 
$this->_converter->highlightSource($word[0],  
                $this->_save .= 
$this->_converter->highlightSource(false,  
                $this->_line .= 
$this->_converter->postProcess($word);  
                $this->_line .= 
$this->_converter->postProcess($word[1]);  
                $this->_line .= 
$this->_converter->highlightSource($word[0],  
                    $word[1], $preformatted);  
                $this->_line .= 
$this->_converter->highlightSource(false,  
     * Like {@link _output()}, but for DocBlock highlighting  
     * @param mixed $dbtype       the docblock type  
     * @param mixed $word         the string|array tag token and value  
     * @param bool  $preformatted whether or not the $word is already formatted  
    function _addDocBlockoutput($dbtype, $word, $preformatted = 
false)  
        if ($this->_pf_internal) {  
            $this->_line .= 
$this->_converter->highlightDocBlockSource('internal',  
            $this->_line .= 
$this->_converter->highlightDocBlockSource($dbtype,  
     * Flush a saved string variable highlighting  
     * @todo CS cleanup - rename to _flushSave() for camelCase rule  
        if (!empty($this->_save)) {  
            $this->_save .= 
$this->_converter->flushHighlightCache();  
            // clear the existing cache, reset it to the old value  
            if (isset
($this->_save_highlight_state)) {  
                    _setHighlightCache($this->_save_highlight_state[0],  
                         $this->_save_highlight_state[1]);  
            $this->_line .= 
$this->_converter->  
                highlightSource(T_CONSTANT_ENCAPSED_STRING, $this->_save, true);  
     * Give the word parser necessary data to begin a new parse  
     * @param array &$data all tokens separated by line number  
        $this->_wp->setup($data, $this);  
        $this->_wp->setWhitespace(true);  
     * Initialize all parser state variables  
     * @param bool         $inlinesourceparse true if we are highlighting an inline  
     *                                         {@}source} tag's output  
     * @param false|string$class             name of class we are going  
     * @uses $_wp sets to a new {@link phpDocumentor_HighlightWordParser}  
        if ($inlinesourceparse) {  
                $this->_pv_class = 
$class;  
        $this->_pv_define              = 
null;  
        $this->_pv_define_name         = 
null;  
        $this->_pv_define_value        = 
null;  
        $this->_pv_define_params_data  = 
null;  
        $this->_pv_docblock            = 
null;  
        $this->_pv_dtemplate           = 
null;  
        $this->_pv_global_name         = 
null;  
        $this->_pv_global_val          = 
null;  
        $this->_pv_globals             = 
null;  
        $this->_pv_global_count        = 
null;  
        $this->_pv_include_params_data = 
null;  
        $this->_pv_include_name        = 
null;  
        $this->_pv_include_value       = 
null;  
        $this->_pv_linenum             = 
null;  
        $this->_pv_periodline          = 
null;  
        $this->_pv_paren_count         = 
0;  
        $this->_pv_statics             = 
null;  
        $this->_pv_static_count        = 
null;  
        $this->_pv_static_val          = 
null;  
        $this->_pv_quote_data          = 
null;  
        $this->_pv_function_data       = 
null;  
        $this->_pv_varname             = 
null;  
        $this->_pf_definename_isset    = 
false;  
        $this->_pf_extends_found       = 
false;  
        $this->_pf_includename_isset   = 
false;  
        $this->_pf_get_source          = 
false;  
        $this->_pf_getting_source      = 
false;  
        $this->_pf_in_class            = 
false;  
        $this->_pf_in_define           = 
false;  
        $this->_pf_in_global           = 
false;  
        $this->_pf_in_include          = 
false;  
        $this->_pf_in_var              = 
false;  
        $this->_pf_funcparam_val       = 
false;  
        $this->_pf_quote_active        = 
false;  
        $this->_pf_reset_quote_data    = 
true;  
        $this->_pf_useperiod           = 
false;  
        $this->_pf_var_equals          = 
false;  
        $this->_pf_obj_op              = 
false;  
        $this->_pf_docblock            = 
false;  
        $this->_pf_docblock_template   = 
false;  
        $this->_pf_colon_colon         = 
false;  
        $this->_pv_last_string         = 
false;  
        $this->_pf_inmethod            = 
false;  
        $this->_pf_no_output_yet       = 
false;  
        $this->_pv_next_word           = 
false;  
     * Initialize the {@link $tokenpushEvent, $wordpushEvent} arrays  
            = 
$GLOBALS['_phpDocumentor_tags_allowed']; 
        $this->allowableInlineTags  
            = 
$GLOBALS['_phpDocumentor_inline_doc_tags_allowed']; 
            = 
array('*' => 
'handleDefaultInlineTag'); 
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
        /**************************************************************/  
 
 
	
		Documentation generated on Mon, 05 Dec 2011 21:21:38 -0600 by phpDocumentor 1.4.4