You are here

wysiwyg_filter.module in WYSIWYG Filter 7

Same filename and directory in other branches
  1. 6 wysiwyg_filter.module

Provides an input filter that allows site administrators configure which HTML elements, attributes and style properties are allowed.

File

wysiwyg_filter.module
View source
<?php

/**
 * @file
 * Provides an input filter that allows site administrators configure which
 * HTML elements, attributes and style properties are allowed.
 */

// todo: more intelligent include policy
// beware: it filter process function in ...page.inc is not included,
// the whole filter is silently ignored. see http://drupal.org/node/1151506
module_load_include('inc', 'wysiwyg_filter', 'wysiwyg_filter.admin');
module_load_include('inc', 'wysiwyg_filter', 'wysiwyg_filter.pages');

/**
 * Implements hook_filter_info().
 */
function wysiwyg_filter_filter_info() {

  // Load common functions.
  module_load_include('inc', 'wysiwyg_filter');
  $filters = array();
  global $base_url;
  $parts = parse_url($base_url);
  $defaults = array(
    'valid_elements' => wysiwyg_filter_default_valid_elements(),
    'allow_comments' => 0,
    'nofollow_policy' => 'whitelist',
    'nofollow_domains' => array(
      $parts['host'],
    ),
  );
  foreach (wysiwyg_filter_get_style_property_groups() as $group => $stuff) {
    $defaults["style_{$group}"] = array();
  }
  foreach (wysiwyg_filter_get_advanced_rules() as $rule => $stuff) {
    $defaults["rule_{$rule}"] = array();
    $defaults["rule_bypass_{$rule}"] = 0;
  }
  $filters['wysiwyg'] = array(
    'title' => t('WYSIWYG Filter'),
    'description' => t('Allows you to restrict whether users can post HTML and which tags and attributes per HTML tag to filter out.'),
    'process callback' => 'wysiwyg_filter_filter_wysiwyg_process',
    'settings callback' => 'wysiwyg_filter_filter_wysiwyg_settings',
    'tips callback' => 'wysiwyg_filter_filter_wysiwyg_tips',
    'default settings' => $defaults,
  );
  return $filters;
}

/**
 * Implements hook_filter_FILTER_tips().
 */
function wysiwyg_filter_filter_wysiwyg_tips($filter, $format, $long = FALSE) {

  // Load common functions.
  module_load_include('inc', 'wysiwyg_filter');
  $filter_options = wysiwyg_filter_get_filter_options($format->format, $filter->settings);
  $tips = array();
  if (!empty($filter_options['valid_elements'])) {
    $tags = array();
    foreach (array_keys($filter_options['valid_elements']) as $tag) {
      $tags[] = '<' . $tag . '>';
    }
    $tips[] = t('Allowed HTML tags: @tags', array(
      '@tags' => implode(' ', $tags),
    ));
  }
  if (!empty($filter_options['style_properties'])) {
    $tips[] = t('Allowed Style properties: @properties', array(
      '@properties' => implode(', ', array_keys($filter_options['style_properties'])),
    ));
  }
  if (!empty($tips)) {
    return implode('<br />', $tips);
  }
}

/**
 * Implementation of wysiwyg_editor_settings_alter().
 */
function wysiwyg_filter_wysiwyg_editor_settings_alter(&$editor_settings, $context) {

  // Provide the valid_elements option to TinyMCE editors, only if the WYSIWYG
  // Filter is enabled in the input format related to the current given context.
  if ($context['profile']->editor == 'tinymce') {

    // first get the filters and their settings
    if (isset($context['profile']->format)) {
      $format_name = $context['profile']->format;
      $filters = filter_list_format($format_name);
      if ($filters && array_key_exists('wysiwyg', $filters)) {
        $filter = $filters['wysiwyg'];
        if ($filter->status != 0) {
          $settings = $filter->settings;
          $editor_settings['valid_elements'] = preg_replace('#\\s+#', '', $settings['valid_elements']);
        }
      }
    }
  }
}

Functions

Namesort descending Description
wysiwyg_filter_filter_info Implements hook_filter_info().
wysiwyg_filter_filter_wysiwyg_tips Implements hook_filter_FILTER_tips().
wysiwyg_filter_wysiwyg_editor_settings_alter Implementation of wysiwyg_editor_settings_alter().