git-svn-id: https://192.168.0.254/svn/Proyectos.FundacionLQDVI_WebCongresos/trunk@2 94ccb1af-fd9d-d947-8d90-7f70ea60afc8
384 lines
11 KiB
PHP
384 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* DOMIT Utilities are a set of utilities for the DOMIT! parser
|
|
* @package domit-xmlparser
|
|
* @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/domit/ DOMIT! Home Page
|
|
* DOMIT! is Free Software
|
|
**/
|
|
|
|
/**
|
|
*@global Array Translation table for predefined XML entities
|
|
*/
|
|
$GLOBALS['DOMIT_PREDEFINED_ENTITIES'] = array('&' => '&', '<' => '<', '>' => '>',
|
|
'"' => '"', "'" => ''');
|
|
/**
|
|
* A set of utilities for the DOMIT! parser
|
|
*
|
|
* These methods are intended to be called statically
|
|
*
|
|
* @package domit-xmlparser
|
|
* @author John Heinstein <johnkarl@nbnet.nb.ca>
|
|
*/
|
|
class DOMIT_Utilities {
|
|
/**
|
|
* Raises an error if an attempt to instantiate the class is made
|
|
*/
|
|
function DOMIT_Utilities() {
|
|
die("DOMIT_Utilities Error: this is a static class that should never be instantiated.\n" .
|
|
"Please use the following syntax to access methods of this class:\n" .
|
|
'DOMIT_Utilities::methodName(parameters)');
|
|
} //DOMIT_Utilities
|
|
|
|
/**
|
|
* Generates a normalized (formatted for readability) representation of the node and its children
|
|
* @param Object The root node of the narmalization
|
|
* @param boolean True if illegal xml characters in text nodes and attributes should be converted to entities
|
|
* @return string The formatted string representation
|
|
*/
|
|
function toNormalizedString (&$node, $subEntities=false, $definedEntities) {
|
|
$node_level = 0;
|
|
$response = '';
|
|
|
|
//$node is a DOMIT_Document
|
|
if ($node->nodeType == DOMIT_DOCUMENT_NODE) {
|
|
$total = $node->childCount;
|
|
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$response .= DOMIT_Utilities::getNormalizedString($node->childNodes[$i],
|
|
$node_level, $subEntities, $definedEntities);
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
else {
|
|
return ($response . DOMIT_Utilities::getNormalizedString($node,
|
|
$node_level, $subEntities, $definedEntities));
|
|
}
|
|
} //toNormalizedString
|
|
|
|
/**
|
|
* Converts illegal XML characters to their entity representations
|
|
* @param string The text to be formatted
|
|
* @param array User defined translation table for entities
|
|
* @return string The formatted text
|
|
*/
|
|
function convertEntities($text, $definedEntities) {
|
|
global $DOMIT_PREDEFINED_ENTITIES;
|
|
$result = strtr($text, $DOMIT_PREDEFINED_ENTITIES);
|
|
$result = strtr($result, $definedEntities);
|
|
return $result;
|
|
} //convertEntities
|
|
|
|
/**
|
|
* Gets a normalized (formatted for readability) representation of the current node
|
|
* @param Object The node to be normalized
|
|
* @param int The level in the DOM hierarchy where the node is located
|
|
* @param boolean True if illegal xml characters in text nodes and attributes should be converted to entities
|
|
* @param array User defined translation table for entities
|
|
* @return string The normalized string representation
|
|
*/
|
|
function getNormalizedString(&$node, $node_level, $subEntities=false, $definedEntities) {
|
|
$response = '';
|
|
|
|
switch ($node->nodeType) {
|
|
case DOMIT_ELEMENT_NODE:
|
|
$response .= DOMIT_Utilities::getNormalizedElementString($node, $response,
|
|
$node_level, $subEntities, $definedEntities);
|
|
break;
|
|
|
|
case DOMIT_TEXT_NODE:
|
|
if ($node->nextSibling == null) {
|
|
$node_level--;
|
|
}
|
|
|
|
$response .= ($subEntities ?
|
|
DOMIT_Utilities::convertEntities($node->nodeValue, $definedEntities) :
|
|
$node->nodeValue);
|
|
break;
|
|
|
|
case DOMIT_CDATA_SECTION_NODE:
|
|
if ($node->nextSibling == null) {
|
|
$node_level--;
|
|
}
|
|
|
|
$response .= '<![CDATA[' . $node->nodeValue . ']]>';
|
|
break;
|
|
|
|
case DOMIT_ATTRIBUTE_NODE:
|
|
$response .= $node->toString(false, $subEntities);
|
|
break;
|
|
|
|
case DOMIT_DOCUMENT_FRAGMENT_NODE:
|
|
$total = $node->childCount;
|
|
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$response .= DOMIT_Utilities::getNormalizedString($node->childNodes[$i], $node_level,
|
|
$subEntities, $definedEntities);
|
|
}
|
|
|
|
break;
|
|
|
|
case DOMIT_COMMENT_NODE:
|
|
$response .= '<!--' . $node->nodeValue . '-->';
|
|
|
|
if ($node->nextSibling == null) {
|
|
$node_level--;
|
|
}
|
|
|
|
$response .= DOMIT_Utilities::getIndentation($node_level) ;
|
|
|
|
break;
|
|
|
|
case DOMIT_PROCESSING_INSTRUCTION_NODE:
|
|
$response .= '<' . '?' . $node->nodeName . ' ' . $node->nodeValue . '?' . '>';
|
|
|
|
if ($node->nextSibling == null) {
|
|
$node_level--;
|
|
}
|
|
|
|
$response .= DOMIT_Utilities::getIndentation($node_level) ;
|
|
|
|
break;
|
|
|
|
case DOMIT_DOCUMENT_TYPE_NODE:
|
|
$response .= $node->toString() . "\n";
|
|
break;
|
|
}
|
|
|
|
return $response;
|
|
} //getNormalizedString
|
|
|
|
/**
|
|
* Gets a normalized (formatted for readability) representation of the current element
|
|
* @param Object The node to be normalized
|
|
* @param string The current normalized text
|
|
* @param int The level in the DOM hierarchy where the node is located
|
|
* @param boolean True if illegal xml characters in text nodes and attributes should be converted to entities
|
|
* @param array User defined translation table for entities
|
|
* @return string The normalized string representation
|
|
*/
|
|
function getNormalizedElementString(&$node, $response, $node_level,
|
|
$subEntities, $definedEntities) {
|
|
$response .= '<' . $node->nodeName;
|
|
|
|
//get attributes text
|
|
if (is_object($node->attributes)) { //DOMIT
|
|
$response .= $node->attributes->toString(false, $subEntities);
|
|
|
|
/*
|
|
if ($node->ownerDocument->isNamespaceAware) {
|
|
foreach ($node->namespaceURIMap as $key => $value) {
|
|
$response .= ' xmlns:' . $value . '="' . $key . '"';
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
else { //DOMIT_Lite
|
|
foreach ($node->attributes as $key => $value) {
|
|
$response .= ' ' . $key . '="';
|
|
$response .= ($subEntities ? DOMIT_Utilities::convertEntities($value,
|
|
$definedEntities) : $value);
|
|
$response .= '"';
|
|
}
|
|
}
|
|
|
|
$node_level++;
|
|
|
|
//if node is childless
|
|
if ($node->childCount == 0) {
|
|
if ($node->ownerDocument->doExpandEmptyElementTags) {
|
|
if (in_array($node->nodeName, $node->ownerDocument->expandEmptyElementExceptions)) {
|
|
$response .= ' />';
|
|
}
|
|
else {
|
|
$response .= '></' . $node->nodeName . '>';
|
|
}
|
|
}
|
|
else {
|
|
if (in_array($node->nodeName, $node->ownerDocument->expandEmptyElementExceptions)) {
|
|
$response .= '></' . $node->nodeName . '>';
|
|
}
|
|
else {
|
|
$response .= ' />';
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$response .= '>';
|
|
|
|
//get children
|
|
$myNodes =& $node->childNodes;
|
|
$total = $node->childCount;
|
|
|
|
//no indentation if first child is a text node
|
|
if (!DOMIT_Utilities::isTextNode($node->firstChild)) {
|
|
$response .= DOMIT_Utilities::getIndentation($node_level);
|
|
}
|
|
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$child =& $myNodes[$i];
|
|
$response .= DOMIT_Utilities::getNormalizedString($child, $node_level,
|
|
$subEntities, $definedEntities);
|
|
}
|
|
|
|
$response .= '</' . $node->nodeName . '>';
|
|
}
|
|
|
|
$node_level--;
|
|
|
|
if ($node->nextSibling == null) {
|
|
$node_level--;
|
|
$response .= DOMIT_Utilities::getIndentation($node_level);
|
|
}
|
|
else {
|
|
//no indentation if next sibling is a text node
|
|
if (!DOMIT_Utilities::isTextNode($node->nextSibling)) {
|
|
$response .= DOMIT_Utilities::getIndentation($node_level);
|
|
}
|
|
}
|
|
|
|
return $response;
|
|
} //getNormalizedElementString
|
|
|
|
/**
|
|
* Determines whether the specified node is a Text node
|
|
* @param Object The node to be tested
|
|
* @return boolean True if the node is a Text node
|
|
*/
|
|
function isTextNode(&$node) {
|
|
$type = $node->nodeType;
|
|
return (($type == DOMIT_TEXT_NODE) || ($type == DOMIT_CDATA_SECTION_NODE));
|
|
} //isTextNode
|
|
|
|
/**
|
|
* Returns the indentation required for the specified node level
|
|
* @param int The current node level
|
|
* @return string The indentation required for the specified node level
|
|
*/
|
|
function getIndentation($node_level) {
|
|
$INDENT_LEN = ' ';
|
|
$indentation = "\n";
|
|
|
|
for ($i = 0; $i < $node_level; $i++) {
|
|
$indentation .= $INDENT_LEN;
|
|
}
|
|
|
|
return $indentation;
|
|
} //getIndentation
|
|
|
|
/**
|
|
* Removes the extension from the specified file name
|
|
* @param string The file name
|
|
* @return string The file name, stripped of its extension
|
|
*/
|
|
function removeExtension($fileName) {
|
|
$total = strlen($fileName);
|
|
$index = -1;
|
|
|
|
for ($i = ($total - 1); $i >= 0; $i--) {
|
|
if ($fileName{$i} == '.') {
|
|
$index = $i;
|
|
}
|
|
}
|
|
|
|
if ($index == -1) {
|
|
return $fileName;
|
|
}
|
|
|
|
return (substr($fileName, 0, $index));
|
|
} //removeExtension
|
|
|
|
/**
|
|
* Determines whether the XML string is valid (NOT FULLY IMPLEMENTED!)
|
|
* @param string The XML text
|
|
* @return boolean True if the XML text is valid
|
|
*/
|
|
function validateXML($xmlText) {
|
|
//this does only rudimentary validation
|
|
//at this point in time
|
|
$isValid = true;
|
|
|
|
if (is_string($xmlText)) {
|
|
$text = trim($xmlText);
|
|
|
|
switch ($text) {
|
|
case '':
|
|
$isValid = false;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
$isValid = false;
|
|
}
|
|
|
|
return $isValid;
|
|
} //validateXML
|
|
|
|
/**
|
|
* Set the browser header to interpret data as UTF-8 formatted
|
|
* @param string The content type of the data
|
|
*/
|
|
function printUTF8Header($contentType = 'text/html') {
|
|
echo header('Content-type: ' . $contentType . '; charset=utf-8');
|
|
} //printUTF8Header
|
|
|
|
/**
|
|
* Formats a string for presentation as HTML
|
|
* @param string The string to be formatted
|
|
* @param boolean True if the string is to be sent directly to output
|
|
* @return string The HTML formatted string
|
|
*/
|
|
function forHTML($text, $doPrint = false) {
|
|
if ($doPrint) {
|
|
print ('<pre>' . htmlspecialchars($text) . '</pre>');
|
|
}
|
|
else {
|
|
return ('<pre>' . htmlspecialchars($text) . '</pre>');
|
|
}
|
|
} //forHTML
|
|
|
|
/**
|
|
* Generates a node tree from an array and appends it to the specified document or node
|
|
* @param object The document or node to which the child nodes should be appended
|
|
* @param array An associative multidimensional array of elements and values
|
|
*/
|
|
function fromArray (&$node, &$myArray) {
|
|
if ($node->nodeType == DOMIT_DOCUMENT_NODE) {
|
|
$docNode =& $node;
|
|
}
|
|
else {
|
|
$docNode =& $node->ownerDocument;
|
|
}
|
|
|
|
foreach ($myArray as $key => $value) {
|
|
if (is_array($value)) {
|
|
//check for numeric indices
|
|
$total = count($value);
|
|
|
|
if (($total > 0) && isset($value[0])){
|
|
for ($i = 0; $i < $total; $i++) {
|
|
$node->appendChild($docNode->createElement($key));
|
|
DOMIT_Utilities::fromArray($node->lastChild, $value[$i]);
|
|
}
|
|
}
|
|
else {
|
|
//generate child elements
|
|
$node->appendChild($docNode->createElement($key));
|
|
DOMIT_Utilities::fromArray($node->lastChild, $value);
|
|
}
|
|
}
|
|
else {
|
|
$node->appendChild($docNode->createElement($key));
|
|
$node->lastChild->appendChild($docNode->createTextNode($value));
|
|
}
|
|
}
|
|
} //fromArray
|
|
|
|
function parseAttributes() {
|
|
|
|
} //parseAttributes
|
|
} //DOMIT_Utilities
|
|
?>
|