You are here

function xbbcode_rebuild_handlers in Extensible BBCode 8

Same name and namespace in other branches
  1. 6 xbbcode.module \xbbcode_rebuild_handlers()
  2. 7 xbbcode.module \xbbcode_rebuild_handlers()
4 calls to xbbcode_rebuild_handlers()
xbbcode_custom_tags_delete_submit in ./xbbcode.admin.inc
Delete a custom tag.
xbbcode_custom_tags_save_submit in ./xbbcode.admin.inc
Save (create or update) a custom tag.
xbbcode_modules_disabled in ./xbbcode.module
Implements hook_modules_disabled().
xbbcode_modules_enabled in ./xbbcode.module
Implements hook_modules_enabled().

File

./xbbcode.module, line 247
The main module file containing hook implementations.

Code

function xbbcode_rebuild_handlers($hooks = array()) {

  // Load the database interface and discovery functions.
  module_load_include('inc', 'xbbcode', 'xbbcode.crud');
  module_load_include('inc', 'xbbcode');

  // Load the old global settings, and the settings for each specific format.
  $old_settings[XBBCODE_GLOBAL] = xbbcode_handlers_load(XBBCODE_GLOBAL, TRUE);
  foreach (array_keys(xbbcode_formats('specific')) as $format) {
    $old_settings[$format] = xbbcode_handlers_load($format, TRUE);
  }

  // Find out which modules currently provide the tags that were already registered.
  $current_handlers = _xbbcode_build_handlers();

  // Remove or replace missing handlers.
  $deleted_tags = $changed_tags = array();
  foreach ($old_settings as $format => $old_handlers) {
    foreach ($old_handlers as $tag_name => $old_handler) {

      // If no module provides a particular tag, delete it.
      if (!isset($current_handlers[$tag_name])) {
        $deleted_tags[$tag_name] = $tag_name;
      }
      elseif (!isset($current_handlers[$tag_name]['modules'][$old_handler->module])) {
        $changed_tags[$format][$tag_name] = key($current_handlers[$tag_name]['modules']);
      }
    }
  }

  // Add new handlers.
  $new_tags = $discovered = array();
  foreach ($current_handlers as $tag_name => $tag_handlers) {
    foreach ($old_settings as $format => $registered_tags) {
      if (!isset($registered_tags[$tag_name])) {

        // If the module has no handler set for this tag, add one of the providers.
        $new_tags[$format][$tag_name] = key($tag_handlers['modules']);
      }
    }
    foreach ($tag_handlers['modules'] as $module => $module_name) {
      if (in_array($module, $hooks)) {
        $discovered[$module][$tag_name] = $tag_name;
      }
    }
  }
  if ($deleted_tags) {
    xbbcode_handlers_delete_tags($deleted_tags);
    drupal_set_message(format_plural(count($deleted_tags), '1 BBCode tag was deleted because it is no longer provided: %tags', '@count tags were deleted because they are no longer provided: %tags', array(
      '%tags' => '[' . implode('], [', $deleted_tags) . ']',
    )), 'warning');
  }
  $changed_result = array();
  foreach ($changed_tags as $format => $changed) {
    foreach ($changed as $tag => $module) {
      $changed_result[$tag] = xbbcode_handler_update($format, $tag, $module);
    }
  }
  if ($changed_result) {
    drupal_set_message(format_plural(count($changed_result), '1 BBCode tag was reassigned because its current module no longer provides it: %tags', '@count tags were reassigned because their current modules no longer provide them: %tags', array(
      '%tags' => '[' . implode('], [', array_keys($changed_result)) . ']',
    )), 'warning');
  }
  foreach ($new_tags as $format => $new) {
    foreach ($new as $name => $module) {
      $tag = (object) array(
        'module' => $module,
        'name' => $name,
        'enabled' => 1,
      );
      xbbcode_handler_save($tag, $format);
    }
  }
  $module_names = _xbbcode_module_names();
  foreach ($discovered as $module => $new) {
    drupal_set_message(format_plural(count($new), 'Module %module provides 1 new BBCode tag: %tags', 'Module %module provides @count new BBCode tags: %tags', array(
      '%module' => $module_names[$module],
      '%tags' => '[' . implode('], [', array_keys($new)) . ']',
    )));
  }
  if ($deleted_tags || $changed_tags || $new_tags) {
    xbbcode_rebuild_tags();
  }
}