qq-wechat-emotion-parser.min.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. !
  2. function() {
  3. window._qqWechatEmotionParser = {};
  4. window.qqWechatEmotionParser = function() {};
  5. } (); !
  6. function() {
  7. var emojiBaseUrl = 'https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/';
  8. // emojiBaseUrl = config.emojiBaseUrl;
  9. window._qqWechatEmotionParser.emotion_map = {
  10. "/::)": emojiBaseUrl + "0.gif",
  11. "/::~": emojiBaseUrl + "1.gif",
  12. "/::B": emojiBaseUrl + "2.gif",
  13. "/::|": emojiBaseUrl + "3.gif",
  14. "/:8-)": emojiBaseUrl + "4.gif",
  15. "/::<": emojiBaseUrl + "5.gif",
  16. "/::$": emojiBaseUrl + "6.gif",
  17. "/::X": emojiBaseUrl + "7.gif",
  18. "/::Z": emojiBaseUrl + "8.gif",
  19. "/::'(": emojiBaseUrl + "9.gif",
  20. "/::-|": emojiBaseUrl + "10.gif",
  21. "/::@": emojiBaseUrl + "11.gif",
  22. "/::P": emojiBaseUrl + "12.gif",
  23. "/::D": emojiBaseUrl + "13.gif",
  24. "/::O": emojiBaseUrl + "14.gif",
  25. "/::(": emojiBaseUrl + "15.gif",
  26. "/::+": emojiBaseUrl + "16.gif",
  27. "/:--b": emojiBaseUrl + "17.gif",
  28. "/::Q": emojiBaseUrl + "18.gif",
  29. "/::T": emojiBaseUrl + "19.gif",
  30. "/:,@P": emojiBaseUrl + "20.gif",
  31. "/:,@-D": emojiBaseUrl + "21.gif",
  32. "/::d": emojiBaseUrl + "22.gif",
  33. "/:,@o": emojiBaseUrl + "23.gif",
  34. "/::g": emojiBaseUrl + "24.gif",
  35. "/:|-)": emojiBaseUrl + "25.gif",
  36. "/::!": emojiBaseUrl + "26.gif",
  37. "/::L": emojiBaseUrl + "27.gif",
  38. "/::>": emojiBaseUrl + "28.gif",
  39. "/::,@": emojiBaseUrl + "29.gif",
  40. "/:,@f": emojiBaseUrl + "30.gif",
  41. "/::-S": emojiBaseUrl + "31.gif",
  42. "/:?": emojiBaseUrl + "32.gif",
  43. "/:,@x": emojiBaseUrl + "33.gif",
  44. "/:,@@": emojiBaseUrl + "34.gif",
  45. "/::8": emojiBaseUrl + "35.gif",
  46. "/:,@!": emojiBaseUrl + "36.gif",
  47. "/:!!!": emojiBaseUrl + "37.gif",
  48. "/:xx": emojiBaseUrl + "38.gif",
  49. "/:bye": emojiBaseUrl + "39.gif",
  50. "/:wipe": emojiBaseUrl + "40.gif",
  51. "/:dig": emojiBaseUrl + "41.gif",
  52. "/:handclap": emojiBaseUrl + "42.gif",
  53. "/:&-(": emojiBaseUrl + "43.gif",
  54. "/:B-)": emojiBaseUrl + "44.gif",
  55. "/:<@": emojiBaseUrl + "45.gif",
  56. "/:@>": emojiBaseUrl + "46.gif",
  57. "/::-O": emojiBaseUrl + "47.gif",
  58. "/:>-|": emojiBaseUrl + "48.gif",
  59. "/:P-(": emojiBaseUrl + "49.gif",
  60. "/::'|": emojiBaseUrl + "50.gif",
  61. "/:X-)": emojiBaseUrl + "51.gif",
  62. "/::*": emojiBaseUrl + "52.gif",
  63. "/:@x": emojiBaseUrl + "53.gif",
  64. "/:8*": emojiBaseUrl + "54.gif",
  65. "/:pd": emojiBaseUrl + "55.gif",
  66. "/:<W>": emojiBaseUrl + "56.gif",
  67. "/:beer": emojiBaseUrl + "57.gif",
  68. "/:basketb": emojiBaseUrl + "58.gif",
  69. "/:oo": emojiBaseUrl + "59.gif",
  70. "/:coffee": emojiBaseUrl + "60.gif",
  71. "/:eat": emojiBaseUrl + "61.gif",
  72. "/:pig": emojiBaseUrl + "62.gif",
  73. "/:rose": emojiBaseUrl + "63.gif",
  74. "/:fade": emojiBaseUrl + "64.gif",
  75. "/:showlove": emojiBaseUrl + "65.gif",
  76. "/:heart": emojiBaseUrl + "66.gif",
  77. "/:break": emojiBaseUrl + "67.gif",
  78. "/:cake": emojiBaseUrl + "68.gif",
  79. "/:li": emojiBaseUrl + "69.gif",
  80. "/:bome": emojiBaseUrl + "70.gif",
  81. "/:kn": emojiBaseUrl + "71.gif",
  82. "/:footb": emojiBaseUrl + "72.gif",
  83. "/:ladybug": emojiBaseUrl + "73.gif",
  84. "/:shit": emojiBaseUrl + "74.gif",
  85. "/:moon": emojiBaseUrl + "75.gif",
  86. "/:sun": emojiBaseUrl + "76.gif",
  87. "/:gift": emojiBaseUrl + "77.gif",
  88. "/:hug": emojiBaseUrl + "78.gif",
  89. "/:strong": emojiBaseUrl + "79.gif",
  90. "/:weak": emojiBaseUrl + "80.gif",
  91. "/:share": emojiBaseUrl + "81.gif",
  92. "/:v": emojiBaseUrl + "82.gif",
  93. "/:@)": emojiBaseUrl + "83.gif",
  94. "/:jj": emojiBaseUrl + "84.gif",
  95. "/:@@": emojiBaseUrl + "85.gif",
  96. "/:bad": emojiBaseUrl + "86.gif",
  97. "/:lvu": emojiBaseUrl + "87.gif",
  98. "/:no": emojiBaseUrl + "88.gif",
  99. "/:ok": emojiBaseUrl + "89.gif",
  100. "/:love": emojiBaseUrl + "90.gif",
  101. "/:<L>": emojiBaseUrl + "91.gif",
  102. "/:jump": emojiBaseUrl + "92.gif",
  103. "/:shake": emojiBaseUrl + "93.gif",
  104. "/:<O>": emojiBaseUrl + "94.gif",
  105. "/:circle": emojiBaseUrl + "95.gif",
  106. "/:kotow": emojiBaseUrl + "96.gif",
  107. "/:turn": emojiBaseUrl + "97.gif",
  108. "/:skip": emojiBaseUrl + "98.gif",
  109. "/:oY": emojiBaseUrl + "99.gif",
  110. "/:#-0": emojiBaseUrl + "100.gif",
  111. "/:hiphot": emojiBaseUrl + "101.gif",
  112. "/:kiss": emojiBaseUrl + "102.gif",
  113. "/:<&": emojiBaseUrl + "103.gif",
  114. "/:&>": emojiBaseUrl + "104.gif",
  115. // 其他转码
  116. "[囧]": emojiBaseUrl + "17.gif",
  117. };
  118. } (); !
  119. function() {
  120. function Trie() {
  121. this.words = 0;
  122. this.empty = 1;
  123. this.index = 0;
  124. this.children = {};
  125. }
  126. Trie.prototype = {
  127. insert: function(str, pos, idx) {
  128. if (str.length === 0) {
  129. return;
  130. }
  131. var T = this;
  132. var k;
  133. var child;
  134. if (pos === undefined) {
  135. pos = 0;
  136. }
  137. if (pos === str.length) {
  138. T.index = idx;
  139. return;
  140. }
  141. k = str[pos];
  142. if (T.children[k] === undefined) {
  143. T.children[k] = new Trie();
  144. T.empty = 0;
  145. T.children[k].words = this.words + 1;
  146. }
  147. child = T.children[k];
  148. child.insert(str, pos + 1, idx);
  149. },
  150. build: function(arr) {
  151. var len = arr.length;
  152. for (var i = 0; i < len; i++) {
  153. this.insert(arr[i], 0, i);
  154. }
  155. },
  156. searchOne: function(str, pos) {
  157. if (pos === undefined) {
  158. pos = 0;
  159. }
  160. var result = {};
  161. if (str.length === 0) return result;
  162. var T = this;
  163. var child;
  164. var k;
  165. result.arr = [];
  166. k = str[pos];
  167. child = T.children[k];
  168. if (child !== undefined && pos < str.length) {
  169. return child.searchOne(str, pos + 1);
  170. }
  171. if (child === undefined && T.empty === 0) return result;
  172. if (T.empty == 1) {
  173. result.arr[0] = pos - T.words;
  174. result.arr[1] = T.index;
  175. result.words = T.words;
  176. return result;
  177. }
  178. return result;
  179. },
  180. search: function(str) {
  181. if (this.empty == 1) return [];
  182. var len = str.length;
  183. var searchResult = [];
  184. var tmp;
  185. for (var i = 0; i < len - 1; i++) {
  186. tmp = this.searchOne(str, i);
  187. if (typeof tmp.arr !== 'undefined' && tmp.arr.length > 0) {
  188. searchResult.push(tmp.arr);
  189. i = i + tmp.words - 1;
  190. }
  191. }
  192. return searchResult;
  193. }
  194. };
  195. if (typeof module !== 'undefined') {
  196. module.exports = Trie;
  197. } else if (typeof window !== 'undefined') {
  198. window._qqWechatEmotionParser.Trie = Trie;
  199. }
  200. } (); !
  201. function() {
  202. var emotion_map, trie, emotion_list, Trie;
  203. if (typeof module !== 'undefined') {
  204. emotion_map = require('./emotions.json');
  205. Trie = require('./trie');
  206. build();
  207. module.exports = qqWechatEmotionParser;
  208. } else if (window !== 'undefined') {
  209. emotion_map = window._qqWechatEmotionParser.emotion_map;
  210. Trie = window._qqWechatEmotionParser.Trie;
  211. build();
  212. window.qqWechatEmotionParser = qqWechatEmotionParser;
  213. }
  214. function build() {
  215. emotion_list = keys(emotion_map);
  216. trie = new Trie();
  217. trie.build(emotion_list);
  218. }
  219. function qqWechatEmotionParser(str) {
  220. console.log(str);
  221. str = str.replace(/&gt;/g,'>');
  222. str = str.replace(/&lt;/g,'<');
  223. console.log(str);
  224. var indices = trie.search(str);
  225. indices.reverse().map(function(idx) {
  226. var pos = idx[0],
  227. emotion = emotion_list[idx[1]],
  228. img = '<img src="' + emotion_map[emotion] + '" alt="' + emotion + '">';
  229. str = splice(str, pos, emotion.length, img);
  230. });
  231. return str;
  232. }
  233. function splice(str, index, count, add) {
  234. return str.slice(0, index) + add + str.slice(index + count);
  235. }
  236. function keys(map) {
  237. var list = [];
  238. for (var k in map) {
  239. if (map.hasOwnProperty(k)) list.push(k);
  240. }
  241. return list;
  242. }
  243. } ();