!C99Shell v. 1.0 pre-release build #13!

Software: Apache. PHP/5.5.15 

uname -a: Windows NT SVR-DMZ 6.1 build 7600 (Windows Server 2008 R2 Enterprise Edition) i586 

SYSTEM 

Safe-mode: OFF (not secure)

C:\dmz\php\pear\PhpDocumentor\phpDocumentor\   drwxrwxrwx
Free 4.1 GB of 39.52 GB (10.37%)
Detected drives: [ a ] [ c ] [ d ] [ e ] [ f ]
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     HighlightParser.inc (95.4 KB)      -rw-rw-rw-
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
 * 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
 * 
 * PHP versions 4 and 5
 *
 * Copyright (c) 2002-2008 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
 *
 * @category   ToolsAndUtilities
 * @package    phpDocumentor
 * @subpackage Parsers
 * @author     Gregory Beaver <cellog@php.net>
 * @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 $
 * @filesource
 * @link       http://www.phpdoc.org
 * @link       http://pear.php.net/PhpDocumentor
 * @tutorial   tags.example.pkg, tags.filesource.pkg, tags.inlinesource.pkg
 * @since      1.2.0beta3
 * @todo       CS cleanup - change package to PhpDocumentor
 */

/**
 * Retrieve tokens from an array of tokens organized by line numbers
 *
 * @category   ToolsAndUtilities
 * @package    phpDocumentor
 * @subpackage Parsers
 * @author     Gregory Beaver <cellog@php.net>
 * @copyright  2002-2008 Gregory Beaver
 * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @version    Release: 1.4.4
 * @link       http://www.phpdoc.org
 * @link       http://pear.php.net/PhpDocumentor
 * @since      1.2.0beta3
 * @todo       CS cleanup - change package to PhpDocumentor
 * @todo       CS cleanup - change class name to PhpDocumentor_*
 */
class phpDocumentor_HighlightWordParser extends phpDocumentorTWordParser
{
    
/**
     * Hash used to keep track of line numbers that have already been initialized
     * @var array
     * @access private
     */
    
var $_listLineNums = array();
    
/**
     * Initialize the parser object
     *
     * @param array                         &$input  the input
     * @param phpDocumentor_HighlightParser &$parser the parser
     *
     * @return void
     */
    
function setup(&$input, &$parser)
    {
        
$this->_parser     = &$parser;
        
$this->data        = &$input;
        
$this->_all        $input;
        
$this->_sourceline 0;
        
$this->pos         0;
        
$this->linenum     0;
    }
    
    
/**
     * debugging function
     *
     * @return void
     * @access private
     */
    
function printState()
    {
        
$linenum $this->linenum;
        
$pos     $this->pos;
        if (!isset(
$this->_all[$this->linenum][$this->pos])) {
            
$linenum++;
            
$pos 0;
        }
        
$details '';
        
$token   $this->_all[$linenum][$pos];
        if (
is_array($token)) {
            
$details token_name($token[0]);
            
$token   htmlspecialchars($token[1]);
        } else {
            
$token htmlspecialchars($token);
        }
        
debug('Next Token ' $this->linenum '-' $this->pos ':' $details);
        
var_dump($token);
    }
    
    
/**
     * Retrieve the position of the next token that will be parsed
     * in the internal token array
     *
     * @return array format: array(line number, position)
     */
    
function nextToken()
    {
        
$linenum $this->linenum;
        
$pos     $this->pos;
        if (!isset(
$this->_all[$this->linenum][$this->pos])) {
            
$linenum++;
            
$pos 0;
        }
        if (!isset(
$this->_all[$linenum][$pos])) {
            return 
false;
        }
        return array(
$linenum$pos);
    }
    
    
/**
     * Retrieve the next token
     *
     * @return array|string either array(PHP token constant, token) or string
     *                      non-specific separator
     */
    
function getWord()
    {
        if (!isset(
$this->_all[$this->linenum][$this->pos])) {
            
$this->linenum++;
            
$this->pos 0;
            if (!isset(
$this->_all[$this->linenum])) {
                return 
false;
            }
            
$this->_parser->newLineNum();
            return 
$this->getWord();
        }
        
$word $this->_all[$this->linenum][$this->pos++];
        return 
str_replace("\t"'    '$word);
    }

    
/**
     * 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
     *
     * @return void
     */
    
function backupPos($last_token$is_pos false)
    {
        if (!
$last_token) {
            return;
        }
        if (
$is_pos) {
            
$this->linenum $last_token[0];
            
$this->pos     $last_token[1];
            return;
        }
        if (
$last_token === false) {
            return;
        }

        
//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]);

        
do {
            
$this->pos--;
            if (
$this->pos 0) {
                
$this->linenum--;
                if (
$this->linenum 0) {
                    
var_dump($last_token);
                    break;
                }
                
$this->pos count($this->_all[$this->linenum]) - 1;
            }
        } while (!
$this->tokenEquals($last_tokenstr_replace("\t"'    '
            
$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
 * @package    phpDocumentor
 * @subpackage Parsers
 * @author     Gregory Beaver <cellog@php.net>
 * @copyright  2002-2008 Gregory Beaver
 * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @version    Release: 1.4.4
 * @link       http://www.phpdoc.org
 * @link       http://pear.php.net/PhpDocumentor
 * @since      1.2.0beta3
 * @todo       CS cleanup - change package to PhpDocumentor
 * @todo       CS cleanup - change class name to PhpDocumentor_*
 */
class phpDocumentor_HighlightParser extends phpDocumentorTParser
{
    
/**#@+
     * @access private
     */

    /**
     * Highlighted source is built up in this string
     * @var string
     */
    
var $_output;

    
/**
     * contents of the current source code line as it is parsed
     * @var string
     */
    
var $_line;

    
/**
     * Used to retrieve highlighted tokens
     * @var Converter a descendant of Converter
     */
    
var $_converter;

    
/**
     * Path to file being highlighted, if this is from a @filesource tag
     * @var false|string full path
     */
    
var $_filesourcepath;

    
/**
     * @var array
     */
    
var $eventHandlers = array(
        
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
     * @tutorial tags.pkg
     */
    
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
     *
     * @return void
     * @uses Converter::SourceLine() encloses {@link $_line} in a
     *                               converter-specific format
     */
    
function newLineNum()
    {
        if (
$this->_pf_no_output_yet) {
            return;
        }
        
$this->_flush_save();
        
$this->_line   .= $this->_converter->flushHighlightCache();
        
$this->_output .= $this->_converter->SourceLine($this->_wp->linenum,
            
$this->_line$this->_path);
        
$this->_line    '';
    }
    
    
/**
     * Start the parsing at a certain line number
     *
     * @param int $num line number
     *
     * @return void
     */
    
function setLineNum($num)
    {
        
$this->_wp->linenum $num;
    }
    
    
/**
     * Parse a new file
     *
     * 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
     * source code.
     *
     * @param array         &$parse_data       the parse data
     * @param Converter     &$converter        the converter object
     * @param bool          $inlinesourceparse whether this data is from an
     *                                         inline {@}source} tag
     * @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
     *                                         {@}source linenum}
     * @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
     *                an event is not found
     * @return bool
     * @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)
    {
        if (!
tokenizer_ext) {
            if (
is_array($parse_data)) {
                
$parse_data join($parse_data'');
            }
            
$parse_data    explode("\n"$parse_data);
            
$this->_output '';
            foreach (
$parse_data as $linenum => $line) {
                if (
$linenum 0) {
                    
$this->_output .= $converter->SourceLine($linenum,
                        
$line$filesourcepath);
                }
            }
            return 
$converter->PreserveWhiteSpace($this->_output);
        }
        static 
$endrecur  0;
        
$this->_converter = &$converter;
        
$converter->startHighlight();
        
$this->_path $filesourcepath;
        
$this->setupStates($inlinesourceparse$class);

        
$this->configWordParser($parse_data);
        if (
$linenum !== false) {
            
$this->setLineNum($linenum);
        }
        
// initialize variables so E_ALL error_reporting doesn't complain
        
$pevent 0;
        
$word   0;

        do {
            
$lpevent $pevent;
            
$pevent  $this->_event_stack->getEvent();
            if (
$lpevent != $pevent) {
                
$this->_last_pevent $lpevent;
            }

            if (
$pevent == PARSER_EVENT_CLASS_MEMBER) {
                
$this->_wp->setWhitespace(true);
            } else {
                
$this->_wp->setWhitespace(false);
            }

            if (!
is_array($word)) {
                
$lw $word;
            }
            if (
is_array($word) && $word[0] != T_WHITESPACE) {
                
$lw $word;
            }
            
$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) && 
                
$pevent != PARSER_EVENT_CLASS_MEMBER
            
) {
                
//debug("added " . $this->_wp->linenum . '-' . $this->_wp->pos);
                
$this->_addoutput($word);
                continue;
            } else {
                
$this->_pv_last_word $lw;
            }
            if (
$pevent != PARSER_EVENT_DOCBLOCK) {
                
$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, 
            //    $this->_wp->linenum);
            
if (PHPDOCUMENTOR_DEBUG == true) {
                echo 
"LAST: ";
                if (
is_array($this->_pv_last_word)) {
                    echo 
token_name($this->_pv_last_word[0]) . 
                        
' => |' .
                        
htmlspecialchars($this->_pv_last_word[1]);
                } else {
                    echo 
"|" $this->_pv_last_word;
                }
                echo 
"|\n";
                echo 
"PEVENT: " $this->getParserEventName($pevent) . "\n";
                echo 
"LASTPEVENT: " .
                    
$this->getParserEventName($this->_last_pevent) . "\n";
                
//echo "LINE: "   . $this->_line   . "\n";
                //echo "OUTPUT: " . $this->_output . "\n";
                
echo $dbg_linenum '-' $dbg_pos ": ";
                if (
is_array($word)) {
                    echo 
token_name($word[0]) . ' => |' htmlspecialchars($word[1]);
                } else {
                    echo 
'|'.htmlspecialchars($word);
                }
                echo 
"|\n";
                
$this->_wp->printState();
                echo 
"NEXT TOKEN: ";
                
$tok1 $this->_pv_next_word;
                
$tok  $this->_wp->_all[$tok1[0]][$tok1[1]];
                if (
is_array($tok)) {
                    echo 
token_name($tok[0]) . ' => ' $tok1[0] . '-' $tok1[1] .
                        
'|' htmlspecialchars($tok[1]);
                } else {
                    echo 
"|" $tok;
                }
                echo 
"|\n";
                echo 
"-------------------\n\n\n";
                
flush();
            }
            if (
$word !== false && isset($this->eventHandlers[$pevent])) {
                
$handle $this->eventHandlers[$pevent];
                
$this->$handle($word$pevent);
            } elseif (
$word !== false) {
                
debug('WARNING: possible error, no handler for event number '
                     
$pevent);
                if (
$endrecur++ == 25) {
                    die(
"FATAL ERROR, recursion limit reached");
                }
            }
        } while (!(
$word === false));
        if (
strlen($this->_line)) {
            
$this->newLineNum();
        }
        return 
$this->_output;
    }

    
/**#@+
     * Event Handlers
     *
     * 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}
     *
     * @return void
     * @access private
     */
    /**
     * Most tokens only need highlighting, and this method handles them
     */
    
function defaultHandler($word$pevent)
    {
        
$this->_addoutput($word);
        if (
$this->checkEventPush($word$pevent)) {
            return;
        }
        
$this->checkEventPop($word$pevent);
    }
    
    
/**
     * Handles global declarations in a function, like:
     *
     * <code>
     * function foobar()
     * {
     *     global $_phpDocumentor_setting;
     * }
     * </code>
     *
     * @uses _globallink() instead of _addoutput(), to link to global variables
     *       if they are used in a function
     */
    
function handleFuncGlobal($word$pevent)
    {
        if (
$this->checkEventPush($word$pevent)) {
            return;
        }
        
$this->_globallink($word);
        
$this->checkEventPop($word$pevent);
    }
    
    
/**
     * 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;
        }
        if (
$this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            return;
        }
        if (
$this->_pf_quote_active &&
            ((
$this->_pv_last_word == '"' && 
            
$this->_last_pevent != PARSER_EVENT_QUOTE) ||
            (
is_array($this->_pv_last_word) && 
            
$this->_pv_last_word[0] == T_END_HEREDOC &&
            
$this->_last_pevent != PARSER_EVENT_EOFQUOTE))
        ) {
            
$this->_pf_quote_active false;
            
$this->_wp->backupPos($word);
            
$this->_event_stack->popEvent();
            return;
        }
        if (!
$this->_pf_quote_active && 
            ((
$this->_pv_last_word == '"' && 
            
$this->_last_pevent != PARSER_EVENT_QUOTE) ||
            (
is_array($this->_pv_last_word) && 
            
$this->_pv_last_word[0] == T_END_HEREDOC &&
            
$this->_last_pevent != PARSER_EVENT_EOFQUOTE))
        ) {
            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);
            
$this->checkEventPop($word$pevent);
            return;
        } 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);
            return;
        }
        if (
$this->checkEventPop($word$pevent)) {
            
$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)
    {
        if (
$this->checkEventPop($word$pevent)) {
            
$this->_pf_quote_active true;
            
$this->_addoutput($word);
            return;
        }
        if (
$this->_pf_inmethod && is_array($word) && $word[0] == T_VARIABLE) {
            
$this->_pv_lastvar $word;
        }
        if (
$this->checkEventPush($word$pevent)) {
            
$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:
     *
     * <code>
     * define("test",array("hello",6 => 4, 5 => array('there')));
     * </code>
     *
     * 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)
    {
        static 
$token_save;
        if (!isset(
$token_save)) {
            
$token_save = array();
        }
        
$e $this->checkEventPush($word$pevent);
        if (
$e && $e != PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS) {
            return;
        }
        
        if (!isset(
$this->_pv_define_params_data)) {
            
$this->_pv_define_params_data '';
        }
        
        if (
$this->checkEventPop($word$pevent)) {
            unset(
$token_save);
            
$this->_addoutput($word);
        }
        if (
$this->_pf_definename_isset) {
            
$this->_addoutput($word);
        } else {
            if (
$word != ",") {
                
$token_save[] = $word;
                if (
is_array($word)) {
                    
$word $word[1];
                }
                
$this->_pv_define_params_data .= $word;
            } else {
                if (
substr($this->_pv_define_params_data01) ==
                    
substr($this->_pv_define_params_data,
                        
strlen($this->_pv_define_params_data) - 1) &&
                    
in_array(substr($this->_pv_define_params_data01), 
                        array(
'"'"'"))
                ) {
                    
// remove leading and ending quotation marks 
                    // if there are only two
                    
$a substr($this->_pv_define_params_data01);
                    
$b substr($this->_pv_define_params_data1
                        
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) {
                    if (
is_object($link)) {
                        if (
is_array($token)) {
                            
$token $token[1];
                        }
                        
$this->_addoutput($this->_converter->returnSee($link,
                            
$token));
                    } else {
                        
$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)
    {
        
$test $this->checkEventPush($word$pevent);
        if (
$test == PARSER_EVENT_DOCBLOCK || $test == PARSER_EVENT_COMMENT) {
            if (
substr($word[1], 02) == '/*' && strpos($word[1], '*/')) {
                
$this->_pv_last_word $word;
                if (
$word[1] == '/**#@-*/') {
                    
$this->_pf_docblock_template true;
                } else {
                    
$this->_pf_docblock true;
                }
                return 
$this->handleDocBlock($wordPARSER_EVENT_DOCBLOCK);
            }
            
$this->_pf_no_output_yet true;
            
$this->_pv_saveline      $this->_wp->linenum 1;
            return;
        }
        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;
        }
        
$this->_link($word);
        
$this->checkEventPop($word$pevent);
    }
    
    
/**
     * 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)
    {
        if (
$this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            return;
        }
        if (
$this->checkEventPop($word$pevent)) {
            return;
        }
        
$this->_link($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)
    {
        if (
$this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            return;
        }
        if (
$this->checkEventPop($word$pevent)) {
            if (
$word == ';') {
                
$this->_addoutput($word);
            }
            return;
        }
        
$this->_methodlink($word);
    }
    
    
/**
     * Handler for the stuff between ( and ) in a function declaration
     *
     * <code>
     * function handles($only,$these,$parameters){...}
     * </code>
     */
    
function handleFunctionParams($word$pevent)
    {
        if (
$this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            return;
        }
        
$this->_addoutput($word);
        
$this->checkEventPop($word$pevent);
    }
    
    
/**
     * 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
     * highlighted normally.
     */
    
function handleLogicBlock($word$pevent)
    {
        if (
$this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            return;
        }
        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;
        }
        
$this->_link($word);
        if (
$this->checkEventPop($word$pevent)) {
            
$e $this->_event_stack->popEvent();
            
$this->_event_stack->pushEvent($e);
            if (
$e == PARSER_EVENT_FUNCTION) {
                
$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');
            
if (!is_array($word)) {
                unset(
$this->_pv_prev_var_type);
            } else {
                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;
        if (
$e $this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            if (
$e == PARSER_EVENT_CLASS_MEMBER) {
                
$this->_pf_no_output_yet true;
            }
            return;
        }
        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->_link($word);
        if (
$this->checkEventPop($word$pevent)) {
            
$this->_pf_inmethod false;
            
$e                  $this->_event_stack->popEvent();
            
$this->_event_stack->pushEvent($e);
            if (
$e == PARSER_EVENT_METHOD) {
                
$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
     * - $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
     * was $this.
     *
     * 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
            
$setnow false;
            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
                    
$setnow true;
                    
$save   $this->_wp->nextToken();
                    
$temp   $this->_wp->getWord();
                    
$this->_wp->backupPos($savetrue);
                }
                if ((
is_string($word) && $word == '(') || (isset($temp) && 
                    
is_string($temp) && $temp == '(')
                ) {
                    
// it's a function
                    
$this->_pf_no_output_yet false;
                    
$this->_methodlink($name);
                    unset(
$this->_pv_prev_var_type);
                } else {
                    
// it's a variable
                    //fancy_debug('name is ', $name);
                    
$this->_pf_no_output_yet false;
                    
$this->_varlink($nametrue);
                    
$templink 
                        
$this->_converter->getLink('object ' $this->_pv_class);
                    
$class    false;
                    if (
is_object($templink)) {
                        
$class $this->_converter->classes
                            
->getClass($templink->name$templink->path);
                    }
                    if (
$class) {
                        
$varname $name;
                        if (
is_array($varname)) {
                            
$varname $name[1];
                        }
                        if (
$varname{0} != '$') {
                            
$varname '$'.$varname;
                        }
                        
$var $class->getVar($this->_converter$varname);
                        
                        if (
is_object($var) && $var->docblock->var) {
                            
$type $var->docblock->var->returnType;
                        }
                        if (isset(
$type)) {
                            if (
strpos($type'object') === false) {
                                
$type 'object '.$type;
                            }
                            
$type $this->_converter->getLink($type);
                            if (
phpDocumentor_get_class($type) == 'classlink') {
                                
// the variable's type is a class, 
                                // save it for future ->
                                //fancy_debug('set prev_var_type!', $type->name);
                                
$setnow                  true;
                                
$this->_pv_prev_var_type $type->name;
                            } else {
                                unset(
$this->_pv_prev_var_type);
                            }
                        } else {
                            unset(
$this->_pv_prev_var_type);
                        }
                    } else {
                        unset(
$this->_pv_prev_var_type);
                    }
                }
            } else {
                
$this->_pf_no_output_yet false;
                
// this does NewLinenum if necessary
                
$this->_wp->backupPos($word);
                
$this->_wp->getWord();
                
$this->_addoutput($name);
            }
            if (!
$setnow) {
                
//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);
            
$this->_wp->getWord();
            if (
$word[0] == T_OBJECT_OPERATOR) {
                
$this->_wp->backupPos($word);
            } else {
                
$this->_addoutput($word);
            }
            return;
        }
        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;
            } else {
                
$this->_pf_no_output_yet false;
                
// this does NewLinenum if necessary
                
$this->_wp->backupPos($word);
                
$this->_wp->getWord();
                
$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->_wp->getWord();
            
$this->_addoutput($word);
            return;
        }
        if (
$this->_pf_obj_op) {
            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->_wp->getWord();
                
$this->_addoutput($word);
                return;
            }
            if (
$word[0] == T_STRING) {
                
//fancy_debug('set pvcmname to', $word);
                
$this->_pv_cm_name $word;
            } else {
                
$this->_pf_no_output_yet false;
                
// this does NewLinenum if necessary
                
$this->_wp->backupPos($word);
                
$this->_wp->getWord();
                
$this->_addoutput($word);
            }
        }
    }
    
    
/**
     * Handles comments
     *
     * 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) && 
            (
in_array($w[0], array(T_COMMENTT_DOC_COMMENT)) && 
            
strpos($w[1], '/**') === 0)
        ) {
            
$this->_event_stack->popEvent();
            
$this->_event_stack->pushEvent(PARSER_EVENT_DOCBLOCK);
            return 
$this->handleDocBlock($wordPARSER_EVENT_DOCBLOCK);
        }
        if (
$this->_pf_no_output_yet) {
            
$flag                    1;
            
$this->_pf_no_output_yet false;
            
$this->_addoutput($this->_pv_last_word);
        }
        if (!
is_array($word) || 
            !
in_array($word[0], array(T_COMMENTT_DOC_COMMENT)) ||
            (
in_array($word[0], array(T_COMMENTT_DOC_COMMENT)) && 
            
strpos($word[1], '/**') === 0)
        ) {
            
$this->_event_stack->popEvent();
            if (
strpos($this->_pv_last_word[1], "\n") !== false) {
                
//$this->_wp->linenum++;
                //$this->newLineNum();
            
}
            
$this->_wp->backupPos($this->_pv_last_word);
            
$this->_wp->getWord();
            
//var_dump($this->_wp->nextToken());
            
return;
        } elseif (isset(
$flag)) {
            
$this->newLineNum();
        }
        
$this->_addoutput($word);
        
$this->checkEventPop($word$pevent);
        if (
strpos($word[1], '*/') === strlen($word[1]) - 2) {
            
$this->_event_stack->popEvent();
        }
    }
    
    
/**
     * Handle class declarations
     *
     * Handles the initial declaration line:
     *
     * <code>class X</code>
     * 
     * or
     * 
     * <code>class X extends Y implements I</code>
     *
     * @uses _classlink() to link to documentation for X and for Y class in
     *                    "class X extends Y"
     */
    
function handleClass($word$pevent)
    {
        
$this->_pf_in_class true;
        
$a                  $this->checkEventPush($word$pevent);

        if (!isset(
$this->_pv_class) && is_array($word) && $word[0] == T_STRING) {
            
$this->_pv_class $this->_converter->class $word[1];
            
$this->_classlink($word);
            return;
        }
        
        if (
is_array($word) && 
            
in_array($word[0], array(T_PRIVATET_PROTECTEDT_PUBLIC))
        ) {
            
$starttok $this->_wp->nextToken();
            
$test     = array(T_WHITESPACE);
            while (
$test && $test[0] == T_WHITESPACE) {
                
$tok  $this->_wp->nextToken();
                
$test $this->_wp->getWord();
            } 
// while
            
            
if (is_array($test) && $test[0] == T_VARIABLE) {
                
$this->_wp->backupPos($toktrue);
                return;
            }
            
$this->_wp->backupPos($starttoktrue);
        }
        
        if (@
in_array($this->_pv_last_word[0], 
            array(
T_PRIVATET_PROTECTEDT_PUBLIC))
        ) {
            if (
is_array($word) && $word[0] == T_VARIABLE) {
                
$this->_wp->backupPos($this->_pv_last_word);
                
$this->_event_stack->pushEvent(PARSER_EVENT_VAR);
                return;
            }
        }

        if (
$this->_pf_extends_found && is_array($word) && $word[0] == T_STRING) {
            
$this->_classlink($word);
            return;
        }
        if (
is_array($word) && $word[0] == T_EXTENDS) {
            
$this->_pf_extends_found true;
        }
        if (
$a == PARSER_EVENT_DOCBLOCK) {
            
$this->_pf_no_output_yet true;
            
$this->_pv_saveline      $this->_wp->linenum 1;
            return;
        }
        
$this->_addoutput($word);
        if (
$this->checkEventPop($word$pevent)) {
            
$this->_pf_in_class false;
            unset(
$this->_pv_class);
        }
    }
    
    
/**
     * Handles class variable declaration
     *
     * <code>
     * class X
     * {
     *     var $Y;
     * }
     * </code>
     *
     * @uses _varlink() make a link to $Y documentation in class variable
     *                  declaration "var $Y;"
     */
    
function handleVar($word$pevent)
    {
        if (
$this->checkEventPush($word$pevent)) {
            
$this->_addoutput($word);
            return;
        }
        if (
is_array($word) && $word[0] == T_VARIABLE) {
            return 
$this->_varlink($word);
        }
        
$this->_addoutput($word);
        
$this->checkEventPop($word$pevent);
    }
    
    
/**
     * 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
     * processing
     *
     * 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) {
                
// not a docblock
                
$this->_wp->backupPos($this->_pv_last_word);
                
$this->_event_stack->popEvent();
                
$this->_event_stack->pushEvent(PARSER_EVENT_COMMENT);
                
$this->_pf_no_output_yet false;
                return;
            } else {
                
$this->_pf_no_output_yet true;
                
$this->_pv_db_lines      = array();
            }
        }
        
$last_word $this->_pv_last_word[1];
        
$dtype     '_pv_docblock';
        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_wordtrue);
            }
            
$this->_event_stack->popEvent();
            return;
        }
        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;
            } else {
                
$this->_pf_docblock true;
            }
            
$this->_pv_db_lines[] = $last_word;
            if (
strpos($last_word'*/') !== false) {
                
$this->commonDocBlock();
                return;
            }
            
$this->_pv_db_lines[] = $word[1];
            if (
strpos($word[1], '*/') !== false) {
                
$this->commonDocBlock();
            }
        } else {
            
$this->_pv_db_lines[] = $word[1];
        }
        if ((
$this->_pf_docblock || $this->_pf_docblock_template) && 
            (
strpos($word[1], '*/') !== false)
        ) {
            
$this->commonDocBlock();
        }
    }
    
/**#@-*/

    /**
     * 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
     * php variable.
     *
     * @return void
     * @uses handleDesc() highlight inline tags in the description
     * @uses handleTags() highlight all tags
     * @access private
     */
    
function commonDocBlock()
    {
        
$this->_event_stack->popEvent();
        
$lines $this->_pv_db_lines;
        
$go    count($this->_pv_db_lines);
        for (
$i=0$i $go$i++) {
            if (
substr(trim($lines[$i]), 02) == '*/' || 
                
substr(trim($lines[$i]), 01) != '*' && 
                
substr(trim($lines[$i]), 03) != '/**'
            
) {
                
$lines[$i] = array($lines[$i], false);
            } elseif (
substr(trim($lines[$i]), 03) == '/**') {
                
$linesi = array();
                
// remove leading "/**"
                
$linesi[1] = substr(trim($lines[$i]), 3);
                if (empty(
$linesi[1])) {
                    
$linesi[0] = $lines[$i];
                } else {
                    
$linesi[0] = 
                        
substr($lines[$i], 0strpos($lines[$i], $linesi[1]));
                }
                
$lines[$i] = $linesi;
            } else {
                
$linesi = array();
                
// remove leading "* "
                
$linesi[1] = substr(trim($lines[$i]), 1);
                if (empty(
$linesi[1])) {
                    
$linesi[0] = $lines[$i];
                } else {
                    
$linesi[0] = 
                        
substr($lines[$i], 0strpos($lines[$i], $linesi[1]));
                }
                
$lines[$i] = $linesi;
            }
        }
        for (
$i 0$i count($lines); $i++) {
            if (
$lines[$i][1] === false) {
                continue;
            }
            if (
substr(trim($lines[$i][1]), 01) == '@' && 
                
substr(trim($lines[$i][1]), 02) != '@ '
            
) {
                
$tagindex $i;
                
$i        count($lines);
            }
        }
        if (isset(
$tagindex)) {
            
$tags array_slice($lines$tagindex);
            
$desc array_slice($lines0$tagindex);
        } else {
            
$tags = array();
            
$desc $lines;
        }
        
//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_wordtrue);
        }
        
$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)
     *
     * @return void
     * @uses getInlineTags()
     * @access private
     */
    
function handleDesc($desc)
    {
        
$dbtype  'docblock';
        
$dbtype .= ($this->_pf_docblock '' 'template');
        foreach (
$desc as $line) {
            
$this->getInlineTags($line[0] . $line[1]);
            if (
strpos($line[0], '*/') === false &&
                !(
substr($line[0], 02) == '/*' && 
                
strpos($line[1], '*/') !== false)
            ) {
                
$this->newLineNum();
                
$this->_wp->linenum++;
            }
        }
        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
     *
     * @return void
     * @access private
     */
    
function handleTags($tags)
    {
        
$newtags = array();
        
$curtag  = array();
        for (
$i=0$i count($tags); $i++) {
            
$tagsi trim($tags[$i][1]);
            if (
substr($tagsi01) == '@' && substr($tagsi02) != '@ ') {
                
// start a new tag
                
$tags[$i][1] = array(substr($tags[$i][1], 0
                    
strpos($tags[$i][1], $tagsi)), $tagsi);
                if (!empty(
$curtag)) {
                    
$newtags[] = $curtag;
                    
$curtag    = array();
                }
                
$curtag[] = $tags[$i];
            } else {
                
$curtag[] = $tags[$i];
            }
        }
        if (!empty(
$curtag)) {
            
$newtags[] = $curtag;
        }
        foreach (
$newtags as $tag) {
            foreach (
$tag as $i => $t) {
                if (
$t[1] === false) {
                    continue;
                }
                if (
is_array($t[1])) {
                    
$tag[$i][1][1]
                        = 
explode(" "str_replace("\t"'    '$t[1][1]));
                    
$x $tag[$i][1][1];
                }
            }
            
$tagname   substr(array_shift($x), 1);
            
$restoftag $tag;
            if (isset(
$this->tagHandlers[$tagname])) {
                
$handle $this->tagHandlers[$tagname];
            } else {
                
$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
     *
     * @return void
     * @access private
     */
    
function getInlineTags($value$endinternal false)
    {
        if (!
$value) {
            return;
        }
        if (
$this->_pf_internal && !$endinternal) {
            if (
strpos($value'}}') !== false) {
                
$x strrpos($value'}}');
                
// add the rest of internal
                
$this->getInlineTags(substr($value0$x 3), true);
                
// strip internal from value
                
$value substr($valuestrrpos($value'}}') + 1);
                
// turn off internal
                
$this->_pf_internal false;
            }
        }
        if (!
$value) {
            return;
        }
        
$dbtype  'docblock';
        
$dbtype .= ($this->_pf_docblock '' 'template');
        
$save    $value;
        
$value   explode('{@'$value);
        
$newval  = array();
        
// everything before the first {@ is normal text
        
$this->_addDocBlockoutput($dbtype$value[0]);
        for (
$i=1$i count($value); $i++) {
            if (
substr($value[$i], 01) == '}') {
                
$this->_addDocBlockoutput($dbtype'{@}' substr($value[$i], 1));
            } else {
                
$save      $value[$i];
                
$value[$i] = str_replace("\t""    "$value[$i]);
                
$value[$i] = explode(" "$value[$i]);
                
$word      array_shift($value[$i]);
                
$val       join(' '$value[$i]);
                if (
$word == 'internal') {
                    
$this->_pf_internal true;
                    
$this->_addDocBlockoutput($dbtype'{@internal ');
                    
$value[$i] = substr($savestrlen('internal') + 1);
                    
// strip internal and cycle as if it were normal text.
                    
$this->_addDocBlockoutput($dbtype$value[$i]);
                    continue;
                }
                if (
in_array(str_replace('}'''$word), $this->allowableInlineTags)
                ) {
                    if (
strpos($word'}')) {
                        
$word str_replace('}'''$word);
                        
$val  '} ' $val;
                    }
                    
$val explode('}'$val);
                    if (
count($val) == 1) {
                         
//addError(PDERROR_UNTERMINATED_INLINE_TAG,
                         //    $word, '', $save);
                    
}
                    
$rest $val;
                    
$val  array_shift($rest);
                    if (
$endinternal) {
                        
$rest join('}'$rest);
                    } else {
                        
$rest join(' '$rest);
                    }
                    if (isset(
$this->inlineTagHandlers[$word])) {
                        
$handle $this->inlineTagHandlers[$word];
                    } else {
                        
$handle $this->inlineTagHandlers['*'];
                    }
                    
$this->$handle($word$val);
                    
$this->_addDocBlockoutput($dbtype$rest);
                } else {
                    
$val $word ' ' $val;
                    
$this->_addDocBlockoutput($dbtype'{@' $val);
                }
            }
        }
    }

    
    
/**
     * Handles all inline tags
     *
     * @param string $name  the tag name
     * @param mixed  $value the tag value
     *
     * @return void
     * @access private
     */
    
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
     *
     * @return void
     * @access private
     */
    /**
     * Handle normal tags
     *
     * 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
     */
    
function defaultTagHandler($name$value$coretag false)
    {
        
$dbtype  'docblock';
        
$dbtype .= ($this->_pf_docblock '' 'template');
        foreach (
$value as $line) {
            
$this->_addDocBlockoutput($dbtype$line[0]);
            if (
$line[1] === false) {
                if (
trim($line[0]) != '*/') {
                    
$this->newLineNum();
                    
$this->_wp->linenum++;
                }
                continue;
            }
            
$this->_addDocBlockoutput($dbtype$line[1][0]);
            
$stored '';
            if (
is_array($line[1][1])) {
                foreach (
$line[1][1] as $i => $tpart) {
                    if (
$tpart == '@' $name && $i == 0) {
                        
$tagname 'tag';
                        if (
$coretag) {
                            
$tagname 'coretag';
                        }
                        
$this->_addDocBlockoutput($tagname'@' $name);
                        continue;
                    }
                    
$stored .= ' ' $tpart;
                }
            } else {
                
$stored $line[1];
            }
            
$this->getInlineTags($stored);
            if (
strpos($stored'*/') === false) {
                
$this->newLineNum();
                
$this->_wp->linenum++;
            }
        }
    }
    
    
/**
     * main handler for "core" tags
     *
     * @see defaultTagHandler()
     */
    
function coreTagHandler($name$value)
    {
        return 
$this->defaultTagHandler($name$valuetrue);
    }
    
    
/**
     * Handles @global
     *
     * This handler works like {@link defaultTagHandler()} except it highlights
     * the type and variable (if present) in "@global type $variable" or
     * "@global type description"
     */
    
function globalTagHandler($name$value)
    {
        
$this->paramTagHandler($name$value);
    }
    
    
/**
     * Handles @param
     *
     * 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
     */
    
function paramTagHandler($name$value$checkforvar true)
    {
        
$dbtype  'docblock';
        
$dbtype .= ($this->_pf_docblock '' 'template');
        
$ret     $this->retrieveType($value0$checkforvar);
        foreach (
$value as $num => $line) {
            
$this->_addDocBlockoutput($dbtype$line[0]);
            if (
$line[1] === false) {
                if (
trim($line[0]) != '*/') {
                    
$this->newLineNum();
                    
$this->_wp->linenum++;
                }
                continue;
            }
            
$this->_addDocBlockoutput($dbtype$line[1][0]);
            
$stored  '';
            
$typeloc 1;
            
$varloc  2;
            if (
is_array($line[1][1])) {
                
$this->_addDocBlockoutput('coretag''@' $name ' ');
                foreach (
$ret[0] as $text) {
                    if (
is_string($text)) {
                        
$this->_addDocBlockoutput($dbtype$text);
                    }
                    if (
is_array($text)) {
                        if (
$text[0] != 'desc') {
                            
$this->_addDocBlockoutput($text[0], $text[1]);
                        } else {
                            
$stored .= $text[1];
                        }
                    }
                }
            } else {
                if (isset(
$ret[$num])) {
                    foreach (
$ret[$num] as $text) {
                        if (
is_string($text)) {
                            
$this->_addDocBlockoutput($dbtype$text);
                        }
                        if (
is_array($text)) {
                            if (
$text[0] != 'desc') {
                                
$this->_addDocBlockoutput($text[0], $text[1]);
                            } else {
                                
$stored .= $text[1];
                            }
                        }
                    }
                } else {
                    
$stored $line[1];
                }
            }
            
$this->getInlineTags($stored);
            if (
strpos($stored'*/') === false) {
                
$this->newLineNum();
                
$this->_wp->linenum++;
            }
        }
    }
    
    
/**
     * handles the @staticvar tag
     *
     * @see paramTagHandler()
     */
    
function staticvarTagHandler($name$value)
    {
        return 
$this->paramTagHandler($name$value);
    }
    
    
/**
     * handles the @var tag
     *
     * @see paramTagHandler()
     */
    
function varTagHandler($name$value)
    {
        return 
$this->paramTagHandler($name$value);
    }
    
    
/**
     * Handles @return
     *
     * This handler works like {@link defaultTagHandler()} except it highlights
     * the type in "@return type description"
     */
    
function returnTagHandler($name$value)
    {
        
$this->paramTagHandler($name$valuefalse);
    }

    
/**
     * Handles @property(-read or -write) and @method magic tags
     */
    
function propertyTagHandler($name$value)
    {
        return 
$this->paramTagHandler($name$valuetrue);
    }

    
/**#@-*/
    
    /**
     * 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]),
     * @access private
     */
    
function retrieveType($value$state 0$checkforvar false)
    {
        
$index  0;
        
$result = array();
        do {
            if (!isset(
$value[$index][1])) {
                return 
$result;
            }
            
$val $value[$index][1];
            if (empty(
$val)) {
                return 
$result;
            }
            if (
$index == 0) {
                
$val $val[1];
                
array_shift($val);
            } else {
                
$val explode(' '$val);
            }
            
$ret              $this->_retrieveType($val$state$checkforvar);
            
$state            $ret[0];
            
$result[$index++] = $ret[1];
        } while ((!
$checkforvar && $state 1) || ($state && $checkforvar));
        return 
$result;
    }

    
/**
     * 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
     *
     * @return array 
     * @access private
     */    
    
function _retrieveType($value$state$checkforvar)
    {
        
$result   = array();
        
$result[] = $this->_removeWhiteSpace($value0);
        if (
$state == 0) {
            if (!
count($value)) {
                return array(
2$result);
            }
            
$types '';
            
$index 0;
            if (
trim($value[0]) == 'object') {
                
$result[] = array('tagphptype'$value[0] . ' ');
                
$types   .= array_shift($value).' ';
                
$result[] = $this->_removeWhiteSpace($value0);
                if (!
count($value)) {
                    
// was just passed "object"
                    
return array(2$result);
                }
                if (
$value[0]{0} == '$' || substr($value[0], 02) == '&$') {
                    
// was just passed "object"
                    // and the next thing is a variable name
                    
if ($checkforvar) {
                        
$result[] = array('tagvarname' $value[0] . ' ');
                        
array_shift($value);
                    }
                    
$result[] = array('desc'join(' '$value));
                    return array(
2$result);
                }
            }
            
$done false;
            
$loop = -1;
            do {
                
// this loop checks for type|type|type and for
                // type|object classname|type|object classname2
                
if (strpos($value[0], '|')) {
                    
$temptypes explode('|'$value[0]);
                    while (
count($temptypes)) {
                        
$type     array_shift($temptypes);
                        
$result[] = array('tagphptype'$type);
                        if (
count($temptypes)) {
                            
$result[] = '|';
                        }
                    }
                    if (
trim($type) == 'object') {
                        
$result[] = array('tagphptype'$types ' ');
                        
$result[] = $this->_removeWhiteSpace($value0);
                    } else {
                        
$done true;
                    }
                    
array_shift($value);
                    if (
count($value) && strlen($value[0]) && isset ($value[0]) && 
                        (
$value[0]{0} == '$' || substr($value[0], 02) == '&$')
                    ) {
                        
// was just passed "object"
                        // and the next thing is a variable name
                        
$result[] = array('tagvarname' $value[0] . ' ');
                        
array_shift($value);
                        
$result[] = array('desc'join(' '$value));
                        return array(
2$result);
                    }
                } else {
                    
$result[] = array('tagphptype'$value[0] . ' ');
                    
array_shift($value);
                    
$done true;
                }
                
$loop++;
            } while (!
$done && count($value));
            if (
$loop) {
                
$result[] = ' ';
            }
            
// 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($value0);
        
$state    1;
        if (
$checkforvar) {
            if (
count($value)) {
                
$state 2;
                if (
substr($value[0], 01) == '$' || 
                    
substr($value[0], 02) == '&$'
                
) {
                    
$result[] = array('tagvarname' $value[0] . ' ');
                    
array_shift($value);
                }
            } else {
                
$state 1;
            }
        }
        
$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
     * @access private
     */
    
function _removeWhiteSpace(&$value$index)
    {
        
$result '';
        if (
count($value) > $index && empty($value[$index])) {
            
$found false;
            for (
$i $index$i count($value) && !strlen($value[$i]); $i++) {
                
$result .= ' ';
            }
            
array_splice($value$index$i $index);
        }
        return 
$result;
    }

    
/**#@+
     * Link generation methods
     *
     * @param string|array $word token to try to link
     *
     * @access private
     */
    /**
     * 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
     * instead of plain text
     */
    
function _link($word)
    {
        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);
                if (
is_object($link)) {
                    
$this->_addoutput($this->_converter->returnSee($link,
                        
$word[1]), true);
                    return;
                }
                
$this->_addoutput($word);
                return;
            }
            
$link $this->_converter->getLink($word[1] . '()');
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            } elseif (
is_string($link) && strpos($link'ttp://')) {
                
$this->_addoutput($this->_converter->returnLink($link,
                    
$word[1]), true);
                return;
            } else {
                
$link $this->_converter->getLink($word[1]);
                if (
is_object($link)) {
                    
$word[1] = $this->_converter->returnSee($link$word[1]);
                }
                
$this->_addoutput($wordtrue);
                return;
            }
        }
        
$this->_addoutput($word);
    }
    
    
/**
     * Works like {@link _link()} except it only links to global variables
     */
    
function _globallink($word)
    {
        if (!
is_array($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]);
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            }
        }
        
$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]);
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            }
        }
        
$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 '::' .
                    
$word[1] . '()');
            } else {
                
$link $this->_converter->getLink($this->_pv_class '::' 
                    
$word[1] . '()');
            }
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            }
            if (isset(
$this->_pv_prev_var_type)) {
                
$this->_addoutput($word);
                return;
            }
            
//debug("checking method " . $word[1] . '()');
            
$link $this->_converter->getLink($word[1] . '()');
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            }
        }
        
$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 (
$justastring) {
            
$word[0] = T_VARIABLE;
        }
        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 . '::' .
                //    $x . $word[1]);
                
$link $this->_converter->getLink($this->_pv_prev_var_type '::' .
                    
$x $word[1]);
            } else {
                
$link $this->_converter->getLink($this->_pv_class '::' 
                    
$x $word[1]);
            }
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            }
            
//debug("checking var " . $x . $word[1]);
            
if (isset($this->_pv_prev_var_type)) {
                
$this->_addoutput($word);
                return;
            }
            
$link $this->_converter->getLink($x $word[1]);
            if (
is_object($link)) {
                
$this->_addoutput($this->_converter->returnSee($link,
                    
$word[1]), true);
                return;
            }
        }
        
$this->_addoutput($word);
    }
    
/**#@-*/
    
    /**#@+
     * Output Methods
     * @access private
     */
    /**
     * 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
     *
     * @return void
     * @see _flush_save()
     */
    
function _addoutput($word$preformatted false)
    {
        if (
$this->_pf_no_output_yet) {
            return;
        }
        if (
$this->_pf_quote_active) {
            if (
is_array($word)) {
                
$this->_save .= $this->_converter->highlightSource($word[0],
                    
$word[1]);
            } else {
                
$this->_save .= $this->_converter->highlightSource(false,
                    
$wordtrue);
            }
        } else {
            
$this->_flush_save();
            if (
is_string($word) && trim($word) == '') {
                
$this->_line .= $this->_converter->postProcess($word);
                return;
            }
            if (
is_array($word) && trim($word[1]) == '') {
                
$this->_line .= $this->_converter->postProcess($word[1]);
                return;
            }
            if (
is_array($word)) {
                
$this->_line .= $this->_converter->highlightSource($word[0],
                    
$word[1], $preformatted);
            } else {
                
$this->_line .= $this->_converter->highlightSource(false,
                    
$word$preformatted);
            }
        }
    }
    
    
/** 
     * 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
     *
     * @return void
     */
    
function _addDocBlockoutput($dbtype$word$preformatted false)
    {
        if (
$this->_pf_internal) {
            
$this->_line .= $this->_converter->highlightDocBlockSource('internal',
                
$word$preformatted);
        } else {
            
$this->_line .= $this->_converter->highlightDocBlockSource($dbtype,
                
$word$preformatted);
        }
    }
    
    
/**
     * Flush a saved string variable highlighting
     *
     * {@source}
     *
     * @return void
     * @todo CS cleanup - rename to _flushSave() for camelCase rule
     */
    
function _flush_save()
    {
        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)) {
                
$this->_converter->
                    
_setHighlightCache($this->_save_highlight_state[0],
                         
$this->_save_highlight_state[1]);
            }
            
$this->_line .= $this->_converter->
                
highlightSource(T_CONSTANT_ENCAPSED_STRING$this->_savetrue);
            
$this->_save  '';
        }
    }
    
/**#@-*/
    
    /**
     * Give the word parser necessary data to begin a new parse
     *
     * @param array &$data all tokens separated by line number
     *
     * @return void
     */
    
function configWordParser(&$data)
    {
        
$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 
     *                                        to start from
     *
     * @return void
     * @uses $_wp sets to a new {@link phpDocumentor_HighlightWordParser}
     */
    
function setupStates($inlinesourceparse$class)
    {
        
$this->_output '';
        
$this->_line   '';
        unset(
$this->_wp);
        
$this->_wp          = new phpDocumentor_HighlightWordParser;
        
$this->_event_stack = new EventStack;
        if (
$inlinesourceparse) {
            
$this->_event_stack->pushEvent(PARSER_EVENT_PHPCODE);
            if (
$class) {
                
$this->_event_stack->pushEvent(PARSER_EVENT_CLASS);
                
$this->_pv_class $class;
            }
        } else {
            
$this->_pv_class null;
        }

        
$this->_pv_define              null;
        
$this->_pv_define_name         null;
        
$this->_pv_define_value        null;
        
$this->_pv_define_params_data  null;
        
$this->_pv_dtype               null;
        
$this->_pv_docblock            null;
        
$this->_pv_dtemplate           null;
        
$this->_pv_func                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_var                 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_saveline            0;
        
$this->_pv_next_word           false;
        
$this->_save                   '';
    }

    
/**
     * Initialize the {@link $tokenpushEvent, $wordpushEvent} arrays
     *
     * @return void
     */
    
function phpDocumentor_HighlightParser()
    {
        if (!
defined('T_INTERFACE')) {
            
define('T_INTERFACE', -1);
        }
        
$this->allowableTags
            
$GLOBALS['_phpDocumentor_tags_allowed'];
        
$this->allowableInlineTags
            
$GLOBALS['_phpDocumentor_inline_doc_tags_allowed'];
        
$this->inlineTagHandlers
            
= array('*' => 'handleDefaultInlineTag');
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_NOEVENTS] = 
            array(
                
T_OPEN_TAG => PARSER_EVENT_PHPCODE,
            );

        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_PHPCODE] = 
            array(
                
T_FUNCTION      => PARSER_EVENT_FUNCTION,
                
T_CLASS         => PARSER_EVENT_CLASS,
                
T_INTERFACE     => PARSER_EVENT_CLASS,
                
T_INCLUDE_ONCE  => PARSER_EVENT_INCLUDE,
                
T_INCLUDE       => PARSER_EVENT_INCLUDE,
                
T_START_HEREDOC => PARSER_EVENT_EOFQUOTE,
                
T_REQUIRE       => PARSER_EVENT_INCLUDE,
                
T_REQUIRE_ONCE  => PARSER_EVENT_INCLUDE,
                
T_COMMENT       => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT   => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_PHPCODE]  =
            array(
                
"define" => PARSER_EVENT_DEFINE,
                
'"'      => PARSER_EVENT_QUOTE,
                
'\''     => PARSER_EVENT_QUOTE,
            );
        
/**************************************************************/

        
$this->wordpushEvent[PARSER_EVENT_FUNCTION]  =
            array(
                
'{' => PARSER_EVENT_LOGICBLOCK,
                
'(' => PARSER_EVENT_FUNCTION_PARAMS,
            );
        
$this->tokenpushEvent[PARSER_EVENT_FUNCTION] =
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpopEvent[PARSER_EVENT_FUNCTION]   = array("}");
        
/**************************************************************/

        
$this->tokenpopEvent[PARSER_EVENT_EOFQUOTE] = array(T_END_HEREDOC);
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_FUNCTION_PARAMS] =
            array(
                
T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE,
                
T_ARRAY                    => PARSER_EVENT_ARRAY,
                
T_COMMENT                  => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT              => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_FUNCTION_PARAMS]  =
            array(
                
'"' => PARSER_EVENT_QUOTE,
                
"'" => PARSER_EVENT_QUOTE,
            );
        
$this->wordpopEvent[PARSER_EVENT_FUNCTION_PARAMS]   = array(")");
        
/**************************************************************/

        
$this->wordpushEvent[PARSER_EVENT_LOGICBLOCK]  = 
            array(
                
"{" => PARSER_EVENT_LOGICBLOCK,
                
'"' => PARSER_EVENT_QUOTE,
            );
        
$this->tokenpushEvent[PARSER_EVENT_LOGICBLOCK] =
            array(
                
T_GLOBAL                   => PARSER_EVENT_FUNC_GLOBAL,
                
T_STATIC                   => PARSER_EVENT_STATIC_VAR,
                
T_START_HEREDOC            => PARSER_EVENT_EOFQUOTE,
                
T_CURLY_OPEN               => PARSER_EVENT_LOGICBLOCK,
                
T_DOLLAR_OPEN_CURLY_BRACES => PARSER_EVENT_LOGICBLOCK,
            );
        
$this->wordpopEvent[PARSER_EVENT_LOGICBLOCK]   = array("}");
        
$this->tokenpopEvent[PARSER_EVENT_LOGICBLOCK]  = array(T_CURLY_OPEN);

        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_ARRAY] = 
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpopEvent[PARSER_EVENT_ARRAY]   = array(")");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_FUNC_GLOBAL] =
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpopEvent[PARSER_EVENT_FUNC_GLOBAL]   = array(";");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_STATIC_VAR] =
            array(
                
T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE,
                
T_COMMENT                  => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT              => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_STATIC_VAR]  =
            array(
                
"=" => PARSER_EVENT_STATIC_VAR_VALUE,
            );
        
$this->wordpopEvent[PARSER_EVENT_STATIC_VAR]   = array(";");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_STATIC_VAR_VALUE] = 
            array(
                
T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE,
                
T_COMMENT                  => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT              => PARSER_EVENT_DOCBLOCK,
                
T_ARRAY                    => PARSER_EVENT_ARRAY,
            );
        
$this->wordpushEvent[PARSER_EVENT_STATIC_VAR_VALUE]  =
            array(
                
'"' => PARSER_EVENT_QUOTE,
                
"'" => PARSER_EVENT_QUOTE,
            );
        
$this->wordpopEvent[PARSER_EVENT_STATIC_VAR_VALUE]   = array(";"",");
        
/**************************************************************/
        
$this->tokenpushEvent[PARSER_EVENT_QUOTE] = 
            array(
                
T_OBJECT_OPERATOR => PARSER_EVENT_CLASS_MEMBER,
                
T_CURLY_OPEN      => PARSER_EVENT_QUOTE_VAR,
            );
        
$this->wordpopEvent[PARSER_EVENT_QUOTE]   = array('"');
        
/**************************************************************/
        
$this->tokenpushEvent[PARSER_EVENT_QUOTE_VAR] = 
            array(
                
T_OBJECT_OPERATOR => PARSER_EVENT_CLASS_MEMBER,
                
T_CURLY_OPEN      => PARSER_EVENT_QUOTE_VAR,
            );
        
$this->wordpushEvent[PARSER_EVENT_QUOTE_VAR]  =
            array(
                
"{" => PARSER_EVENT_QUOTE_VAR,
                
'"' => PARSER_EVENT_QUOTE_VAR,
                
"'" => PARSER_EVENT_QUOTE_VAR,
            );
        
$this->wordpopEvent[PARSER_EVENT_QUOTE_VAR]   = array('}');
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_DEFINE] = 
            array(
                
T_COMMENT                  => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT              => PARSER_EVENT_DOCBLOCK,
                
T_CONSTANT_ENCAPSED_STRING => PARSER_EVENT_QUOTE,
            );
        
$this->wordpushEvent[PARSER_EVENT_DEFINE]  = 
            array(
                
"(" => PARSER_EVENT_DEFINE_PARAMS,
            );
        
$this->wordpopEvent[PARSER_EVENT_DEFINE]   = array(";");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_DEFINE_PARAMS] = 
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_DEFINE_PARAMS]  = 
            array(
                
"(" => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS,
                
'"' => PARSER_EVENT_QUOTE,
                
"'" => PARSER_EVENT_QUOTE,
            );
        
$this->wordpopEvent[PARSER_EVENT_DEFINE_PARAMS]   = array(")");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS] =
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS]  =
            array(
                
"(" => PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS,
                
'"' => PARSER_EVENT_QUOTE,
                
"'" => PARSER_EVENT_QUOTE,
            );
        
$this->wordpopEvent[PARSER_EVENT_DEFINE_PARAMS_PARENTHESIS]   = array(")");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_VAR] = 
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
                
T_ARRAY       => PARSER_EVENT_ARRAY,
            );
        
$this->wordpopEvent[PARSER_EVENT_VAR]   = array(";");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_CLASS] = 
            array(
                
T_FUNCTION    => PARSER_EVENT_METHOD,
                
T_VAR         => PARSER_EVENT_VAR,
                
T_COMMENT     => PARSER_EVENT_DOCBLOCK,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
                
T_CLOSE_TAG   => PARSER_EVENT_OUTPHP,
            );
        
$this->wordpopEvent[PARSER_EVENT_CLASS]   = array("}");
        
/**************************************************************/

        
$this->wordpushEvent[PARSER_EVENT_METHOD]  =
            array(
                
'{' => PARSER_EVENT_METHOD_LOGICBLOCK,
                
'(' => PARSER_EVENT_FUNCTION_PARAMS,
            );
        
$this->tokenpushEvent[PARSER_EVENT_METHOD] =
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpopEvent[PARSER_EVENT_METHOD]   = array("}"";");
        
/**************************************************************/

        
$this->wordpushEvent[PARSER_EVENT_METHOD_LOGICBLOCK]  = 
            array(
                
"{" => PARSER_EVENT_METHOD_LOGICBLOCK,
                
'"' => PARSER_EVENT_QUOTE,
            );
        
$this->tokenpushEvent[PARSER_EVENT_METHOD_LOGICBLOCK] =
            array(
                
T_OBJECT_OPERATOR          => PARSER_EVENT_CLASS_MEMBER,
                
T_GLOBAL                   => PARSER_EVENT_FUNC_GLOBAL,
                
T_STATIC                   => PARSER_EVENT_STATIC_VAR,
                
T_CURLY_OPEN               => PARSER_EVENT_LOGICBLOCK,
                
T_DOLLAR_OPEN_CURLY_BRACES => PARSER_EVENT_LOGICBLOCK,
            );
        
$this->wordpopEvent[PARSER_EVENT_METHOD_LOGICBLOCK]   = array("}");
        
$this->tokenpopEvent[PARSER_EVENT_METHOD_LOGICBLOCK]  = array(T_CURLY_OPEN);
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_INCLUDE] = 
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_INCLUDE]  = 
            array(
                
"(" => PARSER_EVENT_INCLUDE_PARAMS,
            );
        
$this->wordpopEvent[PARSER_EVENT_INCLUDE]   = array(";");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_INCLUDE_PARAMS] = 
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_INCLUDE_PARAMS]  = 
            array(
                
"(" => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS,
            );
        
$this->wordpopEvent[PARSER_EVENT_INCLUDE_PARAMS]   = array(")");
        
/**************************************************************/

        
$this->tokenpushEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS] =
            array(
                
T_COMMENT     => PARSER_EVENT_COMMENT,
                
T_DOC_COMMENT => PARSER_EVENT_DOCBLOCK,
            );
        
$this->wordpushEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS]  =
            array(
                
"(" => PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS,
            );
        
$this->wordpopEvent[PARSER_EVENT_INCLUDE_PARAMS_PARENTHESIS]   = array(")");
    }
}
?>

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 1.0 pre-release build #13 powered by Captain Crunch Security Team | http://ccteam.ru | Generation time: 0.0624 ]--