@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.
Files changed (50) hide show
  1. package/documentation.json +185 -105
  2. package/esm2022/lib/modules/rich-text-display/rich-text-display.component.mjs +42 -0
  3. package/{esm2020 → esm2022}/lib/modules/rich-text-display/rich-text-display.module.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/modules/shared/sky-text-editor-resources.module.mjs +11 -11
  5. package/esm2022/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +197 -0
  6. package/esm2022/lib/modules/text-editor/services/text-editor-adapter.service.mjs +431 -0
  7. package/{esm2020 → esm2022}/lib/modules/text-editor/services/text-editor-selection.service.mjs +4 -4
  8. package/esm2022/lib/modules/text-editor/services/text-editor.service.mjs +59 -0
  9. package/esm2022/lib/modules/text-editor/services/text-sanitization.service.mjs +38 -0
  10. package/esm2022/lib/modules/text-editor/text-editor.component.mjs +410 -0
  11. package/{esm2020 → esm2022}/lib/modules/text-editor/text-editor.module.mjs +41 -41
  12. package/esm2022/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +207 -0
  13. package/esm2022/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +119 -0
  14. package/fesm2022/skyux-text-editor.mjs +1828 -0
  15. package/fesm2022/skyux-text-editor.mjs.map +1 -0
  16. package/lib/modules/rich-text-display/rich-text-display.component.d.ts +1 -1
  17. package/lib/modules/text-editor/menubar/text-editor-menubar.component.d.ts +1 -1
  18. package/lib/modules/text-editor/text-editor.component.d.ts +4 -2
  19. package/lib/modules/text-editor/toolbar/text-editor-toolbar.component.d.ts +1 -1
  20. package/package.json +20 -26
  21. package/esm2020/lib/modules/rich-text-display/rich-text-display.component.mjs +0 -44
  22. package/esm2020/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +0 -197
  23. package/esm2020/lib/modules/text-editor/services/text-editor-adapter.service.mjs +0 -421
  24. package/esm2020/lib/modules/text-editor/services/text-editor.service.mjs +0 -64
  25. package/esm2020/lib/modules/text-editor/services/text-sanitization.service.mjs +0 -43
  26. package/esm2020/lib/modules/text-editor/text-editor.component.mjs +0 -382
  27. package/esm2020/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +0 -204
  28. package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +0 -118
  29. package/fesm2015/skyux-text-editor.mjs +0 -1781
  30. package/fesm2015/skyux-text-editor.mjs.map +0 -1
  31. package/fesm2020/skyux-text-editor.mjs +0 -1792
  32. package/fesm2020/skyux-text-editor.mjs.map +0 -1
  33. /package/{esm2020 → esm2022}/index.mjs +0 -0
  34. /package/{esm2020 → esm2022}/lib/modules/shared/forms-utility.mjs +0 -0
  35. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-list-defaults.mjs +0 -0
  36. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-size-list-defaults.mjs +0 -0
  37. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/menu-defaults.mjs +0 -0
  38. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/style-state-defaults.mjs +0 -0
  39. /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/toolbar-action-defaults.mjs +0 -0
  40. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-command.mjs +0 -0
  41. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-setting.mjs +0 -0
  42. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/font-state.mjs +0 -0
  43. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/menu-type.mjs +0 -0
  44. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/style-state.mjs +0 -0
  45. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/text-editor-merge-field.mjs +0 -0
  46. /package/{esm2020 → esm2022}/lib/modules/text-editor/types/toolbar-action-type.mjs +0 -0
  47. /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-context.mjs +0 -0
  48. /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-result.mjs +0 -0
  49. /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-target.mjs +0 -0
  50. /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(/&nbsp;/, String.fromCharCode(160))
402
- .replace(/&lt;/g, '<')
403
- .replace(/&gt;/g, '>')
404
- .replace(/&amp;/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=