mirror of
https://github.com/ezyang/htmlpurifier.git
synced 2025-01-03 13:21:51 +00:00
Further refactor ConfigDoc, creating HTMLXSLTProcessor. Update NEWS.
git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1104 48356398-32a2-884e-a903-53898d9a118a
This commit is contained in:
parent
c113f43440
commit
aaf4839c34
3
NEWS
3
NEWS
@ -20,11 +20,14 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
|||||||
off, but it's not recommended.
|
off, but it's not recommended.
|
||||||
# New compact syntax for AttrDef objects that can be used to instantiate
|
# New compact syntax for AttrDef objects that can be used to instantiate
|
||||||
new objects via make()
|
new objects via make()
|
||||||
|
# Definitions (esp. HTMLDefinition) are now cached for a significant
|
||||||
|
performance boost
|
||||||
! HTML Purifier now works in PHP 4.3.2.
|
! HTML Purifier now works in PHP 4.3.2.
|
||||||
! Configuration form-editing API makes tweaking HTMLPurifier_Config a
|
! Configuration form-editing API makes tweaking HTMLPurifier_Config a
|
||||||
breeze!
|
breeze!
|
||||||
! Configuration directives that accept hashes now allow new string
|
! Configuration directives that accept hashes now allow new string
|
||||||
format: key1,value1,key2,value2
|
format: key1,value1,key2,value2
|
||||||
|
! ConfigDoc now factored into OOP design
|
||||||
- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
|
- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
|
||||||
. Unit test for ElementDef created, ElementDef behavior modified to
|
. Unit test for ElementDef created, ElementDef behavior modified to
|
||||||
be more flexible
|
be more flexible
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates XML and HTML documents describing configuration.
|
* Generates XML and HTML documents describing configuration.
|
||||||
|
* @note PHP 5 only!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -23,7 +24,7 @@ TODO:
|
|||||||
// Check and configure environment
|
// Check and configure environment
|
||||||
|
|
||||||
if (version_compare('5', PHP_VERSION, '>')) exit('Requires PHP 5 or higher.');
|
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/HTMLPurifier.auto.php';
|
||||||
require_once 'library/ConfigDoc.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
|
// Load copies of HTMLPurifier_ConfigDef and HTMLPurifier
|
||||||
@ -83,41 +68,20 @@ $dom_document->save('configdoc.xml');
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Generate final output using XSLT
|
// Generate final output using XSLT
|
||||||
|
|
||||||
// load the stylesheet
|
// determine stylesheet name
|
||||||
$xsl_stylesheet_name = 'plain';
|
$xsl_stylesheet_name = 'plain';
|
||||||
$xsl_stylesheet = "styles/$xsl_stylesheet_name.xsl";
|
$xsl_stylesheet = "styles/$xsl_stylesheet_name.xsl";
|
||||||
$xsl_dom_stylesheet = new DOMDocument();
|
|
||||||
$xsl_dom_stylesheet->load($xsl_stylesheet);
|
|
||||||
|
|
||||||
// setup the XSLT processor
|
// transform
|
||||||
$xsl_processor = new XSLTProcessor();
|
$xslt_processor = new ConfigDoc_HTMLXSLTProcessor();
|
||||||
|
$xslt_processor->importStylesheet($xsl_stylesheet);
|
||||||
// perform the transformation
|
$html_output = $xslt_processor->transformToHTML($dom_document);
|
||||||
$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); // <br /> not <br/>
|
|
||||||
$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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// hack
|
// hack
|
||||||
if (!defined('HTMLPURIFIER_CUSTOM_SCHEMA')) {
|
if (!defined('HTMLPURIFIER_CUSTOM_SCHEMA')) {
|
||||||
// write it to a file (todo: parse into seperate pages)
|
// write it to a file (todo: parse into seperate pages)
|
||||||
file_put_contents("$xsl_stylesheet_name.html", $html_output);
|
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);
|
$html_output = str_replace('styles/plain.css', HTMLPURIFIER_SCRIPT_LOCATION . 'styles/plain.css', $html_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
require_once 'ConfigDoc/HTMLXSLTProcessor.php';
|
||||||
require_once 'ConfigDoc/XMLSerializer/Types.php';
|
require_once 'ConfigDoc/XMLSerializer/Types.php';
|
||||||
require_once 'ConfigDoc/XMLSerializer/ConfigSchema.php';
|
require_once 'ConfigDoc/XMLSerializer/ConfigSchema.php';
|
||||||
|
|
||||||
|
56
configdoc/library/ConfigDoc/HTMLXSLTProcessor.php
Normal file
56
configdoc/library/ConfigDoc/HTMLXSLTProcessor.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special XSLTProcessor specifically for HTML documents. Loosely
|
||||||
|
* based off of XSLTProcessor, but not really
|
||||||
|
*/
|
||||||
|
class ConfigDoc_HTMLXSLTProcessor
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $xsltProcessor;
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
$this->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); // <br /> not <br/>
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -1,9 +1,26 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The XMLSerializer hierarchy of classes consist of classes that take
|
||||||
|
* objects and serialize them into XML, specifically DOM, form; this
|
||||||
|
* super-class contains convenience functions for those classes.
|
||||||
|
*/
|
||||||
class ConfigDoc_XMLSerializer
|
class ConfigDoc_XMLSerializer
|
||||||
{
|
{
|
||||||
|
|
||||||
|
protected function appendHTMLDiv($document, $node, $html) {
|
||||||
|
// oh no, it's a global!
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ class ConfigDoc_XMLSerializer_ConfigSchema extends ConfigDoc_XMLSerializer
|
|||||||
* @todo Split into sub-serializers
|
* @todo Split into sub-serializers
|
||||||
* @param $schema HTMLPurifier_ConfigSchema to serialize
|
* @param $schema HTMLPurifier_ConfigSchema to serialize
|
||||||
*/
|
*/
|
||||||
function serialize($schema) {
|
public function serialize($schema) {
|
||||||
$dom_document = new DOMDocument('1.0', 'UTF-8');
|
$dom_document = new DOMDocument('1.0', 'UTF-8');
|
||||||
$dom_root = $dom_document->createElement('configdoc');
|
$dom_root = $dom_document->createElement('configdoc');
|
||||||
$dom_document->appendChild($dom_root);
|
$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_description = $dom_document->createElement('description');
|
||||||
$dom_namespace->appendChild($dom_namespace_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);
|
$schema->info_namespace[$namespace_name]->description);
|
||||||
|
|
||||||
foreach ($namespace_info as $name => $info) {
|
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('file', $file);
|
||||||
$dom_description->setAttribute('line', $line);
|
$dom_description->setAttribute('line', $line);
|
||||||
}
|
}
|
||||||
appendHTMLDiv($dom_document, $dom_description, $description);
|
$this->appendHTMLDiv($dom_document, $dom_description, $description);
|
||||||
$dom_descriptions->appendChild($dom_description);
|
$dom_descriptions->appendChild($dom_description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ class ConfigDoc_XMLSerializer_Types extends ConfigDoc_XMLSerializer
|
|||||||
* Serializes the types in a schema into DOM form
|
* Serializes the types in a schema into DOM form
|
||||||
* @param $schema HTMLPurifier_ConfigSchema owner of types to serialize
|
* @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_document = new DOMDocument('1.0', 'UTF-8');
|
||||||
$types_root = $types_document->createElement('types');
|
$types_root = $types_document->createElement('types');
|
||||||
$types_document->appendChild($types_root);
|
$types_document->appendChild($types_root);
|
||||||
|
Loading…
Reference in New Issue
Block a user