|
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 ); |