[SPIP] +2.1.12
[velocampus/web/www.git] / www / extensions / safehtml / lib / safehtml / classes / HTMLSax3.php
diff --git a/www/extensions/safehtml/lib/safehtml/classes/HTMLSax3.php b/www/extensions/safehtml/lib/safehtml/classes/HTMLSax3.php
new file mode 100644 (file)
index 0000000..68e8034
--- /dev/null
@@ -0,0 +1,296 @@
+<?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