Make WordPress Core


Ignore:
Timestamp:
02/24/2012 01:58:18 AM (14 years ago)
Author:
azaozz
Message:

HTML in image captions, first run, see #18311

File:
1 edited

Legend:

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

    r19871 r19982  
    150150    $width = $matches[1];
    151151
    152     $caption = str_replace( array( '>',    '<',    '"',      "'" ),
    153                             array( '&gt;', '&lt;', '&quot;', '&#039;' ),
    154                             $caption
    155                           );
     152    $caption = preg_replace_callback( '/<[a-zA-Z][^<>]+>/', '_cleanup_image_add_caption', $caption );
     153    $caption = str_replace( '"', '&quot;', $caption );
    156154
    157155    $html = preg_replace( '/(class=["\'][^\'"]*)align(none|left|right|center)\s?/', '$1', $html );
     
    160158
    161159    $shcode = '[caption id="' . $id . '" align="align' . $align
    162     . '" width="' . $width . '" caption="' . addslashes($caption) . '"]' . $html . '[/caption]';
     160    . '" width="' . $width . '" caption="' . $caption . '"]' . $html . '[/caption]';
    163161
    164162    return apply_filters( 'image_add_caption_shortcode', $shcode, $html );
    165163}
    166164add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 );
     165
     166// Private, preg_replace callback used in image_add_caption()
     167function _cleanup_image_add_caption($str) {
     168    if ( isset($str[0]) )
     169        return str_replace( '"', "'", $str[0] );
     170
     171    return '';
     172}
    167173
    168174/**
     
    777783    return "
    778784    <input type='text' class='text urlfield' name='attachments[$post->ID][url]' value='" . esc_attr($url) . "' /><br />
    779     <button type='button' class='button urlnone' title=''>" . __('None') . "</button>
    780     <button type='button' class='button urlfile' title='" . esc_attr($file) . "'>" . __('File URL') . "</button>
    781     <button type='button' class='button urlpost' title='" . esc_attr($link) . "'>" . __('Attachment Post URL') . "</button>
     785    <button type='button' class='button urlnone' data-link-url=''>" . __('None') . "</button>
     786    <button type='button' class='button urlfile' data-link-url='" . esc_attr($file) . "'>" . __('File URL') . "</button>
     787    <button type='button' class='button urlpost' data-link-url='" . esc_attr($link) . "'>" . __('Attachment Post URL') . "</button>
    782788";
     789}
     790
     791function wp_caption_input_textarea($edit_post) {
     792    // post data is already escaped
     793    $name = "attachments[{$edit_post->ID}][post_excerpt]";
     794
     795    return '
     796    <textarea class="code" name="' . $name . '" id="' . $name . '">' . $edit_post->post_excerpt . '</textarea>
     797    <div class="edit-caption-controls hide-if-no-js">
     798    <input type="button" class="button caption-insert-link" value="' . esc_attr__('Insert Link') . '" />
     799    <div class="caption-insert-link-wrap hidden">
     800    <label><span>' . __('Link URL') . '</span>
     801    <input type="text" value="" class="caption-insert-link-url" /></label>
     802    <label><span>' . __('Linked text') . '</span>
     803    <input type="text" value="" class="caption-insert-link-text" /></label>
     804    <div class="caption-insert-link-buttons">
     805    <input type="button" class="button caption-cancel" value="' . esc_attr__('Cancel') . '" />
     806    <input type="button" class="button-primary caption-save" value="' . esc_attr__('Insert') . '" />
     807    <br class="clear" />
     808    </div></div></div>
     809    ';
    783810}
    784811
     
    925952        'image_alt'   => array(),
    926953        'post_excerpt' => array(
    927             'label'      => __('Caption'),
    928             'value'      => $edit_post->post_excerpt
     954            'label'      => __('Default Caption'),
     955            'input'      => 'html',
     956            'html'       => wp_caption_input_textarea($edit_post)
    929957        ),
    930958        'post_content' => array(
     
    12031231            $item .= $field[ $field['input'] ];
    12041232        elseif ( $field['input'] == 'textarea' ) {
    1205             if ( user_can_richedit() ) { // textarea_escaped when user_can_richedit() = false
    1206                 $field['value'] = esc_textarea( $field['value'] );
     1233            if ( 'post_content' == $id && user_can_richedit() ) {
     1234                // sanitize_post() skips the post_content when user_can_richedit
     1235                $field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES );
    12071236            }
     1237            // post_excerpt is already escaped by sanitize_post() in get_attachment_fields_to_edit()
    12081238            $item .= "<textarea id='$name' name='$name' $aria_required>" . $field['value'] . '</textarea>';
    12091239        } else {
     
    15141544
    15151545<?php if ( ! apply_filters( 'disable_captions', '' ) ) { ?>
    1516         if ( f.caption.value )
    1517             caption = f.caption.value.replace(/'/g, '&#039;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
     1546        if ( f.caption.value ) {
     1547            caption = f.caption.value.replace(/<[a-z][^<>]+>/g, function(a){
     1548                return a.replace(/"/g, "'");
     1549            });
     1550
     1551            caption = caption.replace(/"/g, '&quot;');
     1552        }
    15181553<?php } ?>
    15191554
Note: See TracChangeset for help on using the changeset viewer.