Ticket #6444: 6444.002.diff

File 6444.002.diff, 4.1 kB (added by AaronCampbell, 8 months ago)
  • trunk/wp-includes/shortcodes.php

    old new  
    4747 
    4848$shortcode_tags = array(); 
    4949 
    50 function add_shortcode($tag, $func) { 
     50function add_shortcode($tag, $func, $post_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[($post_formatting)? 11:9][$tag] = $func; 
     55        } 
    5556} 
    5657 
    5758function 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 
    6364function remove_all_shortcodes() { 
     
    6667        $shortcode_tags = array(); 
    6768} 
    6869 
    69 function do_shortcode($content) { 
     70function do_shortcode_post_formatting($content) { 
     71    return do_shortcode($content, true); 
     72
     73function do_shortcode($content, $post_formatting = false) { 
     74    $pattern = get_shortcode_regex($post_formatting); 
     75    if (!$pattern) { 
     76        return $content; 
     77    } else { 
     78        $callback_func = 'do_shortcode_tag'; 
     79        if ($post_formatting) 
     80           $callback_func .= '_post_formatting'; 
     81 
     82        return preg_replace_callback('/' . $pattern . '/s', $callback_func, $content); 
     83    } 
     84
     85function get_shortcode_regex($post_formatting) { 
    7086        global $shortcode_tags; 
    7187 
    72         if (empty($shortcode_tags) || !is_array($shortcode_tags)) 
    73                 return $content
     88        if (empty($shortcode_tags[($post_formatting)? 11:9]) || !is_array($shortcode_tags[($post_formatting)? 11:9])) 
     89                return false
    7490 
    75         $tagnames = array_keys($shortcode_tags); 
     91        $tagnames = array_keys($shortcode_tags[($post_formatting)? 11:9]); 
    7692        $tagregexp = join( '|', array_map('preg_quote', $tagnames) ); 
    7793 
    78         $pattern = '/\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?/s'; 
     94        return '\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\1\])?'; 
     95
    7996 
    80         return preg_replace_callback($pattern, 'do_shortcode_tag', $content); 
     97function do_shortcode_tag_post_formatting($m) { 
     98    return do_shortcode_tag($m, true); 
    8199} 
    82  
    83 function do_shortcode_tag($m) { 
     100function do_shortcode_tag($m, $post_formatting = false) { 
    84101        global $shortcode_tags; 
    85102 
    86103        $tag = $m[1]; 
     
    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[($post_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[($post_formatting)? 11:9][$tag], $attr); 
    95112        } 
    96113} 
    97114 
     
    129146        return $out; 
    130147} 
    131148 
    132 add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()  
     149add_filter( 'the_content', 'do_shortcode', 9 ); 
     150add_filter( 'the_content', 'do_shortcode_post_formatting', 11 ); 
    133151 
    134152?> 
  • trunk/wp-includes/formatting.php

    old new  
    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 
     
    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