]> scripts.mit.edu Git - autoinstallsdev/wordpress.git/blobdiff - wp-includes/js/wp-emoji.js
WordPress 4.2
[autoinstallsdev/wordpress.git] / wp-includes / js / wp-emoji.js
diff --git a/wp-includes/js/wp-emoji.js b/wp-includes/js/wp-emoji.js
new file mode 100644 (file)
index 0000000..0ff3c6f
--- /dev/null
@@ -0,0 +1,170 @@
+
+( function( window, settings ) {
+       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.
+                *
+                * @since 4.2.0
+                *
+                * @var Boolean
+                */
+               replaceEmoji = false,
+
+               isIE8 = window.navigator.userAgent.indexOf( 'IE 8' ) !== -1,
+
+               // Private
+               twemoji, timer,
+               count = 0;
+
+               /**
+                * Runs when the document load event is fired, so we can do our first parse of the page.
+                *
+                * @since 4.2.0
+                */
+               function load() {
+                       if ( typeof window.twemoji === 'undefined' ) {
+                               // Break if waiting for longer than 30 sec.
+                               if ( count > 600 ) {
+                                       return;
+                               }
+
+                               // Still waiting.
+                               window.clearTimeout( timer );
+                               timer = window.setTimeout( load, 50 );
+                               count++;
+
+                               return;
+                       }
+
+                       twemoji = window.twemoji;
+
+                       if ( MutationObserver ) {
+                               new MutationObserver( function( mutationRecords ) {
+                                       var i = mutationRecords.length,
+                                               ii, node;
+
+                                       while ( i-- ) {
+                                               ii = mutationRecords[ i ].addedNodes.length;
+
+                                               while ( ii-- ) {
+                                                       node = mutationRecords[ i ].addedNodes[ ii ];
+
+                                                       if ( node.nodeType === 3 ) {
+                                                               node = node.parentNode;
+                                                       }
+
+                                                       if ( node && node.nodeType === 1 ) {
+                                                               parse( node );
+                                                       }
+                                               }
+                                       }
+                               } ).observe( document.body, {
+                                       childList: true,
+                                       subtree: true
+                               } );
+                       }
+
+                       parse( document.body );
+               }
+
+               /**
+                * Given an element or string, parse any emoji characters into Twemoji images.
+                *
+                * @since 4.2.0
+                *
+                * @param {HTMLElement|String} object The element or string to parse.
+                * @param {Object} args Additional options for Twemoji.
+                */
+               function parse( object, args ) {
+                       if ( ! replaceEmoji ) {
+                               return object;
+                       }
+
+                       args = args || {};
+
+                       return twemoji.parse( object, {
+                               base: settings.baseUrl,
+                               ext: settings.ext,
+                               className: args.className || 'emoji',
+                               imgAttr: args.imgAttr,
+                               callback: function( icon, options ) {
+                                       // Ignore some standard characters that TinyMCE recommends in its character map.
+                                       switch ( icon ) {
+                                               case 'a9':
+                                               case 'ae':
+                                               case '2122':
+                                               case '2194':
+                                               case '2660':
+                                               case '2663':
+                                               case '2665':
+                                               case '2666':
+                                                       return false;
+                                       }
+
+                                       if ( ! supportsFlagEmoji && supportsEmoji &&
+                                               ! /^1f1(?:e[6-9a-f]|f[0-9a-f])-1f1(?:e[6-9a-f]|f[0-9a-f])$/.test( icon ) ) {
+
+                                               return false;
+                                       }
+
+                                       return ''.concat( options.base, icon, options.ext );
+                               }
+                       } );
+               }
+
+               // 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 {
+                               load();
+                       }
+               }
+
+               return {
+                       replaceEmoji: replaceEmoji,
+                       parse: parse
+               };
+       }
+
+       window.wp = window.wp || {};
+       window.wp.emoji = new wpEmoji();
+
+} )( window, window._wpemojiSettings );