tinymce_plugins_emoticons.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. import {
  2. __commonJS
  3. } from "./chunk-2LSFTFF7.js";
  4. // node_modules/.pnpm/tinymce@5.10.7/node_modules/tinymce/plugins/emoticons/plugin.js
  5. var require_plugin = __commonJS({
  6. "node_modules/.pnpm/tinymce@5.10.7/node_modules/tinymce/plugins/emoticons/plugin.js"() {
  7. (function() {
  8. "use strict";
  9. var global$3 = tinymce.util.Tools.resolve("tinymce.PluginManager");
  10. var eq = function(t) {
  11. return function(a) {
  12. return t === a;
  13. };
  14. };
  15. var isNull = eq(null);
  16. var noop = function() {
  17. };
  18. var constant = function(value2) {
  19. return function() {
  20. return value2;
  21. };
  22. };
  23. var identity = function(x) {
  24. return x;
  25. };
  26. var never = constant(false);
  27. var always = constant(true);
  28. var none = function() {
  29. return NONE;
  30. };
  31. var NONE = function() {
  32. var call = function(thunk) {
  33. return thunk();
  34. };
  35. var id = identity;
  36. var me = {
  37. fold: function(n, _s) {
  38. return n();
  39. },
  40. isSome: never,
  41. isNone: always,
  42. getOr: id,
  43. getOrThunk: call,
  44. getOrDie: function(msg) {
  45. throw new Error(msg || "error: getOrDie called on none.");
  46. },
  47. getOrNull: constant(null),
  48. getOrUndefined: constant(void 0),
  49. or: id,
  50. orThunk: call,
  51. map: none,
  52. each: noop,
  53. bind: none,
  54. exists: never,
  55. forall: always,
  56. filter: function() {
  57. return none();
  58. },
  59. toArray: function() {
  60. return [];
  61. },
  62. toString: constant("none()")
  63. };
  64. return me;
  65. }();
  66. var some = function(a) {
  67. var constant_a = constant(a);
  68. var self = function() {
  69. return me;
  70. };
  71. var bind = function(f) {
  72. return f(a);
  73. };
  74. var me = {
  75. fold: function(n, s) {
  76. return s(a);
  77. },
  78. isSome: always,
  79. isNone: never,
  80. getOr: constant_a,
  81. getOrThunk: constant_a,
  82. getOrDie: constant_a,
  83. getOrNull: constant_a,
  84. getOrUndefined: constant_a,
  85. or: self,
  86. orThunk: self,
  87. map: function(f) {
  88. return some(f(a));
  89. },
  90. each: function(f) {
  91. f(a);
  92. },
  93. bind,
  94. exists: bind,
  95. forall: bind,
  96. filter: function(f) {
  97. return f(a) ? me : NONE;
  98. },
  99. toArray: function() {
  100. return [a];
  101. },
  102. toString: function() {
  103. return "some(" + a + ")";
  104. }
  105. };
  106. return me;
  107. };
  108. var from = function(value2) {
  109. return value2 === null || value2 === void 0 ? NONE : some(value2);
  110. };
  111. var Optional = {
  112. some,
  113. none,
  114. from
  115. };
  116. var exists = function(xs, pred) {
  117. for (var i = 0, len = xs.length; i < len; i++) {
  118. var x = xs[i];
  119. if (pred(x, i)) {
  120. return true;
  121. }
  122. }
  123. return false;
  124. };
  125. var map$1 = function(xs, f) {
  126. var len = xs.length;
  127. var r = new Array(len);
  128. for (var i = 0; i < len; i++) {
  129. var x = xs[i];
  130. r[i] = f(x, i);
  131. }
  132. return r;
  133. };
  134. var each$1 = function(xs, f) {
  135. for (var i = 0, len = xs.length; i < len; i++) {
  136. var x = xs[i];
  137. f(x, i);
  138. }
  139. };
  140. var Cell = function(initial) {
  141. var value2 = initial;
  142. var get = function() {
  143. return value2;
  144. };
  145. var set = function(v) {
  146. value2 = v;
  147. };
  148. return {
  149. get,
  150. set
  151. };
  152. };
  153. var last = function(fn, rate) {
  154. var timer = null;
  155. var cancel = function() {
  156. if (!isNull(timer)) {
  157. clearTimeout(timer);
  158. timer = null;
  159. }
  160. };
  161. var throttle = function() {
  162. var args = [];
  163. for (var _i = 0; _i < arguments.length; _i++) {
  164. args[_i] = arguments[_i];
  165. }
  166. cancel();
  167. timer = setTimeout(function() {
  168. timer = null;
  169. fn.apply(null, args);
  170. }, rate);
  171. };
  172. return {
  173. cancel,
  174. throttle
  175. };
  176. };
  177. var insertEmoticon = function(editor, ch) {
  178. editor.insertContent(ch);
  179. };
  180. var __assign = function() {
  181. __assign = Object.assign || function __assign2(t) {
  182. for (var s, i = 1, n = arguments.length; i < n; i++) {
  183. s = arguments[i];
  184. for (var p in s)
  185. if (Object.prototype.hasOwnProperty.call(s, p))
  186. t[p] = s[p];
  187. }
  188. return t;
  189. };
  190. return __assign.apply(this, arguments);
  191. };
  192. var keys = Object.keys;
  193. var hasOwnProperty = Object.hasOwnProperty;
  194. var each = function(obj, f) {
  195. var props = keys(obj);
  196. for (var k = 0, len = props.length; k < len; k++) {
  197. var i = props[k];
  198. var x = obj[i];
  199. f(x, i);
  200. }
  201. };
  202. var map = function(obj, f) {
  203. return tupleMap(obj, function(x, i) {
  204. return {
  205. k: i,
  206. v: f(x, i)
  207. };
  208. });
  209. };
  210. var tupleMap = function(obj, f) {
  211. var r = {};
  212. each(obj, function(x, i) {
  213. var tuple = f(x, i);
  214. r[tuple.k] = tuple.v;
  215. });
  216. return r;
  217. };
  218. var has = function(obj, key) {
  219. return hasOwnProperty.call(obj, key);
  220. };
  221. var shallow = function(old, nu) {
  222. return nu;
  223. };
  224. var baseMerge = function(merger) {
  225. return function() {
  226. var objects = [];
  227. for (var _i = 0; _i < arguments.length; _i++) {
  228. objects[_i] = arguments[_i];
  229. }
  230. if (objects.length === 0) {
  231. throw new Error("Can't merge zero objects");
  232. }
  233. var ret = {};
  234. for (var j = 0; j < objects.length; j++) {
  235. var curObject = objects[j];
  236. for (var key in curObject) {
  237. if (has(curObject, key)) {
  238. ret[key] = merger(ret[key], curObject[key]);
  239. }
  240. }
  241. }
  242. return ret;
  243. };
  244. };
  245. var merge = baseMerge(shallow);
  246. var singleton = function(doRevoke) {
  247. var subject = Cell(Optional.none());
  248. var revoke = function() {
  249. return subject.get().each(doRevoke);
  250. };
  251. var clear = function() {
  252. revoke();
  253. subject.set(Optional.none());
  254. };
  255. var isSet = function() {
  256. return subject.get().isSome();
  257. };
  258. var get = function() {
  259. return subject.get();
  260. };
  261. var set = function(s) {
  262. revoke();
  263. subject.set(Optional.some(s));
  264. };
  265. return {
  266. clear,
  267. isSet,
  268. get,
  269. set
  270. };
  271. };
  272. var value = function() {
  273. var subject = singleton(noop);
  274. var on = function(f) {
  275. return subject.get().each(f);
  276. };
  277. return __assign(__assign({}, subject), { on });
  278. };
  279. var checkRange = function(str, substr, start) {
  280. return substr === "" || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
  281. };
  282. var contains = function(str, substr) {
  283. return str.indexOf(substr) !== -1;
  284. };
  285. var startsWith = function(str, prefix) {
  286. return checkRange(str, prefix, 0);
  287. };
  288. var global$2 = tinymce.util.Tools.resolve("tinymce.Resource");
  289. var global$1 = tinymce.util.Tools.resolve("tinymce.util.Delay");
  290. var global = tinymce.util.Tools.resolve("tinymce.util.Promise");
  291. var DEFAULT_ID = "tinymce.plugins.emoticons";
  292. var getEmoticonDatabase = function(editor) {
  293. return editor.getParam("emoticons_database", "emojis", "string");
  294. };
  295. var getEmoticonDatabaseUrl = function(editor, pluginUrl) {
  296. var database = getEmoticonDatabase(editor);
  297. return editor.getParam("emoticons_database_url", pluginUrl + "/js/" + database + editor.suffix + ".js", "string");
  298. };
  299. var getEmoticonDatabaseId = function(editor) {
  300. return editor.getParam("emoticons_database_id", DEFAULT_ID, "string");
  301. };
  302. var getAppendedEmoticons = function(editor) {
  303. return editor.getParam("emoticons_append", {}, "object");
  304. };
  305. var getEmotionsImageUrl = function(editor) {
  306. return editor.getParam("emoticons_images_url", "https://twemoji.maxcdn.com/v/13.0.1/72x72/", "string");
  307. };
  308. var ALL_CATEGORY = "All";
  309. var categoryNameMap = {
  310. symbols: "Symbols",
  311. people: "People",
  312. animals_and_nature: "Animals and Nature",
  313. food_and_drink: "Food and Drink",
  314. activity: "Activity",
  315. travel_and_places: "Travel and Places",
  316. objects: "Objects",
  317. flags: "Flags",
  318. user: "User Defined"
  319. };
  320. var translateCategory = function(categories, name) {
  321. return has(categories, name) ? categories[name] : name;
  322. };
  323. var getUserDefinedEmoticons = function(editor) {
  324. var userDefinedEmoticons = getAppendedEmoticons(editor);
  325. return map(userDefinedEmoticons, function(value2) {
  326. return __assign({
  327. keywords: [],
  328. category: "user"
  329. }, value2);
  330. });
  331. };
  332. var initDatabase = function(editor, databaseUrl, databaseId) {
  333. var categories = value();
  334. var all = value();
  335. var emojiImagesUrl = getEmotionsImageUrl(editor);
  336. var getEmoji = function(lib) {
  337. if (startsWith(lib.char, "<img")) {
  338. return lib.char.replace(/src="([^"]+)"/, function(match, url) {
  339. return 'src="' + emojiImagesUrl + url + '"';
  340. });
  341. } else {
  342. return lib.char;
  343. }
  344. };
  345. var processEmojis = function(emojis) {
  346. var cats = {};
  347. var everything = [];
  348. each(emojis, function(lib, title) {
  349. var entry = {
  350. title,
  351. keywords: lib.keywords,
  352. char: getEmoji(lib),
  353. category: translateCategory(categoryNameMap, lib.category)
  354. };
  355. var current = cats[entry.category] !== void 0 ? cats[entry.category] : [];
  356. cats[entry.category] = current.concat([entry]);
  357. everything.push(entry);
  358. });
  359. categories.set(cats);
  360. all.set(everything);
  361. };
  362. editor.on("init", function() {
  363. global$2.load(databaseId, databaseUrl).then(function(emojis) {
  364. var userEmojis = getUserDefinedEmoticons(editor);
  365. processEmojis(merge(emojis, userEmojis));
  366. }, function(err) {
  367. console.log("Failed to load emoticons: " + err);
  368. categories.set({});
  369. all.set([]);
  370. });
  371. });
  372. var listCategory = function(category) {
  373. if (category === ALL_CATEGORY) {
  374. return listAll();
  375. }
  376. return categories.get().bind(function(cats) {
  377. return Optional.from(cats[category]);
  378. }).getOr([]);
  379. };
  380. var listAll = function() {
  381. return all.get().getOr([]);
  382. };
  383. var listCategories = function() {
  384. return [ALL_CATEGORY].concat(keys(categories.get().getOr({})));
  385. };
  386. var waitForLoad = function() {
  387. if (hasLoaded()) {
  388. return global.resolve(true);
  389. } else {
  390. return new global(function(resolve, reject) {
  391. var numRetries = 15;
  392. var interval = global$1.setInterval(function() {
  393. if (hasLoaded()) {
  394. global$1.clearInterval(interval);
  395. resolve(true);
  396. } else {
  397. numRetries--;
  398. if (numRetries < 0) {
  399. console.log("Could not load emojis from url: " + databaseUrl);
  400. global$1.clearInterval(interval);
  401. reject(false);
  402. }
  403. }
  404. }, 100);
  405. });
  406. }
  407. };
  408. var hasLoaded = function() {
  409. return categories.isSet() && all.isSet();
  410. };
  411. return {
  412. listCategories,
  413. hasLoaded,
  414. waitForLoad,
  415. listAll,
  416. listCategory
  417. };
  418. };
  419. var emojiMatches = function(emoji, lowerCasePattern) {
  420. return contains(emoji.title.toLowerCase(), lowerCasePattern) || exists(emoji.keywords, function(k) {
  421. return contains(k.toLowerCase(), lowerCasePattern);
  422. });
  423. };
  424. var emojisFrom = function(list, pattern, maxResults) {
  425. var matches = [];
  426. var lowerCasePattern = pattern.toLowerCase();
  427. var reachedLimit = maxResults.fold(function() {
  428. return never;
  429. }, function(max) {
  430. return function(size) {
  431. return size >= max;
  432. };
  433. });
  434. for (var i = 0; i < list.length; i++) {
  435. if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) {
  436. matches.push({
  437. value: list[i].char,
  438. text: list[i].title,
  439. icon: list[i].char
  440. });
  441. if (reachedLimit(matches.length)) {
  442. break;
  443. }
  444. }
  445. }
  446. return matches;
  447. };
  448. var patternName = "pattern";
  449. var open = function(editor, database) {
  450. var initialState = {
  451. pattern: "",
  452. results: emojisFrom(database.listAll(), "", Optional.some(300))
  453. };
  454. var currentTab = Cell(ALL_CATEGORY);
  455. var scan = function(dialogApi2) {
  456. var dialogData = dialogApi2.getData();
  457. var category = currentTab.get();
  458. var candidates = database.listCategory(category);
  459. var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none());
  460. dialogApi2.setData({ results });
  461. };
  462. var updateFilter = last(function(dialogApi2) {
  463. scan(dialogApi2);
  464. }, 200);
  465. var searchField = {
  466. label: "Search",
  467. type: "input",
  468. name: patternName
  469. };
  470. var resultsField = {
  471. type: "collection",
  472. name: "results"
  473. };
  474. var getInitialState = function() {
  475. var body = {
  476. type: "tabpanel",
  477. tabs: map$1(database.listCategories(), function(cat) {
  478. return {
  479. title: cat,
  480. name: cat,
  481. items: [
  482. searchField,
  483. resultsField
  484. ]
  485. };
  486. })
  487. };
  488. return {
  489. title: "Emoticons",
  490. size: "normal",
  491. body,
  492. initialData: initialState,
  493. onTabChange: function(dialogApi2, details) {
  494. currentTab.set(details.newTabName);
  495. updateFilter.throttle(dialogApi2);
  496. },
  497. onChange: updateFilter.throttle,
  498. onAction: function(dialogApi2, actionData) {
  499. if (actionData.name === "results") {
  500. insertEmoticon(editor, actionData.value);
  501. dialogApi2.close();
  502. }
  503. },
  504. buttons: [{
  505. type: "cancel",
  506. text: "Close",
  507. primary: true
  508. }]
  509. };
  510. };
  511. var dialogApi = editor.windowManager.open(getInitialState());
  512. dialogApi.focus(patternName);
  513. if (!database.hasLoaded()) {
  514. dialogApi.block("Loading emoticons...");
  515. database.waitForLoad().then(function() {
  516. dialogApi.redial(getInitialState());
  517. updateFilter.throttle(dialogApi);
  518. dialogApi.focus(patternName);
  519. dialogApi.unblock();
  520. }).catch(function(_err) {
  521. dialogApi.redial({
  522. title: "Emoticons",
  523. body: {
  524. type: "panel",
  525. items: [{
  526. type: "alertbanner",
  527. level: "error",
  528. icon: "warning",
  529. text: "<p>Could not load emoticons</p>"
  530. }]
  531. },
  532. buttons: [{
  533. type: "cancel",
  534. text: "Close",
  535. primary: true
  536. }],
  537. initialData: {
  538. pattern: "",
  539. results: []
  540. }
  541. });
  542. dialogApi.focus(patternName);
  543. dialogApi.unblock();
  544. });
  545. }
  546. };
  547. var register$1 = function(editor, database) {
  548. editor.addCommand("mceEmoticons", function() {
  549. return open(editor, database);
  550. });
  551. };
  552. var setup = function(editor) {
  553. editor.on("PreInit", function() {
  554. editor.parser.addAttributeFilter("data-emoticon", function(nodes) {
  555. each$1(nodes, function(node) {
  556. node.attr("data-mce-resize", "false");
  557. node.attr("data-mce-placeholder", "1");
  558. });
  559. });
  560. });
  561. };
  562. var init = function(editor, database) {
  563. editor.ui.registry.addAutocompleter("emoticons", {
  564. ch: ":",
  565. columns: "auto",
  566. minChars: 2,
  567. fetch: function(pattern, maxResults) {
  568. return database.waitForLoad().then(function() {
  569. var candidates = database.listAll();
  570. return emojisFrom(candidates, pattern, Optional.some(maxResults));
  571. });
  572. },
  573. onAction: function(autocompleteApi, rng, value2) {
  574. editor.selection.setRng(rng);
  575. editor.insertContent(value2);
  576. autocompleteApi.hide();
  577. }
  578. });
  579. };
  580. var register = function(editor) {
  581. var onAction = function() {
  582. return editor.execCommand("mceEmoticons");
  583. };
  584. editor.ui.registry.addButton("emoticons", {
  585. tooltip: "Emoticons",
  586. icon: "emoji",
  587. onAction
  588. });
  589. editor.ui.registry.addMenuItem("emoticons", {
  590. text: "Emoticons...",
  591. icon: "emoji",
  592. onAction
  593. });
  594. };
  595. function Plugin() {
  596. global$3.add("emoticons", function(editor, pluginUrl) {
  597. var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl);
  598. var databaseId = getEmoticonDatabaseId(editor);
  599. var database = initDatabase(editor, databaseUrl, databaseId);
  600. register$1(editor, database);
  601. register(editor);
  602. init(editor, database);
  603. setup(editor);
  604. });
  605. }
  606. Plugin();
  607. })();
  608. }
  609. });
  610. // node_modules/.pnpm/tinymce@5.10.7/node_modules/tinymce/plugins/emoticons/index.js
  611. require_plugin();
  612. //# sourceMappingURL=tinymce_plugins_emoticons.js.map