function _shortcode_process in Shortcode 7.2
Same name and namespace in other branches
- 6 shortcode.module \_shortcode_process()
- 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));
}