@leanix/components 0.2.249 → 0.2.252
Sign up to get free protection for your applications and to get access to all the features.
- 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
|