@skyux/text-editor 5.7.2 → 6.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/documentation.json +2 -2
- package/esm2020/index.mjs +15 -0
- package/esm2020/lib/modules/rich-text-display/rich-text-display.component.mjs +36 -0
- package/esm2020/lib/modules/rich-text-display/rich-text-display.module.mjs +18 -0
- package/esm2020/lib/modules/shared/forms-utility.mjs +10 -0
- package/esm2020/lib/modules/shared/sky-text-editor-resources.module.mjs +106 -0
- package/esm2020/lib/modules/text-editor/defaults/font-list-defaults.mjs +42 -0
- package/esm2020/lib/modules/text-editor/defaults/font-size-list-defaults.mjs +7 -0
- package/esm2020/lib/modules/text-editor/defaults/menu-defaults.mjs +5 -0
- package/esm2020/lib/modules/text-editor/defaults/style-state-defaults.mjs +15 -0
- package/esm2020/lib/modules/text-editor/defaults/toolbar-action-defaults.mjs +12 -0
- package/esm2020/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +191 -0
- package/esm2020/lib/modules/text-editor/services/text-editor-adapter.service.mjs +477 -0
- package/esm2020/lib/modules/text-editor/services/text-editor-selection.service.mjs +80 -0
- package/esm2020/lib/modules/text-editor/services/text-editor.service.mjs +61 -0
- package/esm2020/lib/modules/text-editor/services/text-sanitization.service.mjs +38 -0
- package/esm2020/lib/modules/text-editor/text-editor.component.mjs +322 -0
- package/esm2020/lib/modules/text-editor/text-editor.module.mjs +98 -0
- package/esm2020/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +179 -0
- package/esm2020/lib/modules/text-editor/types/editor-command.mjs +2 -0
- package/esm2020/lib/modules/text-editor/types/editor-setting.mjs +2 -0
- package/esm2020/lib/modules/text-editor/types/font-state.mjs +2 -0
- package/esm2020/lib/modules/text-editor/types/menu-type.mjs +2 -0
- package/esm2020/lib/modules/text-editor/types/style-state.mjs +2 -0
- package/esm2020/lib/modules/text-editor/types/text-editor-merge-field.mjs +2 -0
- package/esm2020/lib/modules/text-editor/types/toolbar-action-type.mjs +2 -0
- package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal-context.mjs +6 -0
- package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal-result.mjs +2 -0
- package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +117 -0
- package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-target.mjs +9 -0
- package/esm2020/skyux-text-editor.mjs +5 -0
- package/fesm2015/{skyux-text-editor.js → skyux-text-editor.mjs} +45 -69
- package/fesm2015/skyux-text-editor.mjs.map +1 -0
- package/fesm2020/skyux-text-editor.mjs +1743 -0
- package/fesm2020/skyux-text-editor.mjs.map +1 -0
- package/package.json +38 -22
- package/bundles/skyux-text-editor.umd.js +0 -2195
- package/esm2015/index.js +0 -15
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/rich-text-display/rich-text-display.component.js +0 -39
- package/esm2015/lib/modules/rich-text-display/rich-text-display.component.js.map +0 -1
- package/esm2015/lib/modules/rich-text-display/rich-text-display.module.js +0 -18
- package/esm2015/lib/modules/rich-text-display/rich-text-display.module.js.map +0 -1
- package/esm2015/lib/modules/shared/forms-utility.js +0 -10
- package/esm2015/lib/modules/shared/forms-utility.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-text-editor-resources.module.js +0 -106
- package/esm2015/lib/modules/shared/sky-text-editor-resources.module.js.map +0 -1
- package/esm2015/lib/modules/text-editor/defaults/font-list-defaults.js +0 -42
- package/esm2015/lib/modules/text-editor/defaults/font-list-defaults.js.map +0 -1
- package/esm2015/lib/modules/text-editor/defaults/font-size-list-defaults.js +0 -7
- package/esm2015/lib/modules/text-editor/defaults/font-size-list-defaults.js.map +0 -1
- package/esm2015/lib/modules/text-editor/defaults/menu-defaults.js +0 -5
- package/esm2015/lib/modules/text-editor/defaults/menu-defaults.js.map +0 -1
- package/esm2015/lib/modules/text-editor/defaults/style-state-defaults.js +0 -15
- package/esm2015/lib/modules/text-editor/defaults/style-state-defaults.js.map +0 -1
- package/esm2015/lib/modules/text-editor/defaults/toolbar-action-defaults.js +0 -12
- package/esm2015/lib/modules/text-editor/defaults/toolbar-action-defaults.js.map +0 -1
- package/esm2015/lib/modules/text-editor/menubar/text-editor-menubar.component.js +0 -196
- package/esm2015/lib/modules/text-editor/menubar/text-editor-menubar.component.js.map +0 -1
- package/esm2015/lib/modules/text-editor/services/text-editor-adapter.service.js +0 -474
- package/esm2015/lib/modules/text-editor/services/text-editor-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/text-editor/services/text-editor-selection.service.js +0 -80
- package/esm2015/lib/modules/text-editor/services/text-editor-selection.service.js.map +0 -1
- package/esm2015/lib/modules/text-editor/services/text-editor.service.js +0 -61
- package/esm2015/lib/modules/text-editor/services/text-editor.service.js.map +0 -1
- package/esm2015/lib/modules/text-editor/services/text-sanitization.service.js +0 -38
- package/esm2015/lib/modules/text-editor/services/text-sanitization.service.js.map +0 -1
- package/esm2015/lib/modules/text-editor/text-editor.component.js +0 -322
- package/esm2015/lib/modules/text-editor/text-editor.component.js.map +0 -1
- package/esm2015/lib/modules/text-editor/text-editor.module.js +0 -99
- package/esm2015/lib/modules/text-editor/text-editor.module.js.map +0 -1
- package/esm2015/lib/modules/text-editor/toolbar/text-editor-toolbar.component.js +0 -175
- package/esm2015/lib/modules/text-editor/toolbar/text-editor-toolbar.component.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/editor-command.js +0 -2
- package/esm2015/lib/modules/text-editor/types/editor-command.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/editor-setting.js +0 -2
- package/esm2015/lib/modules/text-editor/types/editor-setting.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/font-state.js +0 -2
- package/esm2015/lib/modules/text-editor/types/font-state.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/menu-type.js +0 -2
- package/esm2015/lib/modules/text-editor/types/menu-type.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/style-state.js +0 -2
- package/esm2015/lib/modules/text-editor/types/style-state.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/text-editor-merge-field.js +0 -2
- package/esm2015/lib/modules/text-editor/types/text-editor-merge-field.js.map +0 -1
- package/esm2015/lib/modules/text-editor/types/toolbar-action-type.js +0 -2
- package/esm2015/lib/modules/text-editor/types/toolbar-action-type.js.map +0 -1
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-context.js +0 -6
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-context.js.map +0 -1
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-result.js +0 -2
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-result.js.map +0 -1
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal.component.js +0 -121
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal.component.js.map +0 -1
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-target.js +0 -9
- package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-target.js.map +0 -1
- package/esm2015/skyux-text-editor.js +0 -5
- package/esm2015/skyux-text-editor.js.map +0 -1
- package/fesm2015/skyux-text-editor.js.map +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class SkyTextEditorSelectionService {
|
|
7
|
+
isElementSelected(documentEl, element) {
|
|
8
|
+
const selectedNode = this.getCurrentSelection(documentEl)
|
|
9
|
+
.anchorNode;
|
|
10
|
+
/* istanbul ignore next */
|
|
11
|
+
return (selectedNode &&
|
|
12
|
+
(element.contains(selectedNode) ||
|
|
13
|
+
(selectedNode.parentNode && element.contains(selectedNode.parentNode))));
|
|
14
|
+
}
|
|
15
|
+
getCurrentSelection(documentEl) {
|
|
16
|
+
return documentEl.getSelection();
|
|
17
|
+
}
|
|
18
|
+
getCurrentSelectionParentElement(documentEl) {
|
|
19
|
+
const selection = this.getCurrentSelection(documentEl);
|
|
20
|
+
let selectedEl;
|
|
21
|
+
/* istanbul ignore else */
|
|
22
|
+
if (selection &&
|
|
23
|
+
selection.getRangeAt &&
|
|
24
|
+
selection.getRangeAt(0).commonAncestorContainer) {
|
|
25
|
+
selectedEl = selection.getRangeAt(0).commonAncestorContainer;
|
|
26
|
+
selectedEl =
|
|
27
|
+
selectedEl.nodeType !== 1 ? selectedEl.parentElement : selectedEl;
|
|
28
|
+
}
|
|
29
|
+
else if (selection && selection.type !== 'Control') {
|
|
30
|
+
selectedEl = selection.createRange().parentElement();
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
return selectedEl;
|
|
36
|
+
}
|
|
37
|
+
getCurrentSelectionRange(documentEl, windowEl) {
|
|
38
|
+
/* istanbul ignore else */
|
|
39
|
+
if (windowEl.getSelection) {
|
|
40
|
+
const sel = windowEl.getSelection();
|
|
41
|
+
/* istanbul ignore else */
|
|
42
|
+
if (sel.getRangeAt && sel.rangeCount) {
|
|
43
|
+
return sel.getRangeAt(0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (documentEl.getSelection() &&
|
|
47
|
+
documentEl.getSelection().getRangeAt) {
|
|
48
|
+
return documentEl.getSelection().getRangeAt(0);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
selectElement(documentEl, windowEl, element) {
|
|
52
|
+
/* istanbul ignore else */
|
|
53
|
+
if (element) {
|
|
54
|
+
/* istanbul ignore else */
|
|
55
|
+
if (windowEl.getSelection) {
|
|
56
|
+
const sel = windowEl.getSelection();
|
|
57
|
+
sel.removeAllRanges();
|
|
58
|
+
const range = documentEl.createRange();
|
|
59
|
+
range.selectNodeContents(element);
|
|
60
|
+
sel.addRange(range);
|
|
61
|
+
}
|
|
62
|
+
else if (documentEl.getSelection) {
|
|
63
|
+
const sel = documentEl.getSelection();
|
|
64
|
+
sel.removeAllRanges();
|
|
65
|
+
const range = documentEl.createRange();
|
|
66
|
+
range.selectNodeContents(element);
|
|
67
|
+
sel.addRange(range);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
SkyTextEditorSelectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
73
|
+
SkyTextEditorSelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorSelectionService, providedIn: 'root' });
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorSelectionService, decorators: [{
|
|
75
|
+
type: Injectable,
|
|
76
|
+
args: [{
|
|
77
|
+
providedIn: 'root',
|
|
78
|
+
}]
|
|
79
|
+
}] });
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3Itc2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3NlcnZpY2VzL3RleHQtZWRpdG9yLXNlbGVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNDOztHQUVHO0FBSUgsTUFBTSxPQUFPLDZCQUE2QjtJQUNqQyxpQkFBaUIsQ0FBQyxVQUFvQixFQUFFLE9BQW9CO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7YUFDdEQsVUFBeUIsQ0FBQztRQUM3QiwwQkFBMEI7UUFDMUIsT0FBTyxDQUNMLFlBQVk7WUFDWixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUM3QixDQUFDLFlBQVksQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVNLG1CQUFtQixDQUFDLFVBQW9CO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxnQ0FBZ0MsQ0FBQyxVQUFvQjtRQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFBSSxVQUFtQixDQUFDO1FBQ3hCLDBCQUEwQjtRQUMxQixJQUNFLFNBQVM7WUFDVCxTQUFTLENBQUMsVUFBVTtZQUNwQixTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixFQUMvQztZQUNBLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUFrQyxDQUFDO1lBQ3hFLFVBQVU7Z0JBQ1IsVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNyRTthQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3BELFVBQVUsR0FBSSxTQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQy9EO2FBQU07WUFDTCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTSx3QkFBd0IsQ0FDN0IsVUFBb0IsRUFDcEIsUUFBZ0I7UUFFaEIsMEJBQTBCO1FBQzFCLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRTtZQUN6QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsMEJBQTBCO1lBQzFCLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUNwQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUI7U0FDRjthQUFNLElBQ0wsVUFBVSxDQUFDLFlBQVksRUFBRTtZQUN6QixVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUNwQztZQUNBLE9BQU8sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFTSxhQUFhLENBQ2xCLFVBQW9CLEVBQ3BCLFFBQWdCLEVBQ2hCLE9BQW9CO1FBRXBCLDBCQUEwQjtRQUMxQixJQUFJLE9BQU8sRUFBRTtZQUNYLDBCQUEwQjtZQUMxQixJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQzs7MEhBN0VVLDZCQUE2Qjs4SEFBN0IsNkJBQTZCLGNBRjVCLE1BQU07MkZBRVAsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGlzRWxlbWVudFNlbGVjdGVkKGRvY3VtZW50RWw6IERvY3VtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkTm9kZSA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihkb2N1bWVudEVsKVxuICAgICAgLmFuY2hvck5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gKFxuICAgICAgc2VsZWN0ZWROb2RlICYmXG4gICAgICAoZWxlbWVudC5jb250YWlucyhzZWxlY3RlZE5vZGUpIHx8XG4gICAgICAgIChzZWxlY3RlZE5vZGUucGFyZW50Tm9kZSAmJiBlbGVtZW50LmNvbnRhaW5zKHNlbGVjdGVkTm9kZS5wYXJlbnROb2RlKSkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50RWw6IERvY3VtZW50KTogU2VsZWN0aW9uIHtcbiAgICByZXR1cm4gZG9jdW1lbnRFbC5nZXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudChkb2N1bWVudEVsOiBEb2N1bWVudCk6IEVsZW1lbnQge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihkb2N1bWVudEVsKTtcbiAgICBsZXQgc2VsZWN0ZWRFbDogRWxlbWVudDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGlvbiAmJlxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQgJiZcbiAgICAgIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgKSB7XG4gICAgICBzZWxlY3RlZEVsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXIgYXMgRWxlbWVudDtcbiAgICAgIHNlbGVjdGVkRWwgPVxuICAgICAgICBzZWxlY3RlZEVsLm5vZGVUeXBlICE9PSAxID8gc2VsZWN0ZWRFbC5wYXJlbnRFbGVtZW50IDogc2VsZWN0ZWRFbDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udHlwZSAhPT0gJ0NvbnRyb2wnKSB7XG4gICAgICBzZWxlY3RlZEVsID0gKHNlbGVjdGlvbiBhcyBhbnkpLmNyZWF0ZVJhbmdlKCkucGFyZW50RWxlbWVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRFbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uUmFuZ2UoXG4gICAgZG9jdW1lbnRFbDogRG9jdW1lbnQsXG4gICAgd2luZG93RWw6IFdpbmRvd1xuICApOiBSYW5nZSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAod2luZG93RWwuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBzZWwgPSB3aW5kb3dFbC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoc2VsLmdldFJhbmdlQXQgJiYgc2VsLnJhbmdlQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHNlbC5nZXRSYW5nZUF0KDApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpICYmXG4gICAgICBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXRcbiAgICApIHtcbiAgICAgIHJldHVybiBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdEVsZW1lbnQoXG4gICAgZG9jdW1lbnRFbDogRG9jdW1lbnQsXG4gICAgd2luZG93RWw6IFdpbmRvdyxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHdpbmRvd0VsLmdldFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3dFbC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50RWwuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudEVsLmdldFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCBzZWwgPSBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnRFbC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class SkyTextEditorService {
|
|
7
|
+
constructor() {
|
|
8
|
+
/**
|
|
9
|
+
* A dictionary representing all active text editors and their settings.
|
|
10
|
+
*/
|
|
11
|
+
this.editors = {};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns the blur observable from the editor with the corresponding id.
|
|
15
|
+
*/
|
|
16
|
+
blurListener(id) {
|
|
17
|
+
return this.editors[id].blurObservable;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Returns the click observable from the editor with the corresponding id.
|
|
21
|
+
*/
|
|
22
|
+
clickListener(id) {
|
|
23
|
+
return this.editors[id].clickObservable;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns the command change observable from the editor with the corresponding id.
|
|
27
|
+
*/
|
|
28
|
+
commandChangeListener(id) {
|
|
29
|
+
return this.editors[id].commandChangeObservable;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns the input change observable from the editor with the corresponding id.
|
|
33
|
+
*/
|
|
34
|
+
inputListener(id) {
|
|
35
|
+
return this.editors[id].inputObservable;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Removes editor from the `editors` index by id.
|
|
39
|
+
*/
|
|
40
|
+
removeEditor(id) {
|
|
41
|
+
/* istanbul ignore else */
|
|
42
|
+
if (id in this.editors) {
|
|
43
|
+
delete this.editors[id];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Returns the selection change observable from the editor with the corresponding id.
|
|
48
|
+
*/
|
|
49
|
+
selectionChangeListener(id) {
|
|
50
|
+
return this.editors[id].selectionChangeObservable;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
SkyTextEditorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
54
|
+
SkyTextEditorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorService, providedIn: 'root' });
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorService, decorators: [{
|
|
56
|
+
type: Injectable,
|
|
57
|
+
args: [{
|
|
58
|
+
providedIn: 'root',
|
|
59
|
+
}]
|
|
60
|
+
}] });
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0zQzs7R0FFRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFIakM7UUFJRTs7V0FFRztRQUNJLFlBQU8sR0FBcUMsRUFBRSxDQUFDO0tBOEN2RDtJQTVDQzs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUFVO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLEVBQVU7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUIsQ0FBQyxFQUFVO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsRUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUFVO1FBQzVCLDBCQUEwQjtRQUMxQixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QixDQUFDLEVBQVU7UUFDdkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0lBQ3BELENBQUM7O2lIQWpEVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRWRpdG9yU2V0dGluZyB9IGZyb20gJy4uL3R5cGVzL2VkaXRvci1zZXR0aW5nJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgYWxsIGFjdGl2ZSB0ZXh0IGVkaXRvcnMgYW5kIHRoZWlyIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGVkaXRvcnM6IHsgW2tleTogc3RyaW5nXTogRWRpdG9yU2V0dGluZyB9ID0ge307XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJsdXIgb2JzZXJ2YWJsZSBmcm9tIHRoZSBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBibHVyTGlzdGVuZXIoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvcnNbaWRdLmJsdXJPYnNlcnZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNsaWNrIG9ic2VydmFibGUgZnJvbSB0aGUgZWRpdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaWQuXG4gICAqL1xuICBwdWJsaWMgY2xpY2tMaXN0ZW5lcihpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc1tpZF0uY2xpY2tPYnNlcnZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbW1hbmQgY2hhbmdlIG9ic2VydmFibGUgZnJvbSB0aGUgZWRpdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaWQuXG4gICAqL1xuICBwdWJsaWMgY29tbWFuZENoYW5nZUxpc3RlbmVyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzW2lkXS5jb21tYW5kQ2hhbmdlT2JzZXJ2YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbnB1dCBjaGFuZ2Ugb2JzZXJ2YWJsZSBmcm9tIHRoZSBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBpbnB1dExpc3RlbmVyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzW2lkXS5pbnB1dE9ic2VydmFibGU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlZGl0b3IgZnJvbSB0aGUgYGVkaXRvcnNgIGluZGV4IGJ5IGlkLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVkaXRvcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaWQgaW4gdGhpcy5lZGl0b3JzKSB7XG4gICAgICBkZWxldGUgdGhpcy5lZGl0b3JzW2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGNoYW5nZSBvYnNlcnZhYmxlIGZyb20gdGhlIGVkaXRvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGlkLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzW2lkXS5zZWxlY3Rpb25DaGFuZ2VPYnNlcnZhYmxlO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import createDOMPurify from 'dompurify';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
const domPurify = createDOMPurify(window);
|
|
5
|
+
domPurify.addHook('afterSanitizeAttributes', (node) => {
|
|
6
|
+
// Set all elements owning target to target=_blank
|
|
7
|
+
// so we only allow the target attribute with that value.
|
|
8
|
+
if (node.getAttribute('target')) {
|
|
9
|
+
node.setAttribute('target', '_blank');
|
|
10
|
+
node.setAttribute('rel', 'noopener noreferrer');
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* The `SkyTextSanitizationService` user the `DOMPurify` library to sanitize strings for use
|
|
15
|
+
* in the DOM. `DOMPurify` allows more customization than Angular's internal `DomSanitizer` so we
|
|
16
|
+
* can preserve `<style>` tags and allow `target` attributes for new tab links.
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export class SkyTextSanitizationService {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.allowedAttributes = ['target'];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns a sanitized string, allowing target attribute for new tab links.
|
|
25
|
+
*/
|
|
26
|
+
sanitize(htmlString) {
|
|
27
|
+
return domPurify.sanitize(htmlString, { ADD_ATTR: this.allowedAttributes });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
SkyTextSanitizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextSanitizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
31
|
+
SkyTextSanitizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextSanitizationService, providedIn: 'root' });
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextSanitizationService, decorators: [{
|
|
33
|
+
type: Injectable,
|
|
34
|
+
args: [{
|
|
35
|
+
providedIn: 'root',
|
|
36
|
+
}]
|
|
37
|
+
}] });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1zYW5pdGl6YXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1zYW5pdGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sZUFBZSxNQUFNLFdBQVcsQ0FBQzs7QUFFeEMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRTFDLFNBQVMsQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM3RCxrREFBa0Q7SUFDbEQseURBQXlEO0lBQ3pELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQ2pEO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTywwQkFBMEI7SUFIdkM7UUFJVSxzQkFBaUIsR0FBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBUWxEO0lBTkM7O09BRUc7SUFDSSxRQUFRLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7O3VIQVJVLDBCQUEwQjsySEFBMUIsMEJBQTBCLGNBRnpCLE1BQU07MkZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IGNyZWF0ZURPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuXG5jb25zdCBkb21QdXJpZnkgPSBjcmVhdGVET01QdXJpZnkod2luZG93KTtcblxuZG9tUHVyaWZ5LmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgLy8gU2V0IGFsbCBlbGVtZW50cyBvd25pbmcgdGFyZ2V0IHRvIHRhcmdldD1fYmxhbmtcbiAgLy8gc28gd2Ugb25seSBhbGxvdyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSB3aXRoIHRoYXQgdmFsdWUuXG4gIGlmIChub2RlLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuICB9XG59KTtcblxuLyoqXG4gKiBUaGUgYFNreVRleHRTYW5pdGl6YXRpb25TZXJ2aWNlYCB1c2VyIHRoZSBgRE9NUHVyaWZ5YCBsaWJyYXJ5IHRvIHNhbml0aXplIHN0cmluZ3MgZm9yIHVzZVxuICogaW4gdGhlIERPTS4gYERPTVB1cmlmeWAgYWxsb3dzIG1vcmUgY3VzdG9taXphdGlvbiB0aGFuIEFuZ3VsYXIncyBpbnRlcm5hbCBgRG9tU2FuaXRpemVyYCBzbyB3ZVxuICogY2FuIHByZXNlcnZlIGA8c3R5bGU+YCB0YWdzIGFuZCBhbGxvdyBgdGFyZ2V0YCBhdHRyaWJ1dGVzIGZvciBuZXcgdGFiIGxpbmtzLlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lUZXh0U2FuaXRpemF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gWyd0YXJnZXQnXTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIHNhbml0aXplZCBzdHJpbmcsIGFsbG93aW5nIHRhcmdldCBhdHRyaWJ1dGUgZm9yIG5ldyB0YWIgbGlua3MuXG4gICAqL1xuICBwdWJsaWMgc2FuaXRpemUoaHRtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9tUHVyaWZ5LnNhbml0aXplKGh0bWxTdHJpbmcsIHsgQUREX0FUVFI6IHRoaXMuYWxsb3dlZEF0dHJpYnV0ZXMgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, NgZone, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { NgControl } from '@angular/forms';
|
|
3
|
+
import { SkyCoreAdapterService } from '@skyux/core';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { SkyFormsUtility } from '../shared/forms-utility';
|
|
7
|
+
import { FONT_LIST_DEFAULTS } from './defaults/font-list-defaults';
|
|
8
|
+
import { FONT_SIZE_LIST_DEFAULTS } from './defaults/font-size-list-defaults';
|
|
9
|
+
import { MENU_DEFAULTS } from './defaults/menu-defaults';
|
|
10
|
+
import { STYLE_STATE_DEFAULTS } from './defaults/style-state-defaults';
|
|
11
|
+
import { TOOLBAR_ACTION_DEFAULTS } from './defaults/toolbar-action-defaults';
|
|
12
|
+
import { SkyTextEditorAdapterService } from './services/text-editor-adapter.service';
|
|
13
|
+
import { SkyTextEditorService } from './services/text-editor.service';
|
|
14
|
+
import { SkyTextSanitizationService } from './services/text-sanitization.service';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@skyux/core";
|
|
17
|
+
import * as i2 from "./services/text-editor-adapter.service";
|
|
18
|
+
import * as i3 from "./services/text-editor.service";
|
|
19
|
+
import * as i4 from "./services/text-sanitization.service";
|
|
20
|
+
import * as i5 from "@angular/forms";
|
|
21
|
+
import * as i6 from "@skyux/layout";
|
|
22
|
+
import * as i7 from "./menubar/text-editor-menubar.component";
|
|
23
|
+
import * as i8 from "./toolbar/text-editor-toolbar.component";
|
|
24
|
+
import * as i9 from "@angular/common";
|
|
25
|
+
/**
|
|
26
|
+
* Auto-incrementing integer used to generate unique ids for radio components.
|
|
27
|
+
*/
|
|
28
|
+
let nextUniqueId = 0;
|
|
29
|
+
/**
|
|
30
|
+
* The text editor component lets users format and manipulate text.
|
|
31
|
+
*/
|
|
32
|
+
export class SkyTextEditorComponent {
|
|
33
|
+
constructor(changeDetector, coreAdapterService, adapterService, editorService, sanitizationService, ngControl, zone) {
|
|
34
|
+
this.changeDetector = changeDetector;
|
|
35
|
+
this.coreAdapterService = coreAdapterService;
|
|
36
|
+
this.adapterService = adapterService;
|
|
37
|
+
this.editorService = editorService;
|
|
38
|
+
this.sanitizationService = sanitizationService;
|
|
39
|
+
this.ngControl = ngControl;
|
|
40
|
+
this.zone = zone;
|
|
41
|
+
/**
|
|
42
|
+
* Indicates whether to put focus on the editor after it renders.
|
|
43
|
+
*/
|
|
44
|
+
this.autofocus = false;
|
|
45
|
+
this.editorFocusStream = new Subject();
|
|
46
|
+
/**
|
|
47
|
+
* Specifies the fonts to include in the font picker.
|
|
48
|
+
* @default [{name: 'Blackbaud Sans', value: '"Blackbaud Sans", Arial, sans-serif'}, {name: 'Arial', value: 'Arial'}, {name: 'Arial Black', value: '"Arial Black"'}, {name: 'Courier New', value: '"Courier New"'}, {name: 'Georgia', value: 'Georgia, serif'}, {name: 'Tahoma', value: 'Tahoma, Geneva, sans-serif'}, {name: 'Times New Roman', value: '"Times New Roman"'}, {name: 'Trebuchet MS', value: '"Trebuchet MS", sans-serif'}, {name: 'Verdana', value: 'Verdana, Geneva, sans-serif'}]
|
|
49
|
+
*/
|
|
50
|
+
this.fontList = FONT_LIST_DEFAULTS;
|
|
51
|
+
/**
|
|
52
|
+
* Specifies the font sizes to include in the font size picker.
|
|
53
|
+
* @default [6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 36, 48]
|
|
54
|
+
*/
|
|
55
|
+
this.fontSizeList = FONT_SIZE_LIST_DEFAULTS;
|
|
56
|
+
/**
|
|
57
|
+
* Specifies a unique ID attribute for the text editor.
|
|
58
|
+
* By default, the component generates a random ID.
|
|
59
|
+
*/
|
|
60
|
+
this.id = `sky-text-editor-${++nextUniqueId}`;
|
|
61
|
+
/**
|
|
62
|
+
* Specifies the menus to include in the menu bar.
|
|
63
|
+
* @default [ 'edit', 'format' ]
|
|
64
|
+
*/
|
|
65
|
+
this.menus = MENU_DEFAULTS;
|
|
66
|
+
/**
|
|
67
|
+
* Specifies the merge fields to include in the merge field menu.
|
|
68
|
+
*/
|
|
69
|
+
this.mergeFields = [];
|
|
70
|
+
/**
|
|
71
|
+
* Specifies the actions to include in the toolbar and determines their order.
|
|
72
|
+
* @default [ 'font-family', 'font-size', 'font-style', 'color', 'list', 'link ]
|
|
73
|
+
*/
|
|
74
|
+
this.toolbarActions = TOOLBAR_ACTION_DEFAULTS;
|
|
75
|
+
this.focusInitialized = false;
|
|
76
|
+
this.initialized = false;
|
|
77
|
+
this.ngUnsubscribe = new Subject();
|
|
78
|
+
this._disabled = false;
|
|
79
|
+
this._initialStyleState = Object.assign({}, STYLE_STATE_DEFAULTS);
|
|
80
|
+
this._placeholder = '';
|
|
81
|
+
this._value = '<p></p>';
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
83
|
+
this._onTouched = () => { };
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
85
|
+
this._onChange = () => { };
|
|
86
|
+
this.ngControl.valueAccessor = this;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Indicates whether to disable the text editor.
|
|
90
|
+
* @default false
|
|
91
|
+
*/
|
|
92
|
+
set disabled(value) {
|
|
93
|
+
const coercedValue = SkyFormsUtility.coerceBooleanProperty(value);
|
|
94
|
+
if (coercedValue !== this.disabled) {
|
|
95
|
+
this._disabled = coercedValue;
|
|
96
|
+
// Update focusableChildren inside the iframe.
|
|
97
|
+
let focusableChildren;
|
|
98
|
+
/* istanbul ignore else */
|
|
99
|
+
if (this.iframeRef) {
|
|
100
|
+
focusableChildren = this.coreAdapterService.getFocusableChildren(this.iframeRef.nativeElement.contentDocument.body, {
|
|
101
|
+
ignoreVisibility: true,
|
|
102
|
+
ignoreTabIndex: true,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (this._disabled) {
|
|
106
|
+
this.adapterService.disableEditor(this.id, focusableChildren, this.iframeRef.nativeElement);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.adapterService.enableEditor(this.id, focusableChildren, this.iframeRef.nativeElement);
|
|
110
|
+
}
|
|
111
|
+
this.changeDetector.markForCheck();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
get disabled() {
|
|
115
|
+
return this._disabled;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Specifies the initial styles for all content, including background color, font size, and link state.
|
|
119
|
+
*/
|
|
120
|
+
set initialStyleState(state) {
|
|
121
|
+
// Do not update the state after initialization has taken place
|
|
122
|
+
/* istanbul ignore else */
|
|
123
|
+
if (!this.initialized) {
|
|
124
|
+
this._initialStyleState = {
|
|
125
|
+
...STYLE_STATE_DEFAULTS,
|
|
126
|
+
...state,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
get initialStyleState() {
|
|
131
|
+
return this._initialStyleState;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Specifies placeholder text to display when the text entry area is empty.
|
|
135
|
+
*/
|
|
136
|
+
set placeholder(value) {
|
|
137
|
+
/* istanbul ignore else */
|
|
138
|
+
if (value !== this._placeholder) {
|
|
139
|
+
this._placeholder = value;
|
|
140
|
+
if (this.initialized) {
|
|
141
|
+
this.adapterService.setPlaceholder(this.id, value);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
get placeholder() {
|
|
146
|
+
return this._placeholder;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The internal value of the control.
|
|
150
|
+
*/
|
|
151
|
+
set value(value) {
|
|
152
|
+
// Normalize value and set any empty state to an empty string.
|
|
153
|
+
let normalizedValue = value;
|
|
154
|
+
if (!value ||
|
|
155
|
+
value.trim() === '<p></p>' ||
|
|
156
|
+
value.trim() === '<br>' ||
|
|
157
|
+
value.trim() === '<p><br></p>') {
|
|
158
|
+
normalizedValue = '';
|
|
159
|
+
}
|
|
160
|
+
normalizedValue = this.sanitizationService.sanitize(normalizedValue).trim();
|
|
161
|
+
if (this._value !== normalizedValue) {
|
|
162
|
+
this._value = normalizedValue;
|
|
163
|
+
// Update angular form control if model has been normalized.
|
|
164
|
+
/* istanbul ignore else */
|
|
165
|
+
if (this.ngControl && this.ngControl.control) {
|
|
166
|
+
/* istanbul ignore else */
|
|
167
|
+
if (normalizedValue !== this.ngControl.control.value) {
|
|
168
|
+
this.ngControl.control.setValue(normalizedValue, {
|
|
169
|
+
emitModelToViewChange: false,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Autofocus isn't testable in Firefox and IE.
|
|
174
|
+
/* istanbul ignore next */
|
|
175
|
+
if (this.autofocus && !this.focusInitialized) {
|
|
176
|
+
this.adapterService.focusEditor(this.id);
|
|
177
|
+
this.focusInitialized = true;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
get value() {
|
|
182
|
+
return this._value;
|
|
183
|
+
}
|
|
184
|
+
ngAfterViewInit() {
|
|
185
|
+
this.initIframe();
|
|
186
|
+
}
|
|
187
|
+
ngOnDestroy() {
|
|
188
|
+
this.adapterService.removeObservers(this.editorService.editors[this.id]);
|
|
189
|
+
this.editorService.removeEditor(this.id);
|
|
190
|
+
this.ngUnsubscribe.next();
|
|
191
|
+
this.ngUnsubscribe.complete();
|
|
192
|
+
}
|
|
193
|
+
onIframeLoad() {
|
|
194
|
+
// Remove editor if it already exists to cover situations where the text editor might have been moved in the DOM.
|
|
195
|
+
/* istanbul ignore else */
|
|
196
|
+
if (this.editorService.editors[this.id]) {
|
|
197
|
+
this.editorService.removeEditor(this.id);
|
|
198
|
+
this.initIframe();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Implemented as part of ControlValueAccessor.
|
|
203
|
+
*/
|
|
204
|
+
writeValue(value) {
|
|
205
|
+
this.value = value;
|
|
206
|
+
// Update HTML if necessary.
|
|
207
|
+
const editorValue = this.adapterService.getEditorInnerHtml(this.id);
|
|
208
|
+
if (this.initialized && editorValue !== this._value) {
|
|
209
|
+
this.adapterService.setEditorInnerHtml(this.id, this._value);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Implemented as part of ControlValueAccessor.
|
|
214
|
+
*/
|
|
215
|
+
registerOnChange(fn) {
|
|
216
|
+
this._onChange = fn;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Implemented as part of ControlValueAccessor.
|
|
220
|
+
*/
|
|
221
|
+
registerOnTouched(fn) {
|
|
222
|
+
this._onTouched = fn;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Implemented as part of ControlValueAccessor.
|
|
226
|
+
*/
|
|
227
|
+
setDisabledState(isDisabled) {
|
|
228
|
+
this.disabled = isDisabled;
|
|
229
|
+
}
|
|
230
|
+
updateStyle() {
|
|
231
|
+
this._initialStyleState = {
|
|
232
|
+
...this._initialStyleState,
|
|
233
|
+
...this.adapterService.getStyleState(this.id),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
initIframe() {
|
|
237
|
+
this.adapterService.addEditor(this.id, this.iframeRef.nativeElement, this.initialStyleState, this.placeholder);
|
|
238
|
+
this.editorService
|
|
239
|
+
.inputListener(this.id)
|
|
240
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
241
|
+
.subscribe(() => {
|
|
242
|
+
// Angular doesn't run change detection for changes originating inside an iframe,
|
|
243
|
+
// so we have to call the onChange() event inside NgZone to force change propigation to consuming components.
|
|
244
|
+
this.zone.run(() => {
|
|
245
|
+
this.ViewToModelUpdate();
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
this.editorService
|
|
249
|
+
.selectionChangeListener(this.id)
|
|
250
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
251
|
+
.subscribe(() => {
|
|
252
|
+
this.updateStyle();
|
|
253
|
+
this.editorFocusStream.next();
|
|
254
|
+
});
|
|
255
|
+
this.editorService
|
|
256
|
+
.clickListener(this.id)
|
|
257
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
258
|
+
.subscribe(() => {
|
|
259
|
+
this.editorFocusStream.next();
|
|
260
|
+
});
|
|
261
|
+
this.editorService
|
|
262
|
+
.blurListener(this.id)
|
|
263
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
264
|
+
.subscribe(() => {
|
|
265
|
+
// Angular doesn't run change detection for changes originating inside an iframe,
|
|
266
|
+
// so we have to run markForCheck() inside the NgZone to force change propigation to consuming components.
|
|
267
|
+
this.zone.run(() => {
|
|
268
|
+
this._onTouched();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
this.editorService
|
|
272
|
+
.commandChangeListener(this.id)
|
|
273
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
274
|
+
.subscribe(() => {
|
|
275
|
+
this.updateStyle();
|
|
276
|
+
this.ViewToModelUpdate();
|
|
277
|
+
});
|
|
278
|
+
this.adapterService.setEditorInnerHtml(this.id, this._value);
|
|
279
|
+
/* istanbul ignore next */
|
|
280
|
+
if (this.autofocus) {
|
|
281
|
+
this.adapterService.focusEditor(this.id);
|
|
282
|
+
}
|
|
283
|
+
this.initialized = true;
|
|
284
|
+
}
|
|
285
|
+
ViewToModelUpdate(emitChange = true) {
|
|
286
|
+
this.value = this.adapterService.getEditorInnerHtml(this.id);
|
|
287
|
+
/* istanbul ignore else */
|
|
288
|
+
if (emitChange) {
|
|
289
|
+
this._onChange(this._value);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
SkyTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyCoreAdapterService }, { token: i2.SkyTextEditorAdapterService }, { token: i3.SkyTextEditorService }, { token: i4.SkyTextSanitizationService }, { token: i5.NgControl }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
294
|
+
SkyTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyTextEditorComponent, selector: "sky-text-editor", inputs: { autofocus: "autofocus", disabled: "disabled", fontList: "fontList", fontSizeList: "fontSizeList", id: "id", initialStyleState: "initialStyleState", menus: "menus", mergeFields: "mergeFields", placeholder: "placeholder", toolbarActions: "toolbarActions" }, viewQueries: [{ propertyName: "iframeRef", first: true, predicate: ["iframe"], descendants: true }], ngImport: i0, template: "<div class=\"sky-text-editor\">\n <sky-toolbar class=\"sky-text-editor-toolbar\">\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"menubar\"\n role=\"toolbar\"\n >\n <sky-text-editor-menubar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [menus]=\"menus\"\n [mergeFields]=\"mergeFields\"\n >\n </sky-text-editor-menubar>\n </sky-toolbar-section>\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"toolbar\"\n role=\"toolbar\"\n >\n <sky-text-editor-toolbar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [fontList]=\"fontList\"\n [fontSizeList]=\"fontSizeList\"\n [toolbarActions]=\"toolbarActions\"\n [styleState]=\"initialStyleState\"\n >\n </sky-text-editor-toolbar>\n </sky-toolbar-section>\n </sky-toolbar>\n <iframe\n class=\"sky-text-editor-wrapper\"\n src=\"about:blank\"\n title=\"Text Editor\"\n [ngClass]=\"{\n 'sky-text-editor-wrapper-disabled': disabled\n }\"\n (load)=\"onIframeLoad()\"\n #iframe\n >\n </iframe>\n</div>\n", styles: [".sky-text-editor .sky-text-editor-wrapper{display:flex;flex-wrap:wrap;background-color:#fff;width:100%;height:300px;padding:1rem;font-size:1.2rem;border:1px solid #c0c0c0;overflow-y:auto;outline:none}.sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ededee}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-left:1px solid #cdcfd2!important;border-right:1px solid #cdcfd2!important}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-dropdown-button{border:none}.sky-text-editor .sky-text-editor-toolbar sky-text-editor-menubar,.sky-text-editor .sky-text-editor-toolbar sky-text-editor-toolbar{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper{border:1px solid #d2d2d2}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ececed}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar{padding:10px 10px 0}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-top:1px solid #d2d2d2!important;border-left:1px solid #d2d2d2!important;border-right:1px solid #d2d2d2!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 0 0!important}\n"], components: [{ type: i6.λ37, selector: "sky-toolbar" }, { type: i6.λ38, selector: "sky-toolbar-section" }, { type: i7.SkyTextEditorMenubarComponent, selector: "sky-text-editor-menubar", inputs: ["editorFocusStream", "editorId", "menus", "mergeFields", "disabled"] }, { type: i8.SkyTextEditorToolbarComponent, selector: "sky-text-editor-toolbar", inputs: ["editorFocusStream", "editorId", "fontList", "fontSizeList", "toolbarActions", "styleState", "disabled"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
295
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorComponent, decorators: [{
|
|
296
|
+
type: Component,
|
|
297
|
+
args: [{ selector: 'sky-text-editor', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"sky-text-editor\">\n <sky-toolbar class=\"sky-text-editor-toolbar\">\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"menubar\"\n role=\"toolbar\"\n >\n <sky-text-editor-menubar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [menus]=\"menus\"\n [mergeFields]=\"mergeFields\"\n >\n </sky-text-editor-menubar>\n </sky-toolbar-section>\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"toolbar\"\n role=\"toolbar\"\n >\n <sky-text-editor-toolbar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [fontList]=\"fontList\"\n [fontSizeList]=\"fontSizeList\"\n [toolbarActions]=\"toolbarActions\"\n [styleState]=\"initialStyleState\"\n >\n </sky-text-editor-toolbar>\n </sky-toolbar-section>\n </sky-toolbar>\n <iframe\n class=\"sky-text-editor-wrapper\"\n src=\"about:blank\"\n title=\"Text Editor\"\n [ngClass]=\"{\n 'sky-text-editor-wrapper-disabled': disabled\n }\"\n (load)=\"onIframeLoad()\"\n #iframe\n >\n </iframe>\n</div>\n", styles: [".sky-text-editor .sky-text-editor-wrapper{display:flex;flex-wrap:wrap;background-color:#fff;width:100%;height:300px;padding:1rem;font-size:1.2rem;border:1px solid #c0c0c0;overflow-y:auto;outline:none}.sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ededee}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-left:1px solid #cdcfd2!important;border-right:1px solid #cdcfd2!important}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-dropdown-button{border:none}.sky-text-editor .sky-text-editor-toolbar sky-text-editor-menubar,.sky-text-editor .sky-text-editor-toolbar sky-text-editor-toolbar{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper{border:1px solid #d2d2d2}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ececed}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar{padding:10px 10px 0}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-top:1px solid #d2d2d2!important;border-left:1px solid #d2d2d2!important;border-right:1px solid #d2d2d2!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 0 0!important}\n"] }]
|
|
298
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyCoreAdapterService }, { type: i2.SkyTextEditorAdapterService }, { type: i3.SkyTextEditorService }, { type: i4.SkyTextSanitizationService }, { type: i5.NgControl }, { type: i0.NgZone }]; }, propDecorators: { autofocus: [{
|
|
299
|
+
type: Input
|
|
300
|
+
}], disabled: [{
|
|
301
|
+
type: Input
|
|
302
|
+
}], fontList: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], fontSizeList: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}], id: [{
|
|
307
|
+
type: Input
|
|
308
|
+
}], initialStyleState: [{
|
|
309
|
+
type: Input
|
|
310
|
+
}], menus: [{
|
|
311
|
+
type: Input
|
|
312
|
+
}], mergeFields: [{
|
|
313
|
+
type: Input
|
|
314
|
+
}], placeholder: [{
|
|
315
|
+
type: Input
|
|
316
|
+
}], toolbarActions: [{
|
|
317
|
+
type: Input
|
|
318
|
+
}], iframeRef: [{
|
|
319
|
+
type: ViewChild,
|
|
320
|
+
args: ['iframe']
|
|
321
|
+
}] } });
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RleHQtZWRpdG9yL3NyYy9saWIvbW9kdWxlcy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFB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SUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxhQUFzQixJQUFJO1FBQ2xELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0QsMEJBQTBCO1FBQzFCLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOzttSEE3VVUsc0JBQXNCO3VHQUF0QixzQkFBc0Isc2FDakRuQyxxdUNBNkNBOzJGRElhLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTsrU0FPOUIsU0FBUztzQkFEZixLQUFLO2dCQVFLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBK0NDLFFBQVE7c0JBRGQsS0FBSztnQkFRQyxZQUFZO3NCQURsQixLQUFLO2dCQVFDLEVBQUU7c0JBRFIsS0FBSztnQkFPSyxpQkFBaUI7c0JBRDNCLEtBQUs7Z0JBcUJDLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxXQUFXO3NCQURqQixLQUFLO2dCQU9LLFdBQVc7c0JBRHJCLEtBQUs7Z0JBb0JDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBaURFLFNBQVM7c0JBRGhCLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUZvcm1zVXRpbGl0eSB9IGZyb20gJy4uL3NoYXJlZC9mb3Jtcy11dGlsaXR5JztcblxuaW1wb3J0IHsgRk9OVF9MSVNUX0RFRkFVTFRTIH0gZnJvbSAnLi9kZWZhdWx0cy9mb250LWxpc3QtZGVmYXVsdHMnO1xuaW1wb3J0IHsgRk9OVF9TSVpFX0xJU1RfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL2ZvbnQtc2l6ZS1saXN0LWRlZmF1bHRzJztcbmltcG9ydCB7IE1FTlVfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL21lbnUtZGVmYXVsdHMnO1xuaW1wb3J0IHsgU1RZTEVfU1RBVEVfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL3N0eWxlLXN0YXRlLWRlZmF1bHRzJztcbmltcG9ydCB7IFRPT0xCQVJfQUNUSU9OX0RFRkFVTFRTIH0gZnJvbSAnLi9kZWZhdWx0cy90b29sYmFyLWFjdGlvbi1kZWZhdWx0cyc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RleHQtZWRpdG9yLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0U2FuaXRpemF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1zYW5pdGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yRm9udCB9IGZyb20gJy4vdHlwZXMvZm9udC1zdGF0ZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yTWVudVR5cGUgfSBmcm9tICcuL3R5cGVzL21lbnUtdHlwZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB9IGZyb20gJy4vdHlwZXMvc3R5bGUtc3RhdGUnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvck1lcmdlRmllbGQgfSBmcm9tICcuL3R5cGVzL3RleHQtZWRpdG9yLW1lcmdlLWZpZWxkJztcbmltcG9ydCB7IFNreVRleHRFZGl0b3JUb29sYmFyQWN0aW9uVHlwZSB9IGZyb20gJy4vdHlwZXMvdG9vbGJhci1hY3Rpb24tdHlwZSc7XG5cbi8qKlxuICogQXV0by1pbmNyZW1lbnRpbmcgaW50ZWdlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZHMgZm9yIHJhZGlvIGNvbXBvbmVudHMuXG4gKi9cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG4vKipcbiAqIFRoZSB0ZXh0IGVkaXRvciBjb21wb25lbnQgbGV0cyB1c2VycyBmb3JtYXQgYW5kIG1hbmlwdWxhdGUgdGV4dC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRleHQtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gcHV0IGZvY3VzIG9uIHRoZSBlZGl0b3IgYWZ0ZXIgaXQgcmVuZGVycy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvZm9jdXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgdGV4dCBlZGl0b3IuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29lcmNlZFZhbHVlID0gU2t5Rm9ybXNVdGlsaXR5LmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKGNvZXJjZWRWYWx1ZSAhPT0gdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VkVmFsdWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBmb2N1c2FibGVDaGlsZHJlbiBpbnNpZGUgdGhlIGlmcmFtZS5cbiAgICAgIGxldCBmb2N1c2FibGVDaGlsZHJlbjogSFRNTEVsZW1lbnRbXTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5pZnJhbWVSZWYpIHtcbiAgICAgICAgZm9jdXNhYmxlQ2hpbGRyZW4gPSB0aGlzLmNvcmVBZGFwdGVyU2VydmljZS5nZXRGb2N1c2FibGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudC5ib2R5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlnbm9yZVZpc2liaWxpdHk6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVUYWJJbmRleDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmRpc2FibGVFZGl0b3IoXG4gICAgICAgICAgdGhpcy5pZCxcbiAgICAgICAgICBmb2N1c2FibGVDaGlsZHJlbixcbiAgICAgICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmVuYWJsZUVkaXRvcihcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIGZvY3VzYWJsZUNoaWxkcmVuLFxuICAgICAgICAgIHRoaXMuaWZyYW1lUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgZWRpdG9yRm9jdXNTdHJlYW0gPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGZvbnQgcGlja2VyLlxuICAgKiBAZGVmYXVsdCBbe25hbWU6ICdCbGFja2JhdWQgU2FucycsIHZhbHVlOiAnXCJCbGFja2JhdWQgU2Fuc1wiLCBBcmlhbCwgc2Fucy1zZXJpZid9LCB7bmFtZTogJ0FyaWFsJywgdmFsdWU6ICdBcmlhbCd9LCB7bmFtZTogJ0FyaWFsIEJsYWNrJywgdmFsdWU6ICdcIkFyaWFsIEJsYWNrXCInfSwge25hbWU6ICdDb3VyaWVyIE5ldycsIHZhbHVlOiAnXCJDb3VyaWVyIE5ld1wiJ30sIHtuYW1lOiAnR2VvcmdpYScsIHZhbHVlOiAnR2VvcmdpYSwgc2VyaWYnfSwge25hbWU6ICdUYWhvbWEnLCB2YWx1ZTogJ1RhaG9tYSwgR2VuZXZhLCBzYW5zLXNlcmlmJ30sIHtuYW1lOiAnVGltZXMgTmV3IFJvbWFuJywgdmFsdWU6ICdcIlRpbWVzIE5ldyBSb21hblwiJ30sIHtuYW1lOiAnVHJlYnVjaGV0IE1TJywgdmFsdWU6ICdcIlRyZWJ1Y2hldCBNU1wiLCBzYW5zLXNlcmlmJ30sIHtuYW1lOiAnVmVyZGFuYScsIHZhbHVlOiAnVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmJ31dXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZm9udExpc3Q6IFNreVRleHRFZGl0b3JGb250W10gPSBGT05UX0xJU1RfREVGQVVMVFM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9udCBzaXplcyB0byBpbmNsdWRlIGluIHRoZSBmb250IHNpemUgcGlja2VyLlxuICAgKiBAZGVmYXVsdCBbNiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDM2LCA0OF1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmb250U2l6ZUxpc3Q6IG51bWJlcltdID0gRk9OVF9TSVpFX0xJU1RfREVGQVVMVFM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHVuaXF1ZSBJRCBhdHRyaWJ1dGUgZm9yIHRoZSB0ZXh0IGVkaXRvci5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGNvbXBvbmVudCBnZW5lcmF0ZXMgYSByYW5kb20gSUQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaWQgPSBgc2t5LXRleHQtZWRpdG9yLSR7KytuZXh0VW5pcXVlSWR9YDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHN0eWxlcyBmb3IgYWxsIGNvbnRlbnQsIGluY2x1ZGluZyBiYWNrZ3JvdW5kIGNvbG9yLCBmb250IHNpemUsIGFuZCBsaW5rIHN0YXRlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbml0aWFsU3R5bGVTdGF0ZShzdGF0ZTogU2t5VGV4dEVkaXRvclN0eWxlU3RhdGUpIHtcbiAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSBzdGF0ZSBhZnRlciBpbml0aWFsaXphdGlvbiBoYXMgdGFrZW4gcGxhY2VcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5faW5pdGlhbFN0eWxlU3RhdGUgPSB7XG4gICAgICAgIC4uLlNUWUxFX1NUQVRFX0RFRkFVTFRTLFxuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbml0aWFsU3R5bGVTdGF0ZSgpOiBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxTdHlsZVN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWVudXMgdG8gaW5jbHVkZSBpbiB0aGUgbWVudSBiYXIuXG4gICAqIEBkZWZhdWx0IFsgJ2VkaXQnLCAnZm9ybWF0JyBdXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWVudXM6IFNreVRleHRFZGl0b3JNZW51VHlwZVtdID0gTUVOVV9ERUZBVUxUUztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtZXJnZSBmaWVsZHMgdG8gaW5jbHVkZSBpbiB0aGUgbWVyZ2UgZmllbGQgbWVudS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXJnZUZpZWxkczogU2t5VGV4dEVkaXRvck1lcmdlRmllbGRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgcGxhY2Vob2xkZXIgdGV4dCB0byBkaXNwbGF5IHdoZW4gdGhlIHRleHQgZW50cnkgYXJlYSBpcyBlbXB0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0UGxhY2Vob2xkZXIodGhpcy5pZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBhY3Rpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHRvb2xiYXIgYW5kIGRldGVybWluZXMgdGhlaXIgb3JkZXIuXG4gICAqIEBkZWZhdWx0IFsgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXN0eWxlJywgJ2NvbG9yJywgJ2xpc3QnLCAnbGluayBdXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdG9vbGJhckFjdGlvbnM6IFNreVRleHRFZGl0b3JUb29sYmFyQWN0aW9uVHlwZVtdID0gVE9PTEJBUl9BQ1RJT05fREVGQVVMVFM7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCB2YWx1ZSBvZiB0aGUgY29udHJvbC5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZSBhbmQgc2V0IGFueSBlbXB0eSBzdGF0ZSB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZTogc3RyaW5nID0gdmFsdWU7XG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB2YWx1ZS50cmltKCkgPT09ICc8cD48L3A+JyB8fFxuICAgICAgdmFsdWUudHJpbSgpID09PSAnPGJyPicgfHxcbiAgICAgIHZhbHVlLnRyaW0oKSA9PT0gJzxwPjxicj48L3A+J1xuICAgICkge1xuICAgICAgbm9ybWFsaXplZFZhbHVlID0gJyc7XG4gICAgfVxuICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IHRoaXMuc2FuaXRpemF0aW9uU2VydmljZS5zYW5pdGl6ZShub3JtYWxpemVkVmFsdWUpLnRyaW0oKTtcblxuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbm9ybWFsaXplZFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZTtcblxuICAgICAgLy8gVXBkYXRlIGFuZ3VsYXIgZm9ybSBjb250cm9sIGlmIG1vZGVsIGhhcyBiZWVuIG5vcm1hbGl6ZWQuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZFZhbHVlLCB7XG4gICAgICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9mb2N1cyBpc24ndCB0ZXN0YWJsZSBpbiBGaXJlZm94IGFuZCBJRS5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAodGhpcy5hdXRvZm9jdXMgJiYgIXRoaXMuZm9jdXNJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmZvY3VzRWRpdG9yKHRoaXMuaWQpO1xuICAgICAgICB0aGlzLmZvY3VzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdpZnJhbWUnKVxuICBwcml2YXRlIGlmcmFtZVJlZjogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2luaXRpYWxTdHlsZVN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgU1RZTEVfU1RBVEVfREVGQVVMVFMpO1xuXG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyID0gJyc7XG5cbiAgcHJpdmF0ZSBfdmFsdWUgPSAnPHA+PC9wPic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb3JlQWRhcHRlclNlcnZpY2U6IFNreUNvcmVBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lUZXh0RWRpdG9yQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBTa3lUZXh0RWRpdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHNhbml0aXphdGlvblNlcnZpY2U6IFNreVRleHRTYW5pdGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdElmcmFtZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UucmVtb3ZlT2JzZXJ2ZXJzKHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JzW3RoaXMuaWRdKTtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlRWRpdG9yKHRoaXMuaWQpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgb25JZnJhbWVMb2FkKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBlZGl0b3IgaWYgaXQgYWxyZWFkeSBleGlzdHMgdG8gY292ZXIgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdGV4dCBlZGl0b3IgbWlnaHQgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSBET00uXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvcnNbdGhpcy5pZF0pIHtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5yZW1vdmVFZGl0b3IodGhpcy5pZCk7XG4gICAgICB0aGlzLmluaXRJZnJhbWUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cbiAgICAvLyBVcGRhdGUgSFRNTCBpZiBuZWNlc3NhcnkuXG4gICAgY29uc3QgZWRpdG9yVmFsdWUgPSB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmdldEVkaXRvcklubmVySHRtbCh0aGlzLmlkKTtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiBlZGl0b3JWYWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RWRpdG9ySW5uZXJIdG1sKHRoaXMuaWQsIHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRpYWxTdHlsZVN0YXRlID0ge1xuICAgICAgLi4udGhpcy5faW5pdGlhbFN0eWxlU3RhdGUsXG4gICAgICAuLi4odGhpcy5hZGFwdGVyU2VydmljZS5nZXRTdHlsZVN0YXRlKHRoaXMuaWQpIGFzIGFueSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdElmcmFtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmFkZEVkaXRvcihcbiAgICAgIHRoaXMuaWQsXG4gICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5pbml0aWFsU3R5bGVTdGF0ZSxcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJcbiAgICApO1xuXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlXG4gICAgICAuaW5wdXRMaXN0ZW5lcih0aGlzLmlkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGZvciBjaGFuZ2VzIG9yaWdpbmF0aW5nIGluc2lkZSBhbiBpZnJhbWUsXG4gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGUgb25DaGFuZ2UoKSBldmVudCBpbnNpZGUgTmdab25lIHRvIGZvcmNlIGNoYW5nZSBwcm9waWdhdGlvbiB0byBjb25zdW1pbmcgY29tcG9uZW50cy5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5WaWV3VG9Nb2RlbFVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlXG4gICAgICAuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgdGhpcy5lZGl0b3JGb2N1c1N0cmVhbS5uZXh0KCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZWRpdG9yU2VydmljZVxuICAgICAgLmNsaWNrTGlzdGVuZXIodGhpcy5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdG9yRm9jdXNTdHJlYW0ubmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvclNlcnZpY2VcbiAgICAgIC5ibHVyTGlzdGVuZXIodGhpcy5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEFuZ3VsYXIgZG9lc24ndCBydW4gY2hhbmdlIGRldGVjdGlvbiBmb3IgY2hhbmdlcyBvcmlnaW5hdGluZyBpbnNpZGUgYW4gaWZyYW1lLFxuICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHJ1biBtYXJrRm9yQ2hlY2soKSBpbnNpZGUgdGhlIE5nWm9uZSB0byBmb3JjZSBjaGFuZ2UgcHJvcGlnYXRpb24gdG8gY29uc3VtaW5nIGNvbXBvbmVudHMuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlXG4gICAgICAuY29tbWFuZENoYW5nZUxpc3RlbmVyKHRoaXMuaWQpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgIHRoaXMuVmlld1RvTW9kZWxVcGRhdGUoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFZGl0b3JJbm5lckh0bWwodGhpcy5pZCwgdGhpcy5fdmFsdWUpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZm9jdXNFZGl0b3IodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIFZpZXdUb01vZGVsVXBkYXRlKGVtaXRDaGFuZ2U6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuYWRhcHRlclNlcnZpY2UuZ2V0RWRpdG9ySW5uZXJIdG1sKHRoaXMuaWQpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVtaXRDaGFuZ2UpIHtcbiAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG59XG4iLCI8ZGl2IGNsYXNzPVwic2t5LXRleHQtZWRpdG9yXCI+XG4gIDxza3ktdG9vbGJhciBjbGFzcz1cInNreS10ZXh0LWVkaXRvci10b29sYmFyXCI+XG4gICAgPHNreS10b29sYmFyLXNlY3Rpb25cbiAgICAgIGFyaWEtbGFiZWw9XCJUZXh0IGZvcm1hdHRpbmdcIlxuICAgICAgY2xhc3M9XCJtZW51YmFyXCJcbiAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICA+XG4gICAgICA8c2t5LXRleHQtZWRpdG9yLW1lbnViYXJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2VkaXRvckZvY3VzU3RyZWFtXT1cImVkaXRvckZvY3VzU3RyZWFtXCJcbiAgICAgICAgW2VkaXRvcklkXT1cImlkXCJcbiAgICAgICAgW21lbnVzXT1cIm1lbnVzXCJcbiAgICAgICAgW21lcmdlRmllbGRzXT1cIm1lcmdlRmllbGRzXCJcbiAgICAgID5cbiAgICAgIDwvc2t5LXRleHQtZWRpdG9yLW1lbnViYXI+XG4gICAgPC9za3ktdG9vbGJhci1zZWN0aW9uPlxuICAgIDxza3ktdG9vbGJhci1zZWN0aW9uXG4gICAgICBhcmlhLWxhYmVsPVwiVGV4dCBmb3JtYXR0aW5nXCJcbiAgICAgIGNsYXNzPVwidG9vbGJhclwiXG4gICAgICByb2xlPVwidG9vbGJhclwiXG4gICAgPlxuICAgICAgPHNreS10ZXh0LWVkaXRvci10b29sYmFyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtlZGl0b3JGb2N1c1N0cmVhbV09XCJlZGl0b3JGb2N1c1N0cmVhbVwiXG4gICAgICAgIFtlZGl0b3JJZF09XCJpZFwiXG4gICAgICAgIFtmb250TGlzdF09XCJmb250TGlzdFwiXG4gICAgICAgIFtmb250U2l6ZUxpc3RdPVwiZm9udFNpemVMaXN0XCJcbiAgICAgICAgW3Rvb2xiYXJBY3Rpb25zXT1cInRvb2xiYXJBY3Rpb25zXCJcbiAgICAgICAgW3N0eWxlU3RhdGVdPVwiaW5pdGlhbFN0eWxlU3RhdGVcIlxuICAgICAgPlxuICAgICAgPC9za3ktdGV4dC1lZGl0b3ItdG9vbGJhcj5cbiAgICA8L3NreS10b29sYmFyLXNlY3Rpb24+XG4gIDwvc2t5LXRvb2xiYXI+XG4gIDxpZnJhbWVcbiAgICBjbGFzcz1cInNreS10ZXh0LWVkaXRvci13cmFwcGVyXCJcbiAgICBzcmM9XCJhYm91dDpibGFua1wiXG4gICAgdGl0bGU9XCJUZXh0IEVkaXRvclwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3NreS10ZXh0LWVkaXRvci13cmFwcGVyLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICB9XCJcbiAgICAobG9hZCk9XCJvbklmcmFtZUxvYWQoKVwiXG4gICAgI2lmcmFtZVxuICA+XG4gIDwvaWZyYW1lPlxuPC9kaXY+XG4iXX0=
|