diff options
Diffstat (limited to 'paste/include/geshi/classes/php/class.geshiphpdoublestringcontext.php')
-rw-r--r-- | paste/include/geshi/classes/php/class.geshiphpdoublestringcontext.php | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/paste/include/geshi/classes/php/class.geshiphpdoublestringcontext.php b/paste/include/geshi/classes/php/class.geshiphpdoublestringcontext.php new file mode 100644 index 0000000..c7532eb --- /dev/null +++ b/paste/include/geshi/classes/php/class.geshiphpdoublestringcontext.php @@ -0,0 +1,182 @@ +<?php +/** + * GeSHi - Generic Syntax Highlighter + * + * For information on how to use GeSHi, please consult the documentation + * found in the docs/ directory, or online at http://geshi.org/docs/ + * + * This file is part of GeSHi. + * + * GeSHi is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GeSHi 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GeSHi; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * You can view a copy of the GNU GPL in the COPYING file that comes + * with GeSHi, in the docs/ directory. + * + * @package lang + * @author Nigel McNie <nigel@geshi.org> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL + * @copyright (C) 2005 Nigel McNie + * @version 1.1.0 + * + */ + +/** + * The GeSHiPHPDoubleStringContext class represents a PHP double string + * + * @package lang + * @author Nigel McNie <nigel@geshi.org> + * @since 1.1.0 + * @version 1.1.0 + * @see GeSHiStringContext, GeSHiContext + */ +class GeSHiPHPDoubleStringContext extends GeSHiStringContext +{ + /** + * A cached copy of the parent name + * @var string + * @access private + */ + var $_parentName; + + /** + * The regular expressions used to match variables + * in this context. + * + * {@internal Do Not Change These! The code logic + * depends on them, they are just assigned here so + * that they aren't assigned every time the + * _addParseData method is called}} + * + * @var array + * @access private + */ + var $_regexes = array( + 'REGEX#(\{?\$\$?\{?[a-zA-Z_][a-zA-Z0-9_]*\}?)#', + 'REGEX#(\{?\$\$?\{?[a-zA-Z_][a-zA-Z0-9_]*\[[\$a-zA-Z0-9_\s\[\]\']*\]\}?)#', + 'REGEX#(\{?)(\$\$?\{?[a-zA-Z_][a-zA-Z0-9_]*)(\s*->\s*)([a-zA-Z_][a-zA-Z0-9_]*)(\}?)#' + ); + + /** + * Loads data for a PHP Double String Context. + * + * @var GeSHiStyler The styler to be used for this context + */ + function load (&$styler) + { + parent::load($styler); + $this->_parentName = parent::getName(); + } + + /** + * Adds code detected as being in this context to the parse data + */ + function _addParseData ($code, $first_char_of_next_context = '') + { + geshi_dbg('GeSHiPHPDoubleStringContext::_addParseData(' . substr($code, 0, 15) . '...)', GESHI_DBG_PARSE); + + while (true) { + $earliest_data = array('pos' => false, 'len' => 0); + foreach ($this->_regexes as $regex) { + $data = geshi_get_position($code, $regex, 0, false, true); // request table + if ((false != $data['pos'] && false === $earliest_data['pos']) || + (false !== $data['pos']) && + (($data['pos'] < $earliest_data['pos']) || + ($data['pos'] == $earliest_data['pos'] && $data['len'] > $earliest_data['len']))) { + $earliest_data = $data; + } + } + + if (false === $earliest_data['pos']) { + // No more variables in this string + break; + } + + // bugfix: because we match a var, it might have been escaped. + // so only do to -1 so we can catch slash if it has been + $pos = ($earliest_data['pos']) ? $earliest_data['pos'] - 1 : 0; + $len = ($earliest_data['pos']) ? $earliest_data['len'] + 1 : $earliest_data['len']; + parent::_addParseData(substr($code, 0, $pos)); + + // Now the entire possible var is in: + $possible_var = substr($code, $pos, $len); + geshi_dbg('Found variable at position ' . $earliest_data['pos'] . '(' . $possible_var . ')', GESHI_DBG_PARSE); + + // Check that the dollar sign that started this variable was not escaped + //$first_part = str_replace('\\\\', '', substr($code, 0, $pos)); + //if ('\\' == substr($first_part, -1)) { + // If \\ before var and { is not next character after that... + if ('\\' == substr($possible_var, 0, 1) && '{' != substr($possible_var, 1, 1)) { + // This variable has been escaped, so add the escaped dollar sign + // as the correct context, and the rest of the variable (recurse to catch + // other variables inside this possible variable) + geshi_dbg('Variable was escaped', GESHI_DBG_PARSE); + $this->_styler->addParseData(substr($possible_var, 0, 2), $this->_parentName . '/esc'); + $this->_addParseData(substr($possible_var, 2)); + } else { + // Add first character that might have been a \\ but in fact isn't to the parent + // but only do it if we had to modify the position + if ('$' != substr($possible_var, 0, 1)) { + parent::_addParseData(substr($possible_var, 0, 1)); + $possible_var = substr($possible_var, 1); + } + + // Many checks could go in here... + // @todo [blocking 1.1.5] check for ${foo} variables: start { matched by end } + // because at the moment ${foo is matched for example. + if ('{' == substr($possible_var, 0, 1)) { + if ('}' == substr($possible_var, -1)) { + $start_brace = '{'; + } else { + $start_brace = ''; + parent::_addParseData('{'); + // remove brace from $possible_var. This will only be used + // if the variable isn't an OO variable anyway... + $possible_var = substr($possible_var, 1); + } + } else { + $start_brace = ''; + } + + if (isset($earliest_data['tab'][5])) { + // Then we matched off the third regex - the one that does objects + // The first { if there is one, and $this (which is in index 2 + $this->_styler->addParseData($start_brace . $earliest_data['tab'][2], $this->_parentName . '/var'); + // The -> with any whitespace around it + $this->_styler->addParseData($earliest_data['tab'][3], $this->_parentName . '/sym0'); + // The method name + $this->_styler->addParseData($earliest_data['tab'][4], $this->_parentName . '/oodynamic'); + // The closing }, if any + if ($earliest_data['tab'][5]) { + if ($start_brace) { + $this->_styler->addParseData($earliest_data['tab'][5], $this->_parentName . '/var'); + } else { + parent::_addParseData('}'); + } + } + } else { + $this->_styler->addParseData($possible_var, $this->_parentName . '/var'); + } + + } + + // Chop off what we have done + $code = substr($code, $earliest_data['pos'] + $earliest_data['len']); + } + // Add the rest + parent::_addParseData($code, $first_char_of_next_context); + } +} + +?> |