diff --git a/NEWS b/NEWS index 2413cb92..87b998ab 100644 --- a/NEWS +++ b/NEWS @@ -20,11 +20,14 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier off, but it's not recommended. # New compact syntax for AttrDef objects that can be used to instantiate new objects via make() +# Definitions (esp. HTMLDefinition) are now cached for a significant + performance boost ! HTML Purifier now works in PHP 4.3.2. ! Configuration form-editing API makes tweaking HTMLPurifier_Config a breeze! ! Configuration directives that accept hashes now allow new string format: key1,value1,key2,value2 +! ConfigDoc now factored into OOP design - Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work! . Unit test for ElementDef created, ElementDef behavior modified to be more flexible diff --git a/configdoc/generate.php b/configdoc/generate.php index 328394ee..7e73663a 100644 --- a/configdoc/generate.php +++ b/configdoc/generate.php @@ -2,6 +2,7 @@ /** * Generates XML and HTML documents describing configuration. + * @note PHP 5 only! */ /* @@ -23,7 +24,7 @@ TODO: // Check and configure environment if (version_compare('5', PHP_VERSION, '>')) exit('Requires PHP 5 or higher.'); -error_reporting(E_ALL); +error_reporting(E_ALL); // probably not possible to use E_STRICT // --------------------------------------------------------------------------- @@ -32,22 +33,6 @@ error_reporting(E_ALL); require_once '../library/HTMLPurifier.auto.php'; require_once 'library/ConfigDoc.auto.php'; -// --------------------------------------------------------------------------- -// Setup convenience functions - -function appendHTMLDiv($document, $node, $html) { - global $purifier; - $html = $purifier->purify($html); - $dom_html = $document->createDocumentFragment(); - $dom_html->appendXML($html); - - $dom_div = $document->createElement('div'); - $dom_div->setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); - $dom_div->appendChild($dom_html); - - $node->appendChild($dom_div); -} - // --------------------------------------------------------------------------- // Load copies of HTMLPurifier_ConfigDef and HTMLPurifier @@ -83,41 +68,20 @@ $dom_document->save('configdoc.xml'); // --------------------------------------------------------------------------- // Generate final output using XSLT -// load the stylesheet +// determine stylesheet name $xsl_stylesheet_name = 'plain'; $xsl_stylesheet = "styles/$xsl_stylesheet_name.xsl"; -$xsl_dom_stylesheet = new DOMDocument(); -$xsl_dom_stylesheet->load($xsl_stylesheet); -// setup the XSLT processor -$xsl_processor = new XSLTProcessor(); - -// perform the transformation -$xsl_processor->importStylesheet($xsl_dom_stylesheet); -$html_output = $xsl_processor->transformToXML($dom_document); - -// some slight fudges to preserve backwards compatibility -$html_output = str_replace('/>', ' />', $html_output); //
not
-$html_output = str_replace(' xmlns=""', '', $html_output); // rm unnecessary xmlns - -if (class_exists('Tidy')) { - // cleanup output - $config = array( - 'indent' => true, - 'output-xhtml' => true, - 'wrap' => 80 - ); - $tidy = new Tidy; - $tidy->parseString($html_output, $config, 'utf8'); - $tidy->cleanRepair(); - $html_output = (string) $tidy; -} +// transform +$xslt_processor = new ConfigDoc_HTMLXSLTProcessor(); +$xslt_processor->importStylesheet($xsl_stylesheet); +$html_output = $xslt_processor->transformToHTML($dom_document); // hack if (!defined('HTMLPURIFIER_CUSTOM_SCHEMA')) { // write it to a file (todo: parse into seperate pages) file_put_contents("$xsl_stylesheet_name.html", $html_output); -} else { +} elseif (defined('HTMLPURIFIER_SCRIPT_LOCATION')) { $html_output = str_replace('styles/plain.css', HTMLPURIFIER_SCRIPT_LOCATION . 'styles/plain.css', $html_output); } diff --git a/configdoc/library/ConfigDoc.php b/configdoc/library/ConfigDoc.php index 26ad6c27..87b813a6 100644 --- a/configdoc/library/ConfigDoc.php +++ b/configdoc/library/ConfigDoc.php @@ -1,5 +1,6 @@ xsltProcessor = new XSLTProcessor(); + } + + /** + * Imports stylesheet for processor to use + * @param $xsl XSLT DOM tree, or filename of the XSL transformation + */ + public function importStylesheet($xsl) { + if (is_string($xsl)) { + $xsl_file = $xsl; + $xsl = new DOMDocument(); + $xsl->load($xsl_file); + } + return $this->xsltProcessor->importStylesheet($xsl); + } + + /** + * Transforms an XML file into HTML based on the stylesheet + * @param $xml XML DOM tree + */ + public function transformToHTML($xml) { + $out = $this->xsltProcessor->transformToXML($xml); + + // fudges for HTML backwards compatibility + $out = str_replace('/>', ' />', $out); //
not
+ $out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns + if (class_exists('Tidy')) { + // cleanup output + $config = array( + 'indent' => true, + 'output-xhtml' => true, + 'wrap' => 80 + ); + $tidy = new Tidy; + $tidy->parseString($out, $config, 'utf8'); + $tidy->cleanRepair(); + $out = (string) $tidy; + } + return $out; + } + +} + +?> \ No newline at end of file diff --git a/configdoc/library/ConfigDoc/XMLSerializer.php b/configdoc/library/ConfigDoc/XMLSerializer.php index 288cb8ad..fbcd102b 100644 --- a/configdoc/library/ConfigDoc/XMLSerializer.php +++ b/configdoc/library/ConfigDoc/XMLSerializer.php @@ -1,9 +1,26 @@ purify($html); + $dom_html = $document->createDocumentFragment(); + $dom_html->appendXML($html); + + $dom_div = $document->createElement('div'); + $dom_div->setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); + $dom_div->appendChild($dom_html); + + $node->appendChild($dom_div); + } } diff --git a/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php b/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php index 0aac4aa0..f55a4876 100644 --- a/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php +++ b/configdoc/library/ConfigDoc/XMLSerializer/ConfigSchema.php @@ -10,7 +10,7 @@ class ConfigDoc_XMLSerializer_ConfigSchema extends ConfigDoc_XMLSerializer * @todo Split into sub-serializers * @param $schema HTMLPurifier_ConfigSchema to serialize */ - function serialize($schema) { + public function serialize($schema) { $dom_document = new DOMDocument('1.0', 'UTF-8'); $dom_root = $dom_document->createElement('configdoc'); $dom_document->appendChild($dom_root); @@ -35,7 +35,7 @@ class ConfigDoc_XMLSerializer_ConfigSchema extends ConfigDoc_XMLSerializer ); $dom_namespace_description = $dom_document->createElement('description'); $dom_namespace->appendChild($dom_namespace_description); - appendHTMLDiv($dom_document, $dom_namespace_description, + $this->appendHTMLDiv($dom_document, $dom_namespace_description, $schema->info_namespace[$namespace_name]->description); foreach ($namespace_info as $name => $info) { @@ -100,7 +100,7 @@ class ConfigDoc_XMLSerializer_ConfigSchema extends ConfigDoc_XMLSerializer $dom_description->setAttribute('file', $file); $dom_description->setAttribute('line', $line); } - appendHTMLDiv($dom_document, $dom_description, $description); + $this->appendHTMLDiv($dom_document, $dom_description, $description); $dom_descriptions->appendChild($dom_description); } } diff --git a/configdoc/library/ConfigDoc/XMLSerializer/Types.php b/configdoc/library/ConfigDoc/XMLSerializer/Types.php index abbb4f6a..a3d4716c 100644 --- a/configdoc/library/ConfigDoc/XMLSerializer/Types.php +++ b/configdoc/library/ConfigDoc/XMLSerializer/Types.php @@ -9,7 +9,7 @@ class ConfigDoc_XMLSerializer_Types extends ConfigDoc_XMLSerializer * Serializes the types in a schema into DOM form * @param $schema HTMLPurifier_ConfigSchema owner of types to serialize */ - function serialize($schema) { + public function serialize($schema) { $types_document = new DOMDocument('1.0', 'UTF-8'); $types_root = $types_document->createElement('types'); $types_document->appendChild($types_root);