--- /dev/null
+<?php\r
+// +----------------------------------------------------------------------+\r
+// | Copyright (c) 1997-2002 The PHP Group |\r
+// +----------------------------------------------------------------------+\r
+// | This source file is subject to version 2.02 of the PHP license, |\r
+// | that is bundled with this package in the file LICENSE, and is |\r
+// | available at through the world-wide-web at |\r
+// | http://www.php.net/license/3_0.txt. |\r
+// | If you did not receive a copy of the PHP license and are unable to |\r
+// | obtain it through the world-wide-web, please send a note to |\r
+// | license@php.net so we can mail you a copy immediately. |\r
+// +----------------------------------------------------------------------+\r
+// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |\r
+// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more |\r
+// | Authors: Many @ Sitepointforums Advanced PHP Forums |\r
+// +----------------------------------------------------------------------+\r
+//\r
+\r
+if (!defined('_ECRIRE_INC_VERSION')) return;\r
+\r
+if (!defined('XML_HTMLSAX3')) {\r
+ define('XML_HTMLSAX3', 'XML/');\r
+}\r
+require_once(XML_HTMLSAX3 . 'HTMLSax3/States.php');\r
+require_once(XML_HTMLSAX3 . 'HTMLSax3/Decorators.php');\r
+\r
+class XML_HTMLSax3_StateParser {\r
+ var $htmlsax;\r
+ var $handler_object_element;\r
+ var $handler_method_opening;\r
+ var $handler_method_closing;\r
+ var $handler_object_data;\r
+ var $handler_method_data;\r
+ var $handler_object_pi;\r
+ var $handler_method_pi;\r
+ var $handler_object_jasp;\r
+ var $handler_method_jasp;\r
+ var $handler_object_escape;\r
+ var $handler_method_escape;\r
+ var $handler_default;\r
+ var $parser_options = array();\r
+ var $rawtext;\r
+ var $position;\r
+ var $length;\r
+ var $State = array();\r
+\r
+ function XML_HTMLSax3_StateParser (& $htmlsax) {\r
+ $this->htmlsax = & $htmlsax;\r
+\r
+ $this->State[XML_HTMLSAX3_STATE_START] = new XML_HTMLSax3_StartingState();\r
+\r
+ $this->State[XML_HTMLSAX3_STATE_CLOSING_TAG] = new XML_HTMLSax3_ClosingTagState();\r
+ $this->State[XML_HTMLSAX3_STATE_TAG] = new XML_HTMLSax3_TagState();\r
+ $this->State[XML_HTMLSAX3_STATE_OPENING_TAG] = new XML_HTMLSax3_OpeningTagState();\r
+\r
+ $this->State[XML_HTMLSAX3_STATE_PI] = new XML_HTMLSax3_PiState();\r
+ $this->State[XML_HTMLSAX3_STATE_JASP] = new XML_HTMLSax3_JaspState();\r
+ $this->State[XML_HTMLSAX3_STATE_ESCAPE] = new XML_HTMLSax3_EscapeState();\r
+ }\r
+\r
+ function unscanCharacter() {\r
+ $this->position -= 1;\r
+ }\r
+\r
+ function ignoreCharacter() {\r
+ $this->position += 1;\r
+ }\r
+\r
+ function scanCharacter() {\r
+ if ($this->position < $this->length) {\r
+ return $this->rawtext{$this->position++};\r
+ }\r
+ }\r
+\r
+ function scanUntilString($string) {\r
+ $start = $this->position;\r
+ $this->position = strpos($this->rawtext, $string, $start);\r
+ if ($this->position === FALSE) {\r
+ $this->position = $this->length;\r
+ }\r
+ return substr($this->rawtext, $start, $this->position - $start);\r
+ }\r
+\r
+ function scanUntilCharacters($string) {}\r
+\r
+ function ignoreWhitespace() {}\r
+\r
+ function parse($data) {\r
+ if ($this->parser_options['XML_OPTION_TRIM_DATA_NODES']==1) {\r
+ $decorator = new XML_HTMLSax3_Trim(\r
+ $this->handler_object_data,\r
+ $this->handler_method_data);\r
+ $this->handler_object_data =& $decorator;\r
+ $this->handler_method_data = 'trimData';\r
+ }\r
+ if ($this->parser_options['XML_OPTION_CASE_FOLDING']==1) {\r
+ $open_decor = new XML_HTMLSax3_CaseFolding(\r
+ $this->handler_object_element,\r
+ $this->handler_method_opening,\r
+ $this->handler_method_closing);\r
+ $this->handler_object_element =& $open_decor;\r
+ $this->handler_method_opening ='foldOpen';\r
+ $this->handler_method_closing ='foldClose';\r
+ }\r
+ if ($this->parser_options['XML_OPTION_LINEFEED_BREAK']==1) {\r
+ $decorator = new XML_HTMLSax3_Linefeed(\r
+ $this->handler_object_data,\r
+ $this->handler_method_data);\r
+ $this->handler_object_data =& $decorator;\r
+ $this->handler_method_data = 'breakData';\r
+ }\r
+ if ($this->parser_options['XML_OPTION_TAB_BREAK']==1) {\r
+ $decorator = new XML_HTMLSax3_Tab(\r
+ $this->handler_object_data,\r
+ $this->handler_method_data);\r
+ $this->handler_object_data =& $decorator;\r
+ $this->handler_method_data = 'breakData';\r
+ }\r
+ if ($this->parser_options['XML_OPTION_ENTITIES_UNPARSED']==1) {\r
+ $decorator = new XML_HTMLSax3_Entities_Unparsed(\r
+ $this->handler_object_data,\r
+ $this->handler_method_data);\r
+ $this->handler_object_data =& $decorator;\r
+ $this->handler_method_data = 'breakData';\r
+ }\r
+ if ($this->parser_options['XML_OPTION_ENTITIES_PARSED']==1) {\r
+ $decorator = new XML_HTMLSax3_Entities_Parsed(\r
+ $this->handler_object_data,\r
+ $this->handler_method_data);\r
+ $this->handler_object_data =& $decorator;\r
+ $this->handler_method_data = 'breakData';\r
+ }\r
+ // Note switched on by default\r
+ if ($this->parser_options['XML_OPTION_STRIP_ESCAPES']==1) {\r
+ $decorator = new XML_HTMLSax3_Escape_Stripper(\r
+ $this->handler_object_escape,\r
+ $this->handler_method_escape);\r
+ $this->handler_object_escape =& $decorator;\r
+ $this->handler_method_escape = 'strip';\r
+ }\r
+ $this->rawtext = $data;\r
+ $this->length = strlen($data);\r
+ $this->position = 0;\r
+ $this->_parse();\r
+ }\r
+\r
+ function _parse($state = XML_HTMLSAX3_STATE_START) {\r
+ do {\r
+ $state = $this->State[$state]->parse($this);\r
+ } while ($state != XML_HTMLSAX3_STATE_STOP &&\r
+ $this->position < $this->length);\r
+ }\r
+}\r
+\r
+class XML_HTMLSax3_StateParser_Lt430 extends XML_HTMLSax3_StateParser {\r
+ function XML_HTMLSax3_StateParser_Lt430(& $htmlsax) {\r
+ parent::XML_HTMLSax3_StateParser($htmlsax);\r
+ $this->parser_options['XML_OPTION_TRIM_DATA_NODES'] = 0;\r
+ $this->parser_options['XML_OPTION_CASE_FOLDING'] = 0;\r
+ $this->parser_options['XML_OPTION_LINEFEED_BREAK'] = 0;\r
+ $this->parser_options['XML_OPTION_TAB_BREAK'] = 0;\r
+ $this->parser_options['XML_OPTION_ENTITIES_PARSED'] = 0;\r
+ $this->parser_options['XML_OPTION_ENTITIES_UNPARSED'] = 0;\r
+ $this->parser_options['XML_OPTION_STRIP_ESCAPES'] = 0;\r
+ }\r
+\r
+ function scanUntilCharacters($string) {\r
+ $startpos = $this->position;\r
+ while ($this->position < $this->length && strpos($string, $this->rawtext{$this->position}) === FALSE) {\r
+ $this->position++;\r
+ }\r
+ return substr($this->rawtext, $startpos, $this->position - $startpos);\r
+ }\r
+\r
+ function ignoreWhitespace() {\r
+ while ($this->position < $this->length && \r
+ strpos(" \n\r\t", $this->rawtext{$this->position}) !== FALSE) {\r
+ $this->position++;\r
+ }\r
+ }\r
+\r
+ function parse($data) {\r
+ parent::parse($data);\r
+ }\r
+}\r
+\r
+class XML_HTMLSax3_StateParser_Gtet430 extends XML_HTMLSax3_StateParser {\r
+ function XML_HTMLSax3_StateParser_Gtet430(& $htmlsax) {\r
+ parent::XML_HTMLSax3_StateParser($htmlsax);\r
+ $this->parser_options['XML_OPTION_TRIM_DATA_NODES'] = 0;\r
+ $this->parser_options['XML_OPTION_CASE_FOLDING'] = 0;\r
+ $this->parser_options['XML_OPTION_LINEFEED_BREAK'] = 0;\r
+ $this->parser_options['XML_OPTION_TAB_BREAK'] = 0;\r
+ $this->parser_options['XML_OPTION_ENTITIES_PARSED'] = 0;\r
+ $this->parser_options['XML_OPTION_ENTITIES_UNPARSED'] = 0;\r
+ $this->parser_options['XML_OPTION_STRIP_ESCAPES'] = 0;\r
+ }\r
+ function scanUntilCharacters($string) {\r
+ $startpos = $this->position;\r
+ $length = strcspn($this->rawtext, $string, $startpos);\r
+ $this->position += $length;\r
+ return substr($this->rawtext, $startpos, $length);\r
+ }\r
+\r
+ function ignoreWhitespace() {\r
+ $this->position += strspn($this->rawtext, " \n\r\t", $this->position);\r
+ }\r
+\r
+ function parse($data) {\r
+ parent::parse($data);\r
+ }\r
+}\r
+\r
+class XML_HTMLSax3_NullHandler {\r
+ function DoNothing() {\r
+ }\r
+}\r
+\r
+class XML_HTMLSax3 {\r
+ var $state_parser;\r
+\r
+ function XML_HTMLSax3() {\r
+ if (version_compare(phpversion(), '4.3', 'ge')) {\r
+ $this->state_parser = new XML_HTMLSax3_StateParser_Gtet430($this);\r
+ } else {\r
+ $this->state_parser = new XML_HTMLSax3_StateParser_Lt430($this);\r
+ }\r
+ $nullhandler = new XML_HTMLSax3_NullHandler();\r
+ $this->set_object($nullhandler);\r
+ $this->set_element_handler('DoNothing', 'DoNothing');\r
+ $this->set_data_handler('DoNothing');\r
+ $this->set_pi_handler('DoNothing');\r
+ $this->set_jasp_handler('DoNothing');\r
+ $this->set_escape_handler('DoNothing');\r
+ }\r
+\r
+ function set_object(&$object) {\r
+ if ( is_object($object) ) {\r
+ $this->state_parser->handler_default =& $object;\r
+ return true;\r
+ } else {\r
+ require_once('PEAR.php');\r
+ PEAR::raiseError('XML_HTMLSax3::set_object requires '.\r
+ 'an object instance');\r
+ }\r
+ }\r
+\r
+ function set_option($name, $value=1) {\r
+ if ( array_key_exists($name,$this->state_parser->parser_options) ) {\r
+ $this->state_parser->parser_options[$name] = $value;\r
+ return true;\r
+ } else {\r
+ require_once('PEAR.php');\r
+ PEAR::raiseError('XML_HTMLSax3::set_option('.$name.') illegal');\r
+ }\r
+ }\r
+\r
+ function set_data_handler($data_method) {\r
+ $this->state_parser->handler_object_data =& $this->state_parser->handler_default;\r
+ $this->state_parser->handler_method_data = $data_method;\r
+ }\r
+\r
+ function set_element_handler($opening_method, $closing_method) {\r
+ $this->state_parser->handler_object_element =& $this->state_parser->handler_default;\r
+ $this->state_parser->handler_method_opening = $opening_method;\r
+ $this->state_parser->handler_method_closing = $closing_method;\r
+ }\r
+\r
+ function set_pi_handler($pi_method) {\r
+ $this->state_parser->handler_object_pi =& $this->state_parser->handler_default;\r
+ $this->state_parser->handler_method_pi = $pi_method;\r
+ }\r
+\r
+ function set_escape_handler($escape_method) {\r
+ $this->state_parser->handler_object_escape =& $this->state_parser->handler_default;\r
+ $this->state_parser->handler_method_escape = $escape_method;\r
+ }\r
+\r
+ function set_jasp_handler ($jasp_method) {\r
+ $this->state_parser->handler_object_jasp =& $this->state_parser->handler_default;\r
+ $this->state_parser->handler_method_jasp = $jasp_method;\r
+ }\r
+\r
+ function get_current_position() {\r
+ return $this->state_parser->position;\r
+ }\r
+\r
+ function get_length() {\r
+ return $this->state_parser->length;\r
+ }\r
+\r
+ function parse($data) {\r
+ $this->state_parser->parse($data);\r
+ }\r
+}\r
+?>
\ No newline at end of file