Page MenuHomeIn-Portal Phabricator

in-portal
No OneTemporary

File Metadata

Created
Thu, Feb 6, 3:41 PM

in-portal

Index: branches/RC/core/units/general/xml_helper.php
===================================================================
--- branches/RC/core/units/general/xml_helper.php (revision 10445)
+++ branches/RC/core/units/general/xml_helper.php (revision 10446)
@@ -1,298 +1,301 @@
<?php
class kXMLHelper extends kHelper {
var $RootElement = null;
/**
* Enter description here...
*
* @var kXMLNode
*/
var $CurrentElement = null;
-
+
var $Mode;
/**
* Parses XML data specified and returns root node
*
* @param string $xml
* @return kXMLNode
*/
function &Parse($xml = null, $mode=XML_NO_TEXT_NODES)
{
$this->Mode = $mode;
$this->Clear(); // in case if Parse method is called more then one time
$xml_parser = xml_parser_create();
xml_set_element_handler( $xml_parser, Array(&$this, 'startElement'), Array(&$this, 'endElement') );
xml_set_character_data_handler( $xml_parser, Array(&$this, 'characterData') );
if (!xml_parse($xml_parser, $xml, 1)) {
$this->RootElement = new kXMLNode('ERROR', array('code'=>xml_get_error_code($xml_parser),'message'=>xml_error_string(xml_get_error_code($xml_parser))));
trigger_error(sprintf('XML error: %s at line %d',
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)), E_USER_WARNING);
}
xml_parser_free($xml_parser);
$root_copy = $this->RootElement;
return $root_copy;
}
-
+
function ConvertHTMLEntities($s){
//build first an assoc. array with the entities we want to match
$table1 = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
-
+
$patterns = array();
$replacements = array();
//now build another assoc. array with the entities we want to replace (numeric entities)
foreach ($table1 as $k=>$v){
$patterns[] = "/$v/";
// $c = htmlentities($k,ENT_QUOTES,"UTF-8");
$replacements[] = "&#".ord($k).";";
}
-
+
//now perform a replacement using preg_replace
//each matched value in array 1 will be replaced with the corresponding value in array 2
$s = preg_replace($patterns,$replacements,$s);
return $s;
}
-
+
function startElement(&$Parser, &$Elem, $Attrs)
{
$parent =& $this->CurrentElement; // 1. $parent is now reference to $this->CurrentElement
$this->CurrentElement =& new kXMLNode($Elem, $Attrs); // 2. =& ensures, that new object won't be assigned to $parent as well (don't remove)
if (!isset($this->RootElement) || is_null($this->RootElement)) {
$this->RootElement =& $this->CurrentElement;
}
if (!is_null($parent)) {
$parent->AddChild($this->CurrentElement);
}
}
function characterData($Parser, $Line)
{
if ($this->Mode == XML_WITH_TEXT_NODES) {
$text_node = new kXMLNode('_TEXT_');
$text_node->AppendData($Line);
$this->CurrentElement->AddChild( $text_node );
}
$this->CurrentElement->AppendData($Line);
}
function endElement($Parser, $Elem)
{
if ($this->Mode == XML_WITH_TEXT_NODES) {
/*if (count($this->CurrentElement->Children) == 1 && $this->CurrentElement->firstChild->Name == '_TEXT_') {
$this->CurrentElement->Children = array();
}*/
}
if ($this->CurrentElement->Parent != null) {
$this->CurrentElement =& $this->CurrentElement->Parent;
}
}
function Clear()
{
unset($this->RootElement);
unset($this->CurrentElement);
}
}
class kXMLNode {
var $Name = null;
var $Attributes = array();
var $Children = array();
var $Data = null;
var $firstChild = null;
var $lastChild = null;
/**
* Parent node
*
* @var kXMLNode
*/
var $Parent = null;
/**
* Node position relative to other nodes of it's parent
*
* @var int
*/
var $Position = 0;
-
+
var $CRC = null;
function kXMLNode($name, $attrs = array())
{
$this->Name = strtoupper($name);
foreach ($attrs as $attr => $value) {
$this->Attributes[strtoupper($attr)] = $value;
}
$this->CRC = crc32($this->Name.join(array_keys($this->Attributes)).join(array_values($this->Attributes)));
}
function SetParent(&$elem)
{
$this->Parent =& $elem;
}
/**
* Adds new child to current node
*
* @param kXMLNode $a_child
*/
function AddChild(&$a_child)
{
$node_count = count($this->Children);
$a_child->Position = $node_count;
if ($node_count == 0) {
$this->firstChild =& $a_child;
$this->lastChild =& $a_child;
}
else {
$this->lastChild =& $a_child;
}
$this->Children[] =& $a_child;
$a_child->SetParent($this);
}
function AppendData($data)
{
$this->Data .= $data;
}
function &GetChild($path)
{
$entries = explode('/', strtoupper($path));
$cur = array_shift($entries);
if ($cur == $this->Name) $cur = array_shift($entries);
if (!$cur) return $this;
if (!isset($this->Children[$cur])) return false;
$left = implode('/', $entries);
if (!$left) return $this->Children[$cur];
return $this->Children[$cur]->GetChild($left);
}
function GetChildValue($path)
{
$child =& $this->GetChild($path);
if ($child !== false) {
return $child->Data;
}
}
function &GetChildByPosition($position)
{
if ($position < count($this->Children) ) {
return $this->Children[$position];
}
else {
$false = false;
return $false;
}
}
function &FindChild($name)
{
$name = strtoupper($name);
if ($this->Name == $name) return $this;
// if (isset($this->Children[$name])) return $this->Children[$name];
// $children = array_keys($this->Children);
foreach ($this->Children as $elem)
{
$child =& $elem->FindChild($name);
if ($child !== false)
{
return $child;
}
}
$false = false;
return $false;
}
function FindChildValue($name, $attr=null)
{
$child =& $this->FindChild($name);
if ($child !== false) {
if (isset($attr)) {
return $child->Attributes[strtoupper($attr)];
}
return $child->Data;
}
}
-
+
/**
* Returns next node to this, false in case of end list
*
* @return kXMLNode
*/
function &PrevSibling()
{
if (!is_null($this->Parent) && $this->Position > 0) {
$pos = $this->Position - 1;
do {
$ret =& $this->Parent->GetChildByPosition($pos--);
} while ($ret->Name == '_TEXT_' && $pos >= 0);
if ($ret->Name == '_TEXT_') $ret = false;
return $ret;
}
else {
$false = false;
return $false;
}
}
/**
* Returns next node to this, false in case of end list
*
* @return kXMLNode
*/
function &NextSibling()
{
if (!is_null($this->Parent)) {
$pos = $this->Position + 1;
do {
$ret =& $this->Parent->GetChildByPosition($pos++);
- } while ($ret->Name == '_TEXT_' && $pos < count($this->Parent->Children));
- if ($ret->Name == '_TEXT_') $ret = false;
+ } while ($pos < count($this->Parent->Children) && ($ret->Name == '_TEXT_'));
+
+ if (is_object($ret) && ($ret->Name == '_TEXT_')) {
+ $ret = false;
+ }
return $ret;
}
else {
$false = false;
return $false;
}
}
/**
* Reconstructs XML of the node and subnodes
*
* $param bool $content_only
*/
function GetXML($content_only = false)
{
$xml = '';
if (!$content_only) {
$xml = '<'.$this->Name;
if (count($this->Attributes)) {
$xml .= ' ';
$att_contents = array();
foreach ($this->Attributes as $name => $value) {
$att_contents[] = $name.'="'.$value.'"';
}
$xml .= implode(' ', $att_contents);
}
$xml .= '>';
}
$xml .= $this->Data;
foreach ($this->Children as $node) {
$xml .= $node->GetXML();
}
if (!$content_only) {
$xml .= '</'.$this->Name.'>';
}
return $xml;
}
}
?>
\ No newline at end of file
Property changes on: branches/RC/core/units/general/xml_helper.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.8.2.7
\ No newline at end of property
+1.8.2.8
\ No newline at end of property

Event Timeline