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