Ticket #23282: 23282.12.diff
File 23282.12.diff, 18.5 KB (added by , 12 years ago) |
---|
-
wp-admin/includes/ajax-actions.php
diff --git wp-admin/includes/ajax-actions.php wp-admin/includes/ajax-actions.php index 8581c9e..93a897f 100644
function wp_ajax_send_attachment_to_editor() { 2024 2024 $caption = isset( $attachment['post_excerpt'] ) ? $attachment['post_excerpt'] : ''; 2025 2025 $title = ''; // We no longer insert title tags into <img> tags, as they are redundant. 2026 2026 $html = get_image_send_to_editor( $id, $caption, $title, $align, $url, (bool) $rel, $size, $alt ); 2027 } elseif ( 'video' === substr( $post->post_mime_type, 0, 5 ) || 'audio' === substr( $post->post_mime_type, 0, 5 ) ) { 2028 $html = stripslashes_deep( $_POST['html'] ); 2027 2029 } 2028 2030 2029 2031 $html = apply_filters( 'media_send_to_editor', $html, $id, $attachment ); -
wp-includes/functions.php
diff --git wp-includes/functions.php wp-includes/functions.php index b29b941..78dedb6 100644
$("#wp-auth-check-form iframe").load(function(){ 4020 4020 </script> 4021 4021 </div>' ) ); 4022 4022 } 4023 4024 /** 4025 * Return RegEx body to liberally match an opening HTML tag that: 4026 * 1. Is self-closing or 4027 * 2. Has no body but has a closing tag of the same name or 4028 * 3. Contains a body and a closing tag of the same name 4029 * 4030 * Note: this RegEx does not balance inner tags and does not attempt to produce valid HTML 4031 * 4032 * @since 3.6.0 4033 * 4034 * @param string $tag An HTML tag name. Example: 'video' 4035 * @return string 4036 */ 4037 function get_tag_regex( $tag ) { 4038 if ( empty( $tag ) ) 4039 return; 4040 4041 return sprintf( '(<%1$s[^>]*(?:/?>$|>[\s\S]*?</%1$s>))', tag_escape( $tag ) ); 4042 } 4043 No newline at end of file -
wp-includes/js/media-editor.js
diff --git wp-includes/js/media-editor.js wp-includes/js/media-editor.js index 15eff8d..7dbbb79 100644
66 66 src: size.url, 67 67 captionId: 'attachment_' + attachment.id 68 68 }); 69 69 } else if ( 'video' === attachment.type || 'audio' === attachment.type ) { 70 _.extend( props, _.pick( attachment, 'title', 'type', 'icon', 'mime' ) ); 70 71 // Format properties for non-images. 71 72 } else { 72 73 props.title = props.title || attachment.filename; … … 95 96 return wp.html.string( options ); 96 97 }, 97 98 99 audio: function( props, attachment ) { 100 var shortcode, html; 101 102 props = wp.media.string.props( props, attachment ); 103 104 shortcode = {}; 105 106 if ( props.mime ) { 107 switch ( props.mime ) { 108 case 'audio/mpeg': 109 if ( props.linkUrl.indexOf( 'mp3' ) ) 110 shortcode.mp3 = props.linkUrl; 111 else if ( props.linkUrl.indexOf( 'm4a' ) ) 112 shortcode.m4a = props.linkUrl; 113 break; 114 case 'audio/mp3': 115 shortcode.mp3 = props.linkUrl; 116 break; 117 case 'audio/m4a': 118 shortcode.m4a = props.linkUrl; 119 break; 120 case 'audio/wav': 121 shortcode.wav = props.linkUrl; 122 break; 123 case 'audio/ogg': 124 shortcode.ogg = props.linkUrl; 125 break; 126 case 'audio/x-ms-wma': 127 case 'audio/wma': 128 shortcode.wma = props.linkUrl; 129 break; 130 } 131 } 132 133 html = wp.shortcode.string({ 134 tag: 'audio', 135 attrs: shortcode 136 }); 137 138 return html; 139 }, 140 141 video: function( props, attachment ) { 142 var shortcode, html; 143 144 props = wp.media.string.props( props, attachment ); 145 146 shortcode = {}; 147 148 if ( props.mime ) { 149 switch ( props.mime ) { 150 case 'video/mp4': 151 shortcode.mp4 = props.linkUrl; 152 break; 153 case 'video/m4v': 154 shortcode.m4v = props.linkUrl; 155 break; 156 case 'video/webm': 157 shortcode.webm = props.linkUrl; 158 break; 159 case 'video/ogg': 160 shortcode.ogv = props.linkUrl; 161 break; 162 case 'video/x-ms-wmv': 163 case 'video/wmv': 164 case 'video/asf': 165 shortcode.wmv = props.linkUrl; 166 break; 167 case 'video/flv': 168 case 'video/x-flv': 169 shortcode.flv = props.linkUrl; 170 break; 171 } 172 } 173 174 html = wp.shortcode.string({ 175 tag: 'video', 176 attrs: shortcode 177 }); 178 179 return html; 180 }, 181 98 182 image: function( props, attachment ) { 99 183 var img = {}, 100 184 options, classes, shortcode, html; … … 575 659 if ( props[ prop ] ) 576 660 options[ option ] = props[ prop ]; 577 661 }); 578 662 } else if ( 'video' === attachment.type ) { 663 html = wp.media.string.video( props ); 664 } else if ( 'audio' === attachment.type ) { 665 html = wp.media.string.audio( props ); 579 666 } else { 580 667 html = wp.media.string.link( props ); 581 668 options.post_title = props.title; -
wp-includes/media.php
diff --git wp-includes/media.php wp-includes/media.php index c543389..5b65f3d 100644
function gallery_shortcode($attr) { 803 803 } 804 804 805 805 /** 806 * Provide a No-JS Flash fallback as a last resort for audio / video 807 * 808 * @since 3.6.0 809 * 810 * @param string $url 811 * @return string Fallback HTML 812 */ 813 function wp_mediaelement_fallback( $url ) { 814 return apply_filters( 'wp_mediaelement_fallback', sprintf( '<a href="%1$s">%1$s</a>', esc_url( $url ) ), $url ); 815 } 816 817 /** 818 * Return a filtered list of WP-supported audio formats 819 * 820 * @since 3.6.0 821 * @return array 822 */ 823 function wp_get_audio_extensions() { 824 return apply_filters( 'wp_audio_extensions', array( 'mp3', 'ogg', 'wma', 'm4a', 'wav' ) ); 825 } 826 827 /** 828 * The Audio shortcode. 829 * 830 * This implements the functionality of the Audio Shortcode for displaying 831 * WordPress mp3s in a post. 832 * 833 * @since 3.6.0 834 * 835 * @param array $attr Attributes of the shortcode. 836 * @return string HTML content to display audio. 837 */ 838 function wp_audio_shortcode( $attr ) { 839 $post_id = get_post() ? get_the_ID() : 0; 840 841 static $instances = 0; 842 $instances++; 843 844 $audio = null; 845 846 $default_types = wp_get_audio_extensions(); 847 $defaults_atts = array( 'src' => '' ); 848 foreach ( $default_types as $type ) 849 $defaults_atts[$type] = ''; 850 851 $atts = shortcode_atts( $defaults_atts, $attr ); 852 extract( $atts ); 853 854 $primary = false; 855 if ( ! empty( $src ) ) { 856 $type = wp_check_filetype( $src ); 857 if ( ! in_array( $type['ext'], $default_types ) ) { 858 printf( '<a class="wp-post-format-link-audio" href="%1$s">%1$s</a>', $src ); 859 return; 860 } 861 $primary = true; 862 array_unshift( $default_types, 'src' ); 863 } else { 864 foreach ( $default_types as $ext ) { 865 if ( ! empty( $$ext ) ) { 866 $type = wp_check_filetype( $$ext ); 867 if ( $type['ext'] === $ext ) 868 $primary = true; 869 } 870 } 871 } 872 873 if ( ! $primary ) { 874 $audios = get_post_audio( $post_id ); 875 if ( empty( $audios ) ) 876 return; 877 878 $audio = reset( $audios ); 879 $src = wp_get_attachment_url( $audio->ID ); 880 if ( empty( $src ) ) 881 return; 882 883 array_unshift( $default_types, 'src' ); 884 } 885 886 $library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' ); 887 if ( 'mediaelement' === $library ) { 888 wp_enqueue_style( 'wp-mediaelement' ); 889 wp_enqueue_script( 'wp-mediaelement' ); 890 } 891 892 $atts = array( 893 sprintf( 'class="%s"', apply_filters( 'wp_audio_shortcode_class', 'wp-audio-shortcode' ) ), 894 sprintf( 'id="audio-%d-%d"', $post_id, $instances ), 895 ); 896 897 $html = sprintf( '<audio %s controls="controls" preload="none">', join( ' ', $atts ) ); 898 899 $fileurl = ''; 900 $source = '<source type="%s" src="%s" />'; 901 foreach ( $default_types as $fallback ) { 902 if ( ! empty( $$fallback ) ) { 903 if ( empty( $fileurl ) ) 904 $fileurl = $$fallback; 905 $type = wp_check_filetype( $$fallback ); 906 $html .= sprintf( $source, $type['type'], $$fallback ); 907 } 908 } 909 910 if ( 'mediaelement' === $library ) 911 $html .= wp_mediaelement_fallback( $fileurl ); 912 $html .= '</audio>'; 913 914 return apply_filters( 'wp_audio_shortcode', $html, $atts, $audio, $post_id ); 915 } 916 add_shortcode( 'audio', apply_filters( 'wp_audio_shortcode_handler', 'wp_audio_shortcode' ) ); 917 918 /** 919 * Return a filtered list of WP-supported video formats 920 * 921 * @since 3.6.0 922 * @return array 923 */ 924 function wp_get_video_extensions() { 925 return apply_filters( 'wp_video_extensions', array( 'mp4', 'm4v', 'webm', 'ogv', 'wmv', 'flv' ) ); 926 } 927 928 /** 929 * The Video shortcode. 930 * 931 * This implements the functionality of the Video Shortcode for displaying 932 * WordPress mp4s in a post. 933 * 934 * @since 3.6.0 935 * 936 * @param array $attr Attributes of the shortcode. 937 * @return string HTML content to display video. 938 */ 939 function wp_video_shortcode( $attr ) { 940 global $content_width; 941 $post_id = get_post() ? get_the_ID() : 0; 942 943 static $instances = 0; 944 $instances++; 945 946 $video = null; 947 948 $default_types = wp_get_video_extensions(); 949 $defaults_atts = array( 950 'src' => '', 951 'poster' => '', 952 'height' => 360, 953 'width' => empty( $content_width ) ? 640 : $content_width, 954 ); 955 foreach ( $default_types as $type ) 956 $defaults_atts[$type] = ''; 957 958 $atts = shortcode_atts( $defaults_atts, $attr ); 959 extract( $atts ); 960 961 $primary = false; 962 if ( ! empty( $src ) ) { 963 $type = wp_check_filetype( $src ); 964 if ( ! in_array( $type['ext'], $default_types ) ) { 965 printf( '<a class="wp-post-format-link-video" href="%1$s">%1$s</a>', $src ); 966 return; 967 } 968 $primary = true; 969 array_unshift( $default_types, 'src' ); 970 } else { 971 foreach ( $default_types as $ext ) { 972 if ( ! empty( $$ext ) ) { 973 $type = wp_check_filetype( $$ext ); 974 if ( $type['ext'] === $ext ) 975 $primary = true; 976 } 977 } 978 } 979 980 if ( ! $primary ) { 981 $videos = get_post_video( $post_id ); 982 if ( empty( $videos ) ) 983 return; 984 985 $video = reset( $videos ); 986 $src = wp_get_attachment_url( $video->ID ); 987 if ( empty( $src ) ) 988 return; 989 990 array_unshift( $default_types, 'src' ); 991 } 992 993 $library = apply_filters( 'wp_video_shortcode_library', 'mediaelement' ); 994 if ( 'mediaelement' === $library ) { 995 wp_enqueue_style( 'wp-mediaelement' ); 996 wp_enqueue_script( 'wp-mediaelement' ); 997 } 998 999 $atts = array( 1000 sprintf( 'class="%s"', apply_filters( 'wp_video_shortcode_class', 'wp-video-shortcode' ) ), 1001 sprintf( 'id="video-%d-%d"', $post_id, $instances ), 1002 sprintf( 'width="%d"', $width ), 1003 sprintf( 'height="%d"', $height ), 1004 ); 1005 1006 if ( ! empty( $poster ) ) 1007 $atts[] = sprintf( 'poster="%s"', esc_url( $poster ) ); 1008 1009 $html = sprintf( '<video %s controls="controls" preload="none">', join( ' ', $atts ) ); 1010 1011 $fileurl = ''; 1012 $source = '<source type="%s" src="%s" />'; 1013 foreach ( $default_types as $fallback ) { 1014 if ( ! empty( $$fallback ) ) { 1015 if ( empty( $fileurl ) ) 1016 $fileurl = $$fallback; 1017 $type = wp_check_filetype( $$fallback ); 1018 // m4v sometimes shows up as video/mpeg which collides with mp4 1019 if ( 'm4v' === $type['ext'] ) 1020 $type['type'] = 'video/m4v'; 1021 $html .= sprintf( $source, $type['type'], $$fallback ); 1022 } 1023 } 1024 if ( 'mediaelement' === $library ) 1025 $html .= wp_mediaelement_fallback( $fileurl, $width, $height ); 1026 $html .= '</video>'; 1027 1028 return apply_filters( 'wp_video_shortcode', $html, $atts, $video, $post_id ); 1029 } 1030 add_shortcode( 'video', apply_filters( 'wp_video_shortcode_handler', 'wp_video_shortcode' ) ); 1031 1032 /** 806 1033 * Display previous image link that has the same post parent. 807 1034 * 808 1035 * @since 2.5.0 … … function wp_enqueue_media( $args = array() ) { 1542 1769 1543 1770 do_action( 'wp_enqueue_media' ); 1544 1771 } 1772 1773 /** 1774 * Retrieve audio attached to the passed post 1775 * 1776 * @since 3.6.0 1777 * 1778 * @param int $post_id Post ID 1779 * @return array Found audio attachments 1780 */ 1781 function get_post_audio( $post_id = 0 ) { 1782 $post = empty( $post_id ) ? get_post() : get_post( $post_id ); 1783 if ( empty( $post ) ) 1784 return; 1785 1786 $children = get_children( array( 1787 'post_parent' => $post->ID, 1788 'post_type' => 'attachment', 1789 'post_mime_type' => 'audio', 1790 'posts_per_page' => -1 1791 ) ); 1792 1793 if ( ! empty( $children ) ) 1794 return $children; 1795 } 1796 1797 /** 1798 * Retrieve video attached to the passed post 1799 * 1800 * @since 3.6.0 1801 * 1802 * @param int $post_id Post ID 1803 * @return array Found video attachments 1804 */ 1805 function get_post_video( $post_id = 0 ) { 1806 $post = empty( $post_id ) ? get_post() : get_post( $post_id ); 1807 if ( empty( $post ) ) 1808 return; 1809 1810 $children = get_children( array( 1811 'post_parent' => $post->ID, 1812 'post_type' => 'attachment', 1813 'post_mime_type' => 'video', 1814 'posts_per_page' => -1 1815 ) ); 1816 1817 if ( ! empty( $children ) ) 1818 return $children; 1819 } 1820 1821 /** 1822 * Audio embed handler callback. 1823 * 1824 * @param array $matches The regex matches from the provided regex when calling {@link wp_embed_register_handler()}. 1825 * @param array $attr Embed attributes. 1826 * @param string $url The original URL that was matched by the regex. 1827 * @param array $rawattr The original unmodified attributes. 1828 * @return string The embed HTML. 1829 */ 1830 function wp_audio_embed( $matches, $attr, $url, $rawattr ) { 1831 $audio = $url; 1832 if ( shortcode_exists( 'audio' ) ) 1833 $audio = do_shortcode( '[audio src="' . $url . '" /]' ); 1834 return apply_filters( 'wp_audio_embed', $audio, $attr, $url, $rawattr ); 1835 } 1836 wp_embed_register_handler( 'wp_audio_embed', '#https?://.+?\.(' . join( '|', wp_get_audio_extensions() ) . ')#i', apply_filters( 'wp_audio_embed_handler', 'wp_audio_embed' ), 9999 ); 1837 1838 /** 1839 * Video embed handler callback. 1840 * 1841 * @param array $matches The regex matches from the provided regex when calling {@link wp_embed_register_handler()}. 1842 * @param array $attr Embed attributes. 1843 * @param string $url The original URL that was matched by the regex. 1844 * @param array $rawattr The original unmodified attributes. 1845 * @return string The embed HTML. 1846 */ 1847 function wp_video_embed( $matches, $attr, $url, $rawattr ) { 1848 $dimensions = ''; 1849 $video = $url; 1850 if ( shortcode_exists( 'video' ) ) { 1851 if ( ! empty( $rawattr['width'] ) && ! empty( $rawattr['height'] ) ) { 1852 $dimensions .= sprintf( 'width="%d" ', (int) $rawattr['width'] ); 1853 $dimensions .= sprintf( 'height="%d" ', (int) $rawattr['height'] ); 1854 } 1855 $video = do_shortcode( '[video ' . $dimensions . 'src="' . $url . '" /]' ); 1856 } 1857 return apply_filters( 'wp_video_embed', $video, $attr, $url, $rawattr ); 1858 } 1859 wp_embed_register_handler( 'wp_video_embed', '#https?://.+?\.(' . join( '|', wp_get_video_extensions() ) . ')#i', apply_filters( 'wp_video_embed_handler', 'wp_video_embed' ), 9999 ); -
wp-includes/post-formats.php
diff --git wp-includes/post-formats.php wp-includes/post-formats.php index 828447b..7dfc171 100644
function post_formats_compat( $content, $id = 0 ) { 308 308 $show_content = true; 309 309 $format_output = ''; 310 310 $meta = get_post_format_meta( $post->ID ); 311 // passed by ref in preg_match() 312 $matches = array(); 311 313 312 314 switch ( $format ) { 313 315 case 'link': … … function post_formats_compat( $content, $id = 0 ) { 365 367 break; 366 368 367 369 case 'gallery': 368 preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches ); 369 if ( ! empty( $matches ) && isset( $matches[2] ) ) { 370 foreach ( (array) $matches[2] as $match ) { 371 if ( 'gallery' === $match ) 372 break 2; // foreach + case 373 } 374 } 375 376 if ( ! empty( $meta['gallery'] ) ) { 370 if ( ! has_shortcode( $post->post_content, $format ) && ! empty( $meta['gallery'] ) ) 377 371 $format_output .= $meta['gallery']; 378 }379 372 break; 380 373 381 374 case 'video': 382 375 case 'audio': 383 $shortcode_regex = '/' . get_shortcode_regex() . '/s'; 384 $matches = preg_match( $shortcode_regex, $content ); 385 if ( ! $matches || $format !== $matches[2] ) { 386 if ( ! empty( $meta['media'] ) ) { 387 // the metadata is a shortcode or an embed code 388 if ( preg_match( $shortcode_regex, $meta['media'] ) || preg_match( '#<[^>]+>#', $meta['media'] ) ) { 389 $format_output .= $meta['media']; 390 } elseif ( ! stristr( $content, $meta['media'] ) ) { 391 // attempt to embed the URL 392 $format_output .= sprintf( '[embed]%s[/embed]', $meta['media'] ); 393 } 376 if ( ! has_shortcode( $post->post_content, $format ) && ! empty( $meta['media'] ) ) { 377 // the metadata is a shortcode or an embed code 378 if ( preg_match( '/' . get_shortcode_regex() . '/s', $meta['media'] ) || preg_match( '#<[^>]+>#', $meta['media'] ) ) { 379 $format_output .= $meta['media']; 380 } elseif ( ! stristr( $content, $meta['media'] ) ) { 381 // attempt to embed the URL 382 $format_output .= sprintf( '[embed]%s[/embed]', $meta['media'] ); 394 383 } 395 } 384 } 396 385 break; 397 386 default: 398 387 return $content; -
wp-includes/script-loader.php
diff --git wp-includes/script-loader.php wp-includes/script-loader.php index 84b76d3..bf3e4fb 100644
function wp_default_scripts( &$scripts ) { 277 277 278 278 $scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array('jquery'), '0.9.8', 1 ); 279 279 280 $scripts->add( 'mediaelement', "/wp-includes/js/mediaelement/mediaelement-and-player$suffix.js", array('jquery'), '2.10.1', 1 ); 281 $scripts->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement.js", array('mediaelement'), false, 1 ); 282 280 283 $scripts->add( 'password-strength-meter', "/wp-admin/js/password-strength-meter$suffix.js", array('jquery'), false, 1 ); 281 284 did_action( 'init' ) && $scripts->localize( 'password-strength-meter', 'pwsL10n', array( 282 285 'empty' => __('Strength indicator'), … … function wp_default_styles( &$styles ) { 543 546 $styles->add( 'media-views', "/wp-includes/css/media-views$suffix.css", array( 'buttons' ) ); 544 547 $styles->add( 'buttons', "/wp-includes/css/buttons$suffix.css" ); 545 548 549 $styles->add( 'mediaelement', "/wp-includes/js/mediaelement/mediaelementplayer$suffix.css" ); 550 $styles->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement.css", array( 'mediaelement' ) ); 551 546 552 foreach ( $rtl_styles as $rtl_style ) { 547 553 $styles->add_data( $rtl_style, 'rtl', true ); 548 554 if ( $suffix && ! in_array( $rtl_style, $no_suffix ) ) -
wp-includes/shortcodes.php
diff --git wp-includes/shortcodes.php wp-includes/shortcodes.php index bdc3f9b..b7a0b1b 100644
function remove_all_shortcodes() { 128 128 } 129 129 130 130 /** 131 * Whether a registered shortcode exists named $tag 132 * 133 * @since 3.6.0 134 * 135 * @global array $shortcode_tags 136 * @param string $tag 137 * @return boolean 138 */ 139 function shortcode_exists( $tag ) { 140 global $shortcode_tags; 141 return array_key_exists( $tag, $shortcode_tags ); 142 } 143 144 /** 145 * Whether the passed content contains the specified shortcode 146 * 147 * @since 3.6.0 148 * 149 * @global array $shortcode_tags 150 * @param string $tag 151 * @return boolean 152 */ 153 function has_shortcode( $content, $tag ) { 154 if ( shortcode_exists( $tag ) ) { 155 $matches = array(); 156 preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER ); 157 if ( empty( $matches ) ) 158 return false; 159 160 foreach ( $matches as $shortcode ) { 161 if ( $tag === $shortcode[2] ) 162 return true; 163 } 164 } 165 return false; 166 } 167 168 /** 131 169 * Search content for shortcodes and filter shortcodes through their hooks. 132 170 * 133 171 * If there are no shortcode tags defined, then the content will be returned