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);