Viewing file: Beautifier.php (10.61 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/** * XML_Beautifier * * XML Beautifier package * * PHP versions 4 and 5 * * LICENSE: * * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @category XML * @package XML_Beautifier * @author Stephan Schmidt <schst@php.net> * @copyright 2003-2008 Stephan Schmidt <schst@php.net> * @license http://opensource.org/licenses/bsd-license New BSD License * @version CVS: $Id: Beautifier.php 265438 2008-08-24 19:44:14Z ashnazg $ * @link http://pear.php.net/package/XML_Beautifier */
/** * define include path constant */ if (!defined('XML_BEAUTIFIER_INCLUDE_PATH')) { define('XML_BEAUTIFIER_INCLUDE_PATH', 'XML/Beautifier'); }
/** * element is empty */ define('XML_BEAUTIFIER_EMPTY', 0);
/** * CData */ define('XML_BEAUTIFIER_CDATA', 1);
/** * XML element */ define('XML_BEAUTIFIER_ELEMENT', 2);
/** * processing instruction */ define('XML_BEAUTIFIER_PI', 4);
/** * entity */ define('XML_BEAUTIFIER_ENTITY', 8);
/** * comment */ define('XML_BEAUTIFIER_COMMENT', 16);
/** * XML declaration */ define('XML_BEAUTIFIER_XML_DECLARATION', 32);
/** * doctype declaration */ define('XML_BEAUTIFIER_DT_DECLARATION', 64);
/** * cdata section */ define('XML_BEAUTIFIER_CDATA_SECTION', 128);
/** * default */ define('XML_BEAUTIFIER_DEFAULT', 256);
/** * overwrite the original file */ define('XML_BEAUTIFIER_OVERWRITE', -1);
/** * could not write to output file */ define('XML_BEAUTIFIER_ERROR_NO_OUTPUT_FILE', 151);
/** * could not load renderer */ define('XML_BEAUTIFIER_ERROR_UNKNOWN_RENDERER', 152);
/** * XML_Beautifier is a class that adds linebreaks and * indentation to your XML files. It can be used on XML * that looks ugly (e.g. any generated XML) to transform it * to a nicely looking XML that can be read by humans. * * It removes unnecessary whitespace and adds indentation * depending on the nesting level. * * It is able to treat tags, data, processing instructions * comments, external entities and the XML prologue. * * XML_Beautifier is using XML_Beautifier_Tokenizer to parse an XML * document with a SAX based parser and builds tokens of tags, comments, * entities, data, etc. * These tokens will be serialized and indented by a renderer * with your indent string. * * Example 1: Formatting a file * <code> * require_once 'XML/Beautifier.php'; * $fmt = new XML_Beautifier(); * $result = $fmt->formatFile('oldFile.xml', 'newFile.xml'); * </code> * * Example 2: Formatting a string * <code> * require_once 'XML/Beautifier.php'; * $xml = '<root><foo bar = "pear"/></root>'; * $fmt = new XML_Beautifier(); * $result = $fmt->formatString($xml); * </code> * * @category XML * @package XML_Beautifier * @author Stephan Schmidt <schst@php.net> * @copyright 2003-2008 Stephan Schmidt <schst@php.net> * @license http://opensource.org/licenses/bsd-license New BSD License * @version Release: @package_version@ * @link http://pear.php.net/package/XML_Beautifier */ class XML_Beautifier { /** * default options for the output format * @var array * @access private */ var $_defaultOptions = array( "removeLineBreaks" => true, "removeLeadingSpace" => true, // not implemented, yet "indent" => " ", "linebreak" => "\n", "caseFolding" => false, "caseFoldingTo" => "uppercase", "normalizeComments" => false, "maxCommentLine" => -1, "multilineTags" => false );
/** * options for the output format * @var array * @access private */ var $_options = array(); /** * Constructor * * This is only used to specify the options of the * beautifying process. * * @param array $options options that override default options * * @access public */ function XML_Beautifier($options = array()) { $this->_options = array_merge($this->_defaultOptions, $options); $this->folding = false; }
/** * reset all options to default options * * @return void * @access public * @see setOption(), XML_Beautifier(), setOptions() */ function resetOptions() { $this->_options = $this->_defaultOptions; }
/** * set an option * * You can use this method if you do not want * to set all options in the constructor * * @param string $name option name * @param mixed $value option value * * @return void * @access public * @see resetOptions(), XML_Beautifier(), setOptions() */ function setOption($name, $value) { $this->_options[$name] = $value; } /** * set several options at once * * You can use this method if you do not want * to set all options in the constructor * * @param array $options an options array * * @return void * @access public * @see resetOptions(), XML_Beautifier() */ function setOptions($options) { $this->_options = array_merge($this->_options, $options); }
/** * format a file or URL * * @param string $file filename * @param mixed $newFile filename for beautified XML file * (if none is given, the XML string * will be returned). * if you want overwrite the original file, * use XML_BEAUTIFIER_OVERWRITE * @param string $renderer Renderer to use, * default is the plain xml renderer * * @return mixed XML string of no file should be written, * true if file could be written * @access public * @throws PEAR_Error * @uses _loadRenderer() to load the desired renderer * @todo PEAR CS - should require_once be include_once? */ function formatFile($file, $newFile = null, $renderer = "Plain") { if ($newFile == XML_BEAUTIFIER_OVERWRITE) { $newFile = $file; }
/** * Split the document into tokens * using the XML_Tokenizer */ require_once XML_BEAUTIFIER_INCLUDE_PATH . '/Tokenizer.php'; $tokenizer = new XML_Beautifier_Tokenizer(); $tokens = $tokenizer->tokenize($file, true);
if (PEAR::isError($tokens)) { return $tokens; } $renderer = $this->_loadRenderer($renderer, $this->_options);
if (PEAR::isError($renderer)) { return $renderer; } $xml = $renderer->serialize($tokens); if ($newFile == null) { return $xml; } $fp = @fopen($newFile, "w"); if (!$fp) { return PEAR::raiseError("Could not write to output file", XML_BEAUTIFIER_ERROR_NO_OUTPUT_FILE); } flock($fp, LOCK_EX); fwrite($fp, $xml); flock($fp, LOCK_UN); fclose($fp); return true; }
/** * format an XML string * * @param string $string XML * @param string $renderer the renderer type * * @return string formatted XML string * @access public * @throws PEAR_Error * @todo PEAR CS - should require_once be include_once? */ function formatString($string, $renderer = "Plain") { /** * Split the document into tokens * using the XML_Tokenizer */ require_once XML_BEAUTIFIER_INCLUDE_PATH . '/Tokenizer.php'; $tokenizer = new XML_Beautifier_Tokenizer(); $tokens = $tokenizer->tokenize($string, false);
if (PEAR::isError($tokens)) { return $tokens; }
$renderer = $this->_loadRenderer($renderer, $this->_options);
if (PEAR::isError($renderer)) { return $renderer; } $xml = $renderer->serialize($tokens); return $xml; }
/** * load a renderer * * Renderers are used to serialize the XML tokens back * to an XML string. * * Renderers are located in the XML/Beautifier/Renderer directory. * * NOTE: the "@" error suppression is used in this method * * @param string $name name of the renderer * @param array $options options for the renderer * * @return object renderer * @access private * @throws PEAR_Error */ function &_loadRenderer($name, $options = array()) { $file = XML_BEAUTIFIER_INCLUDE_PATH . "/Renderer/$name.php"; $class = "XML_Beautifier_Renderer_$name";
@include_once $file; if (!class_exists($class)) { return PEAR::raiseError("Could not load renderer.", XML_BEAUTIFIER_ERROR_UNKNOWN_RENDERER); }
$renderer = &new $class($options); return $renderer; } /** * return API version * * @access public * @static * @return string $version API version */ function apiVersion() { return "1.0"; } } ?>
|