data); variable_set('htmlpurifier_version_current', $version); } /** * Implementation of hook_filter(). */ function htmlpurifier_filter($op, $delta = 0, $format = -1, $text = '') { switch ($op) { case 'list': return array(0 => t('HTML Purifier'), 1 => t('HTML Purifier (advanced)')); case 'no cache': // Since HTML Purifier implements its own caching layer, having filter // cache it again is wasteful. Returns FALSE if double caching is permitted. return !variable_get("htmlpurifier_doublecache", FALSE); case 'description': $common = t( 'Removes malicious HTML code and ensures that the output '. 'is standards compliant. Warning: For performance '. 'reasons, please ensure that there are no highly dynamic filters before HTML Purifier. ' ); switch ($delta) { case 0: return $common; case 1: return $common . t('This version has advanced configuration options, do not enable both at the same time.'); } case 'prepare': return $text; case 'process': return _htmlpurifier_process($text, $format); case 'settings': return _htmlpurifier_settings($delta, $format); default: return NULL; } } /** * Implementation of hook_filter_tips(). */ function htmlpurifier_filter_tips($delta, $format, $long = FALSE) { if (variable_get("htmlpurifier_help_$format", TRUE)) { return t('HTML tags will be transformed to conform to HTML standards.'); } } // -- INTERNAL FUNCTIONS ---------------------------------------------------- // /** * Processes HTML according to a format and returns purified HTML. Makes a * cache pass if possible. * * @param string $text * Text to purify * @param int $format * Input format corresponding to HTML Purifier's configuration. * @param boolean $cache * Whether or not to check the cache. * * @note * We ignore $delta because the only difference it makes is in the configuration * screen. */ function _htmlpurifier_process($text, $format, $cache = TRUE) { if ($cache) { $cid = $format . ':' . md5($text); $old = cache_get($cid, 'cache_htmlpurifier'); if ($old) return $old->data; } _htmlpurifier_load(); $config = _htmlpurifier_get_config($format); $purifier = new HTMLPurifier($config); $ret = $purifier->purify($text); if ($cache) cache_set($cid, $ret, 'cache_htmlpurifier', CACHE_PERMANENT); return $ret; } /** * Loads the HTML Purifier library, and performs global initialization. */ function _htmlpurifier_load() { static $done = false; if ($done) { return; } $done = true; $module_path = drupal_get_path('module', 'htmlpurifier'); $library_path = $module_path; if (function_exists('libraries_get_path')) { $library_path = libraries_get_path('htmlpurifier'); // This may happen if the user has HTML Purifier installed under the // old configuration, but also installed libraries and forgot to // move it over. There is code for emitting errors in // htmlpurifier.install when this is the case. if (!file_exists("$library_path/library/HTMLPurifier.auto.php")) { $library_path = $module_path; } } require_once "$library_path/library/HTMLPurifier.auto.php"; require_once "$module_path/HTMLPurifier_DefinitionCache_Drupal.php"; $factory = HTMLPurifier_DefinitionCacheFactory::instance(); $factory->register('Drupal', 'HTMLPurifier_DefinitionCache_Drupal'); // Register the version as a variable: variable_set('htmlpurifier_version_ours', HTMLPurifier::VERSION); } /** * Returns the HTMLPurifier_Config object corresponding to an input format. * @param int $format * Input format. * @return * Instance of HTMLPurifier_Config. */ function _htmlpurifier_get_config($format) { $config = HTMLPurifier_Config::createDefault(); $config->set('AutoFormat.AutoParagraph', TRUE); $config->set('AutoFormat.Linkify', TRUE); $config->set('HTML.Doctype', 'XHTML 1.0 Transitional'); // Probably $config->set('Core.AggressivelyFixLt', TRUE); $config->set('Cache.DefinitionImpl', 'Drupal'); // Filter HTML doesn't allow external images, so neither will we... // for now. This can be configured off. $config->set('URI.DisableExternalResources', TRUE); if (!empty($_SERVER['SERVER_NAME'])) { // SERVER_NAME is more reliable than HTTP_HOST $config->set('URI.Host', $_SERVER['SERVER_NAME']); } if (defined('LANGUAGE_RTL') && $GLOBALS['language']->direction === LANGUAGE_RTL) { $config->set('Attr.DefaultTextDir', 'rtl'); } if ($config_function = _htmlpurifier_config_load($format)) { $config_function($config); } else { $config_data = variable_get("htmlpurifier_config_$format", FALSE); // {FALSE, TRUE, FALSE} = {no index, everything is allowed, don't do mq fix} $config->mergeArrayFromForm($config_data, FALSE, TRUE, FALSE); } return $config; } /** * Returns the name of the configuration function for $format, or FALSE if none * exists. Function name will be htmlpurifier_config_N. * * @param int $format * Integer format to check function for. * @return * String function name for format, or FALSE if none. */ function _htmlpurifier_config_load($format) { $config_file = drupal_get_path('module', 'htmlpurifier') ."/config/$format.php"; $config_function = "htmlpurifier_config_$format"; if ( !function_exists($config_function) && file_exists($config_file) ) { include_once $config_file; } return function_exists($config_function) ? $config_function : FALSE; } /** * Generates a settings form for configuring HTML Purifier. * @param int $delta * Whether or not to use advanced form (1) or not (0). * @param int $format * Input format being configured. * @return * Form API array. */ function _htmlpurifier_settings($delta, $format) { _htmlpurifier_load(); // Dry run, testing for errors: _htmlpurifier_process('', $format, FALSE); $module_path = drupal_get_path('module', 'htmlpurifier'); drupal_add_css("$module_path/config-form.css"); // Makes all configuration links open in new windows; can safe lots of grief! drupal_add_js('$(function(){$(".hp-config a").click(function(){window.open(this.href);return false;});});', 'inline'); drupal_add_js(HTMLPurifier_Printer_ConfigForm::getJavaScript(), 'inline'); $form = array(); $form['dashboard'] = array( '#type' => 'fieldset', '#title' => t('HTML Purifier Dashboard'), '#collapsible' => true, ); $form['dashboard']["htmlpurifier_clear_cache"] = array( '#type' => 'submit', '#value' => t('Clear cache (Warning: Can result in performance degradation)'), '#submit' => array('_htmlpurifier_clear_cache') ); $form['htmlpurifier'] = array( '#type' => 'fieldset', '#title' => t('HTML Purifier'), '#collapsible' => TRUE, ); $form['htmlpurifier']["htmlpurifier_help_$format"] = array( '#type' => 'checkbox', '#title' => t('Display help text'), '#default_value' => variable_get("htmlpurifier_help_$format", TRUE), '#description' => t('If enabled, a short note will be added to the filter tips explaining that HTML will be transformed to conform with HTML standards. You may want to disable this option when the HTML Purifier is used to check the output of another filter like BBCode.'), ); if ($config_function = _htmlpurifier_config_load($format)) { $form['htmlpurifier']['notice'] = array( '#type' => 'markup', '#value' => t('
!function()
is already defined. To edit HTML Purifier\'s configuration, edit the corresponding configuration file, which is usually htmlpurifier/config/!format.php
. To restore the web configuration form, delete or rename this file.