
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/**
* TinyMCE version 7.2.1 (2024-07-03)
*/
(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 onSetupEditable = editor => api => {
const nodeChanged = () => {
api.setEnabled(editor.selection.isEditable());
};
editor.on('NodeChange', nodeChanged);
nodeChanged();
return () => {
editor.off('NodeChange', nodeChanged);
};
};
const register = editor => {
const onAction = () => editor.execCommand('mceShowCharmap');
editor.ui.registry.addButton('charmap', {
icon: 'insert-character',
tooltip: 'Special character',
onAction,
onSetup: onSetupEditable(editor)
});
editor.ui.registry.addMenuItem('charmap', {
icon: 'insert-character',
text: 'Special character...',
onAction,
onSetup: onSetupEditable(editor)
});
};
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();
})();