@skyux/text-editor 8.6.0 → 9.0.0-alpha.0
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 +185 -105
- package/esm2022/lib/modules/rich-text-display/rich-text-display.component.mjs +42 -0
- package/{esm2020 → esm2022}/lib/modules/rich-text-display/rich-text-display.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/modules/shared/sky-text-editor-resources.module.mjs +11 -11
- package/esm2022/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +197 -0
- package/esm2022/lib/modules/text-editor/services/text-editor-adapter.service.mjs +431 -0
- package/{esm2020 → esm2022}/lib/modules/text-editor/services/text-editor-selection.service.mjs +4 -4
- package/esm2022/lib/modules/text-editor/services/text-editor.service.mjs +59 -0
- package/esm2022/lib/modules/text-editor/services/text-sanitization.service.mjs +38 -0
- package/esm2022/lib/modules/text-editor/text-editor.component.mjs +410 -0
- package/{esm2020 → esm2022}/lib/modules/text-editor/text-editor.module.mjs +41 -41
- package/esm2022/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +207 -0
- package/esm2022/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +119 -0
- package/fesm2022/skyux-text-editor.mjs +1828 -0
- package/fesm2022/skyux-text-editor.mjs.map +1 -0
- package/lib/modules/rich-text-display/rich-text-display.component.d.ts +1 -1
- package/lib/modules/text-editor/menubar/text-editor-menubar.component.d.ts +1 -1
- package/lib/modules/text-editor/text-editor.component.d.ts +4 -2
- package/lib/modules/text-editor/toolbar/text-editor-toolbar.component.d.ts +1 -1
- package/package.json +20 -26
- package/esm2020/lib/modules/rich-text-display/rich-text-display.component.mjs +0 -44
- package/esm2020/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +0 -197
- package/esm2020/lib/modules/text-editor/services/text-editor-adapter.service.mjs +0 -421
- package/esm2020/lib/modules/text-editor/services/text-editor.service.mjs +0 -64
- package/esm2020/lib/modules/text-editor/services/text-sanitization.service.mjs +0 -43
- package/esm2020/lib/modules/text-editor/text-editor.component.mjs +0 -382
- package/esm2020/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +0 -204
- package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +0 -118
- package/fesm2015/skyux-text-editor.mjs +0 -1781
- package/fesm2015/skyux-text-editor.mjs.map +0 -1
- package/fesm2020/skyux-text-editor.mjs +0 -1792
- package/fesm2020/skyux-text-editor.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/shared/forms-utility.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-list-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-size-list-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/menu-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/style-state-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/toolbar-action-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-command.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-setting.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/font-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/menu-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/style-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/text-editor-merge-field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/toolbar-action-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-result.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-target.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-text-editor.mjs +0 -0
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
var _SkyTextEditorAdapterService_instances, _SkyTextEditorAdapterService_selectionService, _SkyTextEditorAdapterService_textEditorService, _SkyTextEditorAdapterService_windowRef, _SkyTextEditorAdapterService_getContentWindowEl, _SkyTextEditorAdapterService_getChildSelectedAnchorTags, _SkyTextEditorAdapterService_getIframeDocumentEl, _SkyTextEditorAdapterService_getFontSize, _SkyTextEditorAdapterService_createObservers, _SkyTextEditorAdapterService_getPasteOverride, _SkyTextEditorAdapterService_getCurrentSelectionParentElement, _SkyTextEditorAdapterService_getColor, _SkyTextEditorAdapterService_hasLink, _SkyTextEditorAdapterService_getParent, _SkyTextEditorAdapterService_cleanUpBlankStyleTags, _SkyTextEditorAdapterService_replaceHtmlCodes, _SkyTextEditorAdapterService_setEditorDisabled;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { STYLE_STATE_DEFAULTS } from '../defaults/style-state-defaults';
|
|
6
|
-
import { UrlTarget } from '../url-modal/text-editor-url-target';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./text-editor-selection.service";
|
|
9
|
-
import * as i2 from "./text-editor.service";
|
|
10
|
-
import * as i3 from "@skyux/core";
|
|
11
|
-
/**
|
|
12
|
-
* @internal
|
|
13
|
-
*/
|
|
14
|
-
export class SkyTextEditorAdapterService {
|
|
15
|
-
constructor(selectionService, textEditorService, windowService) {
|
|
16
|
-
_SkyTextEditorAdapterService_instances.add(this);
|
|
17
|
-
_SkyTextEditorAdapterService_selectionService.set(this, void 0);
|
|
18
|
-
_SkyTextEditorAdapterService_textEditorService.set(this, void 0);
|
|
19
|
-
_SkyTextEditorAdapterService_windowRef.set(this, void 0);
|
|
20
|
-
__classPrivateFieldSet(this, _SkyTextEditorAdapterService_selectionService, selectionService, "f");
|
|
21
|
-
__classPrivateFieldSet(this, _SkyTextEditorAdapterService_textEditorService, textEditorService, "f");
|
|
22
|
-
__classPrivateFieldSet(this, _SkyTextEditorAdapterService_windowRef, windowService, "f");
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Creates a text editor inside the supplied iframe element.
|
|
26
|
-
*/
|
|
27
|
-
initEditor(id, iframeElement, styleState, placeholder) {
|
|
28
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_createObservers).call(this, iframeElement);
|
|
29
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
30
|
-
const styleEl = documentEl.createElement('style');
|
|
31
|
-
styleEl.innerHTML = `.editor:empty:before {
|
|
32
|
-
content: attr(data-placeholder);
|
|
33
|
-
font-family: "Blackbaud Sans", Arial, sans-serif;
|
|
34
|
-
color: #686c73;
|
|
35
|
-
font-weight: 400;
|
|
36
|
-
font-size: 15px;
|
|
37
|
-
font-style: italic;
|
|
38
|
-
}`;
|
|
39
|
-
documentEl.head.appendChild(styleEl);
|
|
40
|
-
const style = {
|
|
41
|
-
...STYLE_STATE_DEFAULTS,
|
|
42
|
-
...styleState,
|
|
43
|
-
};
|
|
44
|
-
const bodyStyle = `background-color: ${style.backColor};
|
|
45
|
-
color: ${style.fontColor};
|
|
46
|
-
font-family: ${style.font};
|
|
47
|
-
font-size: ${style.fontSize}px`;
|
|
48
|
-
documentEl.querySelector('html')?.setAttribute('lang', 'en');
|
|
49
|
-
documentEl.body.setAttribute('contenteditable', 'true');
|
|
50
|
-
documentEl.body.setAttribute('id', id);
|
|
51
|
-
documentEl.body.setAttribute('role', 'main');
|
|
52
|
-
documentEl.body.setAttribute('class', 'editor');
|
|
53
|
-
documentEl.body.setAttribute('style', bodyStyle);
|
|
54
|
-
documentEl.body.setAttribute('data-placeholder', placeholder || '');
|
|
55
|
-
}
|
|
56
|
-
disableEditor(focusableChildren, textEditorNativeElement) {
|
|
57
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_setEditorDisabled).call(this, focusableChildren, textEditorNativeElement, true);
|
|
58
|
-
}
|
|
59
|
-
enableEditor(focusableChildren, textEditorNativeElement) {
|
|
60
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_setEditorDisabled).call(this, focusableChildren, textEditorNativeElement, false);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Executes a command on the text editor with the corresponding id.
|
|
64
|
-
*/
|
|
65
|
-
execCommand(editorCommand) {
|
|
66
|
-
/* istanbul ignore else */
|
|
67
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor) {
|
|
68
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
69
|
-
/* istanbul ignore else */
|
|
70
|
-
if (this.editorSelected()) {
|
|
71
|
-
documentEl.execCommand(editorCommand.command, false, editorCommand.value);
|
|
72
|
-
this.focusEditor();
|
|
73
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor.commandChangeObservable.next();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
getCurrentSelection() {
|
|
78
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_selectionService, "f").getCurrentSelection(__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this));
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Returns a data URI using the provided text string.
|
|
82
|
-
* Used to display a merge field inside a string of text.
|
|
83
|
-
*/
|
|
84
|
-
getMergeFieldDataURI(text) {
|
|
85
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_windowRef, "f").nativeWindow.document;
|
|
86
|
-
let textToUse = text;
|
|
87
|
-
if (text.length > 18) {
|
|
88
|
-
textToUse = text.substr(0, 15) + '...';
|
|
89
|
-
}
|
|
90
|
-
const canvasElement = documentEl.createElement('canvas');
|
|
91
|
-
canvasElement.setAttribute('height', '20');
|
|
92
|
-
canvasElement.setAttribute('width', '100');
|
|
93
|
-
canvasElement.style.backgroundColor = 'tan';
|
|
94
|
-
canvasElement.style.border = '1px solid #000000';
|
|
95
|
-
canvasElement.style.borderRadius = '5px';
|
|
96
|
-
const context = canvasElement.getContext('2d');
|
|
97
|
-
context.font = '12px Arial';
|
|
98
|
-
context.textAlign = 'center';
|
|
99
|
-
context.fillText(textToUse, 50, 15);
|
|
100
|
-
context.globalCompositeOperation = 'destination-over';
|
|
101
|
-
context.fillStyle = '#00FFFF';
|
|
102
|
-
context.fillRect(0, 0, 100, 20);
|
|
103
|
-
context.globalCompositeOperation = 'source-over';
|
|
104
|
-
context.lineWidth = 2;
|
|
105
|
-
context.strokeStyle = '#FF0000';
|
|
106
|
-
context.strokeRect(0, 0, 100, 20);
|
|
107
|
-
const result = canvasElement.toDataURL('image/png', 1.0);
|
|
108
|
-
return result;
|
|
109
|
-
}
|
|
110
|
-
getStyleState() {
|
|
111
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
112
|
-
/* istanbul ignore else */
|
|
113
|
-
if (this.editorSelected()) {
|
|
114
|
-
return {
|
|
115
|
-
backColor: __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getColor).call(this, documentEl, 'BackColor'),
|
|
116
|
-
fontColor: __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getColor).call(this, documentEl, 'ForeColor'),
|
|
117
|
-
fontSize: parseInt(__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getFontSize).call(this), undefined),
|
|
118
|
-
font: documentEl.queryCommandValue('fontname'),
|
|
119
|
-
boldState: documentEl.queryCommandState('Bold'),
|
|
120
|
-
italicState: documentEl.queryCommandState('Italic'),
|
|
121
|
-
underlineState: documentEl.queryCommandState('Underline'),
|
|
122
|
-
linkState: __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_hasLink).call(this),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
/* istanbul ignore next */
|
|
126
|
-
return {};
|
|
127
|
-
}
|
|
128
|
-
getEditorInnerHtml() {
|
|
129
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
130
|
-
if (documentEl) {
|
|
131
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_replaceHtmlCodes).call(this, documentEl.body.innerHTML);
|
|
132
|
-
}
|
|
133
|
-
return '';
|
|
134
|
-
}
|
|
135
|
-
setEditorInnerHtml(value) {
|
|
136
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
137
|
-
const editorContent = documentEl.body;
|
|
138
|
-
/* istanbul ignore else */
|
|
139
|
-
if (editorContent.innerHTML !== value) {
|
|
140
|
-
editorContent.innerHTML = value;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
focusEditor() {
|
|
144
|
-
/* istanbul ignore else */
|
|
145
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor) {
|
|
146
|
-
const windowEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getContentWindowEl).call(this);
|
|
147
|
-
const iframeDocumentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
148
|
-
const currentSelection = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_selectionService, "f").getCurrentSelectionRange(iframeDocumentEl, windowEl);
|
|
149
|
-
const cursorIsNotActiveAndHasReset = currentSelection &&
|
|
150
|
-
currentSelection.startOffset === 0 &&
|
|
151
|
-
currentSelection.endOffset === 0;
|
|
152
|
-
if (!this.editorSelected() || cursorIsNotActiveAndHasReset) {
|
|
153
|
-
// focus the end of the editor
|
|
154
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_windowRef, "f").nativeWindow.document;
|
|
155
|
-
const editor = iframeDocumentEl.body;
|
|
156
|
-
const range = documentEl.createRange();
|
|
157
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor.iframeElementRef.focus();
|
|
158
|
-
editor.focus();
|
|
159
|
-
if (windowEl.getSelection && documentEl.createRange) {
|
|
160
|
-
range.selectNodeContents(editor);
|
|
161
|
-
range.collapse(false);
|
|
162
|
-
const sel = windowEl.getSelection();
|
|
163
|
-
sel?.removeAllRanges();
|
|
164
|
-
sel?.addRange(range);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
// Cursor may not be active, restore it
|
|
169
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor.iframeElementRef.focus();
|
|
170
|
-
iframeDocumentEl.body.focus();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
getLink() {
|
|
175
|
-
let link;
|
|
176
|
-
const anchorEl = this.getSelectedAnchorTag();
|
|
177
|
-
if (anchorEl && anchorEl.href) {
|
|
178
|
-
link = {
|
|
179
|
-
target: anchorEl.getAttribute('target') === '_blank'
|
|
180
|
-
? UrlTarget.NewWindow
|
|
181
|
-
: UrlTarget.None,
|
|
182
|
-
url: anchorEl.href,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
return link;
|
|
186
|
-
}
|
|
187
|
-
getSelectedAnchorTag() {
|
|
188
|
-
const selectedEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getCurrentSelectionParentElement).call(this);
|
|
189
|
-
if (selectedEl) {
|
|
190
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getParent).call(this, selectedEl, 'a');
|
|
191
|
-
}
|
|
192
|
-
/* istanbul ignore next */
|
|
193
|
-
return undefined;
|
|
194
|
-
}
|
|
195
|
-
saveSelection() {
|
|
196
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_selectionService, "f").getCurrentSelectionRange(__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this), __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getContentWindowEl).call(this));
|
|
197
|
-
}
|
|
198
|
-
selectElement(element) {
|
|
199
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_selectionService, "f").selectElement(__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this), __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getContentWindowEl).call(this), element);
|
|
200
|
-
}
|
|
201
|
-
setPlaceholder(placeholder) {
|
|
202
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
203
|
-
documentEl.body.setAttribute('data-placeholder', placeholder || '');
|
|
204
|
-
}
|
|
205
|
-
setFontSize(fontSize) {
|
|
206
|
-
const doc = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
207
|
-
this.execCommand({ command: 'fontSize', value: '1' });
|
|
208
|
-
const fontElements = Array.from(doc.querySelectorAll('font[size="1"]'));
|
|
209
|
-
for (const element of fontElements) {
|
|
210
|
-
element.removeAttribute('size');
|
|
211
|
-
element.style.fontSize = fontSize + 'px';
|
|
212
|
-
}
|
|
213
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_cleanUpBlankStyleTags).call(this, doc);
|
|
214
|
-
this.focusEditor();
|
|
215
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor.commandChangeObservable.next();
|
|
216
|
-
}
|
|
217
|
-
removeObservers(setting) {
|
|
218
|
-
/* istanbul ignore next */
|
|
219
|
-
const documentEl = setting.iframeElementRef.contentWindow
|
|
220
|
-
? setting.iframeElementRef.contentWindow.document
|
|
221
|
-
: setting.iframeElementRef.contentDocument;
|
|
222
|
-
setting.selectionChangeObservable.complete();
|
|
223
|
-
setting.clickObservable.complete();
|
|
224
|
-
setting.commandChangeObservable.complete();
|
|
225
|
-
if (documentEl) {
|
|
226
|
-
documentEl.removeEventListener('selectionchange', setting.selectionListener);
|
|
227
|
-
documentEl.removeEventListener('input', setting.selectionListener);
|
|
228
|
-
documentEl.removeEventListener('mousedown', setting.clickListener);
|
|
229
|
-
documentEl.body.removeEventListener('paste', setting.pasteListener);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
editorSelected() {
|
|
233
|
-
const documentEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this);
|
|
234
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_selectionService, "f").isElementSelected(documentEl, documentEl.body);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
_SkyTextEditorAdapterService_selectionService = new WeakMap(), _SkyTextEditorAdapterService_textEditorService = new WeakMap(), _SkyTextEditorAdapterService_windowRef = new WeakMap(), _SkyTextEditorAdapterService_instances = new WeakSet(), _SkyTextEditorAdapterService_getContentWindowEl = function _SkyTextEditorAdapterService_getContentWindowEl() {
|
|
238
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor.iframeElementRef
|
|
239
|
-
.contentWindow;
|
|
240
|
-
}, _SkyTextEditorAdapterService_getChildSelectedAnchorTags = function _SkyTextEditorAdapterService_getChildSelectedAnchorTags() {
|
|
241
|
-
const selectedRange = this.getCurrentSelection()?.getRangeAt(0);
|
|
242
|
-
if (selectedRange && selectedRange.toString().length <= 0) {
|
|
243
|
-
return [];
|
|
244
|
-
}
|
|
245
|
-
const parentElement = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getCurrentSelectionParentElement).call(this);
|
|
246
|
-
let childElements = [];
|
|
247
|
-
/* istanbul ignore else */
|
|
248
|
-
if (parentElement) {
|
|
249
|
-
childElements = Array.from(parentElement.querySelectorAll('a'));
|
|
250
|
-
}
|
|
251
|
-
/* istanbul ignore next */
|
|
252
|
-
return childElements.filter((element) => {
|
|
253
|
-
// IE specific
|
|
254
|
-
if (selectedRange) {
|
|
255
|
-
if (!selectedRange.intersectsNode) {
|
|
256
|
-
if (!element || !element.href) {
|
|
257
|
-
return false;
|
|
258
|
-
}
|
|
259
|
-
const tempRange = document.createRange();
|
|
260
|
-
tempRange.selectNodeContents(element);
|
|
261
|
-
return ((selectedRange.compareBoundaryPoints(Range.START_TO_START, tempRange) !== -1 &&
|
|
262
|
-
selectedRange.compareBoundaryPoints(Range.START_TO_END, tempRange) !== 1) ||
|
|
263
|
-
(selectedRange.compareBoundaryPoints(Range.END_TO_START, tempRange) !== -1 &&
|
|
264
|
-
selectedRange.compareBoundaryPoints(Range.END_TO_END, tempRange) !== 1));
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
// Normal non-IE
|
|
268
|
-
return (!!element && !!element.href && selectedRange?.intersectsNode(element));
|
|
269
|
-
});
|
|
270
|
-
}, _SkyTextEditorAdapterService_getIframeDocumentEl = function _SkyTextEditorAdapterService_getIframeDocumentEl() {
|
|
271
|
-
const contentWindowEl = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getContentWindowEl).call(this);
|
|
272
|
-
/* istanbul ignore else */
|
|
273
|
-
if (contentWindowEl) {
|
|
274
|
-
return contentWindowEl.document;
|
|
275
|
-
}
|
|
276
|
-
/* istanbul ignore next */
|
|
277
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_textEditorService, "f").editor.iframeElementRef
|
|
278
|
-
.contentDocument;
|
|
279
|
-
}, _SkyTextEditorAdapterService_getFontSize = function _SkyTextEditorAdapterService_getFontSize() {
|
|
280
|
-
let fontSize = STYLE_STATE_DEFAULTS.fontSize.toString();
|
|
281
|
-
const selection = this.getCurrentSelection();
|
|
282
|
-
/* istanbul ignore else */
|
|
283
|
-
if (selection &&
|
|
284
|
-
selection.anchorNode &&
|
|
285
|
-
selection.anchorNode.parentElement) {
|
|
286
|
-
let element = selection.anchorNode;
|
|
287
|
-
if (element?.nodeType !== 1) {
|
|
288
|
-
element = element?.parentElement;
|
|
289
|
-
}
|
|
290
|
-
const computedStyle = window.getComputedStyle(element);
|
|
291
|
-
/* istanbul ignore else */
|
|
292
|
-
if (computedStyle) {
|
|
293
|
-
fontSize = computedStyle.getPropertyValue('font-size');
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
return fontSize;
|
|
297
|
-
}, _SkyTextEditorAdapterService_createObservers = function _SkyTextEditorAdapterService_createObservers(element) {
|
|
298
|
-
/* istanbul ignore next */
|
|
299
|
-
const documentEl = element.contentWindow
|
|
300
|
-
? element.contentWindow.document
|
|
301
|
-
: element.contentDocument;
|
|
302
|
-
// Firefox bug where we need to open/close to cancel load so it doesn't overwrite attrs
|
|
303
|
-
documentEl.open();
|
|
304
|
-
documentEl.close();
|
|
305
|
-
const selectionObservable = new Subject();
|
|
306
|
-
const selectionListener = () => selectionObservable.next();
|
|
307
|
-
const clickObservable = new Subject();
|
|
308
|
-
const clickListener = () => clickObservable.next();
|
|
309
|
-
const pasteListener = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getPasteOverride).call(this);
|
|
310
|
-
const blurObservable = new Subject();
|
|
311
|
-
const blurListener = () => blurObservable.next();
|
|
312
|
-
const inputObservable = new Subject();
|
|
313
|
-
const inputListener = () => inputObservable.next();
|
|
314
|
-
documentEl.addEventListener('selectionchange', selectionListener);
|
|
315
|
-
documentEl.addEventListener('input', inputListener);
|
|
316
|
-
documentEl.addEventListener('mousedown', clickListener);
|
|
317
|
-
documentEl.body.addEventListener('paste', pasteListener);
|
|
318
|
-
documentEl.body.addEventListener('blur', blurListener);
|
|
319
|
-
return {
|
|
320
|
-
blurObservable,
|
|
321
|
-
clickObservable,
|
|
322
|
-
commandChangeObservable: new Subject(),
|
|
323
|
-
iframeElementRef: element,
|
|
324
|
-
inputObservable,
|
|
325
|
-
selectionChangeObservable: selectionObservable,
|
|
326
|
-
blurListener,
|
|
327
|
-
clickListener,
|
|
328
|
-
inputListener,
|
|
329
|
-
pasteListener,
|
|
330
|
-
selectionListener,
|
|
331
|
-
};
|
|
332
|
-
}, _SkyTextEditorAdapterService_getPasteOverride = function _SkyTextEditorAdapterService_getPasteOverride() {
|
|
333
|
-
/* istanbul ignore next */
|
|
334
|
-
return (e) => {
|
|
335
|
-
e.preventDefault();
|
|
336
|
-
const text = e.clipboardData?.getData('text/plain');
|
|
337
|
-
if (text !== undefined) {
|
|
338
|
-
this.execCommand({ command: 'insertHTML', value: text.toString() });
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
}, _SkyTextEditorAdapterService_getCurrentSelectionParentElement = function _SkyTextEditorAdapterService_getCurrentSelectionParentElement() {
|
|
342
|
-
return __classPrivateFieldGet(this, _SkyTextEditorAdapterService_selectionService, "f").getCurrentSelectionParentElement(__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this));
|
|
343
|
-
}, _SkyTextEditorAdapterService_getColor = function _SkyTextEditorAdapterService_getColor(documentEl, selector) {
|
|
344
|
-
const commandValue = documentEl.queryCommandValue(selector);
|
|
345
|
-
// Edge is weird and returns numbers
|
|
346
|
-
/* istanbul ignore if */
|
|
347
|
-
if (typeof commandValue === 'number') {
|
|
348
|
-
/* istanbul ignore next */
|
|
349
|
-
return ('rgb(' +
|
|
350
|
-
(commandValue & 0xff) +
|
|
351
|
-
', ' +
|
|
352
|
-
((commandValue & 0xff00) >> 8) +
|
|
353
|
-
', ' +
|
|
354
|
-
((commandValue & 0xff0000) >> 16) +
|
|
355
|
-
')');
|
|
356
|
-
}
|
|
357
|
-
// Firefox uses 'Transparent' instead of a color value
|
|
358
|
-
/* istanbul ignore next */
|
|
359
|
-
if (commandValue.toString().toLowerCase() === 'transparent') {
|
|
360
|
-
return STYLE_STATE_DEFAULTS.backColor;
|
|
361
|
-
}
|
|
362
|
-
return commandValue;
|
|
363
|
-
}, _SkyTextEditorAdapterService_hasLink = function _SkyTextEditorAdapterService_hasLink() {
|
|
364
|
-
const anchorEl = this.getSelectedAnchorTag();
|
|
365
|
-
const childAnchorEls = __classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getChildSelectedAnchorTags).call(this);
|
|
366
|
-
/* istanbul ignore next */
|
|
367
|
-
return childAnchorEls.length > 0 || (!!anchorEl && !!anchorEl.href);
|
|
368
|
-
}, _SkyTextEditorAdapterService_getParent = function _SkyTextEditorAdapterService_getParent(element, tag) {
|
|
369
|
-
let currentNode = element;
|
|
370
|
-
while (currentNode && currentNode.tagName.toUpperCase() !== 'BODY') {
|
|
371
|
-
if (currentNode.tagName.toUpperCase() === tag.toUpperCase()) {
|
|
372
|
-
return currentNode;
|
|
373
|
-
}
|
|
374
|
-
currentNode = currentNode.parentElement;
|
|
375
|
-
}
|
|
376
|
-
return undefined;
|
|
377
|
-
}, _SkyTextEditorAdapterService_cleanUpBlankStyleTags = function _SkyTextEditorAdapterService_cleanUpBlankStyleTags(doc) {
|
|
378
|
-
const orphanElements = Array.from(doc.querySelectorAll('font,span,*[style=""]'));
|
|
379
|
-
for (const element of orphanElements) {
|
|
380
|
-
if (!element.getAttribute('style')) {
|
|
381
|
-
element.removeAttribute('style');
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
const removableElements = orphanElements.filter((element) => {
|
|
385
|
-
const tagName = element.tagName.toUpperCase();
|
|
386
|
-
return ((tagName === 'FONT' || tagName === 'SPAN') &&
|
|
387
|
-
(element.attributes.length === 0 || !element.hasChildNodes));
|
|
388
|
-
});
|
|
389
|
-
for (const element of removableElements) {
|
|
390
|
-
const parent = element.parentNode;
|
|
391
|
-
/* istanbul ignore else */
|
|
392
|
-
if (parent) {
|
|
393
|
-
while (element.firstChild) {
|
|
394
|
-
parent.insertBefore(element.firstChild, element);
|
|
395
|
-
}
|
|
396
|
-
parent.removeChild(element);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}, _SkyTextEditorAdapterService_replaceHtmlCodes = function _SkyTextEditorAdapterService_replaceHtmlCodes(str) {
|
|
400
|
-
return str
|
|
401
|
-
.replace(/ /, String.fromCharCode(160))
|
|
402
|
-
.replace(/</g, '<')
|
|
403
|
-
.replace(/>/g, '>')
|
|
404
|
-
.replace(/&/g, '&');
|
|
405
|
-
}, _SkyTextEditorAdapterService_setEditorDisabled = function _SkyTextEditorAdapterService_setEditorDisabled(focusableChildren, textEditorNativeElement, disabled) {
|
|
406
|
-
textEditorNativeElement.style.pointerEvents = disabled ? 'none' : 'auto';
|
|
407
|
-
textEditorNativeElement.setAttribute('aria-disabled', disabled ? 'true' : 'false');
|
|
408
|
-
/* istanbul ignore else */
|
|
409
|
-
if (focusableChildren.length > 0) {
|
|
410
|
-
focusableChildren.forEach((aFocusableChild) => {
|
|
411
|
-
aFocusableChild.tabIndex = disabled ? -1 : 0;
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
__classPrivateFieldGet(this, _SkyTextEditorAdapterService_instances, "m", _SkyTextEditorAdapterService_getIframeDocumentEl).call(this).body.setAttribute('contenteditable', disabled ? 'false' : 'true');
|
|
415
|
-
};
|
|
416
|
-
SkyTextEditorAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorAdapterService, deps: [{ token: i1.SkyTextEditorSelectionService }, { token: i2.SkyTextEditorService }, { token: i3.SkyAppWindowRef }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
417
|
-
SkyTextEditorAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorAdapterService });
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorAdapterService, decorators: [{
|
|
419
|
-
type: Injectable
|
|
420
|
-
}], ctorParameters: function () { return [{ type: i1.SkyTextEditorSelectionService }, { type: i2.SkyTextEditorService }, { type: i3.SkyAppWindowRef }]; } });
|
|
421
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3ItYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RleHQtZWRpdG9yL3NyYy9saWIvbW9kdWxlcy90ZXh0LWVkaXRvci9zZXJ2aWNlcy90ZXh0LWVkaXRvci1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFLeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7OztBQUtoRTs7R0FFRztBQUVILE1BQU0sT0FBTywyQkFBMkI7SUFLdEMsWUFDRSxnQkFBK0MsRUFDL0MsaUJBQXVDLEVBQ3ZDLGFBQThCOztRQVBoQyxnRUFBaUQ7UUFDakQsaUVBQXlDO1FBQ3pDLHlEQUE0QjtRQU8xQix1QkFBQSxJQUFJLGlEQUFxQixnQkFBZ0IsTUFBQSxDQUFDO1FBQzFDLHVCQUFBLElBQUksa0RBQXNCLGlCQUFpQixNQUFBLENBQUM7UUFDNUMsdUJBQUEsSUFBSSwwQ0FBYyxhQUFhLE1BQUEsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQ2YsRUFBVSxFQUNWLGFBQWdDLEVBQ2hDLFVBQW1DLEVBQ25DLFdBQW9CO1FBRXBCLHVCQUFBLElBQUksc0RBQW1CLENBQUMsTUFBTSxHQUFHLHVCQUFBLElBQUksNEZBQWlCLE1BQXJCLElBQUksRUFBa0IsYUFBYSxDQUFDLENBQUM7UUFFdEUsTUFBTSxVQUFVLEdBQUcsdUJBQUEsSUFBSSxnR0FBcUIsTUFBekIsSUFBSSxDQUF1QixDQUFDO1FBRS9DLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxh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bnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5QXBwV2luZG93UmVmIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNUWUxFX1NUQVRFX0RFRkFVTFRTIH0gZnJvbSAnLi4vZGVmYXVsdHMvc3R5bGUtc3RhdGUtZGVmYXVsdHMnO1xuaW1wb3J0IHsgRWRpdG9yQ29tbWFuZCB9IGZyb20gJy4uL3R5cGVzL2VkaXRvci1jb21tYW5kJztcbmltcG9ydCB7IEVkaXRvclNldHRpbmcgfSBmcm9tICcuLi90eXBlcy9lZGl0b3Itc2V0dGluZyc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB9IGZyb20gJy4uL3R5cGVzL3N0eWxlLXN0YXRlJztcbmltcG9ydCB7IFVybE1vZGFsUmVzdWx0IH0gZnJvbSAnLi4vdXJsLW1vZGFsL3RleHQtZWRpdG9yLXVybC1tb2RhbC1yZXN1bHQnO1xuaW1wb3J0IHsgVXJsVGFyZ2V0IH0gZnJvbSAnLi4vdXJsLW1vZGFsL3RleHQtZWRpdG9yLXVybC10YXJnZXQnO1xuXG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vdGV4dC1lZGl0b3Itc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvclNlcnZpY2UgfSBmcm9tICcuL3RleHQtZWRpdG9yLnNlcnZpY2UnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2t5VGV4dEVkaXRvckFkYXB0ZXJTZXJ2aWNlIHtcbiAgI3NlbGVjdGlvblNlcnZpY2U6IFNreVRleHRFZGl0b3JTZWxlY3Rpb25TZXJ2aWNlO1xuICAjdGV4dEVkaXRvclNlcnZpY2U6IFNreVRleHRFZGl0b3JTZXJ2aWNlO1xuICAjd2luZG93UmVmOiBTa3lBcHBXaW5kb3dSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2VsZWN0aW9uU2VydmljZTogU2t5VGV4dEVkaXRvclNlbGVjdGlvblNlcnZpY2UsXG4gICAgdGV4dEVkaXRvclNlcnZpY2U6IFNreVRleHRFZGl0b3JTZXJ2aWNlLFxuICAgIHdpbmRvd1NlcnZpY2U6IFNreUFwcFdpbmRvd1JlZlxuICApIHtcbiAgICB0aGlzLiNzZWxlY3Rpb25TZXJ2aWNlID0gc2VsZWN0aW9uU2VydmljZTtcbiAgICB0aGlzLiN0ZXh0RWRpdG9yU2VydmljZSA9IHRleHRFZGl0b3JTZXJ2aWNlO1xuICAgIHRoaXMuI3dpbmRvd1JlZiA9IHdpbmRvd1NlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRleHQgZWRpdG9yIGluc2lkZSB0aGUgc3VwcGxpZWQgaWZyYW1lIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgaW5pdEVkaXRvcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGlmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LFxuICAgIHN0eWxlU3RhdGU6IFNreVRleHRFZGl0b3JTdHlsZVN0YXRlLFxuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHRoaXMuI3RleHRFZGl0b3JTZXJ2aWNlLmVkaXRvciA9IHRoaXMuI2NyZWF0ZU9ic2VydmVycyhpZnJhbWVFbGVtZW50KTtcblxuICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLiNnZXRJZnJhbWVEb2N1bWVudEVsKCk7XG5cbiAgICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnRFbC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWwuaW5uZXJIVE1MID0gYC5lZGl0b3I6ZW1wdHk6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgICBmb250LWZhbWlseTogXCJCbGFja2JhdWQgU2Fuc1wiLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICAgIGNvbG9yOiAjNjg2YzczO1xuICAgICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICB9YDtcbiAgICBkb2N1bWVudEVsLmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG5cbiAgICBjb25zdCBzdHlsZTogU2t5VGV4dEVkaXRvclN0eWxlU3RhdGUgPSB7XG4gICAgICAuLi5TVFlMRV9TVEFURV9ERUZBVUxUUyxcbiAgICAgIC4uLnN0eWxlU3RhdGUsXG4gICAgfTtcbiAgICBjb25zdCBib2R5U3R5bGUgPSBgYmFja2dyb3VuZC1jb2xvcjogJHtzdHlsZS5iYWNrQ29sb3J9O1xuICAgICAgY29sb3I6ICR7c3R5bGUuZm9udENvbG9yfTtcbiAgICAgIGZvbnQtZmFtaWx5OiAke3N0eWxlLmZvbnR9O1xuICAgICAgZm9udC1zaXplOiAke3N0eWxlLmZvbnRTaXplfXB4YDtcbiAgICBkb2N1bWVudEVsLnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKT8uc2V0QXR0cmlidXRlKCdsYW5nJywgJ2VuJyk7XG4gICAgZG9jdW1lbnRFbC5ib2R5LnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuc2V0QXR0cmlidXRlKCdpZCcsIGlkKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuc2V0QXR0cmlidXRlKCdyb2xlJywgJ21haW4nKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuc2V0QXR0cmlidXRlKCdjbGFzcycsICdlZGl0b3InKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuc2V0QXR0cmlidXRlKCdzdHlsZScsIGJvZHlTdHlsZSk7XG4gICAgZG9jdW1lbnRFbC5ib2R5LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIHBsYWNlaG9sZGVyIHx8ICcnKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlRWRpdG9yKFxuICAgIGZvY3VzYWJsZUNoaWxkcmVuOiBIVE1MRWxlbWVudFtdLFxuICAgIHRleHRFZGl0b3JOYXRpdmVFbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiB2b2lkIHtcbiAgICB0aGlzLiNzZXRFZGl0b3JEaXNhYmxlZChmb2N1c2FibGVDaGlsZHJlbiwgdGV4dEVkaXRvck5hdGl2ZUVsZW1lbnQsIHRydWUpO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZUVkaXRvcihcbiAgICBmb2N1c2FibGVDaGlsZHJlbjogSFRNTEVsZW1lbnRbXSxcbiAgICB0ZXh0RWRpdG9yTmF0aXZlRWxlbWVudDogSFRNTEVsZW1lbnRcbiAgKTogdm9pZCB7XG4gICAgdGhpcy4jc2V0RWRpdG9yRGlzYWJsZWQoZm9jdXNhYmxlQ2hpbGRyZW4sIHRleHRFZGl0b3JOYXRpdmVFbGVtZW50LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBjb21tYW5kIG9uIHRoZSB0ZXh0IGVkaXRvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGlkLlxuICAgKi9cbiAgcHVibGljIGV4ZWNDb21tYW5kKGVkaXRvckNvbW1hbmQ6IEVkaXRvckNvbW1hbmQpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLiN0ZXh0RWRpdG9yU2VydmljZS5lZGl0b3IpIHtcbiAgICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLiNnZXRJZnJhbWVEb2N1bWVudEVsKCk7XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5lZGl0b3JTZWxlY3RlZCgpKSB7XG4gICAgICAgIGRvY3VtZW50RWwuZXhlY0NvbW1hbmQoXG4gICAgICAgICAgZWRpdG9yQ29tbWFuZC5jb21tYW5kLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGVkaXRvckNvbW1hbmQudmFsdWVcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICAgIHRoaXMuI3RleHRFZGl0b3JTZXJ2aWNlLmVkaXRvci5jb21tYW5kQ2hhbmdlT2JzZXJ2YWJsZS5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRTZWxlY3Rpb24oKTogU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFNlbGVjdGlvbihcbiAgICAgIHRoaXMuI2dldElmcmFtZURvY3VtZW50RWwoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGRhdGEgVVJJIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IHN0cmluZy5cbiAgICogVXNlZCB0byBkaXNwbGF5IGEgbWVyZ2UgZmllbGQgaW5zaWRlIGEgc3RyaW5nIG9mIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVyZ2VGaWVsZERhdGFVUkkodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy4jd2luZG93UmVmLm5hdGl2ZVdpbmRvdy5kb2N1bWVudDtcbiAgICBsZXQgdGV4dFRvVXNlID0gdGV4dDtcbiAgICBpZiAodGV4dC5sZW5ndGggPiAxOCkge1xuICAgICAgdGV4dFRvVXNlID0gdGV4dC5zdWJzdHIoMCwgMTUpICsgJy4uLic7XG4gICAgfVxuXG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50RWwuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcyMCcpO1xuICAgIGNhbnZhc0VsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsICcxMDAnKTtcbiAgICBjYW52YXNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0YW4nO1xuICAgIGNhbnZhc0VsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDAwMDAwJztcbiAgICBjYW52YXNFbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc1cHgnO1xuXG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb250ZXh0LmZvbnQgPSAnMTJweCBBcmlhbCc7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LmZpbGxUZXh0KHRleHRUb1VzZSwgNTAsIDE1KTtcblxuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW92ZXInO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyMwMEZGRkYnO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgMTAwLCAyMCk7XG5cbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAyO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGMDAwMCc7XG4gICAgY29udGV4dC5zdHJva2VSZWN0KDAsIDAsIDEwMCwgMjApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FudmFzRWxlbWVudC50b0RhdGFVUkwoJ2ltYWdlL3BuZycsIDEuMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHlsZVN0YXRlKCk6IFBhcnRpYWw8U2t5VGV4dEVkaXRvclN0eWxlU3RhdGU+IHtcbiAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy4jZ2V0SWZyYW1lRG9jdW1lbnRFbCgpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5lZGl0b3JTZWxlY3RlZCgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYWNrQ29sb3I6IHRoaXMuI2dldENvbG9yKGRvY3VtZW50RWwsICdCYWNrQ29sb3InKSxcbiAgICAgICAgZm9udENvbG9yOiB0aGlzLiNnZXRDb2xvcihkb2N1bWVudEVsLCAnRm9yZUNvbG9yJyksXG4gICAgICAgIGZvbnRTaXplOiBwYXJzZUludCh0aGlzLiNnZXRGb250U2l6ZSgpLCB1bmRlZmluZWQpLFxuICAgICAgICBmb250OiBkb2N1bWVudEVsLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250bmFtZScpLFxuICAgICAgICBib2xkU3RhdGU6IGRvY3VtZW50RWwucXVlcnlDb21tYW5kU3RhdGUoJ0JvbGQnKSxcbiAgICAgICAgaXRhbGljU3RhdGU6IGRvY3VtZW50RWwucXVlcnlDb21tYW5kU3RhdGUoJ0l0YWxpYycpLFxuICAgICAgICB1bmRlcmxpbmVTdGF0ZTogZG9jdW1lbnRFbC5xdWVyeUNvbW1hbmRTdGF0ZSgnVW5kZXJsaW5lJyksXG4gICAgICAgIGxpbmtTdGF0ZTogdGhpcy4jaGFzTGluaygpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFZGl0b3JJbm5lckh0bWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy4jZ2V0SWZyYW1lRG9jdW1lbnRFbCgpO1xuICAgIGlmIChkb2N1bWVudEVsKSB7XG4gICAgICByZXR1cm4gdGhpcy4jcmVwbGFjZUh0bWxDb2Rlcyhkb2N1bWVudEVsLmJvZHkuaW5uZXJIVE1MKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIHNldEVkaXRvcklubmVySHRtbCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZG9jdW1lbnRFbCA9IHRoaXMuI2dldElmcmFtZURvY3VtZW50RWwoKTtcbiAgICBjb25zdCBlZGl0b3JDb250ZW50ID0gZG9jdW1lbnRFbC5ib2R5O1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVkaXRvckNvbnRlbnQuaW5uZXJIVE1MICE9PSB2YWx1ZSkge1xuICAgICAgZWRpdG9yQ29udGVudC5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9jdXNFZGl0b3IoKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy4jdGV4dEVkaXRvclNlcnZpY2UuZWRpdG9yKSB7XG4gICAgICBjb25zdCB3aW5kb3dFbCA9IHRoaXMuI2dldENvbnRlbnRXaW5kb3dFbCgpO1xuICAgICAgY29uc3QgaWZyYW1lRG9jdW1lbnRFbCA9IHRoaXMuI2dldElmcmFtZURvY3VtZW50RWwoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb24gPSB0aGlzLiNzZWxlY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgaWZyYW1lRG9jdW1lbnRFbCxcbiAgICAgICAgd2luZG93RWxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJzb3JJc05vdEFjdGl2ZUFuZEhhc1Jlc2V0ID1cbiAgICAgICAgY3VycmVudFNlbGVjdGlvbiAmJlxuICAgICAgICBjdXJyZW50U2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ID09PSAwICYmXG4gICAgICAgIGN1cnJlbnRTZWxlY3Rpb24uZW5kT2Zmc2V0ID09PSAwO1xuXG4gICAgICBpZiAoIXRoaXMuZWRpdG9yU2VsZWN0ZWQoKSB8fCBjdXJzb3JJc05vdEFjdGl2ZUFuZEhhc1Jlc2V0KSB7XG4gICAgICAgIC8vIGZvY3VzIHRoZSBlbmQgb2YgdGhlIGVkaXRvclxuICAgICAgICBjb25zdCBkb2N1bWVudEVsID0gdGhpcy4jd2luZG93UmVmLm5hdGl2ZVdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gaWZyYW1lRG9jdW1lbnRFbC5ib2R5IGFzIEhUTUxCb2R5RWxlbWVudDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudEVsLmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgdGhpcy4jdGV4dEVkaXRvclNlcnZpY2UuZWRpdG9yLmlmcmFtZUVsZW1lbnRSZWYuZm9jdXMoKTtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvd0VsLmdldFNlbGVjdGlvbiAmJiBkb2N1bWVudEVsLmNyZWF0ZVJhbmdlKSB7XG4gICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcik7XG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvd0VsLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIHNlbD8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgc2VsPy5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEN1cnNvciBtYXkgbm90IGJlIGFjdGl2ZSwgcmVzdG9yZSBpdFxuICAgICAgICB0aGlzLiN0ZXh0RWRpdG9yU2VydmljZS5lZGl0b3IuaWZyYW1lRWxlbWVudFJlZi5mb2N1cygpO1xuICAgICAgICBpZnJhbWVEb2N1bWVudEVsLmJvZHkuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TGluaygpOiBVcmxNb2RhbFJlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxpbms6IFVybE1vZGFsUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFuY2hvckVsID0gdGhpcy5nZXRTZWxlY3RlZEFuY2hvclRhZygpO1xuICAgIGlmIChhbmNob3JFbCAmJiBhbmNob3JFbC5ocmVmKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICB0YXJnZXQ6XG4gICAgICAgICAgYW5jaG9yRWwuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKSA9PT0gJ19ibGFuaydcbiAgICAgICAgICAgID8gVXJsVGFyZ2V0Lk5ld1dpbmRvd1xuICAgICAgICAgICAgOiBVcmxUYXJnZXQuTm9uZSxcbiAgICAgICAgdXJsOiBhbmNob3JFbC5ocmVmLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluaztcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEFuY2hvclRhZygpOiBIVE1MQW5jaG9yRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlbGVjdGVkRWwgPSB0aGlzLiNnZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudCgpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWwpIHtcbiAgICAgIHJldHVybiB0aGlzLiNnZXRQYXJlbnQoc2VsZWN0ZWRFbCwgJ2EnKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVNlbGVjdGlvbigpOiBSYW5nZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFNlbGVjdGlvblJhbmdlKFxuICAgICAgdGhpcy4jZ2V0SWZyYW1lRG9jdW1lbnRFbCgpLFxuICAgICAgdGhpcy4jZ2V0Q29udGVudFdpbmRvd0VsKClcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLiNzZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEVsZW1lbnQoXG4gICAgICB0aGlzLiNnZXRJZnJhbWVEb2N1bWVudEVsKCksXG4gICAgICB0aGlzLiNnZXRDb250ZW50V2luZG93RWwoKSxcbiAgICAgIGVsZW1lbnRcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZG9jdW1lbnRFbCA9IHRoaXMuI2dldElmcmFtZURvY3VtZW50RWwoKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgcGxhY2Vob2xkZXIgfHwgJycpO1xuICB9XG5cbiAgcHVibGljIHNldEZvbnRTaXplKGZvbnRTaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkb2MgPSB0aGlzLiNnZXRJZnJhbWVEb2N1bWVudEVsKCk7XG4gICAgdGhpcy5leGVjQ29tbWFuZCh7IGNvbW1hbmQ6ICdmb250U2l6ZScsIHZhbHVlOiAnMScgfSk7XG4gICAgY29uc3QgZm9udEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gQXJyYXkuZnJvbShcbiAgICAgIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdmb250W3NpemU9XCIxXCJdJylcbiAgICApO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb250RWxlbWVudHMpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzaXplJyk7XG4gICAgICBlbGVtZW50LnN0eWxlLmZvbnRTaXplID0gZm9udFNpemUgKyAncHgnO1xuICAgIH1cbiAgICB0aGlzLiNjbGVhblVwQmxhbmtTdHlsZVRhZ3MoZG9jKTtcblxuICAgIHRoaXMuZm9jdXNFZGl0b3IoKTtcbiAgICB0aGlzLiN0ZXh0RWRpdG9yU2VydmljZS5lZGl0b3IuY29tbWFuZENoYW5nZU9ic2VydmFibGUubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZU9ic2VydmVycyhzZXR0aW5nOiBFZGl0b3JTZXR0aW5nKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb25zdCBkb2N1bWVudEVsID0gc2V0dGluZy5pZnJhbWVFbGVtZW50UmVmLmNvbnRlbnRXaW5kb3dcbiAgICAgID8gc2V0dGluZy5pZnJhbWVFbGVtZW50UmVmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnRcbiAgICAgIDogc2V0dGluZy5pZnJhbWVFbGVtZW50UmVmLmNvbnRlbnREb2N1bWVudDtcbiAgICBzZXR0aW5nLnNlbGVjdGlvbkNoYW5nZU9ic2VydmFibGUuY29tcGxldGUoKTtcbiAgICBzZXR0aW5nLmNsaWNrT2JzZXJ2YWJsZS5jb21wbGV0ZSgpO1xuICAgIHNldHRpbmcuY29tbWFuZENoYW5nZU9ic2VydmFibGUuY29tcGxldGUoKTtcbiAgICBpZiAoZG9jdW1lbnRFbCkge1xuICAgICAgZG9jdW1lbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAnc2VsZWN0aW9uY2hhbmdlJyxcbiAgICAgICAgc2V0dGluZy5zZWxlY3Rpb25MaXN0ZW5lclxuICAgICAgKTtcbiAgICAgIGRvY3VtZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBzZXR0aW5nLnNlbGVjdGlvbkxpc3RlbmVyKTtcbiAgICAgIGRvY3VtZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc2V0dGluZy5jbGlja0xpc3RlbmVyKTtcbiAgICAgIGRvY3VtZW50RWwuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIHNldHRpbmcucGFzdGVMaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgI2dldENvbnRlbnRXaW5kb3dFbCgpOiBXaW5kb3cge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0RWRpdG9yU2VydmljZS5lZGl0b3IuaWZyYW1lRWxlbWVudFJlZlxuICAgICAgLmNvbnRlbnRXaW5kb3cgYXMgV2luZG93O1xuICB9XG5cbiAgI2dldENoaWxkU2VsZWN0ZWRBbmNob3JUYWdzKCk6IEVsZW1lbnRbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSYW5nZSA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApO1xuICAgIGlmIChzZWxlY3RlZFJhbmdlICYmIHNlbGVjdGVkUmFuZ2UudG9TdHJpbmcoKS5sZW5ndGggPD0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLiNnZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudCgpO1xuXG4gICAgbGV0IGNoaWxkRWxlbWVudHM6IEhUTUxBbmNob3JFbGVtZW50W10gPSBbXTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwYXJlbnRFbGVtZW50KSB7XG4gICAgICBjaGlsZEVsZW1lbnRzID0gQXJyYXkuZnJvbShwYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKSk7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gY2hpbGRFbGVtZW50cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcbiAgICAgIC8vIElFIHNwZWNpZmljXG4gICAgICBpZiAoc2VsZWN0ZWRSYW5nZSkge1xuICAgICAgICBpZiAoIXNlbGVjdGVkUmFuZ2UuaW50ZXJzZWN0c05vZGUpIHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuaHJlZikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB0ZW1wUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgIHRlbXBSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChzZWxlY3RlZFJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhcbiAgICAgICAgICAgICAgUmFuZ2UuU1RBUlRfVE9fU1RBUlQsXG4gICAgICAgICAgICAgIHRlbXBSYW5nZVxuICAgICAgICAgICAgKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoXG4gICAgICAgICAgICAgICAgUmFuZ2UuU1RBUlRfVE9fRU5ELFxuICAgICAgICAgICAgICAgIHRlbXBSYW5nZVxuICAgICAgICAgICAgICApICE9PSAxKSB8fFxuICAgICAgICAgICAgKHNlbGVjdGVkUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFxuICAgICAgICAgICAgICBSYW5nZS5FTkRfVE9fU1RBUlQsXG4gICAgICAgICAgICAgIHRlbXBSYW5nZVxuICAgICAgICAgICAgKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoXG4gICAgICAgICAgICAgICAgUmFuZ2UuRU5EX1RPX0VORCxcbiAgICAgICAgICAgICAgICB0ZW1wUmFuZ2VcbiAgICAgICAgICAgICAgKSAhPT0gMSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE5vcm1hbCBub24tSUVcbiAgICAgIHJldHVybiAoXG4gICAgICAgICEhZWxlbWVudCAmJiAhIWVsZW1lbnQuaHJlZiAmJiBzZWxlY3RlZFJhbmdlPy5pbnRlcnNlY3RzTm9kZShlbGVtZW50KVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gICNnZXRJZnJhbWVEb2N1bWVudEVsKCk6IERvY3VtZW50IHtcbiAgICBjb25zdCBjb250ZW50V2luZG93RWwgPSB0aGlzLiNnZXRDb250ZW50V2luZG93RWwoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChjb250ZW50V2luZG93RWwpIHtcbiAgICAgIHJldHVybiBjb250ZW50V2luZG93RWwuZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy4jdGV4dEVkaXRvclNlcnZpY2UuZWRpdG9yLmlmcmFtZUVsZW1lbnRSZWZcbiAgICAgIC5jb250ZW50RG9jdW1lbnQgYXMgRG9jdW1lbnQ7XG4gIH1cblxuICAjZ2V0Rm9udFNpemUoKTogc3RyaW5nIHtcbiAgICBsZXQgZm9udFNpemUgPSBTVFlMRV9TVEFURV9ERUZBVUxUUy5mb250U2l6ZS50b1N0cmluZygpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKFxuICAgICAgc2VsZWN0aW9uICYmXG4gICAgICBzZWxlY3Rpb24uYW5jaG9yTm9kZSAmJlxuICAgICAgc2VsZWN0aW9uLmFuY2hvck5vZGUucGFyZW50RWxlbWVudFxuICAgICkge1xuICAgICAgbGV0IGVsZW1lbnQgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbWVudD8ubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCBhcyBFbGVtZW50KTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoY29tcHV0ZWRTdHlsZSkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbiAgfVxuXG4gICNjcmVhdGVPYnNlcnZlcnMoZWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQpOiBFZGl0b3JTZXR0aW5nIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSBlbGVtZW50LmNvbnRlbnRXaW5kb3dcbiAgICAgID8gZWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50XG4gICAgICA6IChlbGVtZW50LmNvbnRlbnREb2N1bWVudCBhcyBEb2N1bWVudCk7XG5cbiAgICAvLyBGaXJlZm94IGJ1ZyB3aGVyZSB3ZSBuZWVkIHRvIG9wZW4vY2xvc2UgdG8gY2FuY2VsIGxvYWQgc28gaXQgZG9lc24ndCBvdmVyd3JpdGUgYXR0cnNcbiAgICBkb2N1bWVudEVsLm9wZW4oKTtcbiAgICBkb2N1bWVudEVsLmNsb3NlKCk7XG5cbiAgICBjb25zdCBzZWxlY3Rpb25PYnNlcnZhYmxlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdCBzZWxlY3Rpb25MaXN0ZW5lciA9ICgpOiB2b2lkID0+IHNlbGVjdGlvbk9ic2VydmFibGUubmV4dCgpO1xuICAgIGNvbnN0IGNsaWNrT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgY29uc3QgY2xpY2tMaXN0ZW5lciA9ICgpOiB2b2lkID0+IGNsaWNrT2JzZXJ2YWJsZS5uZXh0KCk7XG4gICAgY29uc3QgcGFzdGVMaXN0ZW5lciA9IHRoaXMuI2dldFBhc3RlT3ZlcnJpZGUoKTtcbiAgICBjb25zdCBibHVyT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgY29uc3QgYmx1ckxpc3RlbmVyID0gKCk6IHZvaWQgPT4gYmx1ck9ic2VydmFibGUubmV4dCgpO1xuICAgIGNvbnN0IGlucHV0T2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgY29uc3QgaW5wdXRMaXN0ZW5lciA9ICgpOiB2b2lkID0+IGlucHV0T2JzZXJ2YWJsZS5uZXh0KCk7XG5cbiAgICBkb2N1bWVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbmNoYW5nZScsIHNlbGVjdGlvbkxpc3RlbmVyKTtcbiAgICBkb2N1bWVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaW5wdXRMaXN0ZW5lcik7XG4gICAgZG9jdW1lbnRFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjbGlja0xpc3RlbmVyKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCBwYXN0ZUxpc3RlbmVyKTtcbiAgICBkb2N1bWVudEVsLmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGJsdXJMaXN0ZW5lcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJsdXJPYnNlcnZhYmxlLFxuICAgICAgY2xpY2tPYnNlcnZhYmxlLFxuICAgICAgY29tbWFuZENoYW5nZU9ic2VydmFibGU6IG5ldyBTdWJqZWN0KCksXG4gICAgICBpZnJhbWVFbGVtZW50UmVmOiBlbGVtZW50LFxuICAgICAgaW5wdXRPYnNlcnZhYmxlLFxuICAgICAgc2VsZWN0aW9uQ2hhbmdlT2JzZXJ2YWJsZTogc2VsZWN0aW9uT2JzZXJ2YWJsZSxcbiAgICAgIGJsdXJMaXN0ZW5lcixcbiAgICAgIGNsaWNrTGlzdGVuZXIsXG4gICAgICBpbnB1dExpc3RlbmVyLFxuICAgICAgcGFzdGVMaXN0ZW5lcixcbiAgICAgIHNlbGVjdGlvbkxpc3RlbmVyLFxuICAgIH07XG4gIH1cblxuICAjZ2V0UGFzdGVPdmVycmlkZSgpOiAoZTogQ2xpcGJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIChlOiBDbGlwYm9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdGV4dCA9IGUuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xuXG4gICAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoeyBjb21tYW5kOiAnaW5zZXJ0SFRNTCcsIHZhbHVlOiB0ZXh0LnRvU3RyaW5nKCkgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gICNnZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudCgpOiBFbGVtZW50IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFNlbGVjdGlvblBhcmVudEVsZW1lbnQoXG4gICAgICB0aGlzLiNnZXRJZnJhbWVEb2N1bWVudEVsKClcbiAgICApO1xuICB9XG5cbiAgI2dldENvbG9yKGRvY3VtZW50RWw6IERvY3VtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21tYW5kVmFsdWUgPSBkb2N1bWVudEVsLnF1ZXJ5Q29tbWFuZFZhbHVlKHNlbGVjdG9yKTtcblxuICAgIC8vIEVkZ2UgaXMgd2VpcmQgYW5kIHJldHVybnMgbnVtYmVyc1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0eXBlb2YgY29tbWFuZFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgICdyZ2IoJyArXG4gICAgICAgIChjb21tYW5kVmFsdWUgJiAweGZmKSArXG4gICAgICAgICcsICcgK1xuICAgICAgICAoKGNvbW1hbmRWYWx1ZSAmIDB4ZmYwMCkgPj4gOCkgK1xuICAgICAgICAnLCAnICtcbiAgICAgICAgKChjb21tYW5kVmFsdWUgJiAweGZmMDAwMCkgPj4gMTYpICtcbiAgICAgICAgJyknXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggdXNlcyAnVHJhbnNwYXJlbnQnIGluc3RlYWQgb2YgYSBjb2xvciB2YWx1ZVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKGNvbW1hbmRWYWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgIHJldHVybiBTVFlMRV9TVEFURV9ERUZBVUxUUy5iYWNrQ29sb3I7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kVmFsdWU7XG4gIH1cblxuICAjaGFzTGluaygpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbmNob3JFbCA9IHRoaXMuZ2V0U2VsZWN0ZWRBbmNob3JUYWcoKTtcbiAgICBjb25zdCBjaGlsZEFuY2hvckVscyA9IHRoaXMuI2dldENoaWxkU2VsZWN0ZWRBbmNob3JUYWdzKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gY2hpbGRBbmNob3JFbHMubGVuZ3RoID4gMCB8fCAoISFhbmNob3JFbCAmJiAhIWFuY2hvckVsLmhyZWYpO1xuICB9XG5cbiAgI2dldFBhcmVudChlbGVtZW50OiBFbGVtZW50LCB0YWc6IHN0cmluZyk6IEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIGxldCBjdXJyZW50Tm9kZTogRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdCT0RZJykge1xuICAgICAgaWYgKGN1cnJlbnROb2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gdGFnLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGVkaXRvclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLiNnZXRJZnJhbWVEb2N1bWVudEVsKCk7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGlvblNlcnZpY2UuaXNFbGVtZW50U2VsZWN0ZWQoXG4gICAgICBkb2N1bWVudEVsLFxuICAgICAgZG9jdW1lbnRFbC5ib2R5XG4gICAgKTtcbiAgfVxuXG4gICNjbGVhblVwQmxhbmtTdHlsZVRhZ3MoZG9jOiBEb2N1bWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG9ycGhhbkVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gQXJyYXkuZnJvbShcbiAgICAgIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdmb250LHNwYW4sKltzdHlsZT1cIlwiXScpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygb3JwaGFuRWxlbWVudHMpIHtcbiAgICAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlbW92YWJsZUVsZW1lbnRzID0gb3JwaGFuRWxlbWVudHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGFnTmFtZSA9PT0gJ0ZPTlQnIHx8IHRhZ05hbWUgPT09ICdTUEFOJykgJiZcbiAgICAgICAgKGVsZW1lbnQuYXR0cmlidXRlcy5sZW5ndGggPT09IDAgfHwgIWVsZW1lbnQuaGFzQ2hpbGROb2RlcylcbiAgICAgICk7XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlbW92YWJsZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShlbGVtZW50LmZpcnN0Q2hpbGQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDZXJ0YWluIHZhbHVlcyBhcmUgZW5jb2RlZCBpbiBodG1sIGFuZCBuZWVkIHRvIGJlIGRlY29kZWRcbiAgI3JlcGxhY2VIdG1sQ29kZXMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHJcbiAgICAgIC5yZXBsYWNlKC8mbmJzcDsvLCBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpXG4gICAgICAucmVwbGFjZSgvJmx0Oy9nLCAnPCcpXG4gICAgICAucmVwbGFjZSgvJmd0Oy9nLCAnPicpXG4gICAgICAucmVwbGFjZSgvJmFtcDsvZywgJyYnKTtcbiAgfVxuXG4gICNzZXRFZGl0b3JEaXNhYmxlZChcbiAgICBmb2N1c2FibGVDaGlsZHJlbjogSFRNTEVsZW1lbnRbXSxcbiAgICB0ZXh0RWRpdG9yTmF0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgdGV4dEVkaXRvck5hdGl2ZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IGRpc2FibGVkID8gJ25vbmUnIDogJ2F1dG8nO1xuICAgIHRleHRFZGl0b3JOYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcbiAgICAgICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGRpc2FibGVkID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICAgICk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZm9jdXNhYmxlQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9jdXNhYmxlQ2hpbGRyZW4uZm9yRWFjaCgoYUZvY3VzYWJsZUNoaWxkKSA9PiB7XG4gICAgICAgIGFGb2N1c2FibGVDaGlsZC50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuI2dldElmcmFtZURvY3VtZW50RWwoKS5ib2R5LnNldEF0dHJpYnV0ZShcbiAgICAgICdjb250ZW50ZWRpdGFibGUnLFxuICAgICAgZGlzYWJsZWQgPyAnZmFsc2UnIDogJ3RydWUnXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
var _SkyTextEditorService_editor;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
/**
|
|
6
|
-
* @internal
|
|
7
|
-
*/
|
|
8
|
-
export class SkyTextEditorService {
|
|
9
|
-
constructor() {
|
|
10
|
-
_SkyTextEditorService_editor.set(this, void 0);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* A dictionary representing all active text editors and their settings.
|
|
14
|
-
*/
|
|
15
|
-
set editor(value) {
|
|
16
|
-
__classPrivateFieldSet(this, _SkyTextEditorService_editor, value, "f");
|
|
17
|
-
}
|
|
18
|
-
get editor() {
|
|
19
|
-
if (!__classPrivateFieldGet(this, _SkyTextEditorService_editor, "f")) {
|
|
20
|
-
throw new Error('Editor has not been initialized.');
|
|
21
|
-
}
|
|
22
|
-
return __classPrivateFieldGet(this, _SkyTextEditorService_editor, "f");
|
|
23
|
-
}
|
|
24
|
-
get isInitialized() {
|
|
25
|
-
return __classPrivateFieldGet(this, _SkyTextEditorService_editor, "f") !== undefined;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Returns the blur observable from the editor with the corresponding id.
|
|
29
|
-
*/
|
|
30
|
-
blurListener() {
|
|
31
|
-
return this.editor.blurObservable;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Returns the click observable from the editor with the corresponding id.
|
|
35
|
-
*/
|
|
36
|
-
clickListener() {
|
|
37
|
-
return this.editor.clickObservable;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Returns the command change observable from the editor with the corresponding id.
|
|
41
|
-
*/
|
|
42
|
-
commandChangeListener() {
|
|
43
|
-
return this.editor.commandChangeObservable;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Returns the input change observable from the editor with the corresponding id.
|
|
47
|
-
*/
|
|
48
|
-
inputListener() {
|
|
49
|
-
return this.editor.inputObservable;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Returns the selection change observable from the editor with the corresponding id.
|
|
53
|
-
*/
|
|
54
|
-
selectionChangeListener() {
|
|
55
|
-
return this.editor.selectionChangeObservable;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
_SkyTextEditorService_editor = new WeakMap();
|
|
59
|
-
SkyTextEditorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
60
|
-
SkyTextEditorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorService });
|
|
61
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorService, decorators: [{
|
|
62
|
-
type: Injectable
|
|
63
|
-
}] });
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDOztHQUVHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQURqQztRQXFCRSwrQ0FBbUM7S0FvQ3BDO0lBdkRDOztPQUVHO0lBQ0gsSUFBVyxNQUFNLENBQUMsS0FBb0I7UUFDcEMsdUJBQUEsSUFBSSxnQ0FBVyxLQUFLLE1BQUEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsSUFBSSxDQUFDLHVCQUFBLElBQUksb0NBQVEsRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDckQ7UUFFRCxPQUFPLHVCQUFBLElBQUksb0NBQVEsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sdUJBQUEsSUFBSSxvQ0FBUSxLQUFLLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBSUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUM7SUFDL0MsQ0FBQzs7O2lIQXZEVSxvQkFBb0I7cUhBQXBCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEVkaXRvclNldHRpbmcgfSBmcm9tICcuLi90eXBlcy9lZGl0b3Itc2V0dGluZyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTa3lUZXh0RWRpdG9yU2VydmljZSB7XG4gIC8qKlxuICAgKiBBIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIGFsbCBhY3RpdmUgdGV4dCBlZGl0b3JzIGFuZCB0aGVpciBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBzZXQgZWRpdG9yKHZhbHVlOiBFZGl0b3JTZXR0aW5nKSB7XG4gICAgdGhpcy4jZWRpdG9yID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVkaXRvcigpOiBFZGl0b3JTZXR0aW5nIHtcbiAgICBpZiAoIXRoaXMuI2VkaXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFZGl0b3IgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNlZGl0b3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2VkaXRvciAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgI2VkaXRvcjogRWRpdG9yU2V0dGluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYmx1ciBvYnNlcnZhYmxlIGZyb20gdGhlIGVkaXRvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGlkLlxuICAgKi9cbiAgcHVibGljIGJsdXJMaXN0ZW5lcigpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuYmx1ck9ic2VydmFibGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2xpY2sgb2JzZXJ2YWJsZSBmcm9tIHRoZSBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBjbGlja0xpc3RlbmVyKCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5jbGlja09ic2VydmFibGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tbWFuZCBjaGFuZ2Ugb2JzZXJ2YWJsZSBmcm9tIHRoZSBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBjb21tYW5kQ2hhbmdlTGlzdGVuZXIoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRDaGFuZ2VPYnNlcnZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGlucHV0IGNoYW5nZSBvYnNlcnZhYmxlIGZyb20gdGhlIGVkaXRvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGlkLlxuICAgKi9cbiAgcHVibGljIGlucHV0TGlzdGVuZXIoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlucHV0T2JzZXJ2YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gY2hhbmdlIG9ic2VydmFibGUgZnJvbSB0aGUgZWRpdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaWQuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnNlbGVjdGlvbkNoYW5nZU9ic2VydmFibGU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
var _SkyTextSanitizationService_allowedAttributes;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import createDOMPurify from 'dompurify';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const domPurify = createDOMPurify(window);
|
|
7
|
-
domPurify.addHook('afterSanitizeAttributes', (node) => {
|
|
8
|
-
// Set all elements owning target to target=_blank
|
|
9
|
-
// so we only allow the target attribute with that value.
|
|
10
|
-
if (node.getAttribute('target')) {
|
|
11
|
-
node.setAttribute('target', '_blank');
|
|
12
|
-
node.setAttribute('rel', 'noopener noreferrer');
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
/**
|
|
16
|
-
* The `SkyTextSanitizationService` user the `DOMPurify` library to sanitize strings for use
|
|
17
|
-
* in the DOM. `DOMPurify` allows more customization than Angular's internal `DomSanitizer` so we
|
|
18
|
-
* can preserve `<style>` tags and allow `target` attributes for new tab links.
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
export class SkyTextSanitizationService {
|
|
22
|
-
constructor() {
|
|
23
|
-
_SkyTextSanitizationService_allowedAttributes.set(this, ['target']);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Returns a sanitized string, allowing target attribute for new tab links.
|
|
27
|
-
*/
|
|
28
|
-
sanitize(htmlString) {
|
|
29
|
-
return domPurify.sanitize(htmlString, {
|
|
30
|
-
ADD_ATTR: __classPrivateFieldGet(this, _SkyTextSanitizationService_allowedAttributes, "f"),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
_SkyTextSanitizationService_allowedAttributes = new WeakMap();
|
|
35
|
-
SkyTextSanitizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextSanitizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
36
|
-
SkyTextSanitizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextSanitizationService, providedIn: 'root' });
|
|
37
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextSanitizationService, decorators: [{
|
|
38
|
-
type: Injectable,
|
|
39
|
-
args: [{
|
|
40
|
-
providedIn: 'root',
|
|
41
|
-
}]
|
|
42
|
-
}] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1zYW5pdGl6YXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1zYW5pdGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxlQUFlLE1BQU0sV0FBVyxDQUFDOztBQUV4QyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFMUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQzdELGtEQUFrRDtJQUNsRCx5REFBeUQ7SUFDekQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDakQ7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVIOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLDBCQUEwQjtJQUh2QztRQUlFLHdEQUErQixDQUFDLFFBQVEsQ0FBQyxFQUFDO0tBVTNDO0lBUkM7O09BRUc7SUFDSSxRQUFRLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtZQUNwQyxRQUFRLEVBQUUsdUJBQUEsSUFBSSxxREFBbUI7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O3VIQVZVLDBCQUEwQjsySEFBMUIsMEJBQTBCLGNBRnpCLE1BQU07MkZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IGNyZWF0ZURPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuXG5jb25zdCBkb21QdXJpZnkgPSBjcmVhdGVET01QdXJpZnkod2luZG93KTtcblxuZG9tUHVyaWZ5LmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgLy8gU2V0IGFsbCBlbGVtZW50cyBvd25pbmcgdGFyZ2V0IHRvIHRhcmdldD1fYmxhbmtcbiAgLy8gc28gd2Ugb25seSBhbGxvdyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSB3aXRoIHRoYXQgdmFsdWUuXG4gIGlmIChub2RlLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuICB9XG59KTtcblxuLyoqXG4gKiBUaGUgYFNreVRleHRTYW5pdGl6YXRpb25TZXJ2aWNlYCB1c2VyIHRoZSBgRE9NUHVyaWZ5YCBsaWJyYXJ5IHRvIHNhbml0aXplIHN0cmluZ3MgZm9yIHVzZVxuICogaW4gdGhlIERPTS4gYERPTVB1cmlmeWAgYWxsb3dzIG1vcmUgY3VzdG9taXphdGlvbiB0aGFuIEFuZ3VsYXIncyBpbnRlcm5hbCBgRG9tU2FuaXRpemVyYCBzbyB3ZVxuICogY2FuIHByZXNlcnZlIGA8c3R5bGU+YCB0YWdzIGFuZCBhbGxvdyBgdGFyZ2V0YCBhdHRyaWJ1dGVzIGZvciBuZXcgdGFiIGxpbmtzLlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lUZXh0U2FuaXRpemF0aW9uU2VydmljZSB7XG4gICNhbGxvd2VkQXR0cmlidXRlczogc3RyaW5nW10gPSBbJ3RhcmdldCddO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc2FuaXRpemVkIHN0cmluZywgYWxsb3dpbmcgdGFyZ2V0IGF0dHJpYnV0ZSBmb3IgbmV3IHRhYiBsaW5rcy5cbiAgICovXG4gIHB1YmxpYyBzYW5pdGl6ZShodG1sU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb21QdXJpZnkuc2FuaXRpemUoaHRtbFN0cmluZywge1xuICAgICAgQUREX0FUVFI6IHRoaXMuI2FsbG93ZWRBdHRyaWJ1dGVzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|