]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-includes/js/wp-emoji.js
WordPress 4.2.2
[autoinstalls/wordpress.git] / wp-includes / js / wp-emoji.js
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 );