diff --git a/wp-includes/js/tinymce/plugins/wpemoji/css/editor.css b/wp-includes/js/tinymce/plugins/wpemoji/css/editor.css deleted file mode 100644 index 9d96569122..0000000000 --- a/wp-includes/js/tinymce/plugins/wpemoji/css/editor.css +++ /dev/null @@ -1,15 +0,0 @@ -.emoji-wrapper, -.emoji-spacer { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -img.emoji { - height: 1em; - width: 1em; - margin: 0 .05em 0 .1em; - vertical-align: -0.1em; - border: none; - padding: 0; -} diff --git a/wp-includes/js/tinymce/plugins/wpemoji/css/rtl/editor-rtl.css b/wp-includes/js/tinymce/plugins/wpemoji/css/rtl/editor-rtl.css deleted file mode 100644 index f2a5b512ea..0000000000 --- a/wp-includes/js/tinymce/plugins/wpemoji/css/rtl/editor-rtl.css +++ /dev/null @@ -1,17 +0,0 @@ -/* This file was automatically generated on Nov 19 2014 05:08:11 */ - -.emoji-wrapper, -.emoji-spacer { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -img.emoji { - height: 1em; - width: 1em; - margin: 0 .1em 0 .05em; - vertical-align: -0.1em; - border: none; - padding: 0; -} diff --git a/wp-includes/js/tinymce/plugins/wpemoji/plugin.js b/wp-includes/js/tinymce/plugins/wpemoji/plugin.js index c5e98ded48..fa172d08d6 100644 --- a/wp-includes/js/tinymce/plugins/wpemoji/plugin.js +++ b/wp-includes/js/tinymce/plugins/wpemoji/plugin.js @@ -1,29 +1,18 @@ ( function( tinymce, wp ) { - tinymce.PluginManager.add( 'wpemoji', function( editor, url ) { + tinymce.PluginManager.add( 'wpemoji', function( editor ) { var typing, isMacWebKit = tinymce.Env.mac && tinymce.Env.webkit; - if ( ! wp.emoji.parseEmoji ) { + if ( ! wp || ! wp.emoji ) { return; } - // Loads stylesheet for custom styles within the editor - editor.on( 'init', function() { - var cssId = editor.dom.uniqueId(); - var linkElm = editor.dom.create( 'link', { - id: cssId, - rel: 'stylesheet', - href: url + '/css/editor.css' - }); - editor.getDoc().getElementsByTagName( 'head' )[0].appendChild( linkElm ); - } ); - editor.on( 'keydown keyup', function( event ) { typing = event.type === 'keydown'; } ); editor.on( 'input setcontent', function( event ) { - var selection, node, bookmark, imgs; + var selection, node, bookmark, images; if ( typing && event.type === 'input' ) { return; @@ -36,16 +25,15 @@ bookmark = selection.getBookmark(); } - wp.emoji.parse( node ); + wp.emoji.parse( node, { className: 'wp-emoji new-emoji' } ); - imgs = editor.dom.select( 'img.emoji', node ); + images = editor.dom.select( 'img.new-emoji', node ); - tinymce.each( imgs, function( elem ) { - if ( ! elem.getAttribute( 'data-wp-emoji' ) ) { - elem.setAttribute( 'data-mce-resize', 'false' ); - elem.setAttribute( 'data-mce-placeholder', '1' ); - elem.setAttribute( 'data-wp-emoji', elem.alt ); - } + tinymce.each( images, function( image ) { + image.className = 'wp-emoji'; + image.setAttribute( 'data-mce-resize', 'false' ); + image.setAttribute( 'data-mce-placeholder', '1' ); + image.setAttribute( 'data-wp-emoji', image.alt ); } ); // In IE all content in the editor is left selected aftrer wp.emoji.parse()... diff --git a/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js b/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js index e56857cd8b..6124593dd3 100644 --- a/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js +++ b/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js @@ -1 +1 @@ -!function(a,b){a.PluginManager.add("wpemoji",function(c,d){var e,f=a.Env.mac&&a.Env.webkit;b.emoji.parseEmoji&&(c.on("init",function(){var a=c.dom.uniqueId(),b=c.dom.create("link",{id:a,rel:"stylesheet",href:d+"/css/editor.css"});c.getDoc().getElementsByTagName("head")[0].appendChild(b)}),c.on("keydown keyup",function(a){e="keydown"===a.type}),c.on("input setcontent",function(d){var g,h,i,j;e&&"input"===d.type||(g=c.selection,h=g.getNode(),f&&(i=g.getBookmark()),b.emoji.parse(h),j=c.dom.select("img.emoji",h),a.each(j,function(a){a.getAttribute("data-wp-emoji")||(a.setAttribute("data-mce-resize","false"),a.setAttribute("data-mce-placeholder","1"),a.setAttribute("data-wp-emoji",a.alt))}),a.Env.ie&&h&&"BODY"===h.nodeName&&g.collapse(!0),f&&g.moveToBookmark(i))}),c.on("postprocess",function(a){a.content&&(a.content=a.content.replace(/]+data-wp-emoji="([^"]+)"[^>]*>/g,function(a,b){return b}))}),c.on("resolvename",function(a){"IMG"===a.target.nodeName&&c.dom.getAttrib(a.target,"data-wp-emoji")&&a.preventDefault()}))})}(window.tinymce,window.wp); \ No newline at end of file +!function(a,b){a.PluginManager.add("wpemoji",function(c){var d,e=a.Env.mac&&a.Env.webkit;b&&b.emoji&&(c.on("keydown keyup",function(a){d="keydown"===a.type}),c.on("input setcontent",function(f){var g,h,i,j;d&&"input"===f.type||(g=c.selection,h=g.getNode(),e&&(i=g.getBookmark()),b.emoji.parse(h,{className:"wp-emoji new-emoji"}),j=c.dom.select("img.new-emoji",h),a.each(j,function(a){a.className="wp-emoji",a.setAttribute("data-mce-resize","false"),a.setAttribute("data-mce-placeholder","1"),a.setAttribute("data-wp-emoji",a.alt)}),a.Env.ie&&h&&"BODY"===h.nodeName&&g.collapse(!0),e&&g.moveToBookmark(i))}),c.on("postprocess",function(a){a.content&&(a.content=a.content.replace(/]+data-wp-emoji="([^"]+)"[^>]*>/g,function(a,b){return b}))}),c.on("resolvename",function(a){"IMG"===a.target.nodeName&&c.dom.getAttrib(a.target,"data-wp-emoji")&&a.preventDefault()}))})}(window.tinymce,window.wp); \ No newline at end of file diff --git a/wp-includes/js/tinymce/skins/wordpress/wp-content.css b/wp-includes/js/tinymce/skins/wordpress/wp-content.css index f088a5e7aa..d4488d1435 100644 --- a/wp-includes/js/tinymce/skins/wordpress/wp-content.css +++ b/wp-includes/js/tinymce/skins/wordpress/wp-content.css @@ -57,6 +57,18 @@ th { font-size: inherit; } +/* For emoji replacement images */ +img.wp-emoji { + height: 1em !important; + width: 1em !important; + margin: 0 0.07em !important; + vertical-align: -0.1em !important; + border: none !important; + padding: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + /* DFW mode */ html.wp-fullscreen, html.wp-fullscreen body#tinymce { diff --git a/wp-includes/js/tinymce/wp-tinymce.js.gz b/wp-includes/js/tinymce/wp-tinymce.js.gz index d593923fd0..5fbeaacaaa 100644 Binary files a/wp-includes/js/tinymce/wp-tinymce.js.gz and b/wp-includes/js/tinymce/wp-tinymce.js.gz differ diff --git a/wp-includes/js/wp-emoji.js b/wp-includes/js/wp-emoji.js index 85ca1e4652..726f455f4e 100644 --- a/wp-includes/js/wp-emoji.js +++ b/wp-includes/js/wp-emoji.js @@ -1,9 +1,8 @@ -window.wp = window.wp || {}; -( function( window, wp, twemoji, settings ) { - var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; +( function( window, twemoji, settings ) { + function wpEmoji() { + var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver, - var emoji = { /** * Flag to determine if we should parse all emoji characters into Twemoji images. * @@ -11,7 +10,7 @@ window.wp = window.wp || {}; * * @var Boolean */ - parseAllEmoji: false, + parseAllEmoji = false, /** * Flag to determine if we should consider parsing emoji characters into Twemoji images. @@ -20,7 +19,7 @@ window.wp = window.wp || {}; * * @var Boolean */ - parseEmoji: false, + parseEmoji = false, /** * Flag to determine if we should parse flag characters into Twemoji images. @@ -29,31 +28,14 @@ window.wp = window.wp || {}; * * @var Boolean */ - parseFlags: false, - - /** - * Initialize our emoji support, and set up listeners. - * - * @since 4.2.0 - */ - init: function() { - emoji.parseAllEmoji = ! emoji.browserSupportsEmoji(); - emoji.parseFlags = ! emoji.browserSupportsFlagEmoji(); - emoji.parseEmoji = emoji.parseAllEmoji || emoji.parseFlags; - - if ( window.addEventListener ) { - window.addEventListener( 'load', emoji.load, false ); - } else if ( window.attachEvent ) { - window.attachEvent( 'onload', emoji.load ); - } - }, + parseFlags = false; /** * Runs when the document load event is fired, so we can do our first parse of the page. * * @since 4.2.0 */ - load: function() { + function load() { if ( MutationObserver ) { new MutationObserver( function( mutationRecords ) { var i = mutationRecords.length, @@ -71,7 +53,7 @@ window.wp = window.wp || {}; } if ( node && node.nodeType === 1 ) { - emoji.parse( node ); + parse( node ); } } } @@ -83,45 +65,19 @@ window.wp = window.wp || {}; } ); } - emoji.parse( document.body ); - }, + parse( document.body ); + } /** - * Detect if the browser supports rendering emoji. - * - * @since 4.2.0 - * - * @return {Boolean} True if the browser can render emoji, false if it cannot. - */ - browserSupportsEmoji: function() { - var canvas = document.createElement( 'canvas' ), - context = canvas.getContext && canvas.getContext( '2d' ); - - if ( ! context || ! context.fillText ) { - return false; - } - - /* - * Chrome on OS X added native emoji rendering in M41. Unfortunately, - * it doesn't work when the font is bolder than 500 weight. So, we - * check for bold rendering support to avoid invisible emoji in Chrome. - */ - context.textBaseline = 'top'; - context.font = '600 32px Arial'; - context.fillText( String.fromCharCode( 55357, 56835 ), 0, 0 ); - - return context.getImageData( 16, 16, 1, 1 ).data[0] !== 0; - }, - - /** - * Detect if the browser supports rendering flag emoji. Flag emoji are a single glyph + * Detect if the browser supports rendering emoji or flag emoji. Flag emoji are a single glyph * made of two characters, so some browsers (notably, Firefox OS X) don't support them. * * @since 4.2.0 * - * @return {Boolean} True if the browser renders flag characters as a flag glyph, false if it does not. + * @param flagEmoji {Boolean} Whether to test for support of flag emoji. + * @return {Boolean} True if the browser can render emoji, false if it cannot. */ - browserSupportsFlagEmoji: function() { + function browserSupportsEmoji( type ) { var canvas = document.createElement( 'canvas' ), context = canvas.getContext && canvas.getContext( '2d' ); @@ -130,20 +86,30 @@ window.wp = window.wp || {}; } context.textBaseline = 'top'; - context.font = '32px Arial'; - context.fillText( String.fromCharCode( 55356, 56812, 55356, 56807 ), 0, 0 ); + context.font = '600 32px Arial'; - /* - * This works because the image will be one of three things: - * - Two empty squares, if the browser doen't render emoji - * - Two squares with 'G' and 'B' in them, if the browser doen't render flag emoji - * - The British flag - * - * The first two will encode to small images (1-2KB data URLs), the third will encode - * to a larger image (4-5KB data URL). - */ - return canvas.toDataURL().length > 3000; - }, + if ( type === 'flag' ) { + /* + * This works because the image will be one of three things: + * - Two empty squares, if the browser doen't render emoji + * - Two squares with 'G' and 'B' in them, if the browser doen't render flag emoji + * - The British flag + * + * The first two will encode to small images (1-2KB data URLs), the third will encode + * to a larger image (4-5KB data URL). + */ + context.fillText( String.fromCharCode( 55356, 56812, 55356, 56807 ), 0, 0 ); + return canvas.toDataURL().length > 3000; + } else { + /* + * Chrome on OS X added native emoji rendering in M41. Unfortunately, + * it doesn't work when the font is bolder than 500 weight. So, we + * check for bold rendering support to avoid invisible emoji in Chrome. + */ + context.fillText( String.fromCharCode( 55357, 56835 ), 0, 0 ); + return context.getImageData( 16, 16, 1, 1 ).data[0] !== 0; + } + } /** * Given an element or string, parse any emoji characters into Twemoji images. @@ -152,14 +118,17 @@ window.wp = window.wp || {}; * * @param {HTMLElement|String} object The element or string to parse. */ - parse: function( object ) { - if ( ! emoji.parseEmoji ) { + function parse( object, options ) { + if ( ! parseEmoji ) { return object; } + var className = ( options && options.className ) || 'emoji'; + return twemoji.parse( object, { base: settings.baseUrl, ext: settings.ext, + className: className, callback: function( icon, options ) { // Ignore some standard characters that TinyMCE recommends in its character map. switch ( icon ) { @@ -174,7 +143,7 @@ window.wp = window.wp || {}; return false; } - if ( emoji.parseFlags && ! emoji.parseAllEmoji && + if ( parseFlags && ! parseAllEmoji && ! /^1f1(?:e[6-9a-f]|f[1-9a-f])-1f1(?:e[6-9a-f]|f[1-9a-f])$/.test( icon ) ) { return false; @@ -184,9 +153,31 @@ window.wp = window.wp || {}; } } ); } - }; - emoji.init(); + if ( ! twemoji || ! settings ) { + return; + } - wp.emoji = emoji; -} )( window, window.wp, window.twemoji, window._wpemojiSettings ); + /** + * Initialize our emoji support, and set up listeners. + */ + parseAllEmoji = ! browserSupportsEmoji(); + parseFlags = ! browserSupportsEmoji( 'flag' ); + parseEmoji = parseAllEmoji || parseFlags; + + if ( window.addEventListener ) { + window.addEventListener( 'load', load, false ); + } else if ( window.attachEvent ) { + window.attachEvent( 'onload', load ); + } + + return { + browserSupportsEmoji: browserSupportsEmoji, + parse: parse + }; + } + + window.wp = window.wp || {}; + window.wp.emoji = new wpEmoji(); + +} )( window, window.twemoji, window._wpemojiSettings ); diff --git a/wp-includes/js/wp-emoji.min.js b/wp-includes/js/wp-emoji.min.js index db687013f1..2df09c0146 100644 --- a/wp-includes/js/wp-emoji.min.js +++ b/wp-includes/js/wp-emoji.min.js @@ -1 +1 @@ -window.wp=window.wp||{},function(a,b,c,d){var e=a.MutationObserver||a.WebKitMutationObserver||a.MozMutationObserver,f={parseAllEmoji:!1,parseEmoji:!1,parseFlags:!1,init:function(){f.parseAllEmoji=!f.browserSupportsEmoji(),f.parseFlags=!f.browserSupportsFlagEmoji(),f.parseEmoji=f.parseAllEmoji||f.parseFlags,a.addEventListener?a.addEventListener("load",f.load,!1):a.attachEvent&&a.attachEvent("onload",f.load)},load:function(){e&&new e(function(a){for(var b,c,d=a.length;d--;)for(b=a[d].addedNodes.length;b--;)c=a[d].addedNodes[b],3===c.nodeType&&(c=c.parentNode),c&&1===c.nodeType&&f.parse(c)}).observe(document.body,{childList:!0,subtree:!0}),f.parse(document.body)},browserSupportsEmoji:function(){var a=document.createElement("canvas"),b=a.getContext&&a.getContext("2d");return b&&b.fillText?(b.textBaseline="top",b.font="600 32px Arial",b.fillText(String.fromCharCode(55357,56835),0,0),0!==b.getImageData(16,16,1,1).data[0]):!1},browserSupportsFlagEmoji:function(){var a=document.createElement("canvas"),b=a.getContext&&a.getContext("2d");return b&&b.fillText?(b.textBaseline="top",b.font="32px Arial",b.fillText(String.fromCharCode(55356,56812,55356,56807),0,0),a.toDataURL().length>3e3):!1},parse:function(a){return f.parseEmoji?c.parse(a,{base:d.baseUrl,ext:d.ext,callback:function(a,b){switch(a){case"a9":case"ae":case"2122":case"2194":case"2660":case"2663":case"2665":case"2666":return!1}return!f.parseFlags||f.parseAllEmoji||/^1f1(?:e[6-9a-f]|f[1-9a-f])-1f1(?:e[6-9a-f]|f[1-9a-f])$/.test(a)?"".concat(b.base,"/",a,b.ext):!1}}):a}};f.init(),b.emoji=f}(window,window.wp,window.twemoji,window._wpemojiSettings); \ No newline at end of file +!function(a,b,c){function d(){function d(){g&&new g(function(a){for(var b,c,d=a.length;d--;)for(b=a[d].addedNodes.length;b--;)c=a[d].addedNodes[b],3===c.nodeType&&(c=c.parentNode),c&&1===c.nodeType&&f(c)}).observe(document.body,{childList:!0,subtree:!0}),f(document.body)}function e(a){var b=document.createElement("canvas"),c=b.getContext&&b.getContext("2d");return c&&c.fillText?(c.textBaseline="top",c.font="600 32px Arial","flag"===a?(c.fillText(String.fromCharCode(55356,56812,55356,56807),0,0),b.toDataURL().length>3e3):(c.fillText(String.fromCharCode(55357,56835),0,0),0!==c.getImageData(16,16,1,1).data[0])):!1}function f(a,d){if(!i)return a;var e=d&&d.className||"emoji";return b.parse(a,{base:c.baseUrl,ext:c.ext,className:e,callback:function(a,b){switch(a){case"a9":case"ae":case"2122":case"2194":case"2660":case"2663":case"2665":case"2666":return!1}return!j||h||/^1f1(?:e[6-9a-f]|f[1-9a-f])-1f1(?:e[6-9a-f]|f[1-9a-f])$/.test(a)?"".concat(b.base,"/",a,b.ext):!1}})}var g=a.MutationObserver||a.WebKitMutationObserver||a.MozMutationObserver,h=!1,i=!1,j=!1;if(b&&c)return h=!e(),j=!e("flag"),i=h||j,a.addEventListener?a.addEventListener("load",d,!1):a.attachEvent&&a.attachEvent("onload",d),{browserSupportsEmoji:e,parse:f}}a.wp=a.wp||{},a.wp.emoji=new d}(window,window.twemoji,window._wpemojiSettings); \ No newline at end of file diff --git a/wp-includes/version.php b/wp-includes/version.php index f26d56e2a5..40292b39b4 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.2-beta1-31778'; +$wp_version = '4.2-beta1-31779'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.