Current File : //opt/RZphp74/includes/XML/FastCreate.php |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Master file that defined the base structure for extended classes (drivers).
*
* This is the file included by the end-developper. The driver class needed is
* automatically included.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category XML
* @package XML_FastCreate
* @author Guillaume Lecanu <Guillaume@dev.fr>
* @copyright 1997-2005 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id$
* @link http://pear.php.net/package/XML_FastCreate
* @see XML_Tree
*/
require_once 'PEAR.php';
// {{{ constants
/**
* Errors of XML_FastCreate
*/
define('XML_FASTCREATE_ERROR_NO_FACTORY', 1);
define('XML_FASTCREATE_ERROR_NO_DRIVER', 2);
define('XML_FASTCREATE_ERROR_DTD', 3);
/**
* Default filename for 'file' option
*/
define('XML_FASTCREATE_FILE', '/tmp/XML_FastCreate.xml');
/**
* Default program for 'exec' option
*/
define('XML_FASTCREATE_EXEC',
'/usr/bin/xmllint --valid --noout /tmp/XML_FastCreate.xml 2>&1');
/**
* DocType : XHTML 1.1
*/
define('XML_FASTCREATE_DOCTYPE_XHTML_1_1',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" '
.'"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">');
/**
* DocType : XHTML 1.0 Strict
*/
define('XML_FASTCREATE_DOCTYPE_XHTML_1_0_STRICT',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" '
.'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
/**
* DocType : XHTML 1.0 Transitional
*/
define('XML_FASTCREATE_DOCTYPE_XHTML_1_0_TRANSITIONAL',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '
.'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
/**
* DocType : XHTML 1.0 Frameset
*/
define('XML_FASTCREATE_DOCTYPE_XHTML_1_0_FRAMESET',
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" '
.'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">');
/**
* DocType : XHTML 4.01 Strict
*/
define('XML_FASTCREATE_DOCTYPE_HTML_4_01_STRICT',
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
.'"http://www.w3.org/TR/html4/strict.dtd">');
/**
* DocType : XHTML 4.01 Transitional
*/
define('XML_FASTCREATE_DOCTYPE_HTML_4_01_Transitional',
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" '
.'"http://www.w3.org/TR/html4/loose.dtd">');
/**
* DocType : XHTML 4.01 Frameset
*/
define('XML_FASTCREATE_DOCTYPE_HTML_4_01_Frameset',
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" '
.'"http://www.w3.org/TR/html4/frameset.dtd">');
// }}}
/**
* Make a special class for overloading, depending of the PHP version.
* The class XML_FastCreate extend this special class 'XML_FastCreate_Overload'
*/
if (isSet($GLOBAALS['XML_FASTCREATE_NO_OVERLOAD'])
&& $GLOBAALS['XML_FASTCREATE_NO_OVERLOAD']) {
if (is_array($GLOBAALS['XML_FASTCREATE_NO_OVERLOAD'])) {
$class = 'class XML_FastCreate_Overload extends PEAR {';
foreach ($GLOBAALS['XML_FASTCREATE_NO_OVERLOAD'] as $tag) {
$class .= <<<TEXT
function $tag() {
\$args = func_get_args();
array_unshift(\$args, '$tag');
return call_user_func_array(array(&\$this, 'xml'), \$args);
}
TEXT;
}
$class .= ' }';
eval($class);
} else {
class XML_FastCreate_Overload extends PEAR {}
}
} else {
if (phpversion() < 5) {
$class = <<<TEXT
class XML_FastCreate_Overload extends PEAR {
function __call(\$method, \$args, &\$return)
{
if (\$method != __CLASS__) {
\$return = \$this->_call(\$method, \$args);
}
return true;
}
}
TEXT;
eval($class);
if (function_exists('overload')) {
overload('XML_FastCreate_Overload');
}
} else {
$class = <<<TEXT
class XML_FastCreate_Overload extends PEAR {
function __call(\$method, \$args)
{
if (\$method != __CLASS__) {
return \$this->_call(\$method, \$args);
}
}
}
TEXT;
eval($class);
}
}
// {{{ XML_FastCreate
/**
* Master class to used the XML_FastCreate application.
*
* The end-developper need to call the factory() method to make an instance :
* $x =& XML_FastCreate::factory('Text');
* Simple example to make a valid XHTML page :
* <code>
* <?php
* require_once 'XML/FastCreate.php';
* $x =& XML_FastCreate::factory('Text');
* $x->html(
* $x->head(
* $x->title("A simple XHTML page")
* ),
* $x->body(
* $x->div(
* $x->h1('Example'),
* $x->br(),
* $x->a(array('href' => 'http://pear.php.net'), 'PEAR WebSite')
* )
* )
* );
* // Write output
* $x->toXML();
* ?>
* </code>
* KNOWN BUGS :
* - XML_DTD is an alpha version
* - Some DTD couln't correctly interpreted (like XHTML 1.1)
* - You can use an external program like XMLLINT for check validation
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category XML
* @package XML_FastCreate
* @author Guillaume Lecanu <Guillaume@dev.fr>
* @copyright 1997-2005 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id$
* @link http://pear.php.net/package/XML_FastCreate
* @see XML_Tree
*/
class XML_FastCreate extends XML_FastCreate_Overload
{
// {{{ properties
/**
* DTD Filename for check validity of XML
*
* @var string
* @access private
*/
var $_dtd;
/**
* Enable / disable output indentation
*
* @var boolean
* @access private
*/
var $_indent = false;
/**
* Write output to a file
*
* @var string
* @access private
*/
var $_file;
/**
* Run external command after write output into file
*
* @var string
* @access private
*/
var $_exec;
/*
* Flag to know if the factory is used
*
* @var boolean
* @access private
*/
var $_factory = false;
/*
* Name of the driver use
*
* @var string
* @access private
*/
var $_driver;
/*
* List of tags replacements
*
* @var array
* @access private
*/
var $_translate;
/*
* List of entities to convert
*
* @var array
* @access private
*/
var $_entities = array('&', '<', '>', '"', "'");
/*
* List of replacement of entities
*
* @var array
* @access private
*/
var $_replaces = array('&', '<', '>', '"', ''');
// }}}
// {{{ factory()
/**
* Factory : Make an instance of XML_FastCreate object
*
* @param string $driver Driver to use ("Text", "XML_Tree"..)
*
* @param array $options Hashtable of options :
*
* 'dtd' : Set the DTD file to check validity
* [required the XML_DTD package]
*
* 'indent' : Enable / disable output indentation
*
* 'version' : Set the XML version (default = '1.0')
*
* 'encoding' : Set the encoding charset (default = 'UTF-8')
*
* 'standalone' : Set the standalone attribute (default = 'no')
*
* 'doctype' : DocType string, set manually or use :
* XML_FASTCREATE_DOCTYPE_XHTML_1_1
* XML_FASTCREATE_DOCTYPE_XHTML_1_0_STRICT
* XML_FASTCREATE_DOCTYPE_XHTML_1_0_FRAMESET
* XML_FASTCREATE_DOCTYPE_XHTML_1_0_TRANSITIONAL
* XML_FASTCREATE_DOCTYPE_HTML_4_01_STRICT
* XML_FASTCREATE_DOCTYPE_HTML_4_01_FRAMESET
* XML_FASTCREATE_DOCTYPE_HTML_4_01_TRANSITIONAL
*
* 'quote' : Auto quote attributes & contents (default = true)
*
* 'translate' : Hashtable of tags to translate to anothers :
* 'translate' => array(
* 'title' => array('<h1 class="title"><span>',
* '</span></h1>'),
* 'date' => array('<span class="date">',
* '</span>'),
* )
*
* 'exec' : Use an external tool to valid the document
*
* 'file' : Write the validation output to a file
*
* 'expand' : Return single tag with the syntax :
* <tag></tag> rather <tag /> (default = false)
* ( set to true if you write HTML )
*
* 'apos' : Quote apostrophe to ' (default = true)
* <! WARNING !>
* For valid XML, you must let this option to true.
* If you write XHTML, Microsoft Internet Explorer
* won't recognize this entitie, so you need to turn
* this option to false.
*
* 'singleAttribute' : Accept single attributes (default = false)
* ex: $x->input(array('type'=>'checkbox',
* checked=>true))
* => <input type="checkbox" checked />
* <! WARNING !>
* This syntax is not valid XML.
* For valid XML, don't use this option, use this :
* ex: $x->input(array('type'=>'checkbox',
* checked=>'checked'))
* => <input type="checkbox" checked=>"checked" />
*
* @return object An XML_FastCreate_<driver> instance
* @access public
* @static
*/
function &factory($driver, $options = array())
{
@include_once "FastCreate/{$driver}.php";
$class = 'XML_FastCreate_'.$driver;
if (!class_exists($class)) {
return PEAR::raiseError("Unable to include the XML/FastCreate/"
.$driver.".php file.", XML_FASTCREATE_ERROR_NO_DRIVER,
PEAR_ERROR_DIE);
}
$obj = new $class($options);
return $obj;
}
// }}}
// {{{ XML_FastCreate()
/**
* Constructor method. Use the factory() method to make an instance
*
* @param array $options Hashtable of options. See factory() for details.
*
* @return object An XML_FastCreate instance
* @access private
*/
function XML_FastCreate($options = array())
{
if ($this->_factory) {
$this->PEAR();
$this->_dtd = (isSet($options['dtd'])
? $options['dtd'] : '');
$this->_file = (isSet($options['file'])
? $options['file'] : '');
$this->_exec = (isSet($options['exec'])
? $options['exec'] : '');
if (isSet($options['indent'])) {
$this->_indent = $options['indent'];
}
if (isSet($options['translate'])) {
$this->_translate = $options['translate'];
}
if ($this->_dtd) {
include_once 'XML/DTD/XmlValidator.php';
}
if (!isSet($options['apos'])) {
$options['apos'] = true;
}
if (!$options['apos']) {
array_pop($this->_entities);
array_pop($this->_replaces);
}
} else {
PEAR::raiseError("Use the factory() method please.",
XML_FASTCREATE_ERROR_NO_FACTORY,
PEAR_ERROR_DIE);
}
}
// }}}
// {{{ _call()
/**
* Overloading management
*
* @param string $method Name of the function overloaded
* @param array $args List of arguments of the function overloaded
*
* @return mixed
* @access private
*/
function _call(&$method, &$args)
{
array_unshift($args, $method);
return call_user_func_array(array(&$this, 'xml'), $args);
}
// }}}
// {{{ toXML()
/**
* Print the current XML to standard output
*
* @return mixed Return true or a PEAR Error object
* @access public
*/
function toXML()
{
$xml = $this->getXML();
if ($this->_indent) {
$xml = $this->indentXML($xml);
}
print $xml;
// Check Validity
if ($this->_dtd) {
return $this->isValid($xml);
}
// Write output to file
if ($this->_file) {
$fp = fopen($this->_file, 'w+');
fwrite($fp, $xml);
fclose($fp);
}
// Run an external program
if ($this->_exec) {
$return = shell_exec($this->_exec);
if ($return) {
return PEAR::raiseError($return, XML_FASTCREATE_ERROR_DTD);
}
}
return true;
}
// }}}
// {{{ isValid()
/**
* Check if the XML respect the DTD.
* Require the XML_DTD package
*
* @param string $xml The XML text to check
*
* @return boolean Return true if valid
* @access public
*/
function isValid(&$xml)
{
$validator = new XML_DTD_XmlValidator;
$tree = new XML_Tree();
$nodes = $tree->getTreeFromString($xml);
if (PEAR::isError($nodes)) {
return $nodes;
}
$parser =& new XML_DTD_Parser;
$validator->dtd = $parser->parse($this->_dtd);
$validator->_runTree($nodes);
if ($validator->_errors) {
$errors = $validator->getMessage();
return PEAR::raiseError($errors, XML_FASTCREATE_ERROR_DTD);
}
return true;
}
// }}}
// {{{ _quoteEntities()
/**
* Replace XML special characters by their entities
*
* Convert : & < > " '
* To : & < > " '
*
* @param string $content Content to be quoted
*
* @return string The quoted content
* @access private
*/
function _quoteEntities($content)
{
return str_replace($this->_entities, $this->_replaces, $content);
}
// }}}
// {{{ indentXML()
/**
* Indent an XML text
*
* @param string $xml XML text to indent
*
* @return string The XML text indented
* @acess public
*/
function indentXML($xml)
{
require_once "XML/Beautifier.php";
$fmt = new XML_Beautifier();
$out =& $fmt->formatString($xml);
return $out;
}
// }}}
// {{{ xml()
/**
* Make an XML tag.
*
* Accept all forms of parameters.
*
* @param string $tag Name of the tag
* @param array $args Optional list for attributes
* @param array $contents Optional list of contents (strings or sub tags)
*
* @return mixed See the driver specification
* @access public
*/
function xml($tag)
{
$attribs = array();
$args = func_get_args();
array_shift($args);
if ((count($args) > 0) && is_array($args[0])) {
$attribs = $args[0];
array_shift($args);
}
if ($tag{0} == '_') {
$tag = substr($tag, 1);
} else {
if (isSet($this->_translate[$tag])) {
if (isSet($this->_translate[$tag][1])) {
$open =& $this->_translate[$tag][0];
$close =& $this->_translate[$tag][1];
} elseif (isSet($this->_translate[$tag][0])) {
$open = '<'.$this->_translate[$tag][0].'>';
$close = '</'.$this->_translate[$tag][0].'>';
} else {
$open = '<div class="'.$tag.'">';
$close = '</div>';
}
return $this->importXML($open.$this->exportXML($args).$close);
}
}
return $this->makeXML($tag, $attribs, $args);
}
// }}}
// -------------------------------------------------------- \\
// --- Abstract methods to be implemented by the driver --- \\
// -------------------------------------------------------- \\
// {{{ makeXML()
/**
* Make an XML Tag
*
* @param string $tag Name of the tag
* @param array $attribs List of attributes
* @param array $contents List of contents (strings or sub tags)
*
* @return mixed See the driver specifications
* @access public
*/
function makeXML($tag, $attribs = array(), $contents = array())
{
}
// }}}
// {{{ quote()
/**
* Encode a string to be include in XML tags.
*
* To use only if the 'quoteContents' is false
* Convert : & < > " '
* To : & < > " '
*
* @param string $content Content to be quoted
*
* @return string The quoted content
* @access public
*/
function quote($content)
{
}
// }}}
// {{{ noquote()
/**
* Don't quote this content.
*
* To use only if the 'quoteContents' is true
*
* @param string $content Content to escape quoting
*
* @return string The content not quoted
* @access public
*/
function noquote($content)
{
}
// }}}
// {{{ comment()
/**
* Make an XML comment
*
* @param mixed $content Content to comment
*
* @return mixed See the driver specifications
* @access public
*/
function comment($content)
{
}
// }}}
// {{{ cdata()
/**
* Make a CDATA section <![CDATA[ (...) ]]>
*
* @param mixed $content Content of the section
*
* @return mixed See the driver specifications
* @access public
*/
function cdata($content)
{
}
// }}}
// {{{ getXML()
/**
* Return the current XML text
*
* @return string The current XML text
* @access public
*/
function getXML()
{
}
// }}}
// {{{ importXML()
/**
* Import XML text to driver data
*
* @param mixed $xml The XML text
*
* @return mixed See the driver specifications
* @access public
*/
function importXML($xml)
{
}
// }}}
// {{{ exportXML()
/**
* Export driver data to XML text
*
* @param mixed $xml The XML data driver
*
* @return string The XML text
* @access public
*/
function exportXML($xml)
{
}
// }}}
}
// }}}
?>