?
Path : /home/admin/public_html/old/board/libraries/domit/ |
Current File : /home/admin/public_html/old/board/libraries/domit/xml_saxy_shared.php |
<?php /** * SAXY_Parser_Base is a base class for SAXY and SAXY Lite * @package saxy-xmlparser * @version 1.0 * @copyright (C) 2004 John Heinstein. All rights reserved * @license http://www.gnu.org/copyleft/lesser.html LGPL License * @author John Heinstein <johnkarl@nbnet.nb.ca> * @link http://www.engageinteractive.com/saxy/ SAXY Home Page * SAXY is Free Software **/ /** the initial characters of a cdata section */ define('SAXY_SEARCH_CDATA', '![CDATA['); /** the length of the initial characters of a cdata section */ define('SAXY_CDATA_LEN', 8); /** the initial characters of a notation */ define('SAXY_SEARCH_NOTATION', '!NOTATION'); /** the initial characters of a doctype */ define('SAXY_SEARCH_DOCTYPE', '!DOCTYPE'); /** saxy parse state, just before parsing an attribute */ define('SAXY_STATE_ATTR_NONE', 0); /** saxy parse state, parsing an attribute key */ define('SAXY_STATE_ATTR_KEY', 1); /** saxy parse state, parsing an attribute value */ define('SAXY_STATE_ATTR_VALUE', 2); /** * The base SAX Parser class * * @package saxy-xmlparser * @author John Heinstein <johnkarl@nbnet.nb.ca> */ class SAXY_Parser_Base { /** @var int The current state of the parser */ var $state; /** @var int A temporary container for parsed characters */ var $charContainer; /** @var Object A reference to the start event handler */ var $startElementHandler; /** @var Object A reference to the end event handler */ var $endElementHandler; /** @var Object A reference to the data event handler */ var $characterDataHandler; /** @var Object A reference to the CDATA Section event handler */ var $cDataSectionHandler = null; /** @var boolean True if predefined entities are to be converted into characters */ var $convertEntities = true; /** @var Array Translation table for predefined entities */ var $predefinedEntities = array('&' => '&', '<' => '<', '>' => '>', '"' => '"', ''' => "'"); /** @var Array User defined translation table for entities */ var $definedEntities = array(); /** @var boolean True if whitespace is to be preserved during parsing. NOT YET IMPLEMENTED! */ var $preserveWhitespace = false; /** * Constructor for SAX parser */ function SAXY_Parser_Base() { $this->charContainer = ''; } //SAXY_Parser_Base /** * Sets a reference to the handler for the start element event * @param mixed A reference to the start element handler */ function xml_set_element_handler($startHandler, $endHandler) { $this->startElementHandler = $startHandler; $this->endElementHandler = $endHandler; } //xml_set_element_handler /** * Sets a reference to the handler for the data event * @param mixed A reference to the data handler */ function xml_set_character_data_handler($handler) { $this->characterDataHandler =& $handler; } //xml_set_character_data_handler /** * Sets a reference to the handler for the CDATA Section event * @param mixed A reference to the CDATA Section handler */ function xml_set_cdata_section_handler($handler) { $this->cDataSectionHandler =& $handler; } //xml_set_cdata_section_handler /** * Sets whether predefined entites should be replaced with their equivalent characters during parsing * @param boolean True if entity replacement is to occur */ function convertEntities($truthVal) { $this->convertEntities = $truthVal; } //convertEntities /** * Appends an array of entity mappings to the existing translation table * * Intended mainly to facilitate the conversion of non-ASCII entities into equivalent characters * * @param array A list of entity mappings in the format: array('&' => '&'); */ function appendEntityTranslationTable($table) { $this->definedEntities = $table; } //appendEntityTranslationTable /** * Gets the nth character from the end of the string * @param string The text to be queried * @param int The index from the end of the string * @return string The found character */ function getCharFromEnd($text, $index) { $len = strlen($text); $char = $text{($len - 1 - $index)}; return $char; } //getCharFromEnd /** * Parses the attributes string into an array of key / value pairs * @param string The attribute text * @return Array An array of key / value pairs */ function parseAttributes($attrText) { $attrText = trim($attrText); $attrArray = array(); $maybeEntity = false; $total = strlen($attrText); $keyDump = ''; $valueDump = ''; $currentState = SAXY_STATE_ATTR_NONE; $quoteType = ''; for ($i = 0; $i < $total; $i++) { // $currentChar = $attrText{$i}; $currentChar = substr($attrText, $i, 1); if ($currentState == SAXY_STATE_ATTR_NONE) { if (trim($currentChar != '')) { $currentState = SAXY_STATE_ATTR_KEY; } } switch ($currentChar) { case "\t": if ($currentState == SAXY_STATE_ATTR_VALUE) { $valueDump .= $currentChar; } else { $currentChar = ''; } break; case "\x0B": //vertical tab case "\n": case "\r": $currentChar = ''; break; case '=': if ($currentState == SAXY_STATE_ATTR_VALUE) { $valueDump .= $currentChar; } else { $currentState = SAXY_STATE_ATTR_VALUE; $quoteType = ''; $maybeEntity = false; } break; case '"': if ($currentState == SAXY_STATE_ATTR_VALUE) { if ($quoteType == '') { $quoteType = '"'; } else { if ($quoteType == $currentChar) { // Joomla! hack if (isset( $this ) && $this->convertEntities && $maybeEntity) { $valueDump = strtr($valueDump, $this->predefinedEntities); $valueDump = strtr($valueDump, $this->definedEntities); } $keyDump = trim($keyDump); $attrArray[$keyDump] = $valueDump; $keyDump = $valueDump = $quoteType = ''; $currentState = SAXY_STATE_ATTR_NONE; } else { $valueDump .= $currentChar; } } } break; case "'": if ($currentState == SAXY_STATE_ATTR_VALUE) { if ($quoteType == '') { $quoteType = "'"; } else { if ($quoteType == $currentChar) { // Joomla! hack if (isset( $this ) && $this->convertEntities && $maybeEntity) { $valueDump = strtr($valueDump, $this->predefinedEntities); $valueDump = strtr($valueDump, $this->definedEntities); } $keyDump = trim($keyDump); $attrArray[$keyDump] = $valueDump; $keyDump = $valueDump = $quoteType = ''; $currentState = SAXY_STATE_ATTR_NONE; } else { $valueDump .= $currentChar; } } } break; case '&': //might be an entity $maybeEntity = true; $valueDump .= $currentChar; break; default: if ($currentState == SAXY_STATE_ATTR_KEY) { $keyDump .= $currentChar; } else { $valueDump .= $currentChar; } } } return $attrArray; } //parseAttributes /** * Parses character data * @param string The character data */ function parseBetweenTags($betweenTagText) { if (trim($betweenTagText) != ''){ $this->fireCharacterDataEvent($betweenTagText); } } //parseBetweenTags /** * Fires a start element event * @param string The start element tag name * @param Array The start element attributes */ function fireStartElementEvent($tagName, $attributes) { call_user_func($this->startElementHandler, $this, $tagName, $attributes); } //fireStartElementEvent /** * Fires an end element event * @param string The end element tag name */ function fireEndElementEvent($tagName) { call_user_func($this->endElementHandler, $this, $tagName); } //fireEndElementEvent /** * Fires a character data event * @param string The character data */ function fireCharacterDataEvent($data) { if ($this->convertEntities && ((strpos($data, "&") != -1))) { $data = strtr($data, $this->predefinedEntities); $data = strtr($data, $this->definedEntities); } call_user_func($this->characterDataHandler, $this, $data); } //fireCharacterDataEvent /** * Fires a CDATA Section event * @param string The CDATA Section data */ function fireCDataSectionEvent($data) { call_user_func($this->cDataSectionHandler, $this, $data); } //fireCDataSectionEvent } //SAXY_Parser_Base ?>