OXIESEC PANEL
- Current Dir:
/
/
var
/
www
/
reader
/
_backup
/
tinymce
/
tinymce
/
js
/
tinymce
/
plugins
/
emoticons
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/20/2020 05:39:43 AM
rwxr-xr-x
📁
js
-
02/20/2020 05:40:48 AM
rwxr-xr-x
📄
plugin.js
19.69 KB
02/20/2020 05:37:05 AM
rw-r--r--
📄
plugin.min.js
7.88 KB
02/20/2020 05:37:05 AM
rw-r--r--
Editing: plugin.js
Close
/** * Copyright (c) Tiny Technologies, Inc. All rights reserved. * Licensed under the LGPL or a commercial license. * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * * Version: 5.0.4 (2019-04-23) */ (function () { var emoticons = (function (domGlobals) { 'use strict'; var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); var noop = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } }; var constant = function (value) { return function () { return value; }; }; var identity = function (x) { return x; }; var die = function (msg) { return function () { throw new Error(msg); }; }; var never = constant(false); var always = constant(true); var never$1 = never; var always$1 = always; var none = function () { return NONE; }; var NONE = function () { var eq = function (o) { return o.isNone(); }; var call = function (thunk) { return thunk(); }; var id = function (n) { return n; }; var noop = function () { }; var nul = function () { return null; }; var undef = function () { return undefined; }; var me = { fold: function (n, s) { return n(); }, is: never$1, isSome: never$1, isNone: always$1, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: nul, getOrUndefined: undef, or: id, orThunk: call, map: none, ap: none, each: noop, bind: none, flatten: none, exists: never$1, forall: always$1, filter: none, equals: eq, equals_: eq, toArray: function () { return []; }, toString: constant('none()') }; if (Object.freeze) Object.freeze(me); return me; }(); var some = function (a) { var constant_a = function () { return a; }; var self = function () { return me; }; var map = function (f) { return some(f(a)); }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, is: function (v) { return a === v; }, isSome: always$1, isNone: never$1, getOr: constant_a, getOrThunk: constant_a, getOrDie: constant_a, getOrNull: constant_a, getOrUndefined: constant_a, or: self, orThunk: self, map: map, ap: function (optfab) { return optfab.fold(none, function (fab) { return some(fab(a)); }); }, each: function (f) { f(a); }, bind: bind, flatten: constant_a, exists: bind, forall: bind, filter: function (f) { return f(a) ? me : NONE; }, equals: function (o) { return o.is(a); }, equals_: function (o, elementEq) { return o.fold(never$1, function (b) { return elementEq(a, b); }); }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; } }; return me; }; var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Option = { some: some, none: none, from: from }; var typeOf = function (x) { if (x === null) return 'null'; var t = typeof x; if (t === 'object' && Array.prototype.isPrototypeOf(x)) return 'array'; if (t === 'object' && String.prototype.isPrototypeOf(x)) return 'string'; return t; }; var isType = function (type) { return function (value) { return typeOf(value) === type; }; }; var isFunction = isType('function'); var exists = function (xs, pred) { return findIndex(xs, pred).isSome(); }; var map = function (xs, f) { var len = xs.length; var r = new Array(len); for (var i = 0; i < len; i++) { var x = xs[i]; r[i] = f(x, i, xs); } return r; }; var findIndex = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i, xs)) { return Option.some(i); } } return Option.none(); }; var slice = Array.prototype.slice; var from$1 = isFunction(Array.from) ? Array.from : function (x) { return slice.call(x); }; var contains = function (str, substr) { return str.indexOf(substr) !== -1; }; var emojiMatches = function (emoji, lowerCasePattern) { return contains(emoji.title.toLowerCase(), lowerCasePattern) || exists(emoji.keywords, function (k) { return contains(k.toLowerCase(), lowerCasePattern); }); }; var emojisFrom = function (list, pattern, maxResults) { var matches = []; var lowerCasePattern = pattern.toLowerCase(); var reachedLimit = maxResults.fold(function () { return never; }, function (max) { return function (size) { return size >= max; }; }); for (var i = 0; i < list.length; i++) { if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { matches.push({ value: list[i].char, text: list[i].title, icon: list[i].char }); if (reachedLimit(matches.length)) { break; } } } return matches; }; var init = function (editor, database) { editor.ui.registry.addAutocompleter('emoticons', { ch: ':', columns: 'auto', minChars: 2, fetch: function (pattern, maxResults) { return database.waitForLoad().then(function () { var candidates = database.listAll(); return emojisFrom(candidates, pattern, Option.some(maxResults)); }); }, onAction: function (autocompleteApi, rng, value) { editor.selection.setRng(rng); editor.insertContent(value); autocompleteApi.hide(); } }); }; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; var clone = function () { return Cell(get()); }; return { get: get, set: set, clone: clone }; }; var last = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { domGlobals.clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer !== null) domGlobals.clearTimeout(timer); timer = domGlobals.setTimeout(function () { fn.apply(null, args); timer = null; }, rate); }; return { cancel: cancel, throttle: throttle }; }; var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); var keys = Object.keys; var hasOwnProperty = Object.hasOwnProperty; var each = function (obj, f) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; f(x, i, obj); } }; var map$1 = function (obj, f) { return tupleMap(obj, function (x, i, obj) { return { k: i, v: f(x, i, obj) }; }); }; var tupleMap = function (obj, f) { var r = {}; each(obj, function (x, i) { var tuple = f(x, i, obj); r[tuple.k] = tuple.v; }); return r; }; var has = function (obj, key) { return hasOwnProperty.call(obj, key); }; var value = function (o) { var is = function (v) { return o === v; }; var or = function (opt) { return value(o); }; var orThunk = function (f) { return value(o); }; var map = function (f) { return value(f(o)); }; var mapError = function (f) { return value(o); }; var each = function (f) { f(o); }; var bind = function (f) { return f(o); }; var fold = function (_, onValue) { return onValue(o); }; var exists = function (f) { return f(o); }; var forall = function (f) { return f(o); }; var toOption = function () { return Option.some(o); }; return { is: is, isValue: always, isError: never, getOr: constant(o), getOrThunk: constant(o), getOrDie: constant(o), or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: each, bind: bind, exists: exists, forall: forall, toOption: toOption }; }; var error = function (message) { var getOrThunk = function (f) { return f(); }; var getOrDie = function () { return die(String(message))(); }; var or = function (opt) { return opt; }; var orThunk = function (f) { return f(); }; var map = function (f) { return error(message); }; var mapError = function (f) { return error(f(message)); }; var bind = function (f) { return error(message); }; var fold = function (onError, _) { return onError(message); }; return { is: never, isValue: never, isError: always, getOr: identity, getOrThunk: getOrThunk, getOrDie: getOrDie, or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: noop, bind: bind, exists: never, forall: always, toOption: Option.none }; }; var Result = { value: value, error: error }; var hasOwnProperty$1 = Object.prototype.hasOwnProperty; var shallow = function (old, nu) { return nu; }; var baseMerge = function (merger) { return function () { var objects = new Array(arguments.length); for (var i = 0; i < objects.length; i++) objects[i] = arguments[i]; if (objects.length === 0) throw new Error('Can\'t merge zero objects'); var ret = {}; for (var j = 0; j < objects.length; j++) { var curObject = objects[j]; for (var key in curObject) if (hasOwnProperty$1.call(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } } return ret; }; }; var merge = baseMerge(shallow); var global$1 = tinymce.util.Tools.resolve('tinymce.dom.ScriptLoader'); var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); var getEmoticonDatabaseUrl = function (editor, pluginUrl) { return editor.getParam('emoticons_database_url', pluginUrl + '/js/emojis' + editor.suffix + '.js'); }; var getAppendedEmoticons = function (editor) { return editor.getParam('emoticons_append', {}, 'object'); }; var Settings = { getEmoticonDatabaseUrl: getEmoticonDatabaseUrl, getAppendedEmoticons: getAppendedEmoticons }; var ALL_CATEGORY = 'All'; var categoryNameMap = { symbols: 'Symbols', people: 'People', animals_and_nature: 'Animals and Nature', food_and_drink: 'Food and Drink', activity: 'Activity', travel_and_places: 'Travel and Places', objects: 'Objects', flags: 'Flags', user: 'User Defined' }; var GLOBAL_NAME = 'emoticons_plugin_database'; var extractGlobal = function (url) { if (Global.tinymce[GLOBAL_NAME]) { var result = Result.value(Global.tinymce[GLOBAL_NAME]); delete Global.tinymce[GLOBAL_NAME]; return result; } else { return Result.error('URL ' + url + ' did not contain the expected format for emoticons'); } }; var translateCategory = function (categories, name) { return has(categories, name) ? categories[name] : name; }; var getUserDefinedEmoticons = function (editor) { var userDefinedEmoticons = Settings.getAppendedEmoticons(editor); return map$1(userDefinedEmoticons, function (value) { return merge({ keywords: [], category: 'user' }, value); }); }; var initDatabase = function (editor, databaseUrl) { var categories = Cell(Option.none()); var all = Cell(Option.none()); var processEmojis = function (emojis) { var cats = {}; var everything = []; each(emojis, function (lib, title) { var entry = { title: title, keywords: lib.keywords, char: lib.char, category: translateCategory(categoryNameMap, lib.category) }; var current = cats[entry.category] !== undefined ? cats[entry.category] : []; cats[entry.category] = current.concat([entry]); everything.push(entry); }); categories.set(Option.some(cats)); all.set(Option.some(everything)); }; editor.on('init', function () { global$1.ScriptLoader.loadScript(databaseUrl, function () { extractGlobal(databaseUrl).fold(function (err) { domGlobals.console.log(err); categories.set(Option.some({})); all.set(Option.some([])); }, function (emojis) { var userEmojis = getUserDefinedEmoticons(editor); processEmojis(merge(emojis, userEmojis)); }); }, function () { }); }); var listCategory = function (category) { if (category === ALL_CATEGORY) { return listAll(); } return categories.get().bind(function (cats) { return Option.from(cats[category]); }).getOr([]); }; var listAll = function () { return all.get().getOr([]); }; var listCategories = function () { return [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); }; var waitForLoad = function () { if (hasLoaded()) { return global$2.resolve(true); } else { return new global$2(function (resolve, reject) { var numRetries = 3; var interval = global$3.setInterval(function () { if (hasLoaded()) { global$3.clearInterval(interval); resolve(true); } else { numRetries--; if (numRetries < 0) { domGlobals.console.log('Could not load emojis from url: ' + databaseUrl); global$3.clearInterval(interval); reject(false); } } }, 500); }); } }; var hasLoaded = function () { return categories.get().isSome() && all.get().isSome(); }; return { listCategories: listCategories, hasLoaded: hasLoaded, waitForLoad: waitForLoad, listAll: listAll, listCategory: listCategory }; }; var insertEmoticon = function (editor, ch) { editor.insertContent(ch); }; var patternName = 'pattern'; var open = function (editor, database) { var initialState = { pattern: '', results: emojisFrom(database.listAll(), '', Option.some(300)) }; var scan = function (dialogApi, category) { var dialogData = dialogApi.getData(); var candidates = database.listCategory(category); var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Option.some(300) : Option.none()); dialogApi.setData({ results: results }); }; var updateFilter = last(function (dialogApi) { var category = currentTab.get(); scan(dialogApi, category); }, 200); var currentTab = Cell(ALL_CATEGORY); var searchField = { label: 'Search', type: 'input', name: patternName }; var resultsField = { type: 'collection', name: 'results' }; var getInitialState = function () { var body = { type: 'tabpanel', tabs: map(database.listCategories(), function (cat) { return { title: cat, items: [ searchField, resultsField ] }; }) }; return { title: 'Emoticons', size: 'normal', body: body, initialData: initialState, onTabChange: function (dialogApi, title) { currentTab.set(title); updateFilter.throttle(dialogApi); }, onChange: updateFilter.throttle, onAction: function (dialogApi, actionData) { if (actionData.name === 'results') { insertEmoticon(editor, actionData.value); dialogApi.close(); } }, buttons: [{ type: 'cancel', text: 'Close', primary: true }] }; }; var dialogApi = editor.windowManager.open(getInitialState()); dialogApi.focus(patternName); if (!database.hasLoaded()) { dialogApi.block('Loading emoticons...'); database.waitForLoad().then(function () { dialogApi.redial(getInitialState()); updateFilter.throttle(dialogApi); dialogApi.focus(patternName); dialogApi.unblock(); }).catch(function (err) { dialogApi.redial({ title: 'Emoticons', body: { type: 'panel', items: [{ type: 'alertbanner', level: 'error', icon: 'warning', text: '<p>Could not load emoticons</p>' }] }, buttons: [{ type: 'cancel', text: 'Close', primary: true }], initialData: { pattern: '', results: [] } }); dialogApi.focus(patternName); dialogApi.unblock(); }); } }; var Dialog = { open: open }; var register = function (editor, database) { var onAction = function () { return Dialog.open(editor, database); }; editor.ui.registry.addButton('emoticons', { tooltip: 'Emoticons', icon: 'emoji', onAction: onAction }); editor.ui.registry.addMenuItem('emoticons', { text: 'Emoticons...', icon: 'emoji', onAction: onAction }); }; var Buttons = { register: register }; global.add('emoticons', function (editor, pluginUrl) { var databaseUrl = Settings.getEmoticonDatabaseUrl(editor, pluginUrl); var database = initDatabase(editor, databaseUrl); Buttons.register(editor, database); init(editor, database); }); function Plugin () { } return Plugin; }(window)); })();