wp/wp-includes/js/wp-emoji.js
changeset 5 5e2f62d02dcd
child 7 cf61fcea0001
equal deleted inserted replaced
4:346c88efed21 5:5e2f62d02dcd
       
     1 
       
     2 ( function( window, settings ) {
       
     3 	function wpEmoji() {
       
     4 		var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
       
     5 
       
     6 		/**
       
     7 		 * Flag to determine if we should replace emoji characters with images.
       
     8 		 *
       
     9 		 * @since 4.2.0
       
    10 		 *
       
    11 		 * @var Boolean
       
    12 		 */
       
    13 		replaceEmoji = false,
       
    14 
       
    15 		// Private
       
    16 		twemoji, timer,
       
    17 		loaded = false,
       
    18 		count = 0;
       
    19 
       
    20 		/**
       
    21 		 * Runs when the document load event is fired, so we can do our first parse of the page.
       
    22 		 *
       
    23 		 * @since 4.2.0
       
    24 		 */
       
    25 		function load() {
       
    26 			if ( loaded ) {
       
    27 				return;
       
    28 			}
       
    29 
       
    30 			if ( typeof window.twemoji === 'undefined' ) {
       
    31 				// Break if waiting for longer than 30 sec.
       
    32 				if ( count > 600 ) {
       
    33 					return;
       
    34 				}
       
    35 
       
    36 				// Still waiting.
       
    37 				window.clearTimeout( timer );
       
    38 				timer = window.setTimeout( load, 50 );
       
    39 				count++;
       
    40 
       
    41 				return;
       
    42 			}
       
    43 
       
    44 			twemoji = window.twemoji;
       
    45 			loaded = true;
       
    46 
       
    47 			if ( MutationObserver ) {
       
    48 				new MutationObserver( function( mutationRecords ) {
       
    49 					var i = mutationRecords.length,
       
    50 						addedNodes, removedNodes, ii, node;
       
    51 
       
    52 					while ( i-- ) {
       
    53 						addedNodes = mutationRecords[ i ].addedNodes;
       
    54 						removedNodes = mutationRecords[ i ].removedNodes;
       
    55 						ii = addedNodes.length;
       
    56 
       
    57 						if (
       
    58 							ii === 1 && removedNodes.length === 1 &&
       
    59 							addedNodes[0].nodeType === 3 &&
       
    60 							removedNodes[0].nodeName === 'IMG' &&
       
    61 							addedNodes[0].data === removedNodes[0].alt
       
    62 						) {
       
    63 							return;
       
    64 						}
       
    65 
       
    66 						while ( ii-- ) {
       
    67 							node = addedNodes[ ii ];
       
    68 
       
    69 							if ( node.nodeType === 3 ) {
       
    70 								node = node.parentNode;
       
    71 							}
       
    72 
       
    73 							if ( ! node || ( node.className && node.className.indexOf( 'wp-exclude-emoji' ) !== -1 ) ) {
       
    74 								continue;
       
    75 							}
       
    76 
       
    77 							if ( node && node.nodeType === 1 ) {
       
    78 								parse( node );
       
    79 							}
       
    80 						}
       
    81 					}
       
    82 				} ).observe( document.body, {
       
    83 					childList: true,
       
    84 					subtree: true
       
    85 				} );
       
    86 			}
       
    87 
       
    88 			parse( document.body );
       
    89 		}
       
    90 
       
    91 		/**
       
    92 		 * Given an element or string, parse any emoji characters into Twemoji images.
       
    93 		 *
       
    94 		 * @since 4.2.0
       
    95 		 *
       
    96 		 * @param {HTMLElement|String} object The element or string to parse.
       
    97 		 * @param {Object} args Additional options for Twemoji.
       
    98 		 */
       
    99 		function parse( object, args ) {
       
   100 			if ( ! replaceEmoji || ! twemoji ) {
       
   101 				return object;
       
   102 			}
       
   103 
       
   104 			args = args || {};
       
   105 
       
   106 			return twemoji.parse( object, {
       
   107 				base: settings.baseUrl,
       
   108 				ext: settings.ext,
       
   109 				className: args.className || 'emoji',
       
   110 				imgAttr: args.imgAttr,
       
   111 				callback: function( icon, options ) {
       
   112 					// Ignore some standard characters that TinyMCE recommends in its character map.
       
   113 					switch ( icon ) {
       
   114 						case 'a9':
       
   115 						case 'ae':
       
   116 						case '2122':
       
   117 						case '2194':
       
   118 						case '2660':
       
   119 						case '2663':
       
   120 						case '2665':
       
   121 						case '2666':
       
   122 							return false;
       
   123 					}
       
   124 
       
   125 					if ( ! settings.supports.flag && settings.supports.simple &&
       
   126 						! /^1f1(?:e[6-9a-f]|f[0-9a-f])-1f1(?:e[6-9a-f]|f[0-9a-f])$/.test( icon ) ) {
       
   127 
       
   128 						return false;
       
   129 					}
       
   130 
       
   131 					return ''.concat( options.base, icon, options.ext );
       
   132 				}
       
   133 			} );
       
   134 		}
       
   135 
       
   136 		/**
       
   137 		 * Initialize our emoji support, and set up listeners.
       
   138 		 */
       
   139 		if ( settings ) {
       
   140 			replaceEmoji = ! settings.supports.simple || ! settings.supports.flag;
       
   141 
       
   142 			if ( settings.DOMReady ) {
       
   143 				load();
       
   144 			} else {
       
   145 				settings.readyCallback = load;
       
   146 			}
       
   147 		}
       
   148 
       
   149 		return {
       
   150 			replaceEmoji: replaceEmoji,
       
   151 			parse: parse
       
   152 		};
       
   153 	}
       
   154 
       
   155 	window.wp = window.wp || {};
       
   156 	window.wp.emoji = new wpEmoji();
       
   157 
       
   158 } )( window, window._wpemojiSettings );