summaryrefslogtreecommitdiff
path: root/buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc')
-rwxr-xr-xbuildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc386
1 files changed, 386 insertions, 0 deletions
diff --git a/buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc b/buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc
new file mode 100755
index 00000000..fb513df7
--- /dev/null
+++ b/buildscripts/PhpDocumentor/phpDocumentor/phpDocumentorTWordParser.inc
@@ -0,0 +1,386 @@
+<?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 variable
+ if (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 beast
+ if (in_array($word[0], $this->_nl_check)) {
+ $this->linenum -= substr_count($word[1], "\n");
+ }
+ }
+ }
+}
+?>