silverstripe-framework/core/HTMLCleaner.php
Hamish Friedlander 168f071499 API Make HTMLValue replace-able via DI
Extracted common code out to SS_HTMLValue and made abstract, then
put HTML 4 specific code in SS_HTML4Value. Its now possible to
replace HTMLValue with one designed for HTML 5 or XHTML

Requires a code change from new SS_HTMLValue to
Injector::inst()->create(HTMLValue)
2013-03-14 12:49:02 +13:00

101 lines
2.1 KiB
PHP

<?php
/**
* @package framework
* @subpackage misc
*/
/**
* Base class for HTML cleaning implementations.
*/
abstract class HTMLCleaner extends Object {
/**
* @var array
*/
protected $defaultConfig = array();
/**
* @var $config Array configuration variables for HTMLCleaners that support configuration (like Tidy)
*/
public $config;
/**
* @param Array The configuration for the cleaner, if necessary
*/
public function __construct($config = null) {
if ($config) $this->config = array_merge($this->defaultConfig, $config);
else $this->config = $this->defaultConfig;
}
/**
* @param Array
*/
public function setConfig($config) {
$this->config = $config;
}
/**
* @return Array
*/
public function getConfig() {
return $this->config;
}
/**
* Passed a string, return HTML that has been tidied.
*
* @param String HTML
* @return String HTML, tidied
*/
abstract public function cleanHTML($content);
/**
* Experimental inst class to create a default html cleaner class
*
* @return PurifierHTMLCleaner|TidyHTMLCleaner
*/
public static function inst() {
if (class_exists('HTMLPurifier')) return new PurifierHTMLCleaner();
elseif (class_exists('tidy')) return new TidyHTMLCleaner();
}
}
/**
* Cleans HTML using the HTMLPurifier package
* http://htmlpurifier.org/
*/
class PurifierHTMLCleaner extends HTMLCleaner {
public function cleanHTML($content) {
$html = new HTMLPurifier();
$doc = Injector::inst()->create('HTMLValue', $html->purify($content));
return $doc->getContent();
}
}
/**
* Cleans HTML using the Tidy package
* http://php.net/manual/en/book.tidy.php
*/
class TidyHTMLCleaner extends HTMLCleaner {
protected $defaultConfig = array(
'clean' => true,
'output-xhtml' => true,
'show-body-only' => true,
'wrap' => 0,
'doctype' => 'omit',
'input-encoding' => 'utf8',
'output-encoding' => 'utf8'
);
public function cleanHTML($content) {
$tidy = new tidy();
$output = $tidy->repairString($content, $this->config);
// Clean leading/trailing whitespace
return preg_replace('/(^\s+)|(\s+$)/', '', $output);
}
}