@leanix/components 0.2.249 → 0.2.252
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/esm2020/index.mjs +4 -3
- package/esm2020/lib/core-ui/components/ellipsis/ellipsis.component.mjs +17 -3
- package/esm2020/lib/core-ui/core-ui.module.mjs +3 -3
- package/esm2020/lib/core-ui/linkify/linkify.pipe.mjs +144 -0
- package/esm2020/lib/core-ui/linkify/unlinkify.pipe.mjs +48 -0
- package/esm2020/lib/forms-ui/components/date-input/date-input.component.mjs +2 -2
- package/esm2020/lib/forms-ui/components/single-select/single-select.component.mjs +2 -2
- package/fesm2015/leanix-components.mjs +197 -170
- package/fesm2015/leanix-components.mjs.map +1 -1
- package/fesm2020/leanix-components.mjs +195 -168
- package/fesm2020/leanix-components.mjs.map +1 -1
- package/index.d.ts +2 -2
- package/lib/core-ui/components/ellipsis/ellipsis.component.d.ts +7 -1
- package/lib/core-ui/core-ui.module.d.ts +2 -2
- package/lib/core-ui/{pipes/linkify → linkify}/linkify.pipe.d.ts +11 -0
- package/lib/core-ui/{pipes/linkify → linkify}/unlinkify.pipe.d.ts +0 -0
- package/package.json +1 -1
- package/esm2020/lib/core-ui/pipes/linkify/linkify.pipe.mjs +0 -130
- package/esm2020/lib/core-ui/pipes/linkify/unlinkify.pipe.mjs +0 -48
package/index.d.ts
CHANGED
@@ -3,8 +3,6 @@ export * from './lib/core-ui/core-ui.constants';
|
|
3
3
|
export * from './lib/core-ui/annotations/required';
|
4
4
|
export * from './lib/core-ui/pipes/br.pipe';
|
5
5
|
export * from './lib/core-ui/pipes/custom-date.pipe';
|
6
|
-
export * from './lib/core-ui/pipes/linkify/linkify.pipe';
|
7
|
-
export * from './lib/core-ui/pipes/linkify/unlinkify.pipe';
|
8
6
|
export * from './lib/core-ui/pipes/lx-is-uuid.pipe';
|
9
7
|
export * from './lib/core-ui/pipes/lx-time-ago.pipe';
|
10
8
|
export * from './lib/core-ui/pipes/lx-translate.pipe';
|
@@ -38,6 +36,8 @@ export * from './lib/core-ui/tooltip/tooltip-position.interface';
|
|
38
36
|
export * from './lib/core-ui/tooltip/tooltip.component';
|
39
37
|
export * from './lib/core-ui/tooltip/tooltip.directive';
|
40
38
|
export * from './lib/core-ui/tooltip/tooltip.module';
|
39
|
+
export * from './lib/core-ui/linkify/linkify.pipe';
|
40
|
+
export * from './lib/core-ui/linkify/unlinkify.pipe';
|
41
41
|
export * from './lib/core-ui/functions/core-css.helpers';
|
42
42
|
export * from './lib/core-ui/services/resize-observer.service';
|
43
43
|
export * from './lib/forms-ui/forms-ui.module';
|
@@ -17,6 +17,11 @@ export declare class EllipsisComponent implements OnInit, OnDestroy {
|
|
17
17
|
private translateService;
|
18
18
|
static DEFAULT_RESIZE_DEBOUNCE_MS: number;
|
19
19
|
content: string;
|
20
|
+
/**
|
21
|
+
* Only set this to false if the content is not a user provided string
|
22
|
+
* or if you sanitize the provided content yourself.
|
23
|
+
*/
|
24
|
+
escapeHtmlInContent: boolean;
|
20
25
|
private contentSpanEl$;
|
21
26
|
contentSpanEl: ElementRef<HTMLSpanElement>;
|
22
27
|
private showMoreButtonEl$;
|
@@ -24,6 +29,7 @@ export declare class EllipsisComponent implements OnInit, OnDestroy {
|
|
24
29
|
isShowingMore$: BehaviorSubject<boolean>;
|
25
30
|
showButton$: Observable<boolean>;
|
26
31
|
showMoreButtonLabel$: Observable<string>;
|
32
|
+
sanitizedContent$: Observable<string>;
|
27
33
|
private content$;
|
28
34
|
private destroyed$;
|
29
35
|
constructor(debounceMsAfterResize: number, cdRef: ChangeDetectorRef, hostEl: ElementRef, resizeObserverService: ResizeObserverService, translateService: TranslateService);
|
@@ -33,5 +39,5 @@ export declare class EllipsisComponent implements OnInit, OnDestroy {
|
|
33
39
|
private detectChangesWhenObservableEmits;
|
34
40
|
private isContentOverflowing;
|
35
41
|
static ɵfac: i0.ɵɵFactoryDeclaration<EllipsisComponent, never>;
|
36
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<EllipsisComponent, "lx-ellipsis", never, { "content": "content"; }, {}, never, never>;
|
42
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EllipsisComponent, "lx-ellipsis", never, { "content": "content"; "escapeHtmlInContent": "escapeHtmlInContent"; }, {}, never, never>;
|
37
43
|
}
|
@@ -15,8 +15,8 @@ import * as i13 from "./pipes/highlight-range.pipe";
|
|
15
15
|
import * as i14 from "./pipes/highlight-term.pipe";
|
16
16
|
import * as i15 from "./directives/html.directive";
|
17
17
|
import * as i16 from "./components/icon-scale/icon-scale.component";
|
18
|
-
import * as i17 from "./
|
19
|
-
import * as i18 from "./
|
18
|
+
import * as i17 from "./linkify/linkify.pipe";
|
19
|
+
import * as i18 from "./linkify/unlinkify.pipe";
|
20
20
|
import * as i19 from "./pipes/lx-time-ago.pipe";
|
21
21
|
import * as i20 from "./pipes/lx-translate.pipe";
|
22
22
|
import * as i21 from "./pipes/markdown.pipe";
|
@@ -6,6 +6,8 @@ import * as i0 from "@angular/core";
|
|
6
6
|
* - markdown link syntax
|
7
7
|
* ... into clickable anchor elements.
|
8
8
|
*
|
9
|
+
* The characters "<" and ">" are escaped with their HTML entities < and >.
|
10
|
+
*
|
9
11
|
* You have an user interface where you don't want clickable links but also
|
10
12
|
* don't want users to see the "ugly" markdown link syntax?
|
11
13
|
* -> Use the 'lxUnlikify' pipe to replace markdown link syntax with just the link name
|
@@ -43,6 +45,15 @@ export declare class LxLinkifyPipe implements PipeTransform {
|
|
43
45
|
private turnMarkdownStyleLinksIntoAnchorTags;
|
44
46
|
private wrapRawHttpLinksWithAnchorTags;
|
45
47
|
private getAllRegexMatches;
|
48
|
+
/**
|
49
|
+
* We assume that lxLinkify is exclusively used on user provided strings.
|
50
|
+
* This is why we want to escape any other HTML tags that are already present in the string.
|
51
|
+
* The logic implemented here has been used with no issues for three years in our Fact Sheet comments. See https://github.com/gregjacobs/Autolinker.js/pull/313
|
52
|
+
*
|
53
|
+
* When using lxLinkify in conjunction with other pipes that add HTML, make sure to use lxLinkify first,
|
54
|
+
* so that it doesn't escape the HTML of any previous pipes.
|
55
|
+
*/
|
56
|
+
private escapeHtmlInUserProvidedString;
|
46
57
|
static ɵfac: i0.ɵɵFactoryDeclaration<LxLinkifyPipe, never>;
|
47
58
|
static ɵpipe: i0.ɵɵPipeDeclaration<LxLinkifyPipe, "lxLinkify">;
|
48
59
|
}
|
File without changes
|
package/package.json
CHANGED
@@ -1,130 +0,0 @@
|
|
1
|
-
import { Pipe } from '@angular/core';
|
2
|
-
import * as i0 from "@angular/core";
|
3
|
-
/**
|
4
|
-
* This pipe transforms...
|
5
|
-
* - "raw" http(s) links
|
6
|
-
* - markdown link syntax
|
7
|
-
* ... into clickable anchor elements.
|
8
|
-
*
|
9
|
-
* You have an user interface where you don't want clickable links but also
|
10
|
-
* don't want users to see the "ugly" markdown link syntax?
|
11
|
-
* -> Use the 'lxUnlikify' pipe to replace markdown link syntax with just the link name
|
12
|
-
*/
|
13
|
-
export class LxLinkifyPipe {
|
14
|
-
transform(text) {
|
15
|
-
if (text && typeof text === 'string') {
|
16
|
-
const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(text);
|
17
|
-
const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
|
18
|
-
return textWithRawAndNamedLinks;
|
19
|
-
}
|
20
|
-
else {
|
21
|
-
return text;
|
22
|
-
}
|
23
|
-
}
|
24
|
-
turnMarkdownStyleLinksIntoAnchorTags(text) {
|
25
|
-
let textWithRawAndNamedLinks = text;
|
26
|
-
const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
|
27
|
-
namedLinkMatches.forEach((namedLinkMatch) => {
|
28
|
-
const [source, name, url] = namedLinkMatch;
|
29
|
-
const urlIsValid = url && !/javascript\:/i.test(url);
|
30
|
-
if (source && name && urlIsValid) {
|
31
|
-
textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
|
32
|
-
}
|
33
|
-
});
|
34
|
-
return textWithRawAndNamedLinks;
|
35
|
-
}
|
36
|
-
wrapRawHttpLinksWithAnchorTags(text) {
|
37
|
-
let textWithRawLinks = text;
|
38
|
-
/**
|
39
|
-
* Keeping track of this index prevents infinite loops
|
40
|
-
* where a previously processed link starts with the same characters
|
41
|
-
* as a second link.
|
42
|
-
* e.g. https://angular.io/docs followed by https://angular.io
|
43
|
-
*/
|
44
|
-
let nextIndexToStartReplacingFrom = 0;
|
45
|
-
const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
|
46
|
-
rawLinkMatches.forEach((rawLinkMatch) => {
|
47
|
-
const [url] = rawLinkMatch;
|
48
|
-
const wrapUrlInAnchor = (sanitizedUrlMatch) => {
|
49
|
-
const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
|
50
|
-
const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
|
51
|
-
const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
|
52
|
-
textWithRawLinks = firstPart + secondPart;
|
53
|
-
nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
|
54
|
-
};
|
55
|
-
if (url) {
|
56
|
-
/*
|
57
|
-
* TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
|
58
|
-
* The following is RegExp that handles the same stuff as the JS code below:
|
59
|
-
*
|
60
|
-
* /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
|
61
|
-
*
|
62
|
-
* Demo on regex101: https://regex101.com/r/7Vl9bg/1
|
63
|
-
*
|
64
|
-
* Check lookbehind support here: https://caniuse.com/?search=lookbehind
|
65
|
-
*/
|
66
|
-
const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
|
67
|
-
const textUsedToPerformMatching = rawLinkMatch.input;
|
68
|
-
const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
|
69
|
-
const twoCharactersInFrontOfTheLink = rawLinkMatch.index > 3
|
70
|
-
? `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`
|
71
|
-
: '';
|
72
|
-
const isMarkdownSyntaxLink = twoCharactersInFrontOfTheLink === '](';
|
73
|
-
if (!isMarkdownSyntaxLink && lastCharacterInUrl === '.') {
|
74
|
-
const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
|
75
|
-
if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
|
76
|
-
const urlWithoutDotAtTheEnd = url.slice(0, -1);
|
77
|
-
wrapUrlInAnchor(urlWithoutDotAtTheEnd);
|
78
|
-
}
|
79
|
-
}
|
80
|
-
else if (!isMarkdownSyntaxLink) {
|
81
|
-
wrapUrlInAnchor(url);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
});
|
85
|
-
return textWithRawLinks;
|
86
|
-
}
|
87
|
-
getAllRegexMatches(regex, input) {
|
88
|
-
let match;
|
89
|
-
const matches = [];
|
90
|
-
while ((match = regex.exec(input)) !== null) {
|
91
|
-
matches.push(match);
|
92
|
-
}
|
93
|
-
return matches;
|
94
|
-
}
|
95
|
-
}
|
96
|
-
/**
|
97
|
-
* This is not the "one URL regex to rule them all", but a more realistic one which should work
|
98
|
-
* for any URLs that our customers include in text fields on a Fact Sheet.
|
99
|
-
*
|
100
|
-
* Regex rules explained in plain text:
|
101
|
-
*
|
102
|
-
* (?:(?:https?):\/\/) -> Links must start with "https://" or "http://"
|
103
|
-
*
|
104
|
-
* (?:[^\s/$.?#][^\s]*(?<![\.)])) LET'S SPLIT THIS ONE UP
|
105
|
-
*
|
106
|
-
* [^\s/$.?#][^\s]* -> Match any legal URL character until the next whitespace
|
107
|
-
* (?<![\.)] -> A negative lookahead to prevent matching a dot or parenthesis following a URL
|
108
|
-
*
|
109
|
-
* Link to regex101: https://regex101.com/r/d3KtfH/1 (NOTE: please update this link when changing the regex)
|
110
|
-
*/
|
111
|
-
LxLinkifyPipe.HTTP_LINK_REGEX = /(?:(?:https?):\/\/)(?:[^\s/$.?#][^\s]*)/gi;
|
112
|
-
/**
|
113
|
-
* This will match the markdown link syntax: [link name](url)
|
114
|
-
* Regex rules explained in plain text:
|
115
|
-
*
|
116
|
-
* (?:\[([^\]]*)\]) -> Match any characters inside square brackets
|
117
|
-
* \(([^\s\/$.?#][^\s]*)\) -> Notice that this is the same regex as the HTTP_LINK_REGEX above,
|
118
|
-
* but without the requirement for the http protocol.
|
119
|
-
* This allows for links without including the protocol or also "mailto:hello@world.de" links
|
120
|
-
*
|
121
|
-
* Link to regex101: https://regex101.com/r/5UMUH8/1
|
122
|
-
*/
|
123
|
-
LxLinkifyPipe.NAMED_LINK_REGEX = /(?:\[([^\]]*)\])\(([^\s\/$.?#][^\s]*)\)/gi;
|
124
|
-
LxLinkifyPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: LxLinkifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
125
|
-
LxLinkifyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: LxLinkifyPipe, name: "lxLinkify" });
|
126
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: LxLinkifyPipe, decorators: [{
|
127
|
-
type: Pipe,
|
128
|
-
args: [{ name: 'lxLinkify' }]
|
129
|
-
}] });
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RixPQUFPLHdCQUF3QixDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVPLG9DQUFvQyxDQUFDLElBQVk7UUFDdkQsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUU7Z0JBQ2hDLHdCQUF3QixHQUFHLHdCQUF3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QUMsS0FBSyxJQUFJLEVBQUU7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O0FBcEhEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ29CLDZCQUFlLEdBQUcsMkNBQTRDLENBQUE7QUFFckY7Ozs7Ozs7Ozs7R0FVRztBQUNvQiw4QkFBZ0IsR0FBRywyQ0FBNEMsQ0FBQTswR0E3QjNFLGFBQWE7d0dBQWIsYUFBYTsyRkFBYixhQUFhO2tCQUR6QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGlzIHBpcGUgdHJhbnNmb3Jtcy4uLlxuICogLSBcInJhd1wiIGh0dHAocykgbGlua3NcbiAqIC0gbWFya2Rvd24gbGluayBzeW50YXhcbiAqIC4uLiBpbnRvIGNsaWNrYWJsZSBhbmNob3IgZWxlbWVudHMuXG4gKlxuICogWW91IGhhdmUgYW4gdXNlciBpbnRlcmZhY2Ugd2hlcmUgeW91IGRvbid0IHdhbnQgY2xpY2thYmxlIGxpbmtzIGJ1dCBhbHNvXG4gKiBkb24ndCB3YW50IHVzZXJzIHRvIHNlZSB0aGUgXCJ1Z2x5XCIgbWFya2Rvd24gbGluayBzeW50YXg/XG4gKiAtPiBVc2UgdGhlICdseFVubGlraWZ5JyBwaXBlIHRvIHJlcGxhY2UgbWFya2Rvd24gbGluayBzeW50YXggd2l0aCBqdXN0IHRoZSBsaW5rIG5hbWVcbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHhMaW5raWZ5JyB9KVxuZXhwb3J0IGNsYXNzIEx4TGlua2lmeVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgbm90IHRoZSBcIm9uZSBVUkwgcmVnZXggdG8gcnVsZSB0aGVtIGFsbFwiLCBidXQgYSBtb3JlIHJlYWxpc3RpYyBvbmUgd2hpY2ggc2hvdWxkIHdvcmtcbiAgICogZm9yIGFueSBVUkxzIHRoYXQgb3VyIGN1c3RvbWVycyBpbmNsdWRlIGluIHRleHQgZmllbGRzIG9uIGEgRmFjdCBTaGVldC5cbiAgICpcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/Oig/Omh0dHBzPyk6XFwvXFwvKSAgICAgICAtPiAgICBMaW5rcyBtdXN0IHN0YXJ0IHdpdGggXCJodHRwczovL1wiIG9yIFwiaHR0cDovL1wiXG4gICAqXG4gICAqICg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKSBMRVQnUyBTUExJVCBUSElTIE9ORSBVUFxuICAgKlxuICAgKiBbXlxccy8kLj8jXVteXFxzXSogICAtPiAgICBNYXRjaCBhbnkgbGVnYWwgVVJMIGNoYXJhY3RlciB1bnRpbCB0aGUgbmV4dCB3aGl0ZXNwYWNlXG4gICAqICg/PCFbXFwuKV0gICAgICAgICAgLT4gICAgQSBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gcHJldmVudCBtYXRjaGluZyBhIGRvdCBvciBwYXJlbnRoZXNpcyBmb2xsb3dpbmcgYSBVUkxcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci9kM0t0ZkgvMSAoTk9URTogcGxlYXNlIHVwZGF0ZSB0aGlzIGxpbmsgd2hlbiBjaGFuZ2luZyB0aGUgcmVnZXgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhUVFBfTElOS19SRUdFWCA9IC8oPzooPzpodHRwcz8pOlxcL1xcLykoPzpbXlxccy8kLj8jXVteXFxzXSopL2dpO1xuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgbWF0Y2ggdGhlIG1hcmtkb3duIGxpbmsgc3ludGF4OiBbbGluayBuYW1lXSh1cmwpXG4gICAqIFJlZ2V4IHJ1bGVzIGV4cGxhaW5lZCBpbiBwbGFpbiB0ZXh0OlxuICAgKlxuICAgKiAoPzpcXFsoW15cXF1dKilcXF0pICAgICAgICAgICAgLT4gICAgIE1hdGNoIGFueSBjaGFyYWN0ZXJzIGluc2lkZSBzcXVhcmUgYnJhY2tldHNcbiAgICogXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKSAgICAgLT4gICAgIE5vdGljZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgcmVnZXggYXMgdGhlIEhUVFBfTElOS19SRUdFWCBhYm92ZSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgd2l0aG91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBodHRwIHByb3RvY29sLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBsaW5rcyB3aXRob3V0IGluY2x1ZGluZyB0aGUgcHJvdG9jb2wgb3IgYWxzbyBcIm1haWx0bzpoZWxsb0B3b3JsZC5kZVwiIGxpbmtzXG4gICAqXG4gICAqIExpbmsgdG8gcmVnZXgxMDE6IGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvNVVNVUg4LzFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkFNRURfTElOS19SRUdFWCA9IC8oPzpcXFsoW15cXF1dKilcXF0pXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKS9naTtcblxuICB0cmFuc2Zvcm0odGV4dD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBpZiAodGV4dCAmJiB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRleHRXaXRoUmF3TGlua3MgPSB0aGlzLndyYXBSYXdIdHRwTGlua3NXaXRoQW5jaG9yVGFncyh0ZXh0KTtcbiAgICAgIGNvbnN0IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRoaXMudHVybk1hcmtkb3duU3R5bGVMaW5rc0ludG9BbmNob3JUYWdzKHRleHRXaXRoUmF3TGlua3MpO1xuICAgICAgcmV0dXJuIHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0dXJuTWFya2Rvd25TdHlsZUxpbmtzSW50b0FuY2hvclRhZ3ModGV4dDogc3RyaW5nKSB7XG4gICAgbGV0IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHQ7XG4gICAgY29uc3QgbmFtZWRMaW5rTWF0Y2hlcyA9IHRoaXMuZ2V0QWxsUmVnZXhNYXRjaGVzKEx4TGlua2lmeVBpcGUuTkFNRURfTElOS19SRUdFWCwgdGV4dCk7XG4gICAgbmFtZWRMaW5rTWF0Y2hlcy5mb3JFYWNoKChuYW1lZExpbmtNYXRjaCkgPT4ge1xuICAgICAgY29uc3QgW3NvdXJjZSwgbmFtZSwgdXJsXSA9IG5hbWVkTGlua01hdGNoO1xuICAgICAgY29uc3QgdXJsSXNWYWxpZCA9IHVybCAmJiAhL2phdmFzY3JpcHRcXDovaS50ZXN0KHVybCk7XG4gICAgICBpZiAoc291cmNlICYmIG5hbWUgJiYgdXJsSXNWYWxpZCkge1xuICAgICAgICB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MgPSB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MucmVwbGFjZShcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgYDxhIGhyZWY9XCIke3VybH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtuYW1lfTwvYT5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcztcbiAgfVxuXG4gIHByaXZhdGUgd3JhcFJhd0h0dHBMaW5rc1dpdGhBbmNob3JUYWdzKHRleHQ6IHN0cmluZykge1xuICAgIGxldCB0ZXh0V2l0aFJhd0xpbmtzID0gdGV4dDtcbiAgICAvKipcbiAgICAgKiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgaW5kZXggcHJldmVudHMgaW5maW5pdGUgbG9vcHNcbiAgICAgKiB3aGVyZSBhIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGxpbmsgc3RhcnRzIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyc1xuICAgICAqIGFzIGEgc2Vjb25kIGxpbmsuXG4gICAgICogZS5nLiBodHRwczovL2FuZ3VsYXIuaW8vZG9jcyBmb2xsb3dlZCBieSBodHRwczovL2FuZ3VsYXIuaW9cbiAgICAgKi9cbiAgICBsZXQgbmV4dEluZGV4VG9TdGFydFJlcGxhY2luZ0Zyb20gPSAwO1xuICAgIGNvbnN0IHJhd0xpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5IVFRQX0xJTktfUkVHRVgsIHRleHQpO1xuICAgIHJhd0xpbmtNYXRjaGVzLmZvckVhY2goKHJhd0xpbmtNYXRjaCkgPT4ge1xuICAgICAgY29uc3QgW3VybF0gPSByYXdMaW5rTWF0Y2g7XG4gICAgICBjb25zdCB3cmFwVXJsSW5BbmNob3IgPSAoc2FuaXRpemVkVXJsTWF0Y2g6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSB0ZXh0V2l0aFJhd0xpbmtzLnN1YnN0cmluZygwLCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSk7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhZ0h0bWwgPSBgPGEgaHJlZj1cIiR7c2FuaXRpemVkVXJsTWF0Y2h9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPiR7c2FuaXRpemVkVXJsTWF0Y2h9PC9hPmA7XG4gICAgICAgIGNvbnN0IHNlY29uZFBhcnQgPSB0ZXh0V2l0aFJhd0xpbmtzLnN1YnN0cmluZyhuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSkucmVwbGFjZShzYW5pdGl6ZWRVcmxNYXRjaCEsIGFuY2hvclRhZ0h0bWwpO1xuICAgICAgICB0ZXh0V2l0aFJhd0xpbmtzID0gZmlyc3RQYXJ0ICsgc2Vjb25kUGFydDtcbiAgICAgICAgbmV4dEluZGV4VG9TdGFydFJlcGxhY2luZ0Zyb20gPSByYXdMaW5rTWF0Y2guaW5kZXggKyBhbmNob3JUYWdIdG1sLmxlbmd0aDtcbiAgICAgIH07XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFRPRE86IGdldCByaWQgb2YgYWxsIHRoaXMgY29kZSBvbmNlIFNhZmFyaSBzdXBwb3J0cyBuZWdhdGl2ZSBsb29rYmVoaW5kcyBpbiByZWd1bGFyIGV4cHJlc3Npb25zXG4gICAgICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgUmVnRXhwIHRoYXQgaGFuZGxlcyB0aGUgc2FtZSBzdHVmZiBhcyB0aGUgSlMgY29kZSBiZWxvdzpcbiAgICAgICAgICpcbiAgICAgICAgICogLyg/Oig/Oig/PCFcXF1cXCgpKSg/Omh0dHBzfGh0dHApOlxcL1xcLykoPzpbXlxccy8kLj8jXVteXFxzXSooPzwhW1xcLildKSkvZ2k7XG4gICAgICAgICAqXG4gICAgICAgICAqIERlbW8gb24gcmVnZXgxMDE6IGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvN1ZsOWJnLzFcbiAgICAgICAgICpcbiAgICAgICAgICogQ2hlY2sgbG9va2JlaGluZCBzdXBwb3J0IGhlcmU6IGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD1sb29rYmVoaW5kXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBsYXN0VXJsQ2hhcmFjdGVySW5kZXggPSByYXdMaW5rTWF0Y2guaW5kZXggKyB1cmwubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZyA9IHJhd0xpbmtNYXRjaC5pbnB1dDtcbiAgICAgICAgY29uc3QgbGFzdENoYXJhY3RlckluVXJsID0gdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZ1tsYXN0VXJsQ2hhcmFjdGVySW5kZXhdO1xuICAgICAgICBjb25zdCB0d29DaGFyYWN0ZXJzSW5Gcm9udE9mVGhlTGluayA9XG4gICAgICAgICAgcmF3TGlua01hdGNoLmluZGV4ID4gM1xuICAgICAgICAgICAgPyBgJHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDJdfSR7dGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZ1tyYXdMaW5rTWF0Y2guaW5kZXggLSAxXX1gXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICBjb25zdCBpc01hcmtkb3duU3ludGF4TGluayA9IHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rID09PSAnXSgnO1xuXG4gICAgICAgIGlmICghaXNNYXJrZG93blN5bnRheExpbmsgJiYgbGFzdENoYXJhY3RlckluVXJsID09PSAnLicpIHtcbiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJBZnRlclVybCA9IHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbbGFzdFVybENoYXJhY3RlckluZGV4ICsgMV07XG4gICAgICAgICAgaWYgKCFjaGFyYWN0ZXJBZnRlclVybCB8fCBjaGFyYWN0ZXJBZnRlclVybCA9PT0gJyAnIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnXFxuJykge1xuICAgICAgICAgICAgY29uc3QgdXJsV2l0aG91dERvdEF0VGhlRW5kID0gdXJsLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmxXaXRob3V0RG90QXRUaGVFbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNNYXJrZG93blN5bnRheExpbmspIHtcbiAgICAgICAgICB3cmFwVXJsSW5BbmNob3IodXJsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0V2l0aFJhd0xpbmtzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxSZWdleE1hdGNoZXMocmVnZXg6IFJlZ0V4cCwgaW5wdXQ6IHN0cmluZykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICBjb25zdCBtYXRjaGVzOiBSZWdFeHBFeGVjQXJyYXlbXSA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICAgIG1hdGNoZXMucHVzaChtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG59XG4iXX0=
|
@@ -1,48 +0,0 @@
|
|
1
|
-
import { Pipe } from '@angular/core';
|
2
|
-
import { LxLinkifyPipe } from './linkify.pipe';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
/**
|
5
|
-
* This pipe replaces markdown link syntax with just the link name (omits the link altogether).
|
6
|
-
* Example: [Angular documentation](http://angular.io/docs) -> Angular documentation
|
7
|
-
*
|
8
|
-
* It can also be used for "bridging the gap" until your view is ready to use "lxLinkify"
|
9
|
-
* and you just want to get rid of the "useless" markdown syntax fast.
|
10
|
-
*
|
11
|
-
* While there are views where we want markdown style links to be clickable anchor tags,
|
12
|
-
* there are other views where this can degrade the UX.
|
13
|
-
* Example: in the Fact Sheet list on the inventory list view, having an arbitrary number
|
14
|
-
* of links on the page can slow down the keyboard navigation while navigating through the list.
|
15
|
-
*/
|
16
|
-
export class LxUnlinkifyPipe {
|
17
|
-
transform(text) {
|
18
|
-
if (text && typeof text === 'string') {
|
19
|
-
let textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName = text;
|
20
|
-
const markdownLinkSyntaxMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
|
21
|
-
markdownLinkSyntaxMatches.forEach((markdownLinkSyntaxMatch) => {
|
22
|
-
const [source, name] = markdownLinkSyntaxMatch;
|
23
|
-
if (source && name) {
|
24
|
-
textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName = textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName.replace(source, name);
|
25
|
-
}
|
26
|
-
});
|
27
|
-
return textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName;
|
28
|
-
}
|
29
|
-
else {
|
30
|
-
return text;
|
31
|
-
}
|
32
|
-
}
|
33
|
-
getAllRegexMatches(regex, input) {
|
34
|
-
let match;
|
35
|
-
const matches = [];
|
36
|
-
while ((match = regex.exec(input)) !== null) {
|
37
|
-
matches.push(match);
|
38
|
-
}
|
39
|
-
return matches;
|
40
|
-
}
|
41
|
-
}
|
42
|
-
LxUnlinkifyPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: LxUnlinkifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
43
|
-
LxUnlinkifyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: LxUnlinkifyPipe, name: "lxUnlinkify" });
|
44
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: LxUnlinkifyPipe, decorators: [{
|
45
|
-
type: Pipe,
|
46
|
-
args: [{ name: 'lxUnlinkify' }]
|
47
|
-
}] });
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5saW5raWZ5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3BpcGVzL2xpbmtpZnkvdW5saW5raWZ5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUUvQzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsSUFBSSx3REFBd0QsR0FBRyxJQUFJLENBQUM7WUFDcEUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQzVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7Z0JBQy9DLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtvQkFDbEIsd0RBQXdELEdBQUcsd0RBQXdELENBQUMsT0FBTyxDQUN6SCxNQUFNLEVBQ04sSUFBSSxDQUNMLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sd0RBQXdELENBQUM7U0FDakU7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDckQsSUFBSSxLQUE2QixDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFzQixFQUFFLENBQUM7UUFDdEMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckI7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzs0R0E1QlUsZUFBZTswR0FBZixlQUFlOzJGQUFmLGVBQWU7a0JBRDNCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTHhMaW5raWZ5UGlwZSB9IGZyb20gJy4vbGlua2lmeS5waXBlJztcblxuLyoqXG4gKiBUaGlzIHBpcGUgcmVwbGFjZXMgbWFya2Rvd24gbGluayBzeW50YXggd2l0aCBqdXN0IHRoZSBsaW5rIG5hbWUgKG9taXRzIHRoZSBsaW5rIGFsdG9nZXRoZXIpLlxuICogRXhhbXBsZTogW0FuZ3VsYXIgZG9jdW1lbnRhdGlvbl0oaHR0cDovL2FuZ3VsYXIuaW8vZG9jcykgLT4gQW5ndWxhciBkb2N1bWVudGF0aW9uXG4gKlxuICogSXQgY2FuIGFsc28gYmUgdXNlZCBmb3IgXCJicmlkZ2luZyB0aGUgZ2FwXCIgdW50aWwgeW91ciB2aWV3IGlzIHJlYWR5IHRvIHVzZSBcImx4TGlua2lmeVwiXG4gKiBhbmQgeW91IGp1c3Qgd2FudCB0byBnZXQgcmlkIG9mIHRoZSBcInVzZWxlc3NcIiBtYXJrZG93biBzeW50YXggZmFzdC5cbiAqXG4gKiBXaGlsZSB0aGVyZSBhcmUgdmlld3Mgd2hlcmUgd2Ugd2FudCBtYXJrZG93biBzdHlsZSBsaW5rcyB0byBiZSBjbGlja2FibGUgYW5jaG9yIHRhZ3MsXG4gKiB0aGVyZSBhcmUgb3RoZXIgdmlld3Mgd2hlcmUgdGhpcyBjYW4gZGVncmFkZSB0aGUgVVguXG4gKiBFeGFtcGxlOiBpbiB0aGUgRmFjdCBTaGVldCBsaXN0IG9uIHRoZSBpbnZlbnRvcnkgbGlzdCB2aWV3LCBoYXZpbmcgYW4gYXJiaXRyYXJ5IG51bWJlclxuICogb2YgbGlua3Mgb24gdGhlIHBhZ2UgY2FuIHNsb3cgZG93biB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbiB3aGlsZSBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGxpc3QuXG4gKi9cbkBQaXBlKHsgbmFtZTogJ2x4VW5saW5raWZ5JyB9KVxuZXhwb3J0IGNsYXNzIEx4VW5saW5raWZ5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odGV4dD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBpZiAodGV4dCAmJiB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCB0ZXh0V2hlcmVNYXJrZG93bkxpbmtTeW50YXhJc1JlcGxhY2VkV2l0aEp1c3RUaGVMaW5rTmFtZSA9IHRleHQ7XG4gICAgICBjb25zdCBtYXJrZG93bkxpbmtTeW50YXhNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICAgIG1hcmtkb3duTGlua1N5bnRheE1hdGNoZXMuZm9yRWFjaCgobWFya2Rvd25MaW5rU3ludGF4TWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgW3NvdXJjZSwgbmFtZV0gPSBtYXJrZG93bkxpbmtTeW50YXhNYXRjaDtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiBuYW1lKSB7XG4gICAgICAgICAgdGV4dFdoZXJlTWFya2Rvd25MaW5rU3ludGF4SXNSZXBsYWNlZFdpdGhKdXN0VGhlTGlua05hbWUgPSB0ZXh0V2hlcmVNYXJrZG93bkxpbmtTeW50YXhJc1JlcGxhY2VkV2l0aEp1c3RUaGVMaW5rTmFtZS5yZXBsYWNlKFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGV4dFdoZXJlTWFya2Rvd25MaW5rU3ludGF4SXNSZXBsYWNlZFdpdGhKdXN0VGhlTGlua05hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsUmVnZXhNYXRjaGVzKHJlZ2V4OiBSZWdFeHAsIGlucHV0OiBzdHJpbmcpIHtcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gICAgY29uc3QgbWF0Y2hlczogUmVnRXhwRXhlY0FycmF5W10gPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
|