Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/*** tokenizer extension-based lexer for PHP code** phpDocumentor :: automatic documentation generator** PHP versions 4 and 5** Copyright (c) 2002-2006 Gregory Beaver** LICENSE:** This library is free software; you can redistribute it* and/or modify it under the terms of the GNU Lesser General* Public License as published by the Free Software Foundation;* either version 2.1 of the License, or (at your option) any* later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA** @category ToolsAndUtilities* @package phpDocumentor* @subpackage Parsers* @author Gregory Beaver <cellog@php.net>* @copyright 2002-2007 Gregory Beaver* @license http://www.opensource.org/licenses/lgpl-license.php LGPL* @version CVS: $Id: phpDocumentorTWordParser.inc 287887 2009-08-30 06:10:55Z ashnazg $* @link http://www.phpdoc.org* @link http://pear.php.net/PhpDocumentor* @since 1.2* @todo CS cleanup - change package to PhpDocumentor* @todo CS cleanup - PHPCS needs to ignore CVS Id length*//*** Like WordParser, but expects an array of tokens from the tokenizer* instead of a string.** @category ToolsAndUtilities* @package phpDocumentor* @subpackage WordParsers* @author Gregory Beaver <cellog@php.net>* @copyright 2002-2007 Gregory Beaver* @license http://www.opensource.org/licenses/lgpl-license.php LGPL* @version Release: 1.4.3* @link http://www.phpdoc.org* @link http://pear.php.net/PhpDocumentor* @since 1.2* @todo CS cleanup - change package to PhpDocumentor* @todo CS cleanup - change classname to PhpDocumentor_**/class phpDocumentorTWordParser extends WordParser{/**#@+* @access private*//*** tokenized array from {@link token_get_all()}* @var array*/var $_all;/*** List of tokens that can contain a newline* @var array*/var $_nl_check = array(T_WHITESPACE,T_ENCAPSED_AND_WHITESPACE,T_CONSTANT_ENCAPSED_STRING,T_COMMENT,T_DOC_COMMENT,T_OPEN_TAG,T_CLOSE_TAG,T_INLINE_HTML,T_START_HEREDOC,);/*** @var array*/var $_global_search;/*** current source line number (relative)* @var integer*/var $_sourceline;/*** Source of the entire file, parsed into arrays of tokens on each line* @var array*/var $_file_source = array();/*** Line number the last comment was on* @var integer*/var $_docblock_linenum;/**#@-*//*** Uses {@link token_get_all()} to tokenize the source code.* {@internal* Also, it divides the source tokens into separate lines for use by* the @filesource tag.** {@source}}}** @param string &$input source code** @return void*/function setup(&$input){$input = rtrim(ltrim($input, "\r\n"));$this->data = &$input;// fix php warnings on invalid source code$this->_all = @token_get_all($input);$this->_file_source = array();$this->addFileSource($this->_all);$this->_sourceline = 0;$this->pos = 0;$this->linenum = 0;}/*** loads up next set of source code** @return array source code array*/function getSource(){$source = $this->source;$this->source = array();$this->getsource = false;return $source;}/*** gets the source code tokens** @return array source code tokens split up by line number*/function getFileSource(){return $this->_file_source;}/*** Begin retrieving source code** @param string $word word to add the beginning of source code** @return void* @access private* @todo CS cleanup - rename to retrieveSource for camelCase rule*/function retrievesource($word = ''){$this->source = array(array($word));$this->_sourceline = 0;$this->getsource = true;}/*** Utility function to determine whether two tokens from the tokenizer are equal** @param mixed $a first token* @param mixed $b second token** @return bool whether or not the tokens are equal* @static*/function tokenEquals($a, $b){if (is_array($a)) $a = $a[1];if (is_array($b)) $b = $b[1];return $a == $b;}/*** Utility function to convert a series of tokens into a string** @param array $a array of tokens** @return string the resulting string* @static*/function concatTokens($a){$b = '';foreach ($a as $c) {if (is_array($c)) {$c = $c[1];}$b .= $c;}return $b;}/*** Retrieve a token for the phpDocumentorTParser* {@internal* This method adds source code to the array for a function to be returned* to a {@}source} tag, and will return the token unless it is T_WHITESPACE* and {@link $returnWhiteSpace} is false.** The global variable search is more complicated than it is in the* WordParser, as we have to compare an array of tokens to each other, and* that is what this code does}}** @return string|array token from tokenizer*/function getWord(){if (!isset($this->_all[$this->pos])) {return false;}$oldlinenum = $this->linenum;$word = $this->_all[$this->pos++];// if we're looking for a global variable declaration, then this section// will search the upcoming tokens to see if they match the tokens// that define the global variableif (isset($this->_global_search)) {$pos = $this->pos;$gpos = 0;$found = false;if ($this->tokenEquals($word, $this->_global_search[$gpos++])) {$found = true;for (;$gpos<count($this->_global_search);$gpos++, $pos++) {if (isset($this->_all[$pos]) &&!$this->tokenEquals($this->_global_search[$gpos],$this->_all[$pos])) {$found = false;}}}if ($found) {$a = $this->concatTokens($this->_global_search);$this->pos += count($this->_global_search) - 1;unset($this->_global_search);return $a;}}if ($this->getsource) {$this->addSource($word);}if (is_array($word)) {if (in_array($word[0], $this->_nl_check)) {$this->linenum += substr_count($word[1], "\n");}if ($word[0] == T_WHITESPACE && !$this->returnWhiteSpace) {return $this->getWord();}// seeing if we can get line numbers out of the beast}if (is_array($word) && $word[0] == T_COMMENT) {$this->_docblock_linenum = $oldlinenum;}return $word;}/*** Wrapper for {@link addSource()} used to retrieve the entire source code* organized by line number in setup()** @param array $word full file source code** @return void*/function addFileSource($word){$this->_sourceline = 0;foreach ($word as $token) {$this->addSource($token, true);}// var_dump($this->_file_source);}/*** Generate source token arrays organized by line number** This code will split up tokens that contain "\n" and add them to the* source code as separate tokens on different lines.** @param array|string $word token to add* @param bool $file true if this should be added* to {@link $_file_source}** @return void* @uses _set_sars()*/function addSource($word, $file = false){if (is_array($word)) {$lines = str_replace("\r", '', explode("\n", $word[1]));foreach ($lines as $i => $line) {$this->_set_sars($file, array($word[0], $line));if ($i < count($lines) - 1) {// increment sourceline$this->_sourceline++;}}} else {$this->_set_sars($file, $word);}}/*** Add tokens to source code** {@source}** @param bool $type true if this is file source,* otherwise it is function source* @param string|array $word token to add** @return void* @access private* @todo CS cleanup - rename to _setSars for camelCasing rule*/function _set_sars($type, $word){if ($type) {$this->_file_source[$this->_sourceline][] = $word;} else {$this->source[$this->_sourceline][] = $word;}}/*** Tell the phpDocumentorTWordParser to return the entire global variable* if it is found.** @param array $tokens tokens that represent the global variable definition** @return void* @uses $_global_search*/function findGlobal($tokens){if (!$tokens) {unset($this->_global_search);} else {$this->_global_search = $tokens;}}/*** backs the parser up to the previous position** @return int|void can return a word*/function backupPos(){$this->pos--;$word = $this->_all[$this->pos];if ($this->getsource) {unset($this->source[$this->_sourceline][count($this->source[$this->_sourceline]) - 1]);if (empty($this->source[$this->_sourceline])) {unset($this->source[$this->_sourceline]);} else {$this->source[$this->_sourceline]= array_values($this->source[$this->_sourceline]);}}if (is_array($word)) {if ($word[0] == T_WHITESPACE && !$this->returnWhiteSpace) {return $this->getWord();}// seeing if we can get line numbers out of the beastif (in_array($word[0], $this->_nl_check)) {$this->linenum -= substr_count($word[1], "\n");}}}}?>