artabro/wire/modules/Markup/MarkupHTMLPurifier/MarkupHTMLPurifier.module

224 lines
5.2 KiB
Text
Raw Permalink Normal View History

2024-08-27 11:35:37 +02:00
<?php namespace ProcessWire;
/**
* ProcessWire HTML Purifier module
*
* Serves as a front-end to the HTML Purifier software:
* http://htmlpurifier.org
*
* USAGE:
*
* $purifier = $modules->get('MarkupHTMLPurifier');
* $cleanHTML = $purifier->purify($dirtyHTML);
*
* To specify custom settings to HTML Purifier, perform set()
* calls before calling purify(). For example, UTF-8 encoding
* is assumed, so if you wanted ISO-8859-1 instead, you'd do:
*
* $purifier->set('Core.Encoding', 'ISO-8859-1');
*
* For a full list of HTML Purifier config options, see:
* http://htmlpurifier.org/live/configdoc/plain.html
*
* HTML Purifier by: http://htmlpurifier.org
* ProcessWire module by Ryan Cramer
*
* @method void initConfig(\HTMLPurifier_Config $settings, \HTMLPurifier_HTMLDefinition $def)
*
*/
class MarkupHTMLPurifier extends WireData implements Module {
public static function getModuleInfo() {
return array(
'title' => 'HTML Purifier',
'summary' => 'Front-end to the HTML Purifier library.',
'version' => 497,
'singular' => false,
'autoload' => false,
);
}
/**
* HTML Purifier settings
*
* @var \HTMLPurifier_Config|null
*
*/
protected $settings = null;
/**
* HTML Purifier Raw HTML definition
*
* @var \HTMLPurifier_HTMLDefinition|null
*
*/
protected $def = null;
/**
* Cached instance of HTMLPurifier
*
*/
protected $purifier = null;
/**
* Generate HTML Purifier settings object
*
*/
public function __construct() {
parent::__construct();
require_once(dirname(__FILE__) . '/htmlpurifier/HTMLPurifier.standalone.php');
$this->settings = \HTMLPurifier_Config::createDefault();
$this->settings->autoFinalize = false;
}
/**
* Initialize the module and create default settings
*
*/
public function init() {
$this->settings->set('Cache.SerializerPath', $this->getCachePath());
$this->settings->set('Attr.AllowedRel', array('nofollow', 'noopener', 'noreferrer'));
$this->settings->set('HTML.DefinitionID', 'html5-definitions');
$this->settings->set('HTML.DefinitionRev', 1);
$this->def = $this->settings->maybeGetRawHTMLDefinition();
if($this->def) {
$this->def->addElement('figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common');
$this->def->addElement('figcaption', 'Inline', 'Flow', 'Common');
$this->initConfig($this->settings, $this->def);
}
}
/**
* Method to allow hooks to further initialize HTMLPurifier config/settings
*
* ~~~~~
* $wire->addHook('MarkupHTMLPurifier::initSettings', function($event) {
* $def = $event->arguments(1);
* $def->addAttribute('a', 'data-ext', 'Text');
* });
* ~~~~~
*
* @param \HTMLPurifier_Config $settings
* @param \HTMLPurifier_HTMLDefinition $def
* @since 3.0.173
*
*/
protected function ___initConfig($settings, $def) { }
/**
* Return the cache path used by HTML Purifier
*
* @param bool $create Create if not exists?
* @return string
*
*/
protected function getCachePath($create = true) {
$cachePath = $this->wire()->config->paths->cache . $this->className() . '/';
if($create && !is_dir($cachePath)) $this->wire()->files->mkdir($cachePath);
return $cachePath;
}
/**
* Clear the HTML Purifier cache
*
* @since 3.0.173
*
*/
public function clearCache() {
$cachePath = $this->getCachePath(false);
if(is_dir($cachePath)) $this->wire()->files->rmdir($cachePath, true);
}
/**
* Return the current settings
*
* @return \HTMLPurifier_Config|null
*
*/
public function getConfig() {
return $this->settings;
}
/**
* Get HTML Purifier raw HTML definition
*
* @return \HTMLPurifier_HTMLDefinition|null
* @since 3.0.173
*
*/
public function getDef() {
return $this->def;
}
/**
* Get the HTMLPurifier instance
*
* @return \HTMLPurifier
*
*/
public function getPurifier() {
if(is_null($this->purifier)) $this->purifier = new \HTMLPurifier($this->settings);
return $this->purifier;
}
/**
* Purify the given dirty HTML and return the clean HTML
*
* @param string Dirty HTML
* @return string Clean HTML
*
*/
public function purify($html) {
// purify
$html = $this->getPurifier()->purify($html);
return $html;
}
/**
* Set an HTMLPurifier config option
*
* See configuration options at: http://htmlpurifier.org/live/configdoc/plain.html
*
* @param string $key
* @param string|array|mixed $value
* @return WireData|MarkupHTMLPurifier
*
*/
public function set($key, $value) {
if(strpos($key, '.')) {
// HTML Purifier setting: http://htmlpurifier.org/live/configdoc/plain.html
$this->purifier = null;
$this->settings->set($key, $value);
return $this;
}
// some other setting
return parent::set($key, $value);
}
/**
* Get an HTMLPurifier config option
*
* @param string $key
* @return string|null
*
*/
public function get($key) {
if(strpos($key, '.')) return $this->settings->get($key);
return parent::get($key);
}
/**
* Uninstall by removing the cache path and files
*
*/
public function ___uninstall() {
$cachePath = $this->getCachePath();
wireRmdir($cachePath, true);
$this->message("Removed: $cachePath");
}
}