UNPKG

@tinymce/tinymce-angular

Version:
75 lines 13.7 kB
/** * Copyright (c) 2017-present, Ephox, Inc. * * This source code is licensed under the Apache 2 license found in the * LICENSE file in the root directory of this source tree. * */ import { fromEvent, takeUntil } from 'rxjs'; import { validEvents } from '../editor/Events'; // Caretaker note: `fromEvent` supports passing JQuery-style event targets, the editor has `on` and `off` methods which // will be invoked upon subscription and teardown. const listenTinyMCEEvent = (editor, eventName, destroy$) => fromEvent(editor, eventName).pipe(takeUntil(destroy$)); const bindHandlers = (ctx, editor, destroy$) => { const allowedEvents = getValidEvents(ctx); allowedEvents.forEach((eventName) => { const eventEmitter = ctx[eventName]; listenTinyMCEEvent(editor, eventName.substring(2), destroy$).subscribe((event) => { // Caretaker note: `ngZone.run()` runs change detection since it notifies the forked Angular zone that it's // being re-entered. We don't want to run `ApplicationRef.tick()` if anyone listens to the specific event // within the template. E.g. if the `onSelectionChange` is not listened within the template like: // `<editor (onSelectionChange)="..."></editor>` // then it won't be "observed", and we won't run "dead" change detection. if (isObserved(eventEmitter)) { ctx.ngZone.run(() => eventEmitter.emit({ event, editor })); } }); }); }; const getValidEvents = (ctx) => { const ignoredEvents = parseStringProperty(ctx.ignoreEvents, []); const allowedEvents = parseStringProperty(ctx.allowedEvents, validEvents).filter((event) => validEvents.includes(event) && !ignoredEvents.includes(event)); return allowedEvents; }; const parseStringProperty = (property, defaultValue) => { if (typeof property === 'string') { return property.split(',').map((value) => value.trim()); } if (Array.isArray(property)) { return property; } return defaultValue; }; let unique = 0; const uuid = (prefix) => { const date = new Date(); const time = date.getTime(); const random = Math.floor(Math.random() * 1000000000); unique++; return prefix + '_' + random + unique + String(time); }; const isTextarea = (element) => typeof element !== 'undefined' && element.tagName.toLowerCase() === 'textarea'; const normalizePluginArray = (plugins) => { if (typeof plugins === 'undefined' || plugins === '') { return []; } return Array.isArray(plugins) ? plugins : plugins.split(' '); }; const mergePlugins = (initPlugins, inputPlugins) => normalizePluginArray(initPlugins).concat(normalizePluginArray(inputPlugins)); // eslint-disable-next-line @typescript-eslint/no-empty-function const noop = () => { }; const isNullOrUndefined = (value) => value === null || value === undefined; const isObserved = (o) => // RXJS is making the `observers` property internal in v8. So this is intended as a backwards compatible way of // checking if a subject has observers. o.observed || o.observers?.length > 0; const setMode = (editor, mode) => { if (typeof editor.mode?.set === 'function') { editor.mode.set(mode); } else if ('setMode' in editor && typeof editor.setMode === 'function') { editor.setMode(mode); } }; export { listenTinyMCEEvent, bindHandlers, uuid, isTextarea, normalizePluginArray, mergePlugins, noop, isNullOrUndefined, setMode }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90aW55bWNlLWFuZ3VsYXItY29tcG9uZW50L3NyYy9tYWluL3RzL3V0aWxzL1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sRUFBRSxTQUFTLEVBQVcsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXJELE9BQU8sRUFBRSxXQUFXLEVBQVUsTUFBTSxrQkFBa0IsQ0FBQztBQUd2RCx1SEFBdUg7QUFDdkgsa0RBQWtEO0FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsTUFBVyxFQUNYLFNBQWlCLEVBQ2pCLFFBQXVCLEVBQ3ZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBd0YsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFOUksTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFvQixFQUFFLE1BQVcsRUFBRSxRQUF1QixFQUFRLEVBQUU7SUFDeEYsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBc0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZELGtCQUFrQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9FLDJHQUEyRztZQUMzRyx5R0FBeUc7WUFDekcsaUdBQWlHO1lBQ2pHLGdEQUFnRDtZQUNoRCx5RUFBeUU7WUFDekUsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMs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QUUzRyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQW1CLEVBQVcsRUFBRTtBQUNsRCwrR0FBK0c7QUFDL0csdUNBQXVDO0FBQ3ZDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRXhDLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBYyxFQUFFLElBQTJCLEVBQUUsRUFBRTtJQUM5RCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztTQUFNLElBQUksU0FBUyxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDdkUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osSUFBSSxFQUNKLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsWUFBWSxFQUNaLElBQUksRUFDSixpQkFBaUIsRUFDakIsT0FBTyxFQUNSLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNy1wcmVzZW50LCBFcGhveCwgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKlxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEhhc0V2ZW50VGFyZ2V0QWRkUmVtb3ZlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21FdmVudCc7XG5cbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci9lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IHZhbGlkRXZlbnRzLCBFdmVudHMgfSBmcm9tICcuLi9lZGl0b3IvRXZlbnRzJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ3RpbnltY2UnO1xuXG4vLyBDYXJldGFrZXIgbm90ZTogYGZyb21FdmVudGAgc3VwcG9ydHMgcGFzc2luZyBKUXVlcnktc3R5bGUgZXZlbnQgdGFyZ2V0cywgdGhlIGVkaXRvciBoYXMgYG9uYCBhbmQgYG9mZmAgbWV0aG9kcyB3aGljaFxuLy8gd2lsbCBiZSBpbnZva2VkIHVwb24gc3Vic2NyaXB0aW9uIGFuZCB0ZWFyZG93bi5cbmNvbnN0IGxpc3RlblRpbnlNQ0VFdmVudCA9IChcbiAgZWRpdG9yOiBhbnksXG4gIGV2ZW50TmFtZTogc3RyaW5nLFxuICBkZXN0cm95JDogU3ViamVjdDx2b2lkPlxuKSA9PiBmcm9tRXZlbnQoZWRpdG9yIGFzIEhhc0V2ZW50VGFyZ2V0QWRkUmVtb3ZlPHVua25vd24+IHwgQXJyYXlMaWtlPEhhc0V2ZW50VGFyZ2V0QWRkUmVtb3ZlPHVua25vd24+PiwgZXZlbnROYW1lKS5waXBlKHRha2VVbnRpbChkZXN0cm95JCkpO1xuXG5jb25zdCBiaW5kSGFuZGxlcnMgPSAoY3R4OiBFZGl0b3JDb21wb25lbnQsIGVkaXRvcjogYW55LCBkZXN0cm95JDogU3ViamVjdDx2b2lkPik6IHZvaWQgPT4ge1xuICBjb25zdCBhbGxvd2VkRXZlbnRzID0gZ2V0VmFsaWRFdmVudHMoY3R4KTtcbiAgYWxsb3dlZEV2ZW50cy5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICBjb25zdCBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gY3R4W2V2ZW50TmFtZV07XG5cbiAgICBsaXN0ZW5UaW55TUNFRXZlbnQoZWRpdG9yLCBldmVudE5hbWUuc3Vic3RyaW5nKDIpLCBkZXN0cm95JCkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gQ2FyZXRha2VyIG5vdGU6IGBuZ1pvbmUucnVuKClgIHJ1bnMgY2hhbmdlIGRldGVjdGlvbiBzaW5jZSBpdCBub3RpZmllcyB0aGUgZm9ya2VkIEFuZ3VsYXIgem9uZSB0aGF0IGl0J3NcbiAgICAgIC8vIGJlaW5nIHJlLWVudGVyZWQuIFdlIGRvbid0IHdhbnQgdG8gcnVuIGBBcHBsaWNhdGlvblJlZi50aWNrKClgIGlmIGFueW9uZSBsaXN0ZW5zIHRvIHRoZSBzcGVjaWZpYyBldmVudFxuICAgICAgLy8gd2l0aGluIHRoZSB0ZW1wbGF0ZS4gRS5nLiBpZiB0aGUgYG9uU2VsZWN0aW9uQ2hhbmdlYCBpcyBub3QgbGlzdGVuZWQgd2l0aGluIHRoZSB0ZW1wbGF0ZSBsaWtlOlxuICAgICAgLy8gYDxlZGl0b3IgKG9uU2VsZWN0aW9uQ2hhbmdlKT1cIi4uLlwiPjwvZWRpdG9yPmBcbiAgICAgIC8vIHRoZW4gaXQgd29uJ3QgYmUgXCJvYnNlcnZlZFwiLCBhbmQgd2Ugd29uJ3QgcnVuIFwiZGVhZFwiIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICBpZiAoaXNPYnNlcnZlZChldmVudEVtaXR0ZXIpKSB7XG4gICAgICAgIGN0eC5uZ1pvbmUucnVuKCgpID0+IGV2ZW50RW1pdHRlci5lbWl0KHsgZXZlbnQsIGVkaXRvciB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0VmFsaWRFdmVudHMgPSAoY3R4OiBFZGl0b3JDb21wb25lbnQpOiAoa2V5b2YgRXZlbnRzKVtdID0+IHtcbiAgY29uc3QgaWdub3JlZEV2ZW50cyA9IHBhcnNlU3RyaW5nUHJvcGVydHkoY3R4Lmlnbm9yZUV2ZW50cywgW10pO1xuICBjb25zdCBhbGxvd2VkRXZlbnRzID0gcGFyc2VTdHJpbmdQcm9wZXJ0eShjdHguYWxsb3dlZEV2ZW50cywgdmFsaWRFdmVudHMpLmZpbHRlcihcbiAgICAoZXZlbnQpID0+IHZhbGlkRXZlbnRzLmluY2x1ZGVzKGV2ZW50IGFzIChrZXlvZiBFdmVudHMpKSAmJiAhaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhldmVudCkpIGFzIChrZXlvZiBFdmVudHMpW107XG4gIHJldHVybiBhbGxvd2VkRXZlbnRzO1xufTtcblxuY29uc3QgcGFyc2VTdHJpbmdQcm9wZXJ0eSA9IChwcm9wZXJ0eTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogKGtleW9mIEV2ZW50cylbXSk6IHN0cmluZ1tdID0+IHtcbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcHJvcGVydHkuc3BsaXQoJywnKS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS50cmltKCkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5KSkge1xuICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdFZhbHVlO1xufTtcblxubGV0IHVuaXF1ZSA9IDA7XG5cbmNvbnN0IHV1aWQgPSAocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgdGltZSA9IGRhdGUuZ2V0VGltZSgpO1xuICBjb25zdCByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwKTtcblxuICB1bmlxdWUrKztcblxuICByZXR1cm4gcHJlZml4ICsgJ18nICsgcmFuZG9tICsgdW5pcXVlICsgU3RyaW5nKHRpbWUpO1xufTtcblxuY29uc3QgaXNUZXh0YXJlYSA9IChlbGVtZW50PzogRWxlbWVudCk6IGVsZW1lbnQgaXMgSFRNTFRleHRBcmVhRWxlbWVudCA9PiB0eXBlb2YgZWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZXh0YXJlYSc7XG5cbmNvbnN0IG5vcm1hbGl6ZVBsdWdpbkFycmF5ID0gKHBsdWdpbnM/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdID0+IHtcbiAgaWYgKHR5cGVvZiBwbHVnaW5zID09PSAndW5kZWZpbmVkJyB8fCBwbHVnaW5zID09PSAnJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBsdWdpbnMpID8gcGx1Z2lucyA6IHBsdWdpbnMuc3BsaXQoJyAnKTtcbn07XG5cbmNvbnN0IG1lcmdlUGx1Z2lucyA9IChpbml0UGx1Z2luczogc3RyaW5nIHwgc3RyaW5nW10sIGlucHV0UGx1Z2lucz86IHN0cmluZyB8IHN0cmluZ1tdKSA9PlxuICBub3JtYWxpemVQbHVnaW5BcnJheShpbml0UGx1Z2lucykuY29uY2F0KG5vcm1hbGl6ZVBsdWdpbkFycmF5KGlucHV0UGx1Z2lucykpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5jb25zdCBub29wOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbmNvbnN0IGlzTnVsbE9yVW5kZWZpbmVkID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkID0+IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbmNvbnN0IGlzT2JzZXJ2ZWQgPSAobzogU3ViamVjdDx1bmtub3duPik6IGJvb2xlYW4gPT5cbiAgLy8gUlhKUyBpcyBtYWtpbmcgdGhlIGBvYnNlcnZlcnNgIHByb3BlcnR5IGludGVybmFsIGluIHY4LiBTbyB0aGlzIGlzIGludGVuZGVkIGFzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5IG9mXG4gIC8vIGNoZWNraW5nIGlmIGEgc3ViamVjdCBoYXMgb2JzZXJ2ZXJzLlxuICBvLm9ic2VydmVkIHx8IG8ub2JzZXJ2ZXJzPy5sZW5ndGggPiAwO1xuXG5jb25zdCBzZXRNb2RlID0gKGVkaXRvcjogRWRpdG9yLCBtb2RlOiAncmVhZG9ubHknIHwgJ2Rlc2lnbicpID0+IHtcbiAgaWYgKHR5cGVvZiBlZGl0b3IubW9kZT8uc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZWRpdG9yLm1vZGUuc2V0KG1vZGUpO1xuICB9IGVsc2UgaWYgKCdzZXRNb2RlJyBpbiBlZGl0b3IgJiYgdHlwZW9mIGVkaXRvci5zZXRNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZWRpdG9yLnNldE1vZGUobW9kZSk7XG4gIH1cbn07XG5cbmV4cG9ydCB7XG4gIGxpc3RlblRpbnlNQ0VFdmVudCxcbiAgYmluZEhhbmRsZXJzLFxuICB1dWlkLFxuICBpc1RleHRhcmVhLFxuICBub3JtYWxpemVQbHVnaW5BcnJheSxcbiAgbWVyZ2VQbHVnaW5zLFxuICBub29wLFxuICBpc051bGxPclVuZGVmaW5lZCxcbiAgc2V0TW9kZVxufTtcbiJdfQ==