You are here

function _shortcode_process in Shortcode 7.2

Same name and namespace in other branches
  1. 6 shortcode.module \_shortcode_process()
  2. 7 shortcode.module \_shortcode_process()

Processes the ShortCodes according to the text and the text format.

1 string reference to '_shortcode_process'
shortcode_filter_info in ./shortcode.module
Implements hook_filter_info().

File

./shortcode.module, line 174
Provides ShortCodes filter framework and API (like WP ShortCodes)

Code

function _shortcode_process($text, $filter) {
  $shortcodes_enabled = _shortcode_get_shortcodes($filter);
  if (empty($shortcodes_enabled)) {
    return $text;
  }

  // Processing recursively, now embedding tags within other tags is supported!
  $chunks = preg_split('!(\\[{1,2}.*?\\]{1,2})!', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
  $heap = array();
  $heap_index = array();
  foreach ($chunks as $c) {
    if (!$c) {
      continue;
    }
    $escaped = FALSE;
    if (substr($c, 0, 2) == '[[' && substr($c, -2, 2) == ']]') {
      $escaped = TRUE;

      // Checks media tags, eg: [[{ }]].
      if (substr($c, 0, 3) != '{' && substr($c, -3, 1) != '}') {

        // Removes the outer [].
        $c = substr($c, 1, -1);
      }
    }

    // Decide this is a ShortCode tag or not.
    if (!$escaped && $c[0] == '[' && substr($c, -1, 1) == ']') {

      // The $c maybe contains ShortCode macro.
      // This is maybe a self-closing tag.
      // Removes outer [].
      $original_text = $c;
      $c = substr($c, 1, -1);
      $c = trim($c);
      $ts = explode(' ', $c);
      $tag = array_shift($ts);
      $tag = trim($tag, '/');
      if (!isset($shortcodes_enabled[$tag])) {

        // The current tag is not enabled.
        array_unshift($heap_index, '_string_');
        array_unshift($heap, $original_text);
      }
      elseif (substr($c, -1, 1) == '/') {

        // Processes a self closing tag, - it has "/" at the end-

        /*
         * The exploded array elements meaning:
         * 0 - the full tag text?
         * 1/5 - An extra [] to allow for escaping ShortCodes with double [[]].
         * 2 - The ShortCode name.
         * 3 - The ShortCode argument list.
         * 4 - The content of a ShortCode when it wraps some content.
         */
        $m = array(
          $c,
          '',
          $tag,
          implode(' ', $ts),
          NULL,
          '',
        );
        array_unshift($heap_index, '_string_');
        array_unshift($heap, _shortcode_process_tag($m, $filter));
      }
      elseif ($c[0] == '/') {

        // Indicate a closing tag, so we process the heap.
        $closing_tag = substr($c, 1);
        $process_heap = array();
        $process_heap_index = array();
        $found = FALSE;

        // Get elements from heap and process.
        do {
          $tag = array_shift($heap_index);
          $heap_text = array_shift($heap);
          if ($closing_tag == $tag) {

            // Process the whole tag.
            $m = array(
              $tag . ' ' . $heap_text,
              '',
              $tag,
              $heap_text,
              implode('', $process_heap),
              '',
            );
            $str = _shortcode_process_tag($m, $filter);
            array_unshift($heap_index, '_string_');
            array_unshift($heap, $str);
            $found = TRUE;
          }
          else {
            array_unshift($process_heap, $heap_text);
            array_unshift($process_heap_index, $tag);
          }
        } while (!$found && $heap);
        if (!$found) {
          foreach ($process_heap as $val) {
            array_unshift($heap, $val);
          }
          foreach ($process_heap_index as $val) {
            array_unshift($heap_index, $val);
          }
        }
      }
      else {

        // This is a starting tag. Put it to the heap.
        array_unshift($heap_index, $tag);
        array_unshift($heap, implode(' ', $ts));
      }

      // If escaped or not a ShortCode.
    }
    else {

      // Maybe not found a pair?
      array_unshift($heap_index, '_string_');
      array_unshift($heap, $c);
    }

    // End of foreach.
  }
  return implode('', array_reverse($heap));
}