function wpEmoji() {
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
- /**
- * Flag to determine if the browser and the OS support emoji.
- *
- * @since 4.2.0
- *
- * @var Boolean
- */
- supportsEmoji = false,
-
- /**
- * Flag to determine if the browser and the OS support flag (two character) emoji.
- *
- * @since 4.2.0
- *
- * @var Boolean
- */
- supportsFlagEmoji = false,
-
/**
* Flag to determine if we should replace emoji characters with images.
*
*/
replaceEmoji = false,
- isIE8 = window.navigator.userAgent.indexOf( 'IE 8' ) !== -1,
-
// Private
twemoji, timer,
+ loaded = false,
count = 0;
/**
* @since 4.2.0
*/
function load() {
+ if ( loaded ) {
+ return;
+ }
+
if ( typeof window.twemoji === 'undefined' ) {
// Break if waiting for longer than 30 sec.
if ( count > 600 ) {
}
twemoji = window.twemoji;
+ loaded = true;
if ( MutationObserver ) {
new MutationObserver( function( mutationRecords ) {
var i = mutationRecords.length,
- ii, node;
+ addedNodes, removedNodes, ii, node;
while ( i-- ) {
- ii = mutationRecords[ i ].addedNodes.length;
+ addedNodes = mutationRecords[ i ].addedNodes;
+ removedNodes = mutationRecords[ i ].removedNodes;
+ ii = addedNodes.length;
+
+ if (
+ ii === 1 && removedNodes.length === 1 &&
+ addedNodes[0].nodeType === 3 &&
+ removedNodes[0].nodeName === 'IMG' &&
+ addedNodes[0].data === removedNodes[0].alt
+ ) {
+ return;
+ }
while ( ii-- ) {
- node = mutationRecords[ i ].addedNodes[ ii ];
+ node = addedNodes[ ii ];
if ( node.nodeType === 3 ) {
node = node.parentNode;
}
+ if ( ! node || ( node.className && node.className.indexOf( 'wp-exclude-emoji' ) !== -1 ) ) {
+ continue;
+ }
+
if ( node && node.nodeType === 1 ) {
parse( node );
}
* @param {Object} args Additional options for Twemoji.
*/
function parse( object, args ) {
- if ( ! replaceEmoji ) {
+ if ( ! replaceEmoji || ! twemoji ) {
return object;
}
return false;
}
- if ( ! supportsFlagEmoji && supportsEmoji &&
+ if ( ! settings.supports.flag && settings.supports.simple &&
! /^1f1(?:e[6-9a-f]|f[0-9a-f])-1f1(?:e[6-9a-f]|f[0-9a-f])$/.test( icon ) ) {
return false;
} );
}
- // Load when the readyState changes to 'interactive', not 'complete'.
- function onLoad() {
- if ( ( ! isIE8 && 'interactive' === document.readyState ) || ( isIE8 && 'complete' === document.readyState ) ) {
- load();
- }
- }
-
/**
* Initialize our emoji support, and set up listeners.
*/
if ( settings ) {
- supportsEmoji = window._wpemojiSettings.supports.simple;
- supportsFlagEmoji = window._wpemojiSettings.supports.flag;
- replaceEmoji = ! supportsEmoji || ! supportsFlagEmoji;
-
- if ( ( ! isIE8 && 'loading' === document.readyState ) || ( isIE8 && 'complete' !== document.readyState ) ) {
- if ( document.addEventListener ) {
- document.addEventListener( 'readystatechange', onLoad, false );
- } else if ( document.attachEvent ) {
- document.attachEvent( 'onreadystatechange', onLoad );
- }
- } else {
+ replaceEmoji = ! settings.supports.simple || ! settings.supports.flag;
+
+ if ( settings.DOMReady ) {
load();
+ } else {
+ settings.readyCallback = load;
}
}