Skip to content

Commit d9efa4f

Browse files
committed
Allow shortcodes to run before or after wpautop()/texturize() formatting. Default to before for WP 2.5 compat. Props AaronCampbell
git-svn-id: https://develop.svn.wordpress.org/trunk@7699 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 1ed52ed commit d9efa4f

3 files changed

Lines changed: 41 additions & 21 deletions

File tree

wp-includes/formatting.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function wptexturize($text) {
2626
for ( $i = 0; $i < $stop; $i++ ) {
2727
$curl = $textarr[$i];
2828

29-
if (isset($curl{0}) && '<' != $curl{0} && '[' != $curl{0} && $next) { // If it's not a tag
29+
if (isset($curl{0}) && '<' != $curl{0} && '[' != $curl{0} && $next) { // If it's not a tag or shortcode
3030
// static strings
3131
$curl = str_replace($static_characters, $static_replacements, $curl);
3232
// regular expressions
@@ -74,6 +74,7 @@ function wpautop($pee, $br = 1) {
7474
$pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
7575
$pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end
7676
$pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
77+
$pee = preg_replace('/<p>(\s*?' . get_shortcode_regex(true) . '\s*)<\/p>/s', '$1', $pee); // don't auto-p wrap post-formatting shortcodes
7778
$pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee);
7879
$pee = preg_replace( '|<p>|', "$1<p>", $pee );
7980
$pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
@@ -840,6 +841,7 @@ function wp_trim_excerpt($text) { // Fakes an excerpt if needed
840841
$text = get_the_content('');
841842
$text = apply_filters('the_content', $text);
842843
$text = str_replace(']]>', ']]&gt;', $text);
844+
$text = preg_replace('|//\s*<!\[CDATA\[|', '<![CDATA[', $text);
843845
$text = strip_tags($text);
844846
$excerpt_length = 55;
845847
$words = explode(' ', $text, $excerpt_length + 1);

wp-includes/media.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ function image_get_intermediate_size($post_id, $size='thumbnail') {
286286

287287
if ( is_array($size) || empty($size) || empty($imagedata['sizes'][$size]) )
288288
return false;
289-
289+
290290
$data = $imagedata['sizes'][$size];
291291
// include the full filesystem path of the intermediate file
292292
if ( empty($data['path']) && !empty($data['file']) ) {
@@ -300,7 +300,7 @@ function image_get_intermediate_size($post_id, $size='thumbnail') {
300300
// get an image to represent an attachment - a mime icon for files, thumbnail or intermediate size for images
301301
// returns an array (url, width, height), or false if no image is available
302302
function wp_get_attachment_image_src($attachment_id, $size='thumbnail', $icon = false) {
303-
303+
304304
// get a thumbnail or intermediate image if there is one
305305
if ( $image = image_downsize($attachment_id, $size) )
306306
return $image;
@@ -327,11 +327,11 @@ function wp_get_attachment_image($attachment_id, $size='thumbnail', $icon = fals
327327
$size = join('x', $size);
328328
$html = '<img src="'.attribute_escape($src).'" '.$hwstring.'class="attachment-'.attribute_escape($size).'" alt="" />';
329329
}
330-
330+
331331
return $html;
332332
}
333333

334-
add_shortcode('gallery', 'gallery_shortcode');
334+
add_shortcode('gallery', 'gallery_shortcode', true);
335335

336336
function gallery_shortcode($attr) {
337337
global $post;
@@ -376,7 +376,7 @@ function gallery_shortcode($attr) {
376376
$captiontag = tag_escape($captiontag);
377377
$columns = intval($columns);
378378
$itemwidth = $columns > 0 ? floor(100/$columns) : 100;
379-
379+
380380
$output = apply_filters('gallery_style', "
381381
<style type='text/css'>
382382
.gallery {

wp-includes/shortcodes.php

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,18 @@ function baztag_func($atts, $content='') {
4747

4848
$shortcode_tags = array();
4949

50-
function add_shortcode($tag, $func) {
50+
function add_shortcode($tag, $func, $after_formatting = false) {
5151
global $shortcode_tags;
5252

53-
if ( is_callable($func) )
54-
$shortcode_tags[$tag] = $func;
53+
if ( is_callable($func) ) {
54+
$shortcode_tags[($after_formatting)? 11:9][$tag] = $func;
55+
}
5556
}
5657

5758
function remove_shortcode($tag) {
5859
global $shortcode_tags;
5960

60-
unset($shortcode_tags[$tag]);
61+
unset($shortcode_tags[9][$tag], $shortcode_tags[11][$tag]);
6162
}
6263

6364
function remove_all_shortcodes() {
@@ -66,32 +67,48 @@ function remove_all_shortcodes() {
6667
$shortcode_tags = array();
6768
}
6869

69-
function do_shortcode($content) {
70+
function do_shortcode_after_formatting($content) {
71+
return do_shortcode($content, true);
72+
}
73+
function do_shortcode($content, $after_formatting = false) {
74+
$pattern = get_shortcode_regex($after_formatting);
75+
if (!$pattern) {
76+
return $content;
77+
} else {
78+
$callback_func = 'do_shortcode_tag';
79+
if ($after_formatting)
80+
$callback_func .= '_after_formatting';
81+
82+
return preg_replace_callback('/' . $pattern . '/s', $callback_func, $content);
83+
}
84+
}
85+
function get_shortcode_regex($after_formatting) {
7086
global $shortcode_tags;
7187

72-
if (empty($shortcode_tags) || !is_array($shortcode_tags))
73-
return $content;
88+
if (empty($shortcode_tags[($after_formatting)? 11:9]) || !is_array($shortcode_tags[($after_formatting)? 11:9]))
89+
return false;
7490

75-
$tagnames = array_keys($shortcode_tags);
91+
$tagnames = array_keys($shortcode_tags[($after_formatting)? 11:9]);
7692
$tagregexp = join( '|', array_map('preg_quote', $tagnames) );
7793

78-
$pattern = '/\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?/s';
79-
80-
return preg_replace_callback($pattern, 'do_shortcode_tag', $content);
94+
return '\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?';
8195
}
8296

83-
function do_shortcode_tag($m) {
97+
function do_shortcode_tag_after_formatting($m) {
98+
return do_shortcode_tag($m, true);
99+
}
100+
function do_shortcode_tag($m, $after_formatting = false) {
84101
global $shortcode_tags;
85102

86103
$tag = $m[1];
87104
$attr = shortcode_parse_atts($m[2]);
88105

89106
if ( isset($m[4]) ) {
90107
// enclosing tag - extra parameter
91-
return call_user_func($shortcode_tags[$tag], $attr, $m[4]);
108+
return call_user_func($shortcode_tags[($after_formatting)? 11:9][$tag], $attr, $m[4]);
92109
} else {
93110
// self-closing tag
94-
return call_user_func($shortcode_tags[$tag], $attr);
111+
return call_user_func($shortcode_tags[($after_formatting)? 11:9][$tag], $attr);
95112
}
96113
}
97114

@@ -129,6 +146,7 @@ function shortcode_atts($pairs, $atts) {
129146
return $out;
130147
}
131148

132-
add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()
149+
add_filter( 'the_content', 'do_shortcode', 9 );
150+
add_filter( 'the_content', 'do_shortcode_after_formatting', 11 );
133151

134152
?>

0 commit comments

Comments
 (0)