WordPress.org

Make WordPress Core

Changeset 20679


Ignore:
Timestamp:
05/02/12 01:14:52 (2 years ago)
Author:
azaozz
Message:

Change the image caption shortcode format to [caption ...]<a><img /></a> caption text + htmlcaption. That way HTML tags in captions are better supported and the shortcode wouldn't break when using the wrong quotes. Props sushkov, nacin, fixes #18311

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/media.php

    r20544 r20679  
    146146    $caption = str_replace( array("\r\n", "\r"), "\n", $caption); 
    147147    $caption = preg_replace_callback( '/<[a-zA-Z0-9]+(?: [^<>]+>)*/', '_cleanup_image_add_caption', $caption ); 
    148     $caption = preg_replace( '/\n+/', '<br />', str_replace('"', '&quot;', $caption) ); 
     148    // convert any remaining line breaks to <br> 
     149    $caption = preg_replace( '/[ \n\t]*\n[ \t]*/', '<br />', $caption ); 
    149150 
    150151    $html = preg_replace( '/(class=["\'][^\'"]*)align(none|left|right|center)\s?/', '$1', $html ); 
     
    152153        $align = 'none'; 
    153154 
    154     $shcode = '[caption id="' . $id . '" align="align' . $align 
    155     . '" width="' . $width . '" caption="' . $caption . '"]' . $html . '[/caption]'; 
     155    $shcode = '[caption id="' . $id . '" align="align' . $align . '" width="' . $width . '"]' . $html . ' ' . $caption . '[/caption]'; 
    156156 
    157157    return apply_filters( 'image_add_caption_shortcode', $shcode, $html ); 
     
    167167function _cleanup_image_add_caption( $matches ) { 
    168168    // remove any line breaks from inside the tags 
    169     $s = preg_replace( '/[\r\n\t]+/', ' ', $matches[0] ); 
    170     // look for single quotes inside html attributes (for example in title) 
    171     $s = preg_replace_callback( '/="[^"]+"/', '_cleanup_image_add_caption_callback', $s ); 
    172     return str_replace( '"', "'", $s ); 
    173 } 
    174  
    175 /** 
    176  * Private preg_replace callback used in _cleanup_image_add_caption() 
    177  * 
    178  * @access private 
    179  * @since 3.4.0 
    180  */ 
    181 function _cleanup_image_add_caption_callback( $matches ) { 
    182     return str_replace( "'", '&#39;', $matches[0] ); 
     169    return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] ); 
    183170} 
    184171 
     
    15421529            caption = f.caption.value.replace(/\r\n|\r/g, '\n'); 
    15431530            caption = caption.replace(/<[a-zA-Z0-9]+( [^<>]+)?>/g, function(a){ 
    1544                 a = a.replace(/[\r\n\t]+/, ' ').replace(/="[^"]+"/, function(b){ 
    1545                     return b.replace(/'/g, '&#39;'); 
    1546                 }); 
    1547                 return a.replace(/"/g, "'"); 
     1531                return a.replace(/[\r\n\t]+/, ' '); 
    15481532            }); 
    15491533 
    1550             caption = caption.replace(/\n+/g, '<br />').replace(/"/g, '&quot;'); 
     1534            caption = caption.replace(/\s*\n\s*/g, '<br />'); 
    15511535        } 
    15521536<?php } ?> 
     
    15621546 
    15631547        if ( caption ) 
    1564             html = '[caption id="" align="'+t.align+'" width="'+t.width+'" caption="'+caption+'"]'+html+'[/caption]'; 
     1548            html = '[caption id="" align="'+t.align+'" width="'+t.width+'"]'+html+caption+'[/caption]'; 
    15651549 
    15661550        var win = window.dialogArguments || opener || parent || top; 
  • trunk/wp-admin/js/editor.dev.js

    r20174 r20679  
    7474        } 
    7575 
    76         // keep <br> tags inside captions 
     76        // keep <br> tags inside captions and remove line breaks 
    7777        if ( content.indexOf('[caption') != -1 ) { 
    7878            preserve_br = true; 
    79             content = content.replace(/\[caption[^\]]+\]/g, function(a) { 
    80                 return a.replace(/<br([^>]*)>[\r\n]*/g, '<wp-temp-br$1>'); 
     79            content = content.replace(/\[caption[\s\S]+?\[\/caption\]/g, function(a) { 
     80                return a.replace(/<br([^>]*)>/g, '<wp-temp-br$1>').replace(/[\r\n\t]+/, ''); 
    8181            }); 
    8282        } 
     
    140140 
    141141    _wp_Autop : function(pee) { 
    142         var blocklist = 'table|thead|tfoot|tbody|tr|td|th|caption|col|colgroup|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]|fieldset|legend|hr|noscript|menu|samp|header|footer|article|section|hgroup|nav|aside|details|summary'; 
     142        var preserve_linebreaks = false, preserve_br = false, 
     143            blocklist = 'table|thead|tfoot|tbody|tr|td|th|caption|col|colgroup|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]|fieldset|legend|hr|noscript|menu|samp|header|footer|article|section|hgroup|nav|aside|details|summary'; 
    143144 
    144145        if ( pee.indexOf('<object') != -1 ) { 
     
    154155        // Protect pre|script tags 
    155156        if ( pee.indexOf('<pre') != -1 || pee.indexOf('<script') != -1 ) { 
     157            preserve_linebreaks = true; 
    156158            pee = pee.replace(/<(pre|script)[^>]*>[\s\S]+?<\/\1>/g, function(a) { 
    157                 return a.replace(/(\r\n|\n)/g, '<wp_temp_br>'); 
     159                return a.replace(/(\r\n|\n)/g, '<wp-temp-lb>'); 
     160            }); 
     161        } 
     162 
     163        // keep <br> tags inside captions and convert line breaks 
     164        if ( pee.indexOf('[caption') != -1 ) { 
     165            preserve_br = true; 
     166            pee = pee.replace(/\[caption[\s\S]+?\[\/caption\]/g, function(a) { 
     167                // keep existing <br> 
     168                a = a.replace(/<br([^>]*)>/g, '<wp-temp-br$1>'); 
     169                // no line breaks inside HTML tags 
     170                a = a.replace(/<[a-zA-Z0-9]+( [^<>]+)?>/g, function(b){ 
     171                    return b.replace(/[\r\n\t]+/, ' '); 
     172                }); 
     173                // convert remaining line breaks to <br> 
     174                return a.replace(/\s*\n\s*/g, '<wp-temp-br />'); 
    158175            }); 
    159176        } 
     
    187204 
    188205        // put back the line breaks in pre|script 
    189         pee = pee.replace(/<wp_temp_br>/g, '\n'); 
     206        if ( preserve_linebreaks ) 
     207            pee = pee.replace(/<wp-temp-lb>/g, '\n'); 
     208 
     209        if ( preserve_br ) 
     210            pee = pee.replace(/<wp-temp-br([^>]*)>/g, '<br$1>'); 
    190211 
    191212        return pee; 
  • trunk/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js

    r20174 r20679  
    140140        _do_shcode : function(content) { 
    141141            return content.replace(/(?:<p>)?\[(?:wp_)?caption([^\]]+)\]([\s\S]+?)\[\/(?:wp_)?caption\](?:<\/p>)?/g, function(a,b,c){ 
    142                 var id, cls, w, cap, div_cls; 
     142                var id, cls, w, cap, div_cls, img, trim = tinymce.trim; 
    143143 
    144144                id = b.match(/id=['"]([^'"]*)['"] ?/); 
     
    151151                b = b.replace(w[0], ''); 
    152152 
    153                 cap = tinymce.trim(b).replace(/caption=['"]/, '').replace(/['"]$/, ''); 
     153                c = trim(c); 
     154                img = c.match(/((?:<a [^>]+>)?<img [^>]+>(?:<\/a>)?)([\s\S]*)/i); 
     155 
     156                if ( img && img[2] ) { 
     157                    cap = trim( img[2] ); 
     158                    img = trim( img[1] ); 
     159                } else { 
     160                    // old captions shortcode style 
     161                    cap = trim(b).replace(/caption=['"]/, '').replace(/['"]$/, ''); 
     162                    img = c; 
     163                } 
    154164 
    155165                id = ( id && id[1] ) ? id[1] : ''; 
     
    165175 
    166176                return '<div class="'+div_cls+'"><dl id="'+id+'" class="wp-caption '+cls+'" style="width: '+( 10 + parseInt(w) )+ 
    167                 'px"><dt class="wp-caption-dt">'+c+'</dt><dd class="wp-caption-dd">'+cap+'</dd></dl></div>'; 
     177                'px"><dt class="wp-caption-dt">'+img+'</dt><dd class="wp-caption-dd">'+cap+'</dd></dl></div>'; 
    168178            }); 
    169179        }, 
     
    188198 
    189199                    cap = cap.replace(/\r\n|\r/g, '\n').replace(/<[a-zA-Z0-9]+( [^<>]+)?>/g, function(a){ 
    190                         a = a.replace(/[\r\n\t]+/, ' ').replace(/="[^"]+"/, function(b){ 
    191                             return b.replace(/'/g, '&#39;'); 
    192                         }); 
    193                         return a.replace(/"/g, "'"); 
     200                        // no line breaks inside HTML tags 
     201                        return a.replace(/[\r\n\t]+/, ' '); 
    194202                    }); 
    195203 
    196                     cap = cap.replace(/\n+/g, '<br />').replace(/"/g, '&quot;'); 
    197  
    198                     return '[caption id="'+id+'" align="'+cls+'" width="'+w+'" caption="'+cap+'"]'+c+'[/caption]'; 
     204                    // convert remaining line breaks to <br> 
     205                    cap = cap.replace(/\s*\n\s*/g, '<br />'); 
     206 
     207                    return '[caption id="'+id+'" align="'+cls+'" width="'+w+'"]'+c+' '+cap+'[/caption]'; 
    199208                }); 
    200209 
  • trunk/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js

    r20341 r20679  
    420420 
    421421            caption = caption.replace(/\r\n|\r/g, '\n').replace(/<[a-zA-Z0-9]+( [^<>]+)?>/g, function(a){ 
    422                 a = a.replace(/[\r\n\t]+/, ' ').replace(/="[^"]+"/, function(b){ 
    423                     return b.replace(/'/g, '&#39;'); 
    424                 }); 
    425                 return a.replace(/"/g, "'"); 
     422                return a.replace(/[\r\n\t]+/, ' '); 
    426423            }); 
    427424 
    428             caption = caption.replace(/\n+/g, '<br />').replace(/"/g, '&quot;'); 
     425            caption = caption.replace(/\s*\n\s*/g, '<br />'); 
    429426 
    430427            if ( DL ) { 
  • trunk/wp-includes/media.php

    r20562 r20679  
    725725 */ 
    726726function img_caption_shortcode($attr, $content = null) { 
     727    // New-style shortcode with the caption inside the shortcode with the link and image tags. 
     728    if ( ! isset( $attr['caption'] ) ) { 
     729        if ( preg_match( '#((?:<a [^>]+>\s*)?<img [^>]+>(?:\s*</a>)?)(.*)#is', $content, $matches ) ) { 
     730            $content = $matches[1]; 
     731            $attr['caption'] = trim( $matches[2] ); 
     732        } 
     733    } 
    727734 
    728735    // Allow plugins/themes to override the default caption template. 
Note: See TracChangeset for help on using the changeset viewer.