You are here

xbbcode.module in Extensible BBCode 8.2

The main module file containing hook implementations.

File

xbbcode.module
View source
<?php

/**
 * @file
 * The main module file containing hook implementations.
 */
use Drupal\Core\Cache\Cache;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Routing\RouteMatchInterface;

/**
 * Regular expression matching any quote delimiter, including escaped quotes.
 */
define('XBBCODE_RE_QUOTE', '"|\'|&(quot|#039);|');

/**
 * Regular expression pattern for parsing a key=value assignment.
 */
define('XBBCODE_RE_ATTR', '(?:\\s+(?<key>\\w+)=(?<aq>' . XBBCODE_RE_QUOTE . ')(?<value>[^"]*?)\\g{aq}(?=\\s|\\]|$))');

/**
 * Regular expression pattern for parsing a complete tag element.
 */
define('XBBCODE_RE_TAG', '/\\[(?<closing>\\/)?(?<name>\\w+)(?:=(?<bq>' . XBBCODE_RE_QUOTE . ')(?<option>.*?)\\g{bq}(?=\\s|\\])|(?<attrs>' . XBBCODE_RE_ATTR . '+))?\\]/i');

/**
 * Implements hook_xbbcode_info().
 */
function xbbcode_xbbcode_info() {

  // Load the database interface.
  module_load_include('inc', 'xbbcode', 'xbbcode.crud');
  $custom_tags = xbbcode_custom_tag_load();
  $tags = array();
  foreach ($custom_tags as $name => $tag) {
    $tags[$name] = array(
      'description' => $tag->description,
      'sample' => $tag->sample,
      'markup' => !$tag->options['php'] ? $tag->markup : NULL,
      'callback' => $tag->options['php'] ? '_xbbcode_custom_eval' : NULL,
      'options' => $tag->options,
    );
  }
  return $tags;
}

/**
 * Rendering callback for dynamic custom tags (PHP evaluated).
 */
function _xbbcode_custom_eval($tag_data, $xbbcode_filter) {
  if (module_exists('php')) {
    global $tag;
    $tag = $tag_data;
    module_load_include('inc', 'xbbcode', 'xbbcode.crud');

    // Insert the $tag variable into the evaluated code's scope.
    $code = '<?php global $tag; ?>' . xbbcode_custom_tag_load($tag->name)->markup;
    $output = php_eval($code);
    unset($tag);
    return $output;
  }
}

/**
 * Implements hook_theme().
 */
function xbbcode_theme() {
  return array(
    'xbbcode_settings_handlers_format' => array(
      'render element' => 'fieldset',
      'function' => 'theme_xbbcode_settings_handlers_format',
    ),
  );
}
function xbbcode_settings_handlers_process(&$element, FormStateInterface $form_state, &$complete_form) {
  foreach ($element['#options'] as $key => $value) {

    // Remove checkbox values:
    $element[$key]['#default_value'] = $element[$key]['#default_value'] == $element[$key]['#return_value'];
    unset($element[$key]['#return_value']);

    // Move checkboxes to 'enabled' subkey.
    $element[$key] = [
      'enabled' => $element[$key],
    ];
  }
  return $element;
}

/**
 * Renders the handlers subform as a table.
 */
function theme_xbbcode_settings_handlers_format($variables) {
  $fieldset = $variables['fieldset'];
  $table =& $fieldset['tags'];
  $selectors =& $fieldset['extra']['tags'];
  $table['#attributes']['id'] = 'xbbcode-handlers';
  foreach (array_keys($table['#options']) as $tag) {
    $table['#options'][$tag]['module']['data'] = drupal_render($selectors[$tag]['module']);
  }
  ksort($table['#options']);
  $html = drupal_render($table);
  foreach (Element::children($fieldset) as $element) {
    $html .= drupal_render($fieldset[$element]);
  }
  return $html;
}

Functions

Namesort descending Description
theme_xbbcode_settings_handlers_format Renders the handlers subform as a table.
xbbcode_settings_handlers_process
xbbcode_theme Implements hook_theme().
xbbcode_xbbcode_info Implements hook_xbbcode_info().
_xbbcode_custom_eval Rendering callback for dynamic custom tags (PHP evaluated).

Constants

Namesort descending Description
XBBCODE_RE_ATTR Regular expression pattern for parsing a key=value assignment.
XBBCODE_RE_QUOTE Regular expression matching any quote delimiter, including escaped quotes.
XBBCODE_RE_TAG Regular expression pattern for parsing a complete tag element.