/** * TinyMCE version 6.4.1 (2023-03-29) */ (function () { 'use strict'; var global$1 = tinymce.util.Tools.resolve('tinymce.PluginManager'); const fireInsertCustomChar = (editor, chr) => { return editor.dispatch('insertCustomChar', { chr }); }; const insertChar = (editor, chr) => { const evtChr = fireInsertCustomChar(editor, chr).chr; editor.execCommand('mceInsertContent', false, evtChr); }; const hasProto = (v, constructor, predicate) => { var _a; if (predicate(v, constructor.prototype)) { return true; } else { return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name; } }; const typeOf = x => { const t = typeof x; if (x === null) { return 'null'; } else if (t === 'object' && Array.isArray(x)) { return 'array'; } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) { return 'string'; } else { return t; } }; const isType = type => value => typeOf(value) === type; const isSimpleType = type => value => typeof value === type; const eq = t => a => t === a; const isArray$1 = isType('array'); const isNull = eq(null); const isUndefined = eq(undefined); const isNullable = a => a === null || a === undefined; const isNonNullable = a => !isNullable(a); const isFunction = isSimpleType('function'); const constant = value => { return () => { return value; }; }; const never = constant(false); class Optional { constructor(tag, value) { this.tag = tag; this.value = value; } static some(value) { return new Optional(true, value); } static none() { return Optional.singletonNone; } fold(onNone, onSome) { if (this.tag) { return onSome(this.value); } else { return onNone(); } } isSome() { return this.tag; } isNone() { return !this.tag; } map(mapper) { if (this.tag) { return Optional.some(mapper(this.value)); } else { return Optional.none(); } } bind(binder) { if (this.tag) { return binder(this.value); } else { return Optional.none(); } } exists(predicate) { return this.tag && predicate(this.value); } forall(predicate) { return !this.tag || predicate(this.value); } filter(predicate) { if (!this.tag || predicate(this.value)) { return this; } else { return Optional.none(); } } getOr(replacement) { return this.tag ? this.value : replacement; } or(replacement) { return this.tag ? this : replacement; } getOrThunk(thunk) { return this.tag ? this.value : thunk(); } orThunk(thunk) { return this.tag ? this : thunk(); } getOrDie(message) { if (!this.tag) { throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None'); } else { return this.value; } } static from(value) { return isNonNullable(value) ? Optional.some(value) : Optional.none(); } getOrNull() { return this.tag ? this.value : null; } getOrUndefined() { return this.value; } each(worker) { if (this.tag) { worker(this.value); } } toArray() { return this.tag ? [this.value] : []; } toString() { return this.tag ? `some(${ this.value })` : 'none()'; } } Optional.singletonNone = new Optional(false); const nativePush = Array.prototype.push; const map = (xs, f) => { const len = xs.length; const r = new Array(len); for (let i = 0; i < len; i++) { const x = xs[i]; r[i] = f(x, i); } return r; }; const each = (xs, f) => { for (let i = 0, len = xs.length; i < len; i++) { const x = xs[i]; f(x, i); } }; const findUntil = (xs, pred, until) => { for (let i = 0, len = xs.length; i < len; i++) { const x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { break; } } return Optional.none(); }; const find = (xs, pred) => { return findUntil(xs, pred, never); }; const flatten = xs => { const r = []; for (let i = 0, len = xs.length; i < len; ++i) { if (!isArray$1(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } nativePush.apply(r, xs[i]); } return r; }; const bind = (xs, f) => flatten(map(xs, f)); var global = tinymce.util.Tools.resolve('tinymce.util.Tools'); const option = name => editor => editor.options.get(name); const register$2 = editor => { const registerOption = editor.options.register; const charMapProcessor = value => isFunction(value) || isArray$1(value); registerOption('charmap', { processor: charMapProcessor }); registerOption('charmap_append', { processor: charMapProcessor }); }; const getCharMap$1 = option('charmap'); const getCharMapAppend = option('charmap_append'); const isArray = global.isArray; const UserDefined = 'User Defined'; const getDefaultCharMap = () => { return [ { name: 'Currency', characters: [ [ 36, 'dollar sign' ], [ 162, 'cent sign' ], [ 8364, 'euro sign' ], [ 163, 'pound sign' ], [ 165, 'yen sign' ], [ 164, 'currency sign' ], [ 8352, 'euro-currency sign' ], [ 8353, 'colon sign' ], [ 8354, 'cruzeiro sign' ], [ 8355, 'french franc sign' ], [ 8356, 'lira sign' ], [ 8357, 'mill sign' ], [ 8358, 'naira sign' ], [ 8359, 'peseta sign' ], [ 8360, 'rupee sign' ], [ 8361, 'won sign' ], [ 8362, 'new sheqel sign' ], [ 8363, 'dong sign' ], [ 8365, 'kip sign' ], [ 8366, 'tugrik sign' ], [ 8367, 'drachma sign' ], [ 8368, 'german penny symbol' ], [ 8369, 'peso sign' ], [ 8370, 'guarani sign' ], [ 8371, 'austral sign' ], [ 8372, 'hryvnia sign' ], [ 8373, 'cedi sign' ], [ 8374, 'livre tournois sign' ], [ 8375, 'spesmilo sign' ], [ 8376, 'tenge sign' ], [ 8377, 'indian rupee sign' ], [ 8378, 'turkish lira sign' ], [ 8379, 'nordic mark sign' ], [ 8380, 'manat sign' ], [ 8381, 'ruble sign' ], [ 20870, 'yen character' ], [ 20803, 'yuan character' ], [ 22291, 'yuan character, in hong kong and taiwan' ], [ 22278, 'yen/yuan character variant one' ] ] }, { name: 'Text', characters: [ [ 169, 'copyright sign' ], [ 174, 'registered sign' ], [ 8482, 'trade mark sign' ], [ 8240, 'per mille sign' ], [ 181, 'micro sign' ], [ 183, 'middle dot' ], [ 8226, 'bullet' ], [ 8230, 'three dot leader' ], [ 8242, 'minutes / feet' ], [ 8243, 'seconds / inches' ], [ 167, 'section sign' ], [ 182, 'paragraph sign' ], [ 223, 'sharp s / ess-zed' ] ] }, { name: 'Quotations', characters: [ [ 8249, 'single left-pointing angle quotation mark' ], [ 8250, 'single right-pointing angle quotation mark' ], [ 171, 'left pointing guillemet' ], [ 187, 'right pointing guillemet' ], [ 8216, 'left single quotation mark' ], [ 8217, 'right single quotation mark' ], [ 8220, 'left double quotation mark' ], [ 8221, 'right double quotation mark' ], [ 8218, 'single low-9 quotation mark' ], [ 8222, 'double low-9 quotation mark' ], [ 60, 'less-than sign' ], [ 62, 'greater-than sign' ], [ 8804, 'less-than or equal to' ], [ 8805, 'greater-than or equal to' ], [ 8211, 'en dash' ], [ 8212, 'em dash' ], [ 175, 'macron' ], [ 8254, 'overline' ], [ 164, 'currency sign' ], [ 166, 'broken bar' ], [ 168, 'diaeresis' ], [ 161, 'inverted exclamation mark' ], [ 191, 'turned question mark' ], [ 710, 'circumflex accent' ], [ 732, 'small tilde' ], [ 176, 'degree sign' ], [ 8722, 'minus sign' ], [ 177, 'plus-minus sign' ], [ 247, 'division sign' ], [ 8260, 'fraction slash' ], [ 215, 'multiplication sign' ], [ 185, 'superscript one' ], [ 178, 'superscript two' ], [ 179, 'superscript three' ], [ 188, 'fraction one quarter' ], [ 189, 'fraction one half' ], [ 190, 'fraction three quarters' ] ] }, { name: 'Mathematical', characters: [ [ 402, 'function / florin' ], [ 8747, 'integral' ], [ 8721, 'n-ary sumation' ], [ 8734, 'infinity' ], [ 8730, 'square root' ], [ 8764, 'similar to' ], [ 8773, 'approximately equal to' ], [ 8776, 'almost equal to' ], [ 8800, 'not equal to' ], [ 8801, 'identical to' ], [ 8712, 'element of' ], [ 8713, 'not an element of' ], [ 8715, 'contains as member' ], [ 8719, 'n-ary product' ], [ 8743, 'logical and' ], [ 8744, 'logical or' ], [ 172, 'not sign' ], [ 8745, 'intersection' ], [ 8746, 'union' ], [ 8706, 'partial differential' ], [ 8704, 'for all' ], [ 8707, 'there exists' ], [ 8709, 'diameter' ], [ 8711, 'backward difference' ], [ 8727, 'asterisk operator' ], [ 8733, 'proportional to' ], [ 8736, 'angle' ] ] }, { name: 'Extended Latin', characters: [ [ 192, 'A - grave' ], [ 193, 'A - acute' ], [ 194, 'A - circumflex' ], [ 195, 'A - tilde' ], [ 196, 'A - diaeresis' ], [ 197, 'A - ring above' ], [ 256, 'A - macron' ], [ 198, 'ligature AE' ], [ 199, 'C - cedilla' ], [ 200, 'E - grave' ], [ 201, 'E - acute' ], [ 202, 'E - circumflex' ], [ 203, 'E - diaeresis' ], [ 274, 'E - macron' ], [ 204, 'I - grave' ], [ 205, 'I - acute' ], [ 206, 'I - circumflex' ], [ 207, 'I - diaeresis' ], [ 298, 'I - macron' ], [ 208, 'ETH' ], [ 209, 'N - tilde' ], [ 210, 'O - grave' ], [ 211, 'O - acute' ], [ 212, 'O - circumflex' ], [ 213, 'O - tilde' ], [ 214, 'O - diaeresis' ], [ 216, 'O - slash' ], [ 332, 'O - macron' ], [ 338, 'ligature OE' ], [ 352, 'S - caron' ], [ 217, 'U - grave' ], [ 218, 'U - acute' ], [ 219, 'U - circumflex' ], [ 220, 'U - diaeresis' ], [ 362, 'U - macron' ], [ 221, 'Y - acute' ], [ 376, 'Y - diaeresis' ], [ 562, 'Y - macron' ], [ 222, 'THORN' ], [ 224, 'a - grave' ], [ 225, 'a - acute' ], [ 226, 'a - circumflex' ], [ 227, 'a - tilde' ], [ 228, 'a - diaeresis' ], [ 229, 'a - ring above' ], [ 257, 'a - macron' ], [ 230, 'ligature ae' ], [ 231, 'c - cedilla' ], [ 232, 'e - grave' ], [ 233, 'e - acute' ], [ 234, 'e - circumflex' ], [ 235, 'e - diaeresis' ], [ 275, 'e - macron' ], [ 236, 'i - grave' ], [ 237, 'i - acute' ], [ 238, 'i - circumflex' ], [ 239, 'i - diaeresis' ], [ 299, 'i - macron' ], [ 240, 'eth' ], [ 241, 'n - tilde' ], [ 242, 'o - grave' ], [ 243, 'o - acute' ], [ 244, 'o - circumflex' ], [ 245, 'o - tilde' ], [ 246, 'o - diaeresis' ], [ 248, 'o slash' ], [ 333, 'o macron' ], [ 339, 'ligature oe' ], [ 353, 's - caron' ], [ 249, 'u - grave' ], [ 250, 'u - acute' ], [ 251, 'u - circumflex' ], [ 252, 'u - diaeresis' ], [ 363, 'u - macron' ], [ 253, 'y - acute' ], [ 254, 'thorn' ], [ 255, 'y - diaeresis' ], [ 563, 'y - macron' ], [ 913, 'Alpha' ], [ 914, 'Beta' ], [ 915, 'Gamma' ], [ 916, 'Delta' ], [ 917, 'Epsilon' ], [ 918, 'Zeta' ], [ 919, 'Eta' ], [ 920, 'Theta' ], [ 921, 'Iota' ], [ 922, 'Kappa' ], [ 923, 'Lambda' ], [ 924, 'Mu' ], [ 925, 'Nu' ], [ 926, 'Xi' ], [ 927, 'Omicron' ], [ 928, 'Pi' ], [ 929, 'Rho' ], [ 931, 'Sigma' ], [ 932, 'Tau' ], [ 933, 'Upsilon' ], [ 934, 'Phi' ], [ 935, 'Chi' ], [ 936, 'Psi' ], [ 937, 'Omega' ], [ 945, 'alpha' ], [ 946, 'beta' ], [ 947, 'gamma' ], [ 948, 'delta' ], [ 949, 'epsilon' ], [ 950, 'zeta' ], [ 951, 'eta' ], [ 952, 'theta' ], [ 953, 'iota' ], [ 954, 'kappa' ], [ 955, 'lambda' ], [ 956, 'mu' ], [ 957, 'nu' ], [ 958, 'xi' ], [ 959, 'omicron' ], [ 960, 'pi' ], [ 961, 'rho' ], [ 962, 'final sigma' ], [ 963, 'sigma' ], [ 964, 'tau' ], [ 965, 'upsilon' ], [ 966, 'phi' ], [ 967, 'chi' ], [ 968, 'psi' ], [ 969, 'omega' ] ] }, { name: 'Symbols', characters: [ [ 8501, 'alef symbol' ], [ 982, 'pi symbol' ], [ 8476, 'real part symbol' ], [ 978, 'upsilon - hook symbol' ], [ 8472, 'Weierstrass p' ], [ 8465, 'imaginary part' ] ] }, { name: 'Arrows', characters: [ [ 8592, 'leftwards arrow' ], [ 8593, 'upwards arrow' ], [ 8594, 'rightwards arrow' ], [ 8595, 'downwards arrow' ], [ 8596, 'left right arrow' ], [ 8629, 'carriage return' ], [ 8656, 'leftwards double arrow' ], [ 8657, 'upwards double arrow' ], [ 8658, 'rightwards double arrow' ], [ 8659, 'downwards double arrow' ], [ 8660, 'left right double arrow' ], [ 8756, 'therefore' ], [ 8834, 'subset of' ], [ 8835, 'superset of' ], [ 8836, 'not a subset of' ], [ 8838, 'subset of or equal to' ], [ 8839, 'superset of or equal to' ], [ 8853, 'circled plus' ], [ 8855, 'circled times' ], [ 8869, 'perpendicular' ], [ 8901, 'dot operator' ], [ 8968, 'left ceiling' ], [ 8969, 'right ceiling' ], [ 8970, 'left floor' ], [ 8971, 'right floor' ], [ 9001, 'left-pointing angle bracket' ], [ 9002, 'right-pointing angle bracket' ], [ 9674, 'lozenge' ], [ 9824, 'black spade suit' ], [ 9827, 'black club suit' ], [ 9829, 'black heart suit' ], [ 9830, 'black diamond suit' ], [ 8194, 'en space' ], [ 8195, 'em space' ], [ 8201, 'thin space' ], [ 8204, 'zero width non-joiner' ], [ 8205, 'zero width joiner' ], [ 8206, 'left-to-right mark' ], [ 8207, 'right-to-left mark' ] ] } ]; }; const charmapFilter = charmap => { return global.grep(charmap, item => { return isArray(item) && item.length === 2; }); }; const getCharsFromOption = optionValue => { if (isArray(optionValue)) { return charmapFilter(optionValue); } if (typeof optionValue === 'function') { return optionValue(); } return []; }; const extendCharMap = (editor, charmap) => { const userCharMap = getCharMap$1(editor); if (userCharMap) { charmap = [{ name: UserDefined, characters: getCharsFromOption(userCharMap) }]; } const userCharMapAppend = getCharMapAppend(editor); if (userCharMapAppend) { const userDefinedGroup = global.grep(charmap, cg => cg.name === UserDefined); if (userDefinedGroup.length) { userDefinedGroup[0].characters = [ ...userDefinedGroup[0].characters, ...getCharsFromOption(userCharMapAppend) ]; return charmap; } return charmap.concat({ name: UserDefined, characters: getCharsFromOption(userCharMapAppend) }); } return charmap; }; const getCharMap = editor => { const groups = extendCharMap(editor, getDefaultCharMap()); return groups.length > 1 ? [{ name: 'All', characters: bind(groups, g => g.characters) }].concat(groups) : groups; }; const get = editor => { const getCharMap$1 = () => { return getCharMap(editor); }; const insertChar$1 = chr => { insertChar(editor, chr); }; return { getCharMap: getCharMap$1, insertChar: insertChar$1 }; }; const Cell = initial => { let value = initial; const get = () => { return value; }; const set = v => { value = v; }; return { get, set }; }; const last = (fn, rate) => { let timer = null; const cancel = () => { if (!isNull(timer)) { clearTimeout(timer); timer = null; } }; const throttle = (...args) => { cancel(); timer = setTimeout(() => { timer = null; fn.apply(null, args); }, rate); }; return { cancel, throttle }; }; const contains = (str, substr, start = 0, end) => { const idx = str.indexOf(substr, start); if (idx !== -1) { return isUndefined(end) ? true : idx + substr.length <= end; } else { return false; } }; const fromCodePoint = String.fromCodePoint; const charMatches = (charCode, name, lowerCasePattern) => { if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) { return true; } else { return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); } }; const scan = (group, pattern) => { const matches = []; const lowerCasePattern = pattern.toLowerCase(); each(group.characters, g => { if (charMatches(g[0], g[1], lowerCasePattern)) { matches.push(g); } }); return map(matches, m => ({ text: m[1], value: fromCodePoint(m[0]), icon: fromCodePoint(m[0]) })); }; const patternName = 'pattern'; const open = (editor, charMap) => { const makeGroupItems = () => [ { label: 'Search', type: 'input', name: patternName }, { type: 'collection', name: 'results' } ]; const makeTabs = () => map(charMap, charGroup => ({ title: charGroup.name, name: charGroup.name, items: makeGroupItems() })); const makePanel = () => ({ type: 'panel', items: makeGroupItems() }); const makeTabPanel = () => ({ type: 'tabpanel', tabs: makeTabs() }); const currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); const scanAndSet = (dialogApi, pattern) => { find(charMap, group => group.name === currentTab.get()).each(f => { const items = scan(f, pattern); dialogApi.setData({ results: items }); }); }; const SEARCH_DELAY = 40; const updateFilter = last(dialogApi => { const pattern = dialogApi.getData().pattern; scanAndSet(dialogApi, pattern); }, SEARCH_DELAY); const body = charMap.length === 1 ? makePanel() : makeTabPanel(); const initialData = { pattern: '', results: scan(charMap[0], '') }; const bridgeSpec = { title: 'Special Character', size: 'normal', body, buttons: [{ type: 'cancel', name: 'close', text: 'Close', primary: true }], initialData, onAction: (api, details) => { if (details.name === 'results') { insertChar(editor, details.value); api.close(); } }, onTabChange: (dialogApi, details) => { currentTab.set(details.newTabName); updateFilter.throttle(dialogApi); }, onChange: (dialogApi, changeData) => { if (changeData.name === patternName) { updateFilter.throttle(dialogApi); } } }; const dialogApi = editor.windowManager.open(bridgeSpec); dialogApi.focus(patternName); }; const register$1 = (editor, charMap) => { editor.addCommand('mceShowCharmap', () => { open(editor, charMap); }); }; const init = (editor, all) => { editor.ui.registry.addAutocompleter('charmap', { trigger: ':', columns: 'auto', minChars: 2, fetch: (pattern, _maxResults) => new Promise((resolve, _reject) => { resolve(scan(all, pattern)); }), onAction: (autocompleteApi, rng, value) => { editor.selection.setRng(rng); editor.insertContent(value); autocompleteApi.hide(); } }); }; const register = editor => { const onAction = () => editor.execCommand('mceShowCharmap'); editor.ui.registry.addButton('charmap', { icon: 'insert-character', tooltip: 'Special character', onAction }); editor.ui.registry.addMenuItem('charmap', { icon: 'insert-character', text: 'Special character...', onAction }); }; var Plugin = () => { global$1.add('charmap', editor => { register$2(editor); const charMap = getCharMap(editor); register$1(editor, charMap); register(editor); init(editor, charMap[0]); return get(editor); }); }; Plugin(); })();