summaryrefslogtreecommitdiffstats
path: root/paste/include/geshi/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'paste/include/geshi/scripts')
-rw-r--r--paste/include/geshi/scripts/get-keywords/docs/README23
-rw-r--r--paste/include/geshi/scripts/get-keywords/get-keywords.php143
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/css/class.csskeywordgetter.php101
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/css/class.cssxmlparser.php112
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/html/class.htmlkeywordgetter.php96
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptkeywordgetter.php121
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptxmlparser.php107
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/php/class.phpkeywordgetter.php120
-rw-r--r--paste/include/geshi/scripts/get-keywords/languages/php/class.phpxmlparser.php107
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/class.keywordgetter.php184
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/class.keywordgettererror.php97
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/class.keywordgetterstrategy.php105
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/class.keywordxmlparser.php58
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/functions.get-keywords.php95
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/pear/Console/Getopt.php251
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/pear/PEAR.php1055
-rw-r--r--paste/include/geshi/scripts/get-keywords/lib/pear/XML/Parser.php684
17 files changed, 3459 insertions, 0 deletions
diff --git a/paste/include/geshi/scripts/get-keywords/docs/README b/paste/include/geshi/scripts/get-keywords/docs/README
new file mode 100644
index 0000000..ad60041
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/docs/README
@@ -0,0 +1,23 @@
+get-keywords.php is a script to get a current list of all the keywords for a particular language.
+
+Currently it's very alpha, just like the rest of this stuff. I run Debian and KDE, and so I have
+access to the katepart XML files in /usr/share/apps/katepart/syntax. Thus, the keyword getter
+strategies that use parser those files work for me.
+
+If you know where these files are online, feel free to write a strategy implementation that gets
+the file from the 'net and uses that (perhaps from KDE SVN?).
+
+No real documentation I'm afraid... just look through the code and look at how the various keyword
+strategy stuff is implemented in language/*/class.*getterstrategy.php.
+
+Oh, and to use:
+
+php get-keywords.php [lang] [group[
+php get-keywords.php --list-langs
+php get-keywords.php --list-groups [language]
+
+In the future:
+
+php get-keywords.php ... --output-format=[HTML|text|special]
+
+ $Id: README,v 1.2 2005/06/09 13:31:35 oracleshinoda Exp $
diff --git a/paste/include/geshi/scripts/get-keywords/get-keywords.php b/paste/include/geshi/scripts/get-keywords/get-keywords.php
new file mode 100644
index 0000000..c5d4534
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/get-keywords.php
@@ -0,0 +1,143 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+define('GESHI_GET_KEYWORDS_VERSION', '0.1.2');
+
+/**
+ * Script to get keywords for languages from katepart kde package
+ *
+ * Usage:
+ * get-keywords.php css properties
+ * get-keywords.php css attributes
+ * get-keywords.php php statements
+ * get-keywords.php php keywords
+ * get-keywords.php --list-langs
+ * get-keywords.php --list-groups css
+ * ...
+ *
+ * @todo [blocking 1.1.1] customise output format options (one per line, formatted for pasting into lang file, HTML)
+ */
+
+// As always...
+error_reporting(E_ALL);
+
+/** Get standard functions */
+require_once 'lib/functions.get-keywords.php';
+/** Get the KeywordGetter class */
+require_once 'lib/class.keywordgetter.php';
+/** Get the console options reader class */
+require_once 'lib/pear/Console/Getopt.php';
+
+// Parse command line options
+$opt_parser =& new Console_Getopt;
+$args = $opt_parser->getopt($argv, 'hv', array('help', 'version', 'list-groups=', 'list-langs'));
+
+// Print error if there was an argument not recognised
+if (PEAR::isError($args)) {
+ echo str_replace('Console_Getopt', $argv[0], $args->getMessage()) . '
+Try `' . $argv[0] . " --help' for more information.\n";
+ exit(1);
+}
+
+
+//
+// Do the easy options first
+//
+
+// Check for help
+if (get_option(array('h', 'help'), $args)) {
+ show_help();
+ exit;
+}
+
+// Check for version
+if (get_option(array('v', 'version'), $args)) {
+ show_version();
+ exit;
+}
+
+// Check for --list-langs
+if (get_option('list-langs', $args)) {
+ $languages = KeywordGetter::getSupportedLanguages();
+ print_r($languages);
+ exit;
+}
+
+// Check for --list-groups
+if (false !== ($language = get_option('list-groups', $args))) {
+ $kwgetter =& KeywordGetter::factory($language);
+ if (KeywordGetter::isError($kwgetter)) {
+ die($kwgetter->lastError());
+ }
+ print_r($kwgetter->getValidKeywordGroups());
+ exit;
+}
+
+
+//
+// Simple options are not being used - time to actually
+// get keywords if we can
+//
+
+// If we don't have a language and a keyword type, show the help and exit
+if (!isset($argv[1]) || !isset($argv[2])) {
+ show_help();
+ exit;
+}
+
+// Create a new keyword getter. If this language is not supported, exit
+$kwgetter =& KeywordGetter::factory($argv[1]);
+if (KeywordGetter::isError($kwgetter)) {
+ die($kwgetter->lastError());
+}
+
+// Get the keywords based on the required keyword group. If there
+// is an error getting the keywords, print it and exit
+$keywords = $kwgetter->getKeywords($argv[2]);
+if (KeywordGetter::isError($keywords)) {
+ die($keywords->lastError());
+}
+
+// Simply echo to standard out, although a todo would be to make this customisable
+// @todo [blocking 1.1.1] Customise the output of keywords (to a file perhaps?)
+$result = '';
+$spaces = ' ';
+foreach ($keywords as $keyword) {
+ $result .= "'".$keyword . "', ";
+}
+$result = wordwrap($result, 75);
+$result = $spaces . str_replace("\n", "\n$spaces", $result);
+echo substr($result, 0, -2) . "\n";
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/css/class.csskeywordgetter.php b/paste/include/geshi/scripts/get-keywords/languages/css/class.csskeywordgetter.php
new file mode 100644
index 0000000..397d2ea
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/css/class.csskeywordgetter.php
@@ -0,0 +1,101 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the CSS XML parser used for getting CSS keywords */
+require_once 'class.cssxmlparser.php';
+
+/**
+ * Implementation of KeywordGetterStrategy for the CSS language.
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.0
+ * @version 1.1.0
+ * @see KeywordGetterStrategy
+ */
+class cssKeywordGetterStrategy extends KeywordGetterStrategy
+{
+ /**
+ * Creates a new CSS Keyword Getter Strategy. Defines allowed
+ * keyword groups for CSS.
+ */
+ function cssKeywordGetterStrategy ()
+ {
+ $this->_language = 'CSS';
+ $this->_validKeywordGroups = array(
+ 'properties', 'types', 'colors', 'paren', 'mediatypes', 'pseudoclasses'
+ );
+ }
+
+ /**
+ * Implementation of abstract method {@link KeywordGetterStrategy::getKeywords()}
+ * to get keywords for CSS
+ *
+ * @param string The keyword group to get keywords for. If not a valid keyword
+ * group an error is returned
+ * @return array The keywords for CSS for the specified keyword group
+ * @throws KeywordGetterError
+ */
+ function getKeywords ($keyword_group)
+ {
+ // Check that keyword group listed is valid
+ $group_valid = $this->keywordGroupIsValid($keyword_group);
+ if (KeywordGetter::isError($group_valid)) {
+ return $group_valid;
+ }
+
+ $xml_parser =& new CSS_XML_Parser;
+ $xml_parser->setKeywordGroup($keyword_group);
+
+ // Set the file to parse to Nigel's local CSS syntax file.
+ // @todo [blocking 1.1.9] Find online if possible (check kde.org) and link to that
+ // @todo [blocking 1.1.9] Make configurable the file? Have at least hardcoded ones for me and for the web
+ $result =& $xml_parser->setInputFile('/usr/share/apps/katepart/syntax/css.xml');
+ if (PEAR::isError($result)) {
+ return new KeywordGetterError(FILE_UNAVAILABLE, $this->_language,
+ array('{FILENAME}' => '/usr/share/apps/katepart/syntax/css.xml'));
+ }
+
+ $result =& $xml_parser->parse();
+ if (PEAR::isError($result)) {
+ return new KeywordGetterError(PARSE_ERROR, $this->_language,
+ array('{PARSE_ERROR}' => $result->getMessage()));
+ }
+
+ $keywords =& $xml_parser->getKeywords();
+ return array_unique($keywords);
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/css/class.cssxmlparser.php b/paste/include/geshi/scripts/get-keywords/languages/css/class.cssxmlparser.php
new file mode 100644
index 0000000..dd2f576
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/css/class.cssxmlparser.php
@@ -0,0 +1,112 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the Keyword XML Parser class for use by CSS_XML_Parser */
+require_once 'lib/class.keywordxmlparser.php';
+
+/**
+ * Extends Keyword_XML_Parser as a class to get CSS keywords from
+ * a katepart syntax XML file
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.0
+ * @version 1.1.0
+ * @see Keyword_XML_Parser
+ */
+class CSS_XML_Parser extends Keyword_XML_Parser
+{
+ /**#@+
+ * @var boolean
+ * @access private
+ */
+ /**
+ * Whether we are currently in the block of the XML file
+ * with items of the correct type
+ */
+ var $_valid;
+
+ /**
+ * Whether we should add the next CDATA we encounter. This
+ * is made true when we encounter an ITEM node
+ */
+ var $_addKeyword;
+
+ /**
+ * A list of keywords to ignore
+ * @var array
+ */
+ var $_keywordsToIgnore = array('100', '200', '300', '400', '500', '600', '700', '800', '900');
+ /**#@-*/
+
+ /**
+ * Called when the start tag of a node of the
+ * XML document is encountered
+ *
+ * @param resource XML Parser Resource
+ * @param string The name of the node encountered
+ * @param array Any attributes the node has
+ */
+ function startHandler ($xp, $name, $attributes)
+ {
+ if ('LIST' == $name) {
+ if ($attributes['NAME'] == $this->_keywordGroup) {
+ $this->_valid = true;
+ } else {
+ $this->_valid = false;
+ }
+ }
+ if ($this->_valid && 'ITEM' == $name) {
+ $this->_addKeyword = true;
+ } else {
+ $this->_addKeyword = false;
+ }
+ }
+
+ /**
+ * Called when CDATA is encountered
+ *
+ * @param resource XML Parser resource
+ * @param string The CDATA encountered
+ */
+ function cdataHandler ($xp, $cdata)
+ {
+ if ($this->_addKeyword && !in_array(trim($cdata), $this->_keywordsToIgnore)) {
+ array_push($this->_keywords, trim($cdata));
+ }
+ $this->_addKeyword = false;
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/html/class.htmlkeywordgetter.php b/paste/include/geshi/scripts/get-keywords/languages/html/class.htmlkeywordgetter.php
new file mode 100644
index 0000000..a8a8a7e
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/html/class.htmlkeywordgetter.php
@@ -0,0 +1,96 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/**
+ * Implementation of KeywordGetterStrategy for the HTML language.
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.1
+ * @version 1.1.0
+ * @see KeywordGetterStrategy
+ */
+class htmlKeywordGetterStrategy extends KeywordGetterStrategy
+{
+ /**
+ * The file from which the attribute names will be raided
+ * @var string
+ * @access private
+ */
+ var $_fileName = '/usr/share/doc/w3-recs/RECS/html4/index/attributes.html';
+
+ /**
+ * Creates a new HTML Keyword Getter Strategy. Defines allowed
+ * keyword groups for HTML.
+ */
+ function htmlKeywordGetterStrategy ()
+ {
+ $this->_language = 'HTML';
+ $this->_validKeywordGroups = array(
+ 'attributes'
+ );
+ }
+
+ /**
+ * Implementation of abstract method {@link KeywordGetterStrategy::getKeywords()}
+ * to get keywords for HTML
+ *
+ * @param string The keyword group to get keywords for. If not a valid keyword
+ * group an error is returned
+ * @return array The keywords for HTML for the specified keyword group
+ * @throws KeywordGetterError
+ */
+ function getKeywords ($keyword_group)
+ {
+ // Check that keyword group listed is valid
+ $group_valid = $this->keywordGroupIsValid($keyword_group);
+ if (KeywordGetter::isError($group_valid)) {
+ return $group_valid;
+ }
+
+ if (!is_readable($this->_fileName)) {
+ return new KeywordGetterError(FILE_UNAVAILABLE, $this->_language,
+ array('{FILENAME}' => $this->_fileName));
+ }
+
+ $file_contents = implode('', file($this->_fileName));
+ $matches = array();
+ preg_match_all('#<td title="Name"><a[^>]+>\s*([a-z\-]+)#', $file_contents, $matches);
+ $keywords = $matches[1];
+
+ return array_unique($keywords);
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptkeywordgetter.php b/paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptkeywordgetter.php
new file mode 100644
index 0000000..b25c26e
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptkeywordgetter.php
@@ -0,0 +1,121 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the Javascript XML parser used for getting Javascript keywords */
+require_once 'class.javascriptxmlparser.php';
+
+/**
+ * Implementation of KeywordGetterStrategy for the Javascript language.
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.1
+ * @version 1.1.0
+ * @see KeywordGetterStrategy
+ */
+class javascriptKeywordGetterStrategy extends KeywordGetterStrategy
+{
+
+ /**
+ * Extra keywords missed by the language file
+ *
+ * @var array
+ * @access private
+ */
+ var $_missedKeywords = array(
+ 'keywords' => array(
+ 'null'
+ ),
+ 'methods' => array(
+ 'getElementById'
+ )
+ );
+
+ /**
+ * Creates a new Javascript Keyword Getter Strategy. Defines allowed
+ * keyword groups for Javascript.
+ */
+ function javascriptKeywordGetterStrategy ()
+ {
+ $this->_language = 'Javascript';
+ $this->_validKeywordGroups = array(
+ 'keywords', 'functions', 'objects', 'math', 'events', 'methods'
+ );
+ }
+
+ /**
+ * Implementation of abstract method {@link KeywordGetterStrategy::getKeywords()}
+ * to get keywords for Javascript
+ *
+ * @param string The keyword group to get keywords for. If not a valid keyword
+ * group an error is returned
+ * @return array The keywords for Javascript for the specified keyword group
+ * @throws KeywordGetterError
+ */
+ function getKeywords ($keyword_group)
+ {
+ // Check that keyword group listed is valid
+ $group_valid = $this->keywordGroupIsValid($keyword_group);
+ if (KeywordGetter::isError($group_valid)) {
+ return $group_valid;
+ }
+
+ $xml_parser =& new Javascript_XML_Parser;
+ $xml_parser->setKeywordGroup($keyword_group);
+
+ // Set the file to parse to Nigel's local Javascript syntax file.
+ $result =& $xml_parser->setInputFile('/usr/share/apps/katepart/syntax/javascript.xml');
+ if (PEAR::isError($result)) {
+ return new KeywordGetterError(FILE_UNAVAILABLE, $this->_language,
+ array('{FILENAME}' => '/usr/share/apps/katepart/syntax/javascript.xml'));
+ }
+
+ $result =& $xml_parser->parse();
+ if (PEAR::isError($result)) {
+ return new KeywordGetterError(PARSE_ERROR, $this->_language,
+ array('{PARSE_ERROR}' => $result->getMessage()));
+ }
+
+ $keywords =& $xml_parser->getKeywords();
+ //@todo [blocking 1.1.1] move missedkeywords functionality into common place
+ // as well as unique and sorts
+ if (isset($this->_missedKeywords[$keyword_group])) {
+ $keywords = array_merge($keywords, $this->_missedKeywords[$keyword_group]);
+ }
+ sort($keywords);
+ return array_unique($keywords);
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptxmlparser.php b/paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptxmlparser.php
new file mode 100644
index 0000000..a427494
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/javascript/class.javascriptxmlparser.php
@@ -0,0 +1,107 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the Keyword XML Parser class for use by Javascript_XML_Parser */
+require_once 'lib/class.keywordxmlparser.php';
+
+/**
+ * Extends Keyword_XML_Parser as a class to get Javascript keywords from
+ * a katepart syntax XML file
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.1
+ * @version 1.1.0
+ * @see Keyword_XML_Parser
+ */
+class Javascript_XML_Parser extends Keyword_XML_Parser
+{
+ /**#@+
+ * @var boolean
+ * @access private
+ */
+ /**
+ * Whether we are currently in the block of the XML file
+ * with items of the correct type
+ */
+ var $_valid;
+
+ /**
+ * Whether we should add the next CDATA we encounter. This
+ * is made true when we encounter an ITEM node
+ */
+ var $_addKeyword;
+
+ /**#@-*/
+
+ /**
+ * Called when the start tag of a node of the
+ * XML document is encountered
+ *
+ * @param resource XML Parser resource
+ * @param string The name of the node encountered
+ * @param array Any attributes the node has
+ */
+ function startHandler ($xp, $name, $attributes)
+ {
+ if ('LIST' == $name) {
+ if ($attributes['NAME'] == $this->_keywordGroup) {
+ $this->_valid = true;
+ } else {
+ $this->_valid = false;
+ }
+ }
+ if ($this->_valid && 'ITEM' == $name) {
+ $this->_addKeyword = true;
+ } else {
+ $this->_addKeyword = false;
+ }
+ }
+
+ /**
+ * Called when CDATA is encountered
+ *
+ * @param resource XML Parser Resource
+ * @param string The CDATA encountered
+ */
+ function cdataHandler ($xp, $cdata)
+ {
+ if ($this->_addKeyword) {
+ array_push($this->_keywords, trim($cdata));
+ }
+ $this->_addKeyword = false;
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/php/class.phpkeywordgetter.php b/paste/include/geshi/scripts/get-keywords/languages/php/class.phpkeywordgetter.php
new file mode 100644
index 0000000..ede4d05
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/php/class.phpkeywordgetter.php
@@ -0,0 +1,120 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the PHP XML parser used for getting PHP keywords */
+require_once 'class.phpxmlparser.php';
+
+/**
+ * Implementation of KeywordGetterStrategy for the PHP language.
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.1
+ * @version 1.1.0
+ * @see KeywordGetterStrategy
+ */
+class phpKeywordGetterStrategy extends KeywordGetterStrategy
+{
+ /**
+ * Creates a new PHP Keyword Getter Strategy. Defines allowed
+ * keyword groups for PHP.
+ */
+ function phpKeywordGetterStrategy ()
+ {
+ $this->_language = 'PHP';
+ $this->_validKeywordGroups = array(
+ 'controlstructures', 'keywords', 'functions'
+ );
+ }
+
+ /**
+ * Implementation of abstract method {@link KeywordGetterStrategy::getKeywords()}
+ * to get keywords for PHP
+ *
+ * @param string The keyword group to get keywords for. If not a valid keyword
+ * group an error is returned
+ * @return array The keywords for PHP for the specified keyword group
+ * @throws KeywordGetterError
+ */
+ function getKeywords ($keyword_group)
+ {
+ // Check that keyword group listed is valid
+ $group_valid = $this->keywordGroupIsValid($keyword_group);
+ if (KeywordGetter::isError($group_valid)) {
+ return $group_valid;
+ }
+
+ // Convert keyword group to correct name
+ // for XML parser if needed
+ if ('controlstructures' == $keyword_group) {
+ $keyword_group = 'control structures';
+ }
+
+ $xml_parser =& new PHP_XML_Parser;
+ $xml_parser->setKeywordGroup($keyword_group);
+
+ // Set the file to parse to Nigel's local PHP syntax file.
+ $result =& $xml_parser->setInputFile('/usr/share/apps/katepart/syntax/php.xml');
+ if (PEAR::isError($result)) {
+ return new KeywordGetterError(FILE_UNAVAILABLE, $this->_language,
+ array('{FILENAME}' => '/usr/share/apps/katepart/syntax/php.xml'));
+ }
+
+ $result =& $xml_parser->parse();
+ if (PEAR::isError($result)) {
+ return new KeywordGetterError(PARSE_ERROR, $this->_language,
+ array('{PARSE_ERROR}' => $result->getMessage()));
+ }
+
+ $keywords =& $xml_parser->getKeywords();
+
+ // Add some keywords that don't seem to be in the XML file
+ if ('control structures' == $keyword_group) {
+ array_push($keywords, 'endwhile', 'endif', 'endswitch', 'endforeach');
+ } elseif ('keywords' == $keyword_group) {
+ array_push($keywords, '__FUNCTION__', '__CLASS__', '__METHOD__',
+ 'DEFAULT_INCLUDE_PATH', 'PEAR_INSTALL_DIR', 'PEAR_EXTENSION_DIR',
+ 'PHP_EXTENSION_DIR', 'PHP_BINDIR', 'PHP_LIBDIR', 'PHP_DATADIR',
+ 'PHP_SYSCONFDIR', 'PHP_LOCALSTATEDIR', 'PHP_CONFIG_FILE_PATH',
+ 'PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT',
+ 'PHP_OUTPUT_HANDLER_END', 'E_STRICT', 'E_CORE_ERROR', 'E_CORE_WARNING',
+ 'E_COMPILE_ERROR', 'E_COMPILE_WARNING');
+ }
+ sort($keywords);
+
+ return array_unique($keywords);
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/languages/php/class.phpxmlparser.php b/paste/include/geshi/scripts/get-keywords/languages/php/class.phpxmlparser.php
new file mode 100644
index 0000000..26d2641
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/languages/php/class.phpxmlparser.php
@@ -0,0 +1,107 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the Keyword XML Parser class for use by CSS_XML_Parser */
+require_once 'lib/class.keywordxmlparser.php';
+
+/**
+ * Extends Keyword_XML_Parser as a class to get PHP keywords from
+ * a katepart syntax XML file
+ *
+ * @package scripts
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.1
+ * @version 1.1.0
+ * @see Keyword_XML_Parser
+ */
+class PHP_XML_Parser extends Keyword_XML_Parser
+{
+ /**#@+
+ * @var boolean
+ * @access private
+ */
+ /**
+ * Whether we are currently in the block of the XML file
+ * with items of the correct type
+ */
+ var $_valid;
+
+ /**
+ * Whether we should add the next CDATA we encounter. This
+ * is made true when we encounter an ITEM node
+ */
+ var $_addKeyword;
+
+ /**#@-*/
+
+ /**
+ * Called when the start tag of a node of the
+ * XML document is encountered
+ *
+ * @param resource XML Parser resource
+ * @param string The name of the node encountered
+ * @param array Any attributes the node has
+ */
+ function startHandler ($xp, $name, $attributes)
+ {
+ if ('LIST' == $name) {
+ if ($attributes['NAME'] == $this->_keywordGroup) {
+ $this->_valid = true;
+ } else {
+ $this->_valid = false;
+ }
+ }
+ if ($this->_valid && 'ITEM' == $name) {
+ $this->_addKeyword = true;
+ } else {
+ $this->_addKeyword = false;
+ }
+ }
+
+ /**
+ * Called when CDATA is encountered
+ *
+ * @param resource XML Parser resource
+ * @param string The CDATA encountered
+ */
+ function cdataHandler ($xp, $cdata)
+ {
+ if ($this->_addKeyword) {
+ array_push($this->_keywords, trim($cdata));
+ }
+ $this->_addKeyword = false;
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/class.keywordgetter.php b/paste/include/geshi/scripts/get-keywords/lib/class.keywordgetter.php
new file mode 100644
index 0000000..8e1f3af
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/class.keywordgetter.php
@@ -0,0 +1,184 @@
+<?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 scripts
+ * @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 language to get keywords for is not supported by this tool */
+define('LANG_NOT_SUPPORTED', -1);
+/** The keyword group asked for is not supported by the language */
+define('INVALID_KEYWORD_GROUP', -2);
+/** There was a parse error parsing an XML document for keywords */
+define('PARSE_ERROR', -3);
+
+/**#@+
+ * @access private
+ */
+/** The strategy object used to get keywords is invalid */
+define('INVALID_STRATEGY', -4);
+/**#@-*/
+
+/** Class that handles errors */
+require_once 'class.keywordgettererror.php';
+
+/** Class that is the root of the keyword getting strategy */
+require_once 'class.keywordgetterstrategy.php';
+
+/**
+ * The KeywordGetter class. The get-keywords program is a
+ * frontend to this class.
+ *
+ * @author Nigel McNie
+ * @since 0.1.0
+ */
+class KeywordGetter
+{
+ /**#@+
+ * @access private
+ */
+ /**
+ * The language being used
+ * @var string
+ */
+ var $_language;
+
+ /**
+ * The keyword strategy to use
+ * @var KeywordGetterStrategy
+ */
+ var $_keywordStrategy;
+ /**#@-*/
+
+ /**
+ * Constructor
+ *
+ * @param KeywordGetterStrategy The strategy to use to get keywords
+ * @private
+ * {@internal Yes, that's right, PRIVATE. Use KeywordGetter::factory
+ * to create new KeywordGetters}}
+ */
+ function KeywordGetter ($kwstrategy)
+ {
+ if (!is_a($kwstrategy, 'KeywordGetterStrategy')) {
+ return new KeywordGetterError(INVALID_STRATEGY, $this->_language);
+ }
+ $this->_keywordStrategy = $kwstrategy;
+ }
+
+ /**
+ * Creates a new keyword getter based on the incoming language
+ *
+ * @param string The language to get keywords for
+ * @static
+ */
+ function &factory ($language)
+ {
+ if (!file_exists('languages/' . $language . '/class.' . $language . 'keywordgetter.php')) {
+ return new KeywordGetterError(LANG_NOT_SUPPORTED, $language);
+ }
+ $this->_language = $language;
+
+ /** Get the requested language */
+ require_once 'languages/' . $language . '/class.' . $language . 'keywordgetter.php';
+
+ $class = $language . 'KeywordGetterStrategy';
+ if (!class_exists($class)) {
+ return new KeywordGetterError(LANG_NOT_SUPPORTED, $language);
+ }
+
+ return new KeywordGetter(new $class);
+ }
+
+ /**
+ * Returns whether the passed object is an error object
+ *
+ * @param mixed The variable that may be an error object
+ * @return boolean Whether the variable is an error object
+ * @static
+ */
+ function isError ($possible_err_object)
+ {
+ return is_a($possible_err_object, 'KeywordGetterError');
+ }
+
+ /**
+ * Gets the keywords for a language
+ *
+ * @param The keyword group to get keywords for
+ * @return array An array of the keywords for this language/keyword group
+ */
+ function &getKeywords ($keyword_group)
+ {
+ return $this->_keywordStrategy->getKeywords($keyword_group);
+ }
+
+ /**
+ * Gets valid keyword groups for a language
+ *
+ * @return array An array of valid keyword groups for the language
+ * that this KeywordGetter is representing
+ */
+ function &getValidKeywordGroups ()
+ {
+ return $this->_keywordStrategy->getValidKeywordGroups();
+ }
+
+ /**
+ * Gets a list of all supported languages
+ *
+ * @return array
+ * @static
+ */
+ function &getSupportedLanguages ()
+ {
+ $files_to_ignore = array('.', '..', 'CVS');
+ $supported_languages = array();
+
+ $dh = @opendir('languages');
+ if (false === $dh) {
+ return false;
+ }
+
+ while (false !== ($file = @readdir($dh))) {
+ if (in_array($file, $files_to_ignore)) {
+ continue;
+ }
+ if (file_exists('languages/' . $file . '/class.' . $file . 'keywordgetter.php')) {
+ array_push($supported_languages, $file);
+ }
+ }
+
+ return $supported_languages;
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/class.keywordgettererror.php b/paste/include/geshi/scripts/get-keywords/lib/class.keywordgettererror.php
new file mode 100644
index 0000000..ac12a9a
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/class.keywordgettererror.php
@@ -0,0 +1,97 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+class KeywordGetterError
+{
+
+ /**
+ * The error message
+ * @var string
+ */
+ var $_errorMessage;
+
+ /**
+ * Possible error messages
+ * @var array
+ * @static
+ */
+ var $_errorMessages = array(
+ LANG_NOT_SUPPORTED =>
+ 'The language "{LANGUAGE}" is not supported by this tool at this time
+(see php $0 list-langs for a list of supported languages)',
+ INVALID_STRATEGY =>
+ 'The strategy object given is invalid (this is an internal error,
+if you see this please send a bug report to nigel@geshi.org)',
+ INVALID_KEYWORD_GROUP =>
+ 'The keyword group "{KEYWORD_GROUP}" given is invalid for the language "{LANGUAGE}"',
+ PARSE_ERROR =>
+ 'There was a parsing error while trying to parse the XML language file: {MESSAGE}',
+ FILE_UNAVAILABLE =>
+ 'The file {FILENAME} is unavailable for retrieving keywords from. Does it exist/is it readable?'
+ );
+
+ /**
+ * Creates a new KeywordGetterError object
+ *
+ * @param int The error type of this error
+ * @param string The language being used
+ */
+ function KeywordGetterError ($error_type, $language, $other_info = array())
+ {
+ global $argv;
+ $message = $this->_errorMessages[$error_type];
+ $matches = array(
+ '{LANGUAGE}' => $language,
+ '$0' => $argv[0]
+ );
+ $matches = array_merge($matches, $other_info);
+
+ $message = str_replace(array_keys($matches), $matches, $message);
+ $this->_errorMessage = 'Error: ' . $message . "\n";
+ }
+
+ /**
+ * Returns the last error
+ *
+ * @return string
+ */
+ function lastError ()
+ {
+ return $this->_errorMessage;
+ }
+}
+
+?>
+
diff --git a/paste/include/geshi/scripts/get-keywords/lib/class.keywordgetterstrategy.php b/paste/include/geshi/scripts/get-keywords/lib/class.keywordgetterstrategy.php
new file mode 100644
index 0000000..a586507
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/class.keywordgetterstrategy.php
@@ -0,0 +1,105 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/**
+ * Class that is overridden to provide an implementation of getting keywords
+ * for a particular language
+ *
+ * @author Nigel McNie <nigel@geshi.org>
+ * @since 0.1.0
+ * @abstract
+ */
+class KeywordGetterStrategy
+{
+
+ /**#@+
+ * @access private
+ */
+
+ /**
+ * The language that this getter is getting keywords for
+ * @var string
+ */
+ var $_language;
+
+ /**
+ * The keyword group within the language that this getter is
+ * getting keywords for
+ * @var string
+ */
+ var $_keywordGroup;
+
+ /**
+ * The keyword groups that are valid (supported) by this strategy
+ * @var array
+ */
+ var $_validKeywordGroups;
+
+ /**
+ * used?
+ */
+ var $_keywords = array();
+
+ /**#@-*/
+
+ /**
+ * @abstract
+ */
+ function getKeywords ($keyword_group)
+ {
+ return new KeywordGetterError(LANG_NOT_SUPPORTED, $this->_language);
+ }
+
+ /**
+ * @return array
+ */
+ function getValidKeywordGroups ()
+ {
+ return $this->_validKeywordGroups;
+ }
+
+ /**
+ * Checks whether the keyword group asked for is valid
+ */
+ function keywordGroupIsValid ($keyword_group) {
+ if (in_array($keyword_group, $this->_validKeywordGroups)) {
+ return true;
+ }
+ return new KeywordGetterError(INVALID_KEYWORD_GROUP, $this->_language,
+ array('{KEYWORD_GROUP}' => $keyword_group));
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/class.keywordxmlparser.php b/paste/include/geshi/scripts/get-keywords/lib/class.keywordxmlparser.php
new file mode 100644
index 0000000..1c0ea72
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/class.keywordxmlparser.php
@@ -0,0 +1,58 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/** Get the XML parser class */
+require_once 'lib/pear/XML/Parser.php';
+
+/**
+ * @todo [blocking 1.1.9] comment
+ */
+class Keyword_XML_Parser extends XML_Parser
+{
+ var $_keywordGroup;
+ var $_keywords = array();
+
+ function setKeywordGroup ($keyword_group)
+ {
+ $this->_keywordGroup = $keyword_group;
+ }
+
+ function &getKeywords ()
+ {
+ return $this->_keywords;
+ }
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/functions.get-keywords.php b/paste/include/geshi/scripts/get-keywords/lib/functions.get-keywords.php
new file mode 100644
index 0000000..9116c36
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/functions.get-keywords.php
@@ -0,0 +1,95 @@
+<?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 scripts
+ * @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
+ *
+ */
+
+/**
+ * Shows help text for get-keywords script and exits
+ *
+ * @since 0.1.0
+ */
+function show_help ()
+{
+ global $argv;
+ print <<<EOF
+Usage: php $argv[0] language keyword-group
+Language is a language supported by GeSHi and
+that also has a katepart language file or similar.
+
+Options:
+ -h --help Show this help text
+ -v --version Show version information
+ --list-groups [lang] List keyword groups for language [lang]
+ --list-langs List supported languages
+
+EOF;
+ exit;
+}
+
+/**
+ * Shows the version number of get-keywords and exits
+ *
+ * @since 0.1.0
+ */
+function show_version ()
+{
+ print GESHI_GET_KEYWORDS_VERSION .
+ "\n\$Date: 2005/07/25 07:03:11 $\n";
+ exit;
+}
+
+/**
+ * Checks whether the specified options were passed on the command
+ * line, and returns the value of the option if specified.
+ *
+ * @param string|array The options to check for
+ * @param array The arguments as parsed by Console_Getopt::getopt()
+ * @return True if the argument exists, the value of the argument if there is a value, else false
+ * @since 0.1.0
+ * @todo [blocking 1.1.5] Move this into console_getopt class
+ * @todo [blocking 1.1.5] Check about what is returned when option does exist
+ */
+function get_option ($options, $args)
+{
+ $options = (array) $options;
+ $args = $args[0];
+ foreach ($args as $arg) {
+ foreach ($options as $option) {
+ if ($option == $arg[0] || '--' . $option == $arg[0]) {
+ return ($arg[1]) ? $arg[1] : true;
+ }
+ }
+ }
+ return false;
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/pear/Console/Getopt.php b/paste/include/geshi/scripts/get-keywords/lib/pear/Console/Getopt.php
new file mode 100644
index 0000000..723ef12
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/pear/Console/Getopt.php
@@ -0,0 +1,251 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at the following url: |
+// | http://www.php.net/license/3_0.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Author: Andrei Zmievski <andrei@php.net> |
+// +----------------------------------------------------------------------+
+//
+// $Id: Getopt.php,v 1.1 2005/06/04 04:04:00 oracleshinoda Exp $
+
+require_once 'lib/pear/PEAR.php';
+
+/**
+ * Command-line options parsing class.
+ *
+ * @author Andrei Zmievski <andrei@php.net>
+ *
+ */
+class Console_Getopt {
+ /**
+ * Parses the command-line options.
+ *
+ * The first parameter to this function should be the list of command-line
+ * arguments without the leading reference to the running program.
+ *
+ * The second parameter is a string of allowed short options. Each of the
+ * option letters can be followed by a colon ':' to specify that the option
+ * requires an argument, or a double colon '::' to specify that the option
+ * takes an optional argument.
+ *
+ * The third argument is an optional array of allowed long options. The
+ * leading '--' should not be included in the option name. Options that
+ * require an argument should be followed by '=', and options that take an
+ * option argument should be followed by '=='.
+ *
+ * The return value is an array of two elements: the list of parsed
+ * options and the list of non-option command-line arguments. Each entry in
+ * the list of parsed options is a pair of elements - the first one
+ * specifies the option, and the second one specifies the option argument,
+ * if there was one.
+ *
+ * Long and short options can be mixed.
+ *
+ * Most of the semantics of this function are based on GNU getopt_long().
+ *
+ * @param array $args an array of command-line arguments
+ * @param string $short_options specifies the list of allowed short options
+ * @param array $long_options specifies the list of allowed long options
+ *
+ * @return array two-element array containing the list of parsed options and
+ * the non-option arguments
+ *
+ * @access public
+ *
+ */
+ function getopt2($args, $short_options, $long_options = null)
+ {
+ return Console_Getopt::doGetopt(2, $args, $short_options, $long_options);
+ }
+
+ /**
+ * This function expects $args to start with the script name (POSIX-style).
+ * Preserved for backwards compatibility.
+ * @see getopt2()
+ */
+ function getopt($args, $short_options, $long_options = null)
+ {
+ return Console_Getopt::doGetopt(1, $args, $short_options, $long_options);
+ }
+
+ /**
+ * The actual implementation of the argument parsing code.
+ */
+ function doGetopt($version, $args, $short_options, $long_options = null)
+ {
+ // in case you pass directly readPHPArgv() as the first arg
+ if (PEAR::isError($args)) {
+ return $args;
+ }
+ if (empty($args)) {
+ return array(array(), array());
+ }
+ $opts = array();
+ $non_opts = array();
+
+ settype($args, 'array');
+
+ if ($long_options) {
+ sort($long_options);
+ }
+
+ /*
+ * Preserve backwards compatibility with callers that relied on
+ * erroneous POSIX fix.
+ */
+ if ($version < 2) {
+ if (isset($args[0]{0}) && $args[0]{0} != '-') {
+ array_shift($args);
+ }
+ }
+
+ reset($args);
+ while (list($i, $arg) = each($args)) {
+
+ /* The special element '--' means explicit end of
+ options. Treat the rest of the arguments as non-options
+ and end the loop. */
+ if ($arg == '--') {
+ $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
+ break;
+ }
+
+ if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) {
+ $non_opts = array_merge($non_opts, array_slice($args, $i));
+ break;
+ } elseif (strlen($arg) > 1 && $arg{1} == '-') {
+ $error = Console_Getopt::_parseLongOption(substr($arg, 2), $long_options, $opts, $args);
+ if (PEAR::isError($error))
+ return $error;
+ } else {
+ $error = Console_Getopt::_parseShortOption(substr($arg, 1), $short_options, $opts, $args);
+ if (PEAR::isError($error))
+ return $error;
+ }
+ }
+
+ return array($opts, $non_opts);
+ }
+
+ /**
+ * @access private
+ *
+ */
+ function _parseShortOption($arg, $short_options, &$opts, &$args)
+ {
+ for ($i = 0; $i < strlen($arg); $i++) {
+ $opt = $arg{$i};
+ $opt_arg = null;
+
+ /* Try to find the short option in the specifier string. */
+ if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':')
+ {
+ return PEAR::raiseError("Console_Getopt: unrecognized option -- $opt");
+ }
+
+ if (strlen($spec) > 1 && $spec{1} == ':') {
+ if (strlen($spec) > 2 && $spec{2} == ':') {
+ if ($i + 1 < strlen($arg)) {
+ /* Option takes an optional argument. Use the remainder of
+ the arg string if there is anything left. */
+ $opts[] = array($opt, substr($arg, $i + 1));
+ break;
+ }
+ } else {
+ /* Option requires an argument. Use the remainder of the arg
+ string if there is anything left. */
+ if ($i + 1 < strlen($arg)) {
+ $opts[] = array($opt, substr($arg, $i + 1));
+ break;
+ } else if (list(, $opt_arg) = each($args))
+ /* Else use the next argument. */;
+ else
+ return PEAR::raiseError("Console_Getopt: option requires an argument -- $opt");
+ }
+ }
+
+ $opts[] = array($opt, $opt_arg);
+ }
+ }
+
+ /**
+ * @access private
+ *
+ */
+ function _parseLongOption($arg, $long_options, &$opts, &$args)
+ {
+ @list($opt, $opt_arg) = explode('=', $arg, 2);
+ $opt_len = strlen($opt);
+
+ for ($i = 0; $i < count($long_options); $i++) {
+ $long_opt = $long_options[$i];
+ $opt_start = substr($long_opt, 0, $opt_len);
+
+ /* Option doesn't match. Go on to the next one. */
+ if ($opt_start != $opt)
+ continue;
+
+ $opt_rest = substr($long_opt, $opt_len);
+
+ /* Check that the options uniquely matches one of the allowed
+ options. */
+ if ($opt_rest != '' && $opt{0} != '=' &&
+ $i + 1 < count($long_options) &&
+ $opt == substr($long_options[$i+1], 0, $opt_len)) {
+ return PEAR::raiseError("Console_Getopt: option --$opt is ambiguous");
+ }
+
+ if (substr($long_opt, -1) == '=') {
+ if (substr($long_opt, -2) != '==') {
+ /* Long option requires an argument.
+ Take the next argument if one wasn't specified. */;
+ if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) {
+ return PEAR::raiseError("Console_Getopt: option --$opt requires an argument");
+ }
+ }
+ } else if ($opt_arg) {
+ return PEAR::raiseError("Console_Getopt: option --$opt doesn't allow an argument");
+ }
+
+ $opts[] = array('--' . $opt, $opt_arg);
+ return;
+ }
+
+ return PEAR::raiseError("Console_Getopt: unrecognized option --$opt");
+ }
+
+ /**
+ * Safely read the $argv PHP array across different PHP configurations.
+ * Will take care on register_globals and register_argc_argv ini directives
+ *
+ * @access public
+ * @return mixed the $argv PHP array or PEAR error if not registered
+ */
+ function readPHPArgv()
+ {
+ global $argv;
+ if (!is_array($argv)) {
+ if (!@is_array($_SERVER['argv'])) {
+ if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
+ return PEAR::raiseError("Console_Getopt: Could not read cmd args (register_argc_argv=Off?)");
+ }
+ return $GLOBALS['HTTP_SERVER_VARS']['argv'];
+ }
+ return $_SERVER['argv'];
+ }
+ return $argv;
+ }
+
+}
+
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/pear/PEAR.php b/paste/include/geshi/scripts/get-keywords/lib/pear/PEAR.php
new file mode 100644
index 0000000..5a86b6b
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/pear/PEAR.php
@@ -0,0 +1,1055 @@
+<?php
+//
+// +--------------------------------------------------------------------+
+// | PEAR, the PHP Extension and Application Repository |
+// +--------------------------------------------------------------------+
+// | Copyright (c) 1997-2004 The PHP Group |
+// +--------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at the following url: |
+// | http://www.php.net/license/3_0.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +--------------------------------------------------------------------+
+// | Authors: Sterling Hughes <sterling@php.net> |
+// | Stig Bakken <ssb@php.net> |
+// | Tomas V.V.Cox <cox@idecnet.com> |
+// +--------------------------------------------------------------------+
+//
+// $Id: PEAR.php,v 1.1 2005/06/04 04:03:26 oracleshinoda Exp $
+//
+
+define('PEAR_ERROR_RETURN', 1);
+define('PEAR_ERROR_PRINT', 2);
+define('PEAR_ERROR_TRIGGER', 4);
+define('PEAR_ERROR_DIE', 8);
+define('PEAR_ERROR_CALLBACK', 16);
+/**
+ * WARNING: obsolete
+ * @deprecated
+ */
+define('PEAR_ERROR_EXCEPTION', 32);
+define('PEAR_ZE2', (function_exists('version_compare') &&
+ version_compare(zend_version(), "2-dev", "ge")));
+
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ define('OS_WINDOWS', true);
+ define('OS_UNIX', false);
+ define('PEAR_OS', 'Windows');
+} else {
+ define('OS_WINDOWS', false);
+ define('OS_UNIX', true);
+ define('PEAR_OS', 'Unix'); // blatant assumption
+}
+
+// instant backwards compatibility
+if (!defined('PATH_SEPARATOR')) {
+ if (OS_WINDOWS) {
+ define('PATH_SEPARATOR', ';');
+ } else {
+ define('PATH_SEPARATOR', ':');
+ }
+}
+
+$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN;
+$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
+$GLOBALS['_PEAR_destructor_object_list'] = array();
+$GLOBALS['_PEAR_shutdown_funcs'] = array();
+$GLOBALS['_PEAR_error_handler_stack'] = array();
+
+@ini_set('track_errors', true);
+
+/**
+ * Base class for other PEAR classes. Provides rudimentary
+ * emulation of destructors.
+ *
+ * If you want a destructor in your class, inherit PEAR and make a
+ * destructor method called _yourclassname (same name as the
+ * constructor, but with a "_" prefix). Also, in your constructor you
+ * have to call the PEAR constructor: $this->PEAR();.
+ * The destructor method will be called without parameters. Note that
+ * at in some SAPI implementations (such as Apache), any output during
+ * the request shutdown (in which destructors are called) seems to be
+ * discarded. If you need to get any debug information from your
+ * destructor, use error_log(), syslog() or something similar.
+ *
+ * IMPORTANT! To use the emulated destructors you need to create the
+ * objects by reference: $obj =& new PEAR_child;
+ *
+ * @since PHP 4.0.2
+ * @author Stig Bakken <ssb@php.net>
+ * @see http://pear.php.net/manual/
+ */
+class PEAR
+{
+ // {{{ properties
+
+ /**
+ * Whether to enable internal debug messages.
+ *
+ * @var bool
+ * @access private
+ */
+ var $_debug = false;
+
+ /**
+ * Default error mode for this object.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_mode = null;
+
+ /**
+ * Default error options used for this object when error mode
+ * is PEAR_ERROR_TRIGGER.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_options = null;
+
+ /**
+ * Default error handler (callback) for this object, if error mode is
+ * PEAR_ERROR_CALLBACK.
+ *
+ * @var string
+ * @access private
+ */
+ var $_default_error_handler = '';
+
+ /**
+ * Which class to use for error objects.
+ *
+ * @var string
+ * @access private
+ */
+ var $_error_class = 'PEAR_Error';
+
+ /**
+ * An array of expected errors.
+ *
+ * @var array
+ * @access private
+ */
+ var $_expected_errors = array();
+
+ // }}}
+
+ // {{{ constructor
+
+ /**
+ * Constructor. Registers this object in
+ * $_PEAR_destructor_object_list for destructor emulation if a
+ * destructor object exists.
+ *
+ * @param string $error_class (optional) which class to use for
+ * error objects, defaults to PEAR_Error.
+ * @access public
+ * @return void
+ */
+ function PEAR($error_class = null)
+ {
+ $classname = strtolower(get_class($this));
+ if ($this->_debug) {
+ print "PEAR constructor called, class=$classname\n";
+ }
+ if ($error_class !== null) {
+ $this->_error_class = $error_class;
+ }
+ while ($classname && strcasecmp($classname, "pear")) {
+ $destructor = "_$classname";
+ if (method_exists($this, $destructor)) {
+ global $_PEAR_destructor_object_list;
+ $_PEAR_destructor_object_list[] = &$this;
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+
+ // }}}
+ // {{{ destructor
+
+ /**
+ * Destructor (the emulated type of...). Does nothing right now,
+ * but is included for forward compatibility, so subclass
+ * destructors should always call it.
+ *
+ * See the note in the class desciption about output from
+ * destructors.
+ *
+ * @access public
+ * @return void
+ */
+ function _PEAR() {
+ if ($this->_debug) {
+ printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
+ }
+ }
+
+ // }}}
+ // {{{ getStaticProperty()
+
+ /**
+ * If you have a class that's mostly/entirely static, and you need static
+ * properties, you can use this method to simulate them. Eg. in your method(s)
+ * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
+ * You MUST use a reference, or they will not persist!
+ *
+ * @access public
+ * @param string $class The calling classname, to prevent clashes
+ * @param string $var The variable to retrieve.
+ * @return mixed A reference to the variable. If not set it will be
+ * auto initialised to NULL.
+ */
+ function &getStaticProperty($class, $var)
+ {
+ static $properties;
+ return $properties[$class][$var];
+ }
+
+ // }}}
+ // {{{ registerShutdownFunc()
+
+ /**
+ * Use this function to register a shutdown method for static
+ * classes.
+ *
+ * @access public
+ * @param mixed $func The function name (or array of class/method) to call
+ * @param mixed $args The arguments to pass to the function
+ * @return void
+ */
+ function registerShutdownFunc($func, $args = array())
+ {
+ $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
+ }
+
+ // }}}
+ // {{{ isError()
+
+ /**
+ * Tell whether a value is a PEAR error.
+ *
+ * @param mixed $data the value to test
+ * @param int $code if $data is an error object, return true
+ * only if $code is a string and
+ * $obj->getMessage() == $code or
+ * $code is an integer and $obj->getCode() == $code
+ * @access public
+ * @return bool true if parameter is an error
+ */
+ function isError($data, $code = null)
+ {
+ if (is_a($data, 'PEAR_Error')) {
+ if (is_null($code)) {
+ return true;
+ } elseif (is_string($code)) {
+ return $data->getMessage() == $code;
+ } else {
+ return $data->getCode() == $code;
+ }
+ }
+ return false;
+ }
+
+ // }}}
+ // {{{ setErrorHandling()
+
+ /**
+ * Sets how errors generated by this object should be handled.
+ * Can be invoked both in objects and statically. If called
+ * statically, setErrorHandling sets the default behaviour for all
+ * PEAR objects. If called in an object, setErrorHandling sets
+ * the default behaviour for that object.
+ *
+ * @param int $mode
+ * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options
+ * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
+ * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ *
+ * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
+ * to be the callback function or method. A callback
+ * function is a string with the name of the function, a
+ * callback method is an array of two elements: the element
+ * at index 0 is the object, and the element at index 1 is
+ * the name of the method to call in the object.
+ *
+ * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
+ * a printf format string used when printing the error
+ * message.
+ *
+ * @access public
+ * @return void
+ * @see PEAR_ERROR_RETURN
+ * @see PEAR_ERROR_PRINT
+ * @see PEAR_ERROR_TRIGGER
+ * @see PEAR_ERROR_DIE
+ * @see PEAR_ERROR_CALLBACK
+ * @see PEAR_ERROR_EXCEPTION
+ *
+ * @since PHP 4.0.5
+ */
+
+ function setErrorHandling($mode = null, $options = null)
+ {
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $setmode = &$this->_default_error_mode;
+ $setoptions = &$this->_default_error_options;
+ } else {
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ }
+
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ }
+
+ // }}}
+ // {{{ expectError()
+
+ /**
+ * This method is used to tell which errors you expect to get.
+ * Expected errors are always returned with error mode
+ * PEAR_ERROR_RETURN. Expected error codes are stored in a stack,
+ * and this method pushes a new element onto it. The list of
+ * expected errors are in effect until they are popped off the
+ * stack with the popExpect() method.
+ *
+ * Note that this method can not be called statically
+ *
+ * @param mixed $code a single error code or an array of error codes to expect
+ *
+ * @return int the new depth of the "expected errors" stack
+ * @access public
+ */
+ function expectError($code = '*')
+ {
+ if (is_array($code)) {
+ array_push($this->_expected_errors, $code);
+ } else {
+ array_push($this->_expected_errors, array($code));
+ }
+ return sizeof($this->_expected_errors);
+ }
+
+ // }}}
+ // {{{ popExpect()
+
+ /**
+ * This method pops one element off the expected error codes
+ * stack.
+ *
+ * @return array the list of error codes that were popped
+ */
+ function popExpect()
+ {
+ return array_pop($this->_expected_errors);
+ }
+
+ // }}}
+ // {{{ _checkDelExpect()
+
+ /**
+ * This method checks unsets an error code if available
+ *
+ * @param mixed error code
+ * @return bool true if the error code was unset, false otherwise
+ * @access private
+ * @since PHP 4.3.0
+ */
+ function _checkDelExpect($error_code)
+ {
+ $deleted = false;
+
+ foreach ($this->_expected_errors AS $key => $error_array) {
+ if (in_array($error_code, $error_array)) {
+ unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
+ $deleted = true;
+ }
+
+ // clean up empty arrays
+ if (0 == count($this->_expected_errors[$key])) {
+ unset($this->_expected_errors[$key]);
+ }
+ }
+ return $deleted;
+ }
+
+ // }}}
+ // {{{ delExpect()
+
+ /**
+ * This method deletes all occurences of the specified element from
+ * the expected error codes stack.
+ *
+ * @param mixed $error_code error code that should be deleted
+ * @return mixed list of error codes that were deleted or error
+ * @access public
+ * @since PHP 4.3.0
+ */
+ function delExpect($error_code)
+ {
+ $deleted = false;
+
+ if ((is_array($error_code) && (0 != count($error_code)))) {
+ // $error_code is a non-empty array here;
+ // we walk through it trying to unset all
+ // values
+ foreach($error_code as $key => $error) {
+ if ($this->_checkDelExpect($error)) {
+ $deleted = true;
+ } else {
+ $deleted = false;
+ }
+ }
+ return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ } elseif (!empty($error_code)) {
+ // $error_code comes alone, trying to unset it
+ if ($this->_checkDelExpect($error_code)) {
+ return true;
+ } else {
+ return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ }
+ } else {
+ // $error_code is empty
+ return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
+ }
+ }
+
+ // }}}
+ // {{{ raiseError()
+
+ /**
+ * This method is a wrapper that returns an instance of the
+ * configured error class with this object's default error
+ * handling applied. If the $mode and $options parameters are not
+ * specified, the object's defaults are used.
+ *
+ * @param mixed $message a text error message or a PEAR error object
+ *
+ * @param int $code a numeric error code (it is up to your class
+ * to define these if you want to use codes)
+ *
+ * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
+ * specifies the PHP-internal error level (one of
+ * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ * If $mode is PEAR_ERROR_CALLBACK, this
+ * parameter specifies the callback function or
+ * method. In other error modes this parameter
+ * is ignored.
+ *
+ * @param string $userinfo If you need to pass along for example debug
+ * information, this parameter is meant for that.
+ *
+ * @param string $error_class The returned error object will be
+ * instantiated from this class, if specified.
+ *
+ * @param bool $skipmsg If true, raiseError will only pass error codes,
+ * the error message parameter will be dropped.
+ *
+ * @access public
+ * @return object a PEAR error object
+ * @see PEAR::setErrorHandling
+ * @since PHP 4.0.5
+ */
+ function raiseError($message = null,
+ $code = null,
+ $mode = null,
+ $options = null,
+ $userinfo = null,
+ $error_class = null,
+ $skipmsg = false)
+ {
+ // The error is yet a PEAR error object
+ if (is_object($message)) {
+ $code = $message->getCode();
+ $userinfo = $message->getUserInfo();
+ $error_class = $message->getType();
+ $message->error_message_prefix = '';
+ $message = $message->getMessage();
+ }
+
+ if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) {
+ if ($exp[0] == "*" ||
+ (is_int(reset($exp)) && in_array($code, $exp)) ||
+ (is_string(reset($exp)) && in_array($message, $exp))) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ }
+ // No mode given, try global ones
+ if ($mode === null) {
+ // Class error handler
+ if (isset($this) && isset($this->_default_error_mode)) {
+ $mode = $this->_default_error_mode;
+ $options = $this->_default_error_options;
+ // Global error handler
+ } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
+ $mode = $GLOBALS['_PEAR_default_error_mode'];
+ $options = $GLOBALS['_PEAR_default_error_options'];
+ }
+ }
+
+ if ($error_class !== null) {
+ $ec = $error_class;
+ } elseif (isset($this) && isset($this->_error_class)) {
+ $ec = $this->_error_class;
+ } else {
+ $ec = 'PEAR_Error';
+ }
+ if ($skipmsg) {
+ return new $ec($code, $mode, $options, $userinfo);
+ } else {
+ return new $ec($message, $code, $mode, $options, $userinfo);
+ }
+ }
+
+ // }}}
+ // {{{ throwError()
+
+ /**
+ * Simpler form of raiseError with fewer options. In most cases
+ * message, code and userinfo are enough.
+ *
+ * @param string $message
+ *
+ */
+ function throwError($message = null,
+ $code = null,
+ $userinfo = null)
+ {
+ if (isset($this) && is_a($this, 'PEAR')) {
+ return $this->raiseError($message, $code, null, null, $userinfo);
+ } else {
+ return PEAR::raiseError($message, $code, null, null, $userinfo);
+ }
+ }
+
+ // }}}
+ function staticPushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ $stack[] = array($def_mode, $def_options);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $def_mode = $mode;
+ $def_options = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $def_mode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $def_options = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ function staticPopErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ return true;
+ }
+
+ // {{{ pushErrorHandling()
+
+ /**
+ * Push a new error handler on top of the error handler options stack. With this
+ * you can easily override the actual error handler for some code and restore
+ * it later with popErrorHandling.
+ *
+ * @param mixed $mode (same as setErrorHandling)
+ * @param mixed $options (same as setErrorHandling)
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::setErrorHandling
+ */
+ function pushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $def_mode = &$this->_default_error_mode;
+ $def_options = &$this->_default_error_options;
+ } else {
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ }
+ $stack[] = array($def_mode, $def_options);
+
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $this->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ // }}}
+ // {{{ popErrorHandling()
+
+ /**
+ * Pop the last error handler used
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::pushErrorHandling
+ */
+ function popErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $this->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ return true;
+ }
+
+ // }}}
+ // {{{ loadExtension()
+
+ /**
+ * OS independant PHP extension load. Remember to take care
+ * on the correct extension name for case sensitive OSes.
+ *
+ * @param string $ext The extension name
+ * @return bool Success or not on the dl() call
+ */
+ function loadExtension($ext)
+ {
+ if (!extension_loaded($ext)) {
+ // if either returns true dl() will produce a FATAL error, stop that
+ if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) {
+ return false;
+ }
+ if (OS_WINDOWS) {
+ $suffix = '.dll';
+ } elseif (PHP_OS == 'HP-UX') {
+ $suffix = '.sl';
+ } elseif (PHP_OS == 'AIX') {
+ $suffix = '.a';
+ } elseif (PHP_OS == 'OSX') {
+ $suffix = '.bundle';
+ } else {
+ $suffix = '.so';
+ }
+ return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
+ }
+ return true;
+ }
+
+ // }}}
+}
+
+// {{{ _PEAR_call_destructors()
+
+function _PEAR_call_destructors()
+{
+ global $_PEAR_destructor_object_list;
+ if (is_array($_PEAR_destructor_object_list) &&
+ sizeof($_PEAR_destructor_object_list))
+ {
+ reset($_PEAR_destructor_object_list);
+ if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) {
+ $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
+ }
+ while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
+ $classname = get_class($objref);
+ while ($classname) {
+ $destructor = "_$classname";
+ if (method_exists($objref, $destructor)) {
+ $objref->$destructor();
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+ // Empty the object list to ensure that destructors are
+ // not called more than once.
+ $_PEAR_destructor_object_list = array();
+ }
+
+ // Now call the shutdown functions
+ if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) {
+ foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
+ call_user_func_array($value[0], $value[1]);
+ }
+ }
+}
+
+// }}}
+
+class PEAR_Error
+{
+ // {{{ properties
+
+ var $error_message_prefix = '';
+ var $mode = PEAR_ERROR_RETURN;
+ var $level = E_USER_NOTICE;
+ var $code = -1;
+ var $message = '';
+ var $userinfo = '';
+ var $backtrace = null;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * PEAR_Error constructor
+ *
+ * @param string $message message
+ *
+ * @param int $code (optional) error code
+ *
+ * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
+ * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
+ *
+ * @param mixed $options (optional) error level, _OR_ in the case of
+ * PEAR_ERROR_CALLBACK, the callback function or object/method
+ * tuple.
+ *
+ * @param string $userinfo (optional) additional user/debug info
+ *
+ * @access public
+ *
+ */
+ function PEAR_Error($message = 'unknown error', $code = null,
+ $mode = null, $options = null, $userinfo = null)
+ {
+ if ($mode === null) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ $this->message = $message;
+ $this->code = $code;
+ $this->mode = $mode;
+ $this->userinfo = $userinfo;
+ if (function_exists("debug_backtrace")) {
+ if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) {
+ $this->backtrace = debug_backtrace();
+ }
+ }
+ if ($mode & PEAR_ERROR_CALLBACK) {
+ $this->level = E_USER_NOTICE;
+ $this->callback = $options;
+ } else {
+ if ($options === null) {
+ $options = E_USER_NOTICE;
+ }
+ $this->level = $options;
+ $this->callback = null;
+ }
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ } else {
+ $format = $options;
+ }
+ printf($format, $this->getMessage());
+ }
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ trigger_error($this->getMessage(), $this->level);
+ }
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $msg = $this->getMessage();
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ if (substr($msg, -1) != "\n") {
+ $msg .= "\n";
+ }
+ } else {
+ $format = $options;
+ }
+ die(sprintf($format, $msg));
+ }
+ if ($this->mode & PEAR_ERROR_CALLBACK) {
+ if (is_callable($this->callback)) {
+ call_user_func($this->callback, $this);
+ }
+ }
+ if ($this->mode & PEAR_ERROR_EXCEPTION) {
+ trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions", E_USER_WARNING);
+ eval('$e = new Exception($this->message, $this->code);$e->PEAR_Error = $this;throw($e);');
+ }
+ }
+
+ // }}}
+ // {{{ getMode()
+
+ /**
+ * Get the error mode from an error object.
+ *
+ * @return int error mode
+ * @access public
+ */
+ function getMode() {
+ return $this->mode;
+ }
+
+ // }}}
+ // {{{ getCallback()
+
+ /**
+ * Get the callback function/method from an error object.
+ *
+ * @return mixed callback function or object/method array
+ * @access public
+ */
+ function getCallback() {
+ return $this->callback;
+ }
+
+ // }}}
+ // {{{ getMessage()
+
+
+ /**
+ * Get the error message from an error object.
+ *
+ * @return string full error message
+ * @access public
+ */
+ function getMessage()
+ {
+ return ($this->error_message_prefix . $this->message);
+ }
+
+
+ // }}}
+ // {{{ getCode()
+
+ /**
+ * Get error code from an error object
+ *
+ * @return int error code
+ * @access public
+ */
+ function getCode()
+ {
+ return $this->code;
+ }
+
+ // }}}
+ // {{{ getType()
+
+ /**
+ * Get the name of this error/exception.
+ *
+ * @return string error/exception name (type)
+ * @access public
+ */
+ function getType()
+ {
+ return get_class($this);
+ }
+
+ // }}}
+ // {{{ getUserInfo()
+
+ /**
+ * Get additional user-supplied information.
+ *
+ * @return string user-supplied information
+ * @access public
+ */
+ function getUserInfo()
+ {
+ return $this->userinfo;
+ }
+
+ // }}}
+ // {{{ getDebugInfo()
+
+ /**
+ * Get additional debug information supplied by the application.
+ *
+ * @return string debug information
+ * @access public
+ */
+ function getDebugInfo()
+ {
+ return $this->getUserInfo();
+ }
+
+ // }}}
+ // {{{ getBacktrace()
+
+ /**
+ * Get the call backtrace from where the error was generated.
+ * Supported with PHP 4.3.0 or newer.
+ *
+ * @param int $frame (optional) what frame to fetch
+ * @return array Backtrace, or NULL if not available.
+ * @access public
+ */
+ function getBacktrace($frame = null)
+ {
+ if ($frame === null) {
+ return $this->backtrace;
+ }
+ return $this->backtrace[$frame];
+ }
+
+ // }}}
+ // {{{ addUserInfo()
+
+ function addUserInfo($info)
+ {
+ if (empty($this->userinfo)) {
+ $this->userinfo = $info;
+ } else {
+ $this->userinfo .= " ** $info";
+ }
+ }
+
+ // }}}
+ // {{{ toString()
+
+ /**
+ * Make a string representation of this object.
+ *
+ * @return string a string with an object summary
+ * @access public
+ */
+ function toString() {
+ $modes = array();
+ $levels = array(E_USER_NOTICE => 'notice',
+ E_USER_WARNING => 'warning',
+ E_USER_ERROR => 'error');
+ if ($this->mode & PEAR_ERROR_CALLBACK) {
+ if (is_array($this->callback)) {
+ $callback = (is_object($this->callback[0]) ?
+ strtolower(get_class($this->callback[0])) :
+ $this->callback[0]) . '::' .
+ $this->callback[1];
+ } else {
+ $callback = $this->callback;
+ }
+ return sprintf('[%s: message="%s" code=%d mode=callback '.
+ 'callback=%s prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ $callback, $this->error_message_prefix,
+ $this->userinfo);
+ }
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ $modes[] = 'print';
+ }
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ $modes[] = 'trigger';
+ }
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $modes[] = 'die';
+ }
+ if ($this->mode & PEAR_ERROR_RETURN) {
+ $modes[] = 'return';
+ }
+ return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
+ 'prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ implode("|", $modes), $levels[$this->level],
+ $this->error_message_prefix,
+ $this->userinfo);
+ }
+
+ // }}}
+}
+
+/*
+ * Local Variables:
+ * mode: php
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
+?>
diff --git a/paste/include/geshi/scripts/get-keywords/lib/pear/XML/Parser.php b/paste/include/geshi/scripts/get-keywords/lib/pear/XML/Parser.php
new file mode 100644
index 0000000..0febabb
--- /dev/null
+++ b/paste/include/geshi/scripts/get-keywords/lib/pear/XML/Parser.php
@@ -0,0 +1,684 @@
+<?php
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2004 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.0 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available at through the world-wide-web at |
+// | http://www.php.net/license/3_0.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Author: Stig Bakken <ssb@fast.no> |
+// | Tomas V.V.Cox <cox@idecnet.com> |
+// | Stephan Schmidt <schst@php-tools.net> |
+// +----------------------------------------------------------------------+
+//
+// $Id: Parser.php,v 1.1 2005/06/04 04:04:48 oracleshinoda Exp $
+
+/**
+ * XML Parser class.
+ *
+ * This is an XML parser based on PHP's "xml" extension,
+ * based on the bundled expat library.
+ *
+ * @category XML
+ * @package XML_Parser
+ * @author Stig Bakken <ssb@fast.no>
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Stephan Schmidt <schst@php-tools.net>
+ */
+
+/**
+ * uses PEAR's error handling
+ */
+require_once 'lib/pear/PEAR.php';
+
+/**
+ * resource could not be created
+ */
+define('XML_PARSER_ERROR_NO_RESOURCE', 200);
+
+/**
+ * unsupported mode
+ */
+define('XML_PARSER_ERROR_UNSUPPORTED_MODE', 201);
+
+/**
+ * invalid encoding was given
+ */
+define('XML_PARSER_ERROR_INVALID_ENCODING', 202);
+
+/**
+ * specified file could not be read
+ */
+define('XML_PARSER_ERROR_FILE_NOT_READABLE', 203);
+
+/**
+ * invalid input
+ */
+define('XML_PARSER_ERROR_INVALID_INPUT', 204);
+
+/**
+ * remote file cannot be retrieved in safe mode
+ */
+define('XML_PARSER_ERROR_REMOTE', 205);
+
+/**
+ * XML Parser class.
+ *
+ * This is an XML parser based on PHP's "xml" extension,
+ * based on the bundled expat library.
+ *
+ * Notes:
+ * - It requires PHP 4.0.4pl1 or greater
+ * - From revision 1.17, the function names used by the 'func' mode
+ * are in the format "xmltag_$elem", for example: use "xmltag_name"
+ * to handle the <name></name> tags of your xml file.
+ *
+ * @category XML
+ * @package XML_Parser
+ * @author Stig Bakken <ssb@fast.no>
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Stephan Schmidt <schst@php-tools.net>
+ * todo create XML_Parser_Namespace to parse documents with namespaces
+ * todo create XML_Parser_Pull
+ * todo Tests that need to be made:
+ * - mixing character encodings
+ * - a test using all expat handlers
+ * - options (folding, output charset)
+ * - different parsing modes
+ */
+class XML_Parser extends PEAR
+{
+ // {{{ properties
+
+ /**
+ * XML parser handle
+ *
+ * @var resource
+ * @see xml_parser_create()
+ */
+ var $parser;
+
+ /**
+ * File handle if parsing from a file
+ *
+ * @var resource
+ */
+ var $fp;
+
+ /**
+ * Whether to do case folding
+ *
+ * If set to true, all tag and attribute names will
+ * be converted to UPPER CASE.
+ *
+ * @var boolean
+ */
+ var $folding = true;
+
+ /**
+ * Mode of operation, one of "event" or "func"
+ *
+ * @var string
+ */
+ var $mode;
+
+ /**
+ * Mapping from expat handler function to class method.
+ *
+ * @var array
+ */
+ var $handler = array(
+ 'character_data_handler' => 'cdataHandler',
+ 'default_handler' => 'defaultHandler',
+ 'processing_instruction_handler' => 'piHandler',
+ 'unparsed_entity_decl_handler' => 'unparsedHandler',
+ 'notation_decl_handler' => 'notationHandler',
+ 'external_entity_ref_handler' => 'entityrefHandler'
+ );
+
+ /**
+ * source encoding
+ *
+ * @var string
+ */
+ var $srcenc;
+
+ /**
+ * target encoding
+ *
+ * @var string
+ */
+ var $tgtenc;
+
+ /**
+ * handler object
+ *
+ * @var object
+ */
+ var $_handlerObj;
+
+ // }}}
+ // {{{ constructor
+
+ /**
+ * Creates an XML parser.
+ *
+ * This is needed for PHP4 compatibility, it will
+ * call the constructor, when a new instance is created.
+ *
+ * @param string $srcenc source charset encoding, use NULL (default) to use
+ * whatever the document specifies
+ * @param string $mode how this parser object should work, "event" for
+ * startelement/endelement-type events, "func"
+ * to have it call functions named after elements
+ * @param string $tgenc a valid target encoding
+ */
+ function XML_Parser($srcenc = null, $mode = 'event', $tgtenc = null)
+ {
+ XML_Parser::__construct($srcenc, $mode, $tgtenc);
+ }
+ // }}}
+
+ /**
+ * PHP5 constructor
+ *
+ * @param string $srcenc source charset encoding, use NULL (default) to use
+ * whatever the document specifies
+ * @param string $mode how this parser object should work, "event" for
+ * startelement/endelement-type events, "func"
+ * to have it call functions named after elements
+ * @param string $tgenc a valid target encoding
+ */
+ function __construct($srcenc = null, $mode = 'event', $tgtenc = null)
+ {
+ $this->PEAR('XML_Parser_Error');
+
+ $this->mode = $mode;
+ $this->srcenc = $srcenc;
+ $this->tgtenc = $tgtenc;
+ }
+ // }}}
+
+ /**
+ * Sets the mode of the parser.
+ *
+ * Possible modes are:
+ * - func
+ * - event
+ *
+ * You can set the mode using the second parameter
+ * in the constructor.
+ *
+ * This method is only needed, when switching to a new
+ * mode at a later point.
+ *
+ * @access public
+ * @param string mode, either 'func' or 'event'
+ * @return boolean|object true on success, PEAR_Error otherwise
+ */
+ function setMode($mode)
+ {
+ if ($mode != 'func' && $mode != 'event') {
+ $this->raiseError('Unsupported mode given', XML_PARSER_ERROR_UNSUPPORTED_MODE);
+ }
+
+ $this->mode = $mode;
+ return true;
+ }
+
+ /**
+ * Sets the object, that will handle the XML events
+ *
+ * This allows you to create a handler object independent of the
+ * parser object that you are using and easily switch the underlying
+ * parser.
+ *
+ * If no object will be set, XML_Parser assumes that you
+ * extend this class and handle the events in $this.
+ *
+ * @access public
+ * @param object object to handle the events
+ * @return boolean will always return true
+ * @since v1.2.0beta3
+ */
+ function setHandlerObj(&$obj)
+ {
+ $this->_handlerObj = &$obj;
+ return true;
+ }
+
+ /**
+ * Init the element handlers
+ *
+ * @access private
+ */
+ function _initHandlers()
+ {
+ if (!is_resource($this->parser)) {
+ return false;
+ }
+
+ if (!is_object($this->_handlerObj)) {
+ $this->_handlerObj = &$this;
+ }
+ switch ($this->mode) {
+
+ case 'func':
+ xml_set_object($this->parser, $this->_handlerObj);
+ xml_set_element_handler($this->parser, array(&$this, 'funcStartHandler'), array(&$this, 'funcEndHandler'));
+ break;
+
+ case 'event':
+ xml_set_object($this->parser, $this->_handlerObj);
+ xml_set_element_handler($this->parser, 'startHandler', 'endHandler');
+ break;
+ default:
+ return $this->raiseError('Unsupported mode given', XML_PARSER_ERROR_UNSUPPORTED_MODE);
+ break;
+ }
+
+
+ /**
+ * set additional handlers for character data, entities, etc.
+ */
+ foreach ($this->handler as $xml_func => $method) {
+ if (method_exists($this->_handlerObj, $method)) {
+ $xml_func = 'xml_set_' . $xml_func;
+ $xml_func($this->parser, $method);
+ }
+ }
+ }
+
+ // {{{ _create()
+
+ /**
+ * create the XML parser resource
+ *
+ * Has been moved from the constructor to avoid
+ * problems with object references.
+ *
+ * Furthermore it allows us returning an error
+ * if something fails.
+ *
+ * @access private
+ * @return boolean|object true on success, PEAR_Error otherwise
+ *
+ * @see xml_parser_create
+ */
+ function _create()
+ {
+ if ($this->srcenc === null) {
+ $xp = @xml_parser_create();
+ } else {
+ $xp = @xml_parser_create($this->srcenc);
+ }
+ if (is_resource($xp)) {
+ if ($this->tgtenc !== null) {
+ if (!@xml_parser_set_option($xp, XML_OPTION_TARGET_ENCODING,
+ $this->tgtenc)) {
+ return $this->raiseError('invalid target encoding', XML_PARSER_ERROR_INVALID_ENCODING);
+ }
+ }
+ $this->parser = $xp;
+ $result = $this->_initHandlers($this->mode);
+ if ($this->isError($result)) {
+ return $result;
+ }
+ xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, $this->folding);
+
+ return true;
+ }
+ return $this->raiseError('Unable to create XML parser resource.', XML_PARSER_ERROR_NO_RESOURCE);
+ }
+
+ // }}}
+ // {{{ reset()
+
+ /**
+ * Reset the parser.
+ *
+ * This allows you to use one parser instance
+ * to parse multiple XML documents.
+ *
+ * @access public
+ * @return boolean|object true on success, PEAR_Error otherwise
+ */
+ function reset()
+ {
+ $result = $this->_create();
+ if ($this->isError( $result )) {
+ return $result;
+ }
+ return true;
+ }
+
+ // }}}
+ // {{{ setInputFile()
+
+ /**
+ * Sets the input xml file to be parsed
+ *
+ * @param string Filename (full path)
+ * @return resource fopen handle of the given file
+ * @throws XML_Parser_Error
+ * @see setInput(), setInputString(), parse()
+ * @access public
+ */
+ function setInputFile($file)
+ {
+ /**
+ * check, if file is a remote file
+ */
+ if (eregi('^(http|ftp)://', substr($file, 0, 10))) {
+ if (!ini_get('allow_url_fopen')) {
+ return $this->raiseError('Remote files cannot be parsed, as safe mode is enabled.', XML_PARSER_ERROR_REMOTE);
+ }
+ }
+
+ $fp = @fopen($file, 'rb');
+ if (is_resource($fp)) {
+ $this->fp = $fp;
+ return $fp;
+ }
+ return $this->raiseError('File could not be opened.', XML_PARSER_ERROR_FILE_NOT_READABLE);
+ }
+
+ // }}}
+ // {{{ setInputString()
+
+ /**
+ * XML_Parser::setInputString()
+ *
+ * Sets the xml input from a string
+ *
+ * @param string $data a string containing the XML document
+ * @return null
+ **/
+ function setInputString($data)
+ {
+ $this->fp = $data;
+ return null;
+ }
+
+ // }}}
+ // {{{ setInput()
+
+ /**
+ * Sets the file handle to use with parse().
+ *
+ * You should use setInputFile() or setInputString() if you
+ * pass a string
+ *
+ * @param mixed $fp Can be either a resource returned from fopen(),
+ * a URL, a local filename or a string.
+ * @access public
+ * @see parse()
+ * @uses setInputString(), setInputFile()
+ */
+ function setInput($fp)
+ {
+ if (is_resource($fp)) {
+ $this->fp = $fp;
+ return true;
+ }
+ // see if it's an absolute URL (has a scheme at the beginning)
+ elseif (eregi('^[a-z]+://', substr($fp, 0, 10))) {
+ return $this->setInputFile($fp);
+ }
+ // see if it's a local file
+ elseif (file_exists($fp)) {
+ return $this->setInputFile($fp);
+ }
+ // it must be a string
+ else {
+ $this->fp = $fp;
+ return true;
+ }
+
+ return $this->raiseError('Illegal input format', XML_PARSER_ERROR_INVALID_INPUT);
+ }
+
+ // }}}
+ // {{{ parse()
+
+ /**
+ * Central parsing function.
+ *
+ * @return true|object PEAR error returns true on success, or a PEAR_Error otherwise
+ * @access public
+ */
+ function parse()
+ {
+ /**
+ * reset the parser
+ */
+ $result = $this->reset();
+ if ($this->isError($result)) {
+ return $result;
+ }
+ // if $this->fp was fopened previously
+ if (is_resource($this->fp)) {
+
+ while ($data = fread($this->fp, 4096)) {
+ if (!$this->_parseString($data, feof($this->fp))) {
+ $error = &$this->raiseError();
+ $this->free();
+ return $error;
+ }
+ }
+ // otherwise, $this->fp must be a string
+ } else {
+ if (!$this->_parseString($this->fp, true)) {
+ $error = &$this->raiseError();
+ $this->free();
+ return $error;
+ }
+ }
+ $this->free();
+
+ return true;
+ }
+
+ /**
+ * XML_Parser::_parseString()
+ *
+ * @param string $data
+ * @param boolean $eof
+ * @return bool
+ * @access private
+ * @see parseString()
+ **/
+ function _parseString($data, $eof = false)
+ {
+ return xml_parse($this->parser, $data, $eof);
+ }
+
+ // }}}
+ // {{{ parseString()
+
+ /**
+ * XML_Parser::parseString()
+ *
+ * Parses a string.
+ *
+ * @param string $data XML data
+ * @param boolean $eof If set and TRUE, data is the last piece of data sent in this parser
+ * @throws XML_Parser_Error
+ * @return Pear Error|true true on success or a PEAR Error
+ * @see _parseString()
+ */
+ function parseString($data, $eof = false)
+ {
+ if (!isset($this->parser) || !is_resource($this->parser)) {
+ $this->reset();
+ }
+
+ if (!$this->_parseString($data, $eof)) {
+ $error = &$this->raiseError();
+ $this->free();
+ return $error;
+ }
+
+ if ($eof === true) {
+ $this->free();
+ }
+ return true;
+ }
+
+ /**
+ * XML_Parser::free()
+ *
+ * Free the internal resources associated with the parser
+ *
+ * @return null
+ **/
+ function free()
+ {
+ if (isset($this->parser) && is_resource($this->parser)) {
+ xml_parser_free($this->parser);
+ unset( $this->parser );
+ }
+ if (isset($this->fp) && is_resource($this->fp)) {
+ fclose($this->fp);
+ }
+ unset($this->fp);
+ return null;
+ }
+
+ /**
+ * XML_Parser::raiseError()
+ *
+ * Throws a XML_Parser_Error
+ *
+ * @param string $msg the error message
+ * @param integer $ecode the error message code
+ * @return XML_Parser_Error
+ **/
+ function raiseError($msg = null, $ecode = 0)
+ {
+ $msg = !is_null($msg) ? $msg : $this->parser;
+ $err = &new XML_Parser_Error($msg, $ecode);
+ return parent::raiseError($err);
+ }
+
+ // }}}
+ // {{{ funcStartHandler()
+
+ function funcStartHandler($xp, $elem, $attribs)
+ {
+ $func = 'xmltag_' . $elem;
+ if (strchr($func, '.')) {
+ $func = str_replace('.', '_', $func);
+ }
+ if (method_exists($this->_handlerObj, $func)) {
+ call_user_func(array(&$this->_handlerObj, $func), $xp, $elem, $attribs);
+ } elseif (method_exists($this->_handlerObj, 'xmltag')) {
+ call_user_func(array(&$this->_handlerObj, 'xmltag'), $xp, $elem, $attribs);
+ }
+ }
+
+ // }}}
+ // {{{ funcEndHandler()
+
+ function funcEndHandler($xp, $elem)
+ {
+ $func = 'xmltag_' . $elem . '_';
+ if (strchr($func, '.')) {
+ $func = str_replace('.', '_', $func);
+ }
+ if (method_exists($this->_handlerObj, $func)) {
+ call_user_func(array(&$this->_handlerObj, $func), $xp, $elem);
+ } elseif (method_exists($this->_handlerObj, 'xmltag_')) {
+ call_user_func(array(&$this->_handlerObj, 'xmltag_'), $xp, $elem);
+ }
+ }
+
+ // }}}
+ // {{{ startHandler()
+
+ /**
+ *
+ * @abstract
+ */
+ function startHandler($xp, $elem, &$attribs)
+ {
+ return NULL;
+ }
+
+ // }}}
+ // {{{ endHandler()
+
+ /**
+ *
+ * @abstract
+ */
+ function endHandler($xp, $elem)
+ {
+ return NULL;
+ }
+
+
+ // }}}me
+}
+
+/**
+ * error class, replaces PEAR_Error
+ *
+ * An instance of this class will be returned
+ * if an error occurs inside XML_Parser.
+ *
+ * There are three advantages over using the standard PEAR_Error:
+ * - All messages will be prefixed
+ * - check for XML_Parser error, using is_a( $error, 'XML_Parser_Error' )
+ * - messages can be generated from the xml_parser resource
+ *
+ * @package XML_Parser
+ * @access public
+ * @see PEAR_Error
+ */
+class XML_Parser_Error extends PEAR_Error
+{
+ // {{{ properties
+
+ /**
+ * prefix for all messages
+ *
+ * @var string
+ */
+ var $error_message_prefix = 'XML_Parser: ';
+
+ // }}}
+ // {{{ constructor()
+ /**
+ * construct a new error instance
+ *
+ * You may either pass a message or an xml_parser resource as first
+ * parameter. If a resource has been passed, the last error that
+ * happened will be retrieved and returned.
+ *
+ * @access public
+ * @param string|resource message or parser resource
+ * @param integer error code
+ * @param integer error handling
+ * @param integer error level
+ */
+ function XML_Parser_Error($msgorparser = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE)
+ {
+ if (is_resource($msgorparser)) {
+ $code = xml_get_error_code($msgorparser);
+ $msgorparser = sprintf('%s at XML input line %d',
+ xml_error_string($code),
+ xml_get_current_line_number($msgorparser));
+ }
+ $this->PEAR_Error($msgorparser, $code, $mode, $level);
+ }
+ // }}}
+}
+?> \ No newline at end of file