--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wp/wp-includes/js/wp-emoji.js Tue Jun 09 03:35:32 2015 +0200
@@ -0,0 +1,158 @@
+
+( function( window, settings ) {
+ function wpEmoji() {
+ var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
+
+ /**
+ * Flag to determine if we should replace emoji characters with images.
+ *
+ * @since 4.2.0
+ *
+ * @var Boolean
+ */
+ replaceEmoji = false,
+
+ // Private
+ twemoji, timer,
+ loaded = false,
+ 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 ( loaded ) {
+ return;
+ }
+
+ 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;
+ loaded = true;
+
+ if ( MutationObserver ) {
+ new MutationObserver( function( mutationRecords ) {
+ var i = mutationRecords.length,
+ addedNodes, removedNodes, ii, node;
+
+ while ( i-- ) {
+ 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 = 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 );
+ }
+ }
+ }
+ } ).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 || ! twemoji ) {
+ 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 ( ! 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;
+ }
+
+ return ''.concat( options.base, icon, options.ext );
+ }
+ } );
+ }
+
+ /**
+ * Initialize our emoji support, and set up listeners.
+ */
+ if ( settings ) {
+ replaceEmoji = ! settings.supports.simple || ! settings.supports.flag;
+
+ if ( settings.DOMReady ) {
+ load();
+ } else {
+ settings.readyCallback = load;
+ }
+ }
+
+ return {
+ replaceEmoji: replaceEmoji,
+ parse: parse
+ };
+ }
+
+ window.wp = window.wp || {};
+ window.wp.emoji = new wpEmoji();
+
+} )( window, window._wpemojiSettings );