@leanix/components 0.2.240 → 0.2.241
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/lib/core-ui/pipes/linkify/linkify.pipe.mjs +66 -61
- package/fesm2015/leanix-components.mjs +65 -60
- package/fesm2015/leanix-components.mjs.map +1 -1
- package/fesm2020/leanix-components.mjs +65 -60
- package/fesm2020/leanix-components.mjs.map +1 -1
- package/lib/core-ui/pipes/linkify/linkify.pipe.d.ts +2 -0
- package/package.json +1 -1
@@ -13,72 +13,77 @@ import * as i0 from "@angular/core";
|
|
13
13
|
export class LxLinkifyPipe {
|
14
14
|
transform(text) {
|
15
15
|
if (text && typeof text === 'string') {
|
16
|
-
|
17
|
-
|
18
|
-
* Keeping track of this index prevents infinite loops
|
19
|
-
* where a previously processed link starts with the same characters
|
20
|
-
* as a second link.
|
21
|
-
* e.g. https://angular.io/docs followed by https://angular.io
|
22
|
-
*/
|
23
|
-
let nextIndexToStartReplacingFrom = 0;
|
24
|
-
const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
|
25
|
-
rawLinkMatches.forEach((rawLinkMatch) => {
|
26
|
-
const [url] = rawLinkMatch;
|
27
|
-
const wrapUrlInAnchor = (sanitizedUrlMatch) => {
|
28
|
-
const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
|
29
|
-
const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
|
30
|
-
const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
|
31
|
-
textWithRawLinks = firstPart + secondPart;
|
32
|
-
nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
|
33
|
-
};
|
34
|
-
if (url) {
|
35
|
-
/*
|
36
|
-
* TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
|
37
|
-
* The following is RegExp that handles the same stuff as the JS code below:
|
38
|
-
*
|
39
|
-
* /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
|
40
|
-
*
|
41
|
-
* Demo on regex101: https://regex101.com/r/7Vl9bg/1
|
42
|
-
*
|
43
|
-
* Check lookbehind support here: https://caniuse.com/?search=lookbehind
|
44
|
-
*/
|
45
|
-
const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
|
46
|
-
const textUsedToPerformMatching = rawLinkMatch.input;
|
47
|
-
const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
|
48
|
-
if (lastCharacterInUrl === '.') {
|
49
|
-
const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
|
50
|
-
if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
|
51
|
-
const urlWithoutDotAtTheEnd = url.slice(0, -1);
|
52
|
-
wrapUrlInAnchor(urlWithoutDotAtTheEnd);
|
53
|
-
}
|
54
|
-
}
|
55
|
-
else if (rawLinkMatch.index > 3) {
|
56
|
-
const twoCharactersInFrontOfTheLink = `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`;
|
57
|
-
if (twoCharactersInFrontOfTheLink && twoCharactersInFrontOfTheLink !== '](') {
|
58
|
-
// only wrap url in anchor when it is not a named markdown link
|
59
|
-
wrapUrlInAnchor(url);
|
60
|
-
}
|
61
|
-
}
|
62
|
-
else {
|
63
|
-
wrapUrlInAnchor(url);
|
64
|
-
}
|
65
|
-
}
|
66
|
-
});
|
67
|
-
let textWithRawAndNamedLinks = textWithRawLinks;
|
68
|
-
const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, textWithRawLinks);
|
69
|
-
namedLinkMatches.forEach((namedLinkMatch) => {
|
70
|
-
const [source, name, url] = namedLinkMatch;
|
71
|
-
const urlIsValid = url && !/javascript\:/i.test(url);
|
72
|
-
if (source && name && urlIsValid) {
|
73
|
-
textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
|
74
|
-
}
|
75
|
-
});
|
16
|
+
const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(text);
|
17
|
+
const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
|
76
18
|
return textWithRawAndNamedLinks;
|
77
19
|
}
|
78
20
|
else {
|
79
21
|
return text;
|
80
22
|
}
|
81
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
|
+
}
|
82
87
|
getAllRegexMatches(regex, input) {
|
83
88
|
let match;
|
84
89
|
const matches = [];
|
@@ -122,4 +127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
|
|
122
127
|
type: Pipe,
|
123
128
|
args: [{ name: 'lxLinkify' }]
|
124
129
|
}] });
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDNUI7Ozs7O2VBS0c7WUFDSCxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztZQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQzNCLE1BQU0sZUFBZSxHQUFHLENBQUMsaUJBQXlCLEVBQUUsRUFBRTtvQkFDcEQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO29CQUMvRSxNQUFNLGFBQWEsR0FBRyxZQUFZLGlCQUFpQiwrQ0FBK0MsaUJBQWlCLE1BQU0sQ0FBQztvQkFDMUgsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUN4SCxnQkFBZ0IsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO29CQUMxQyw2QkFBNkIsR0FB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RkFBYixhQUFhO2tCQUR6QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGlzIHBpcGUgdHJhbnNmb3Jtcy4uLlxuICogLSBcInJhd1wiIGh0dHAocykgbGlua3NcbiAqIC0gbWFya2Rvd24gbGluayBzeW50YXhcbiAqIC4uLiBpbnRvIGNsaWNrYWJsZSBhbmNob3IgZWxlbWVudHMuXG4gKlxuICogWW91IGhhdmUgYW4gdXNlciBpbnRlcmZhY2Ugd2hlcmUgeW91IGRvbid0IHdhbnQgY2xpY2thYmxlIGxpbmtzIGJ1dCBhbHNvXG4gKiBkb24ndCB3YW50IHVzZXJzIHRvIHNlZSB0aGUgXCJ1Z2x5XCIgbWFya2Rvd24gbGluayBzeW50YXg/XG4gKiAtPiBVc2UgdGhlICdseFVubGlraWZ5JyBwaXBlIHRvIHJlcGxhY2UgbWFya2Rvd24gbGluayBzeW50YXggd2l0aCBqdXN0IHRoZSBsaW5rIG5hbWVcbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHhMaW5raWZ5JyB9KVxuZXhwb3J0IGNsYXNzIEx4TGlua2lmeVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgbm90IHRoZSBcIm9uZSBVUkwgcmVnZXggdG8gcnVsZSB0aGVtIGFsbFwiLCBidXQgYSBtb3JlIHJlYWxpc3RpYyBvbmUgd2hpY2ggc2hvdWxkIHdvcmtcbiAgICogZm9yIGFueSBVUkxzIHRoYXQgb3VyIGN1c3RvbWVycyBpbmNsdWRlIGluIHRleHQgZmllbGRzIG9uIGEgRmFjdCBTaGVldC5cbiAgICpcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/Oig/Omh0dHBzPyk6XFwvXFwvKSAgICAgICAtPiAgICBMaW5rcyBtdXN0IHN0YXJ0IHdpdGggXCJodHRwczovL1wiIG9yIFwiaHR0cDovL1wiXG4gICAqXG4gICAqICg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKSBMRVQnUyBTUExJVCBUSElTIE9ORSBVUFxuICAgKlxuICAgKiBbXlxccy8kLj8jXVteXFxzXSogICAtPiAgICBNYXRjaCBhbnkgbGVnYWwgVVJMIGNoYXJhY3RlciB1bnRpbCB0aGUgbmV4dCB3aGl0ZXNwYWNlXG4gICAqICg/PCFbXFwuKV0gICAgICAgICAgLT4gICAgQSBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gcHJldmVudCBtYXRjaGluZyBhIGRvdCBvciBwYXJlbnRoZXNpcyBmb2xsb3dpbmcgYSBVUkxcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci9kM0t0ZkgvMSAoTk9URTogcGxlYXNlIHVwZGF0ZSB0aGlzIGxpbmsgd2hlbiBjaGFuZ2luZyB0aGUgcmVnZXgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhUVFBfTElOS19SRUdFWCA9IC8oPzooPzpodHRwcz8pOlxcL1xcLykoPzpbXlxccy8kLj8jXVteXFxzXSopL2dpO1xuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgbWF0Y2ggdGhlIG1hcmtkb3duIGxpbmsgc3ludGF4OiBbbGluayBuYW1lXSh1cmwpXG4gICAqIFJlZ2V4IHJ1bGVzIGV4cGxhaW5lZCBpbiBwbGFpbiB0ZXh0OlxuICAgKlxuICAgKiAoPzpcXFsoW15cXF1dKilcXF0pICAgICAgICAgICAgLT4gICAgIE1hdGNoIGFueSBjaGFyYWN0ZXJzIGluc2lkZSBzcXVhcmUgYnJhY2tldHNcbiAgICogXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKSAgICAgLT4gICAgIE5vdGljZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgcmVnZXggYXMgdGhlIEhUVFBfTElOS19SRUdFWCBhYm92ZSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgd2l0aG91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBodHRwIHByb3RvY29sLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBsaW5rcyB3aXRob3V0IGluY2x1ZGluZyB0aGUgcHJvdG9jb2wgb3IgYWxzbyBcIm1haWx0bzpoZWxsb0B3b3JsZC5kZVwiIGxpbmtzXG4gICAqXG4gICAqIExpbmsgdG8gcmVnZXgxMDE6IGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvNVVNVUg4LzFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkFNRURfTElOS19SRUdFWCA9IC8oPzpcXFsoW15cXF1dKilcXF0pXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKS9naTtcblxuICB0cmFuc2Zvcm0odGV4dD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBpZiAodGV4dCAmJiB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCB0ZXh0V2l0aFJhd0xpbmtzID0gdGV4dDtcbiAgICAgIC8qKlxuICAgICAgICogS2VlcGluZyB0cmFjayBvZiB0aGlzIGluZGV4IHByZXZlbnRzIGluZmluaXRlIGxvb3BzXG4gICAgICAgKiB3aGVyZSBhIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGxpbmsgc3RhcnRzIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyc1xuICAgICAgICogYXMgYSBzZWNvbmQgbGluay5cbiAgICAgICAqIGUuZy4gaHR0cHM6Ly9hbmd1bGFyLmlvL2RvY3MgZm9sbG93ZWQgYnkgaHR0cHM6Ly9hbmd1bGFyLmlvXG4gICAgICAgKi9cbiAgICAgIGxldCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IDA7XG4gICAgICBjb25zdCByYXdMaW5rTWF0Y2hlcyA9IHRoaXMuZ2V0QWxsUmVnZXhNYXRjaGVzKEx4TGlua2lmeVBpcGUuSFRUUF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICAgIHJhd0xpbmtNYXRjaGVzLmZvckVhY2goKHJhd0xpbmtNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBbdXJsXSA9IHJhd0xpbmtNYXRjaDtcbiAgICAgICAgY29uc3Qgd3JhcFVybEluQW5jaG9yID0gKHNhbml0aXplZFVybE1hdGNoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSB0ZXh0V2l0aFJhd0xpbmtzLnN1YnN0cmluZygwLCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSk7XG4gICAgICAgICAgY29uc3QgYW5jaG9yVGFnSHRtbCA9IGA8YSBocmVmPVwiJHtzYW5pdGl6ZWRVcmxNYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtzYW5pdGl6ZWRVcmxNYXRjaH08L2E+YDtcbiAgICAgICAgICBjb25zdCBzZWNvbmRQYXJ0ID0gdGV4dFdpdGhSYXdMaW5rcy5zdWJzdHJpbmcobmV4dEluZGV4VG9TdGFydFJlcGxhY2luZ0Zyb20pLnJlcGxhY2Uoc2FuaXRpemVkVXJsTWF0Y2ghLCBhbmNob3JUYWdIdG1sKTtcbiAgICAgICAgICB0ZXh0V2l0aFJhd0xpbmtzID0gZmlyc3RQYXJ0ICsgc2Vjb25kUGFydDtcbiAgICAgICAgICBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IHJhd0xpbmtNYXRjaC5pbmRleCArIGFuY2hvclRhZ0h0bWwubGVuZ3RoO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBUT0RPOiBnZXQgcmlkIG9mIGFsbCB0aGlzIGNvZGUgb25jZSBTYWZhcmkgc3VwcG9ydHMgbmVnYXRpdmUgbG9va2JlaGluZHMgaW4gcmVndWxhciBleHByZXNzaW9uc1xuICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgUmVnRXhwIHRoYXQgaGFuZGxlcyB0aGUgc2FtZSBzdHVmZiBhcyB0aGUgSlMgY29kZSBiZWxvdzpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIC8oPzooPzooPzwhXFxdXFwoKSkoPzpodHRwc3xodHRwKTpcXC9cXC8pKD86W15cXHMvJC4/I11bXlxcc10qKD88IVtcXC4pXSkpL2dpO1xuICAgICAgICAgICAqXG4gICAgICAgICAgICogRGVtbyBvbiByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci83Vmw5YmcvMVxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQ2hlY2sgbG9va2JlaGluZCBzdXBwb3J0IGhlcmU6IGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD1sb29rYmVoaW5kXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgbGFzdFVybENoYXJhY3RlckluZGV4ID0gcmF3TGlua01hdGNoLmluZGV4ICsgdXJsLmxlbmd0aCAtIDE7XG4gICAgICAgICAgY29uc3QgdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZyA9IHJhd0xpbmtNYXRjaC5pbnB1dDtcbiAgICAgICAgICBjb25zdCBsYXN0Q2hhcmFjdGVySW5VcmwgPSB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW2xhc3RVcmxDaGFyYWN0ZXJJbmRleF07XG4gICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXJJblVybCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJBZnRlclVybCA9IHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbbGFzdFVybENoYXJhY3RlckluZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIWNoYXJhY3RlckFmdGVyVXJsIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnICcgfHwgY2hhcmFjdGVyQWZ0ZXJVcmwgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybFdpdGhvdXREb3RBdFRoZUVuZCA9IHVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmxXaXRob3V0RG90QXRUaGVFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocmF3TGlua01hdGNoLmluZGV4ID4gMykge1xuICAgICAgICAgICAgY29uc3QgdHdvQ2hhcmFjdGVyc0luRnJvbnRPZlRoZUxpbmsgPSBgJHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDJdfSR7XG4gICAgICAgICAgICAgIHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbcmF3TGlua01hdGNoLmluZGV4IC0gMV1cbiAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgaWYgKHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rICYmIHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rICE9PSAnXSgnKSB7XG4gICAgICAgICAgICAgIC8vIG9ubHkgd3JhcCB1cmwgaW4gYW5jaG9yIHdoZW4gaXQgaXMgbm90IGEgbmFtZWQgbWFya2Rvd24gbGlua1xuICAgICAgICAgICAgICB3cmFwVXJsSW5BbmNob3IodXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JhcFVybEluQW5jaG9yKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHRXaXRoUmF3TGlua3M7XG4gICAgICBjb25zdCBuYW1lZExpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0V2l0aFJhd0xpbmtzKTtcbiAgICAgIG5hbWVkTGlua01hdGNoZXMuZm9yRWFjaCgobmFtZWRMaW5rTWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgW3NvdXJjZSwgbmFtZSwgdXJsXSA9IG5hbWVkTGlua01hdGNoO1xuICAgICAgICBjb25zdCB1cmxJc1ZhbGlkID0gdXJsICYmICEvamF2YXNjcmlwdFxcOi9pLnRlc3QodXJsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiBuYW1lICYmIHVybElzVmFsaWQpIHtcbiAgICAgICAgICB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MgPSB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MucmVwbGFjZShcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGA8YSBocmVmPVwiJHt1cmx9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPiR7bmFtZX08L2E+YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFJlZ2V4TWF0Y2hlcyhyZWdleDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RixPQUFPLHdCQUF3QixDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVPLG9DQUFvQyxDQUFDLElBQVk7UUFDdkQsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUU7Z0JBQ2hDLHdCQUF3QixHQUFHLHdCQUF3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QyxLQUFLLElBQUksRUFBRTtZQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7QUFwSEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDb0IsNkJBQWUsR0FBRywyQ0FBNEMsQ0FBQTtBQUVyRjs7Ozs7Ozs7OztHQVVHO0FBQ29CLDhCQUFnQixHQUFHLDJDQUE0QyxDQUFBOzBHQTdCM0UsYUFBYTt3R0FBYixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFRoaXMgcGlwZSB0cmFuc2Zvcm1zLi4uXG4gKiAtIFwicmF3XCIgaHR0cChzKSBsaW5rc1xuICogLSBtYXJrZG93biBsaW5rIHN5bnRheFxuICogLi4uIGludG8gY2xpY2thYmxlIGFuY2hvciBlbGVtZW50cy5cbiAqXG4gKiBZb3UgaGF2ZSBhbiB1c2VyIGludGVyZmFjZSB3aGVyZSB5b3UgZG9uJ3Qgd2FudCBjbGlja2FibGUgbGlua3MgYnV0IGFsc29cbiAqIGRvbid0IHdhbnQgdXNlcnMgdG8gc2VlIHRoZSBcInVnbHlcIiBtYXJrZG93biBsaW5rIHN5bnRheD9cbiAqIC0+IFVzZSB0aGUgJ2x4VW5saWtpZnknIHBpcGUgdG8gcmVwbGFjZSBtYXJrZG93biBsaW5rIHN5bnRheCB3aXRoIGp1c3QgdGhlIGxpbmsgbmFtZVxuICovXG5AUGlwZSh7IG5hbWU6ICdseExpbmtpZnknIH0pXG5leHBvcnQgY2xhc3MgTHhMaW5raWZ5UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVGhpcyBpcyBub3QgdGhlIFwib25lIFVSTCByZWdleCB0byBydWxlIHRoZW0gYWxsXCIsIGJ1dCBhIG1vcmUgcmVhbGlzdGljIG9uZSB3aGljaCBzaG91bGQgd29ya1xuICAgKiBmb3IgYW55IFVSTHMgdGhhdCBvdXIgY3VzdG9tZXJzIGluY2x1ZGUgaW4gdGV4dCBmaWVsZHMgb24gYSBGYWN0IFNoZWV0LlxuICAgKlxuICAgKiBSZWdleCBydWxlcyBleHBsYWluZWQgaW4gcGxhaW4gdGV4dDpcbiAgICpcbiAgICogKD86KD86aHR0cHM/KTpcXC9cXC8pICAgICAgIC0+ICAgIExpbmtzIG11c3Qgc3RhcnQgd2l0aCBcImh0dHBzOi8vXCIgb3IgXCJodHRwOi8vXCJcbiAgICpcbiAgICogKD86W15cXHMvJC4/I11bXlxcc10qKD88IVtcXC4pXSkpIExFVCdTIFNQTElUIFRISVMgT05FIFVQXG4gICAqXG4gICAqIFteXFxzLyQuPyNdW15cXHNdKiAgIC0+ICAgIE1hdGNoIGFueSBsZWdhbCBVUkwgY2hhcmFjdGVyIHVudGlsIHRoZSBuZXh0IHdoaXRlc3BhY2VcbiAgICogKD88IVtcXC4pXSAgICAgICAgICAtPiAgICBBIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBwcmV2ZW50IG1hdGNoaW5nIGEgZG90IG9yIHBhcmVudGhlc2lzIGZvbGxvd2luZyBhIFVSTFxuICAgKlxuICAgKiBMaW5rIHRvIHJlZ2V4MTAxOiBodHRwczovL3JlZ2V4MTAxLmNvbS9yL2QzS3RmSC8xIChOT1RFOiBwbGVhc2UgdXBkYXRlIHRoaXMgbGluayB3aGVuIGNoYW5naW5nIHRoZSByZWdleClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSFRUUF9MSU5LX1JFR0VYID0gLyg/Oig/Omh0dHBzPyk6XFwvXFwvKSg/OlteXFxzLyQuPyNdW15cXHNdKikvZ2k7XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBtYXRjaCB0aGUgbWFya2Rvd24gbGluayBzeW50YXg6IFtsaW5rIG5hbWVdKHVybClcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/OlxcWyhbXlxcXV0qKVxcXSkgICAgICAgICAgICAtPiAgICAgTWF0Y2ggYW55IGNoYXJhY3RlcnMgaW5zaWRlIHNxdWFyZSBicmFja2V0c1xuICAgKiBcXCgoW15cXHNcXC8kLj8jXVteXFxzXSopXFwpICAgICAtPiAgICAgTm90aWNlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSByZWdleCBhcyB0aGUgSFRUUF9MSU5LX1JFR0VYIGFib3ZlLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3aXRob3V0IHRoZSByZXF1aXJlbWVudCBmb3IgdGhlIGh0dHAgcHJvdG9jb2wuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGxpbmtzIHdpdGhvdXQgaW5jbHVkaW5nIHRoZSBwcm90b2NvbCBvciBhbHNvIFwibWFpbHRvOmhlbGxvQHdvcmxkLmRlXCIgbGlua3NcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci81VU1VSDgvMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBOQU1FRF9MSU5LX1JFR0VYID0gLyg/OlxcWyhbXlxcXV0qKVxcXSlcXCgoW15cXHNcXC8kLj8jXVteXFxzXSopXFwpL2dpO1xuXG4gIHRyYW5zZm9ybSh0ZXh0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIGlmICh0ZXh0ICYmIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdGV4dFdpdGhSYXdMaW5rcyA9IHRoaXMud3JhcFJhd0h0dHBMaW5rc1dpdGhBbmNob3JUYWdzKHRleHQpO1xuICAgICAgY29uc3QgdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzID0gdGhpcy50dXJuTWFya2Rvd25TdHlsZUxpbmtzSW50b0FuY2hvclRhZ3ModGV4dFdpdGhSYXdMaW5rcyk7XG4gICAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHR1cm5NYXJrZG93blN0eWxlTGlua3NJbnRvQW5jaG9yVGFncyh0ZXh0OiBzdHJpbmcpIHtcbiAgICBsZXQgdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzID0gdGV4dDtcbiAgICBjb25zdCBuYW1lZExpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICBuYW1lZExpbmtNYXRjaGVzLmZvckVhY2goKG5hbWVkTGlua01hdGNoKSA9PiB7XG4gICAgICBjb25zdCBbc291cmNlLCBuYW1lLCB1cmxdID0gbmFtZWRMaW5rTWF0Y2g7XG4gICAgICBjb25zdCB1cmxJc1ZhbGlkID0gdXJsICYmICEvamF2YXNjcmlwdFxcOi9pLnRlc3QodXJsKTtcbiAgICAgIGlmIChzb3VyY2UgJiYgbmFtZSAmJiB1cmxJc1ZhbGlkKSB7XG4gICAgICAgIHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcy5yZXBsYWNlKFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBgPGEgaHJlZj1cIiR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj4ke25hbWV9PC9hPmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwUmF3SHR0cExpbmtzV2l0aEFuY2hvclRhZ3ModGV4dDogc3RyaW5nKSB7XG4gICAgbGV0IHRleHRXaXRoUmF3TGlua3MgPSB0ZXh0O1xuICAgIC8qKlxuICAgICAqIEtlZXBpbmcgdHJhY2sgb2YgdGhpcyBpbmRleCBwcmV2ZW50cyBpbmZpbml0ZSBsb29wc1xuICAgICAqIHdoZXJlIGEgcHJldmlvdXNseSBwcm9jZXNzZWQgbGluayBzdGFydHMgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJzXG4gICAgICogYXMgYSBzZWNvbmQgbGluay5cbiAgICAgKiBlLmcuIGh0dHBzOi8vYW5ndWxhci5pby9kb2NzIGZvbGxvd2VkIGJ5IGh0dHBzOi8vYW5ndWxhci5pb1xuICAgICAqL1xuICAgIGxldCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IDA7XG4gICAgY29uc3QgcmF3TGlua01hdGNoZXMgPSB0aGlzLmdldEFsbFJlZ2V4TWF0Y2hlcyhMeExpbmtpZnlQaXBlLkhUVFBfTElOS19SRUdFWCwgdGV4dCk7XG4gICAgcmF3TGlua01hdGNoZXMuZm9yRWFjaCgocmF3TGlua01hdGNoKSA9PiB7XG4gICAgICBjb25zdCBbdXJsXSA9IHJhd0xpbmtNYXRjaDtcbiAgICAgIGNvbnN0IHdyYXBVcmxJbkFuY2hvciA9IChzYW5pdGl6ZWRVcmxNYXRjaDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0UGFydCA9IHRleHRXaXRoUmF3TGlua3Muc3Vic3RyaW5nKDAsIG5leHRJbmRleFRvU3RhcnRSZXBsYWNpbmdGcm9tKTtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFnSHRtbCA9IGA8YSBocmVmPVwiJHtzYW5pdGl6ZWRVcmxNYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtzYW5pdGl6ZWRVcmxNYXRjaH08L2E+YDtcbiAgICAgICAgY29uc3Qgc2Vjb25kUGFydCA9IHRleHRXaXRoUmF3TGlua3Muc3Vic3RyaW5nKG5leHRJbmRleFRvU3RhcnRSZXBsYWNpbmdGcm9tKS5yZXBsYWNlKHNhbml0aXplZFVybE1hdGNoISwgYW5jaG9yVGFnSHRtbCk7XG4gICAgICAgIHRleHRXaXRoUmF3TGlua3MgPSBmaXJzdFBhcnQgKyBzZWNvbmRQYXJ0O1xuICAgICAgICBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IHJhd0xpbmtNYXRjaC5pbmRleCArIGFuY2hvclRhZ0h0bWwubGVuZ3RoO1xuICAgICAgfTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogVE9ETzogZ2V0IHJpZCBvZiBhbGwgdGhpcyBjb2RlIG9uY2UgU2FmYXJpIHN1cHBvcnRzIG5lZ2F0aXZlIGxvb2tiZWhpbmRzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAgICAgICogVGhlIGZvbGxvd2luZyBpcyBSZWdFeHAgdGhhdCBoYW5kbGVzIHRoZSBzYW1lIHN0dWZmIGFzIHRoZSBKUyBjb2RlIGJlbG93OlxuICAgICAgICAgKlxuICAgICAgICAgKiAvKD86KD86KD88IVxcXVxcKCkpKD86aHR0cHN8aHR0cCk6XFwvXFwvKSg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKS9naTtcbiAgICAgICAgICpcbiAgICAgICAgICogRGVtbyBvbiByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci83Vmw5YmcvMVxuICAgICAgICAgKlxuICAgICAgICAgKiBDaGVjayBsb29rYmVoaW5kIHN1cHBvcnQgaGVyZTogaHR0cHM6Ly9jYW5pdXNlLmNvbS8/c2VhcmNoPWxvb2tiZWhpbmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGxhc3RVcmxDaGFyYWN0ZXJJbmRleCA9IHJhd0xpbmtNYXRjaC5pbmRleCArIHVybC5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nID0gcmF3TGlua01hdGNoLmlucHV0O1xuICAgICAgICBjb25zdCBsYXN0Q2hhcmFjdGVySW5VcmwgPSB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW2xhc3RVcmxDaGFyYWN0ZXJJbmRleF07XG4gICAgICAgIGNvbnN0IHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rID1cbiAgICAgICAgICByYXdMaW5rTWF0Y2guaW5kZXggPiAzXG4gICAgICAgICAgICA/IGAke3RleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbcmF3TGlua01hdGNoLmluZGV4IC0gMl19JHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDFdfWBcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IGlzTWFya2Rvd25TeW50YXhMaW5rID0gdHdvQ2hhcmFjdGVyc0luRnJvbnRPZlRoZUxpbmsgPT09ICddKCc7XG5cbiAgICAgICAgaWYgKCFpc01hcmtkb3duU3ludGF4TGluayAmJiBsYXN0Q2hhcmFjdGVySW5VcmwgPT09ICcuJykge1xuICAgICAgICAgIGNvbnN0IGNoYXJhY3RlckFmdGVyVXJsID0gdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZ1tsYXN0VXJsQ2hhcmFjdGVySW5kZXggKyAxXTtcbiAgICAgICAgICBpZiAoIWNoYXJhY3RlckFmdGVyVXJsIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnICcgfHwgY2hhcmFjdGVyQWZ0ZXJVcmwgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb25zdCB1cmxXaXRob3V0RG90QXRUaGVFbmQgPSB1cmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgd3JhcFVybEluQW5jaG9yKHVybFdpdGhvdXREb3RBdFRoZUVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc01hcmtkb3duU3ludGF4TGluaykge1xuICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHRXaXRoUmF3TGlua3M7XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFJlZ2V4TWF0Y2hlcyhyZWdleDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
|
@@ -1167,72 +1167,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
|
|
1167
1167
|
class LxLinkifyPipe {
|
1168
1168
|
transform(text) {
|
1169
1169
|
if (text && typeof text === 'string') {
|
1170
|
-
|
1171
|
-
|
1172
|
-
* Keeping track of this index prevents infinite loops
|
1173
|
-
* where a previously processed link starts with the same characters
|
1174
|
-
* as a second link.
|
1175
|
-
* e.g. https://angular.io/docs followed by https://angular.io
|
1176
|
-
*/
|
1177
|
-
let nextIndexToStartReplacingFrom = 0;
|
1178
|
-
const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
|
1179
|
-
rawLinkMatches.forEach((rawLinkMatch) => {
|
1180
|
-
const [url] = rawLinkMatch;
|
1181
|
-
const wrapUrlInAnchor = (sanitizedUrlMatch) => {
|
1182
|
-
const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
|
1183
|
-
const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
|
1184
|
-
const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
|
1185
|
-
textWithRawLinks = firstPart + secondPart;
|
1186
|
-
nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
|
1187
|
-
};
|
1188
|
-
if (url) {
|
1189
|
-
/*
|
1190
|
-
* TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
|
1191
|
-
* The following is RegExp that handles the same stuff as the JS code below:
|
1192
|
-
*
|
1193
|
-
* /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
|
1194
|
-
*
|
1195
|
-
* Demo on regex101: https://regex101.com/r/7Vl9bg/1
|
1196
|
-
*
|
1197
|
-
* Check lookbehind support here: https://caniuse.com/?search=lookbehind
|
1198
|
-
*/
|
1199
|
-
const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
|
1200
|
-
const textUsedToPerformMatching = rawLinkMatch.input;
|
1201
|
-
const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
|
1202
|
-
if (lastCharacterInUrl === '.') {
|
1203
|
-
const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
|
1204
|
-
if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
|
1205
|
-
const urlWithoutDotAtTheEnd = url.slice(0, -1);
|
1206
|
-
wrapUrlInAnchor(urlWithoutDotAtTheEnd);
|
1207
|
-
}
|
1208
|
-
}
|
1209
|
-
else if (rawLinkMatch.index > 3) {
|
1210
|
-
const twoCharactersInFrontOfTheLink = `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`;
|
1211
|
-
if (twoCharactersInFrontOfTheLink && twoCharactersInFrontOfTheLink !== '](') {
|
1212
|
-
// only wrap url in anchor when it is not a named markdown link
|
1213
|
-
wrapUrlInAnchor(url);
|
1214
|
-
}
|
1215
|
-
}
|
1216
|
-
else {
|
1217
|
-
wrapUrlInAnchor(url);
|
1218
|
-
}
|
1219
|
-
}
|
1220
|
-
});
|
1221
|
-
let textWithRawAndNamedLinks = textWithRawLinks;
|
1222
|
-
const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, textWithRawLinks);
|
1223
|
-
namedLinkMatches.forEach((namedLinkMatch) => {
|
1224
|
-
const [source, name, url] = namedLinkMatch;
|
1225
|
-
const urlIsValid = url && !/javascript\:/i.test(url);
|
1226
|
-
if (source && name && urlIsValid) {
|
1227
|
-
textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
|
1228
|
-
}
|
1229
|
-
});
|
1170
|
+
const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(text);
|
1171
|
+
const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
|
1230
1172
|
return textWithRawAndNamedLinks;
|
1231
1173
|
}
|
1232
1174
|
else {
|
1233
1175
|
return text;
|
1234
1176
|
}
|
1235
1177
|
}
|
1178
|
+
turnMarkdownStyleLinksIntoAnchorTags(text) {
|
1179
|
+
let textWithRawAndNamedLinks = text;
|
1180
|
+
const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
|
1181
|
+
namedLinkMatches.forEach((namedLinkMatch) => {
|
1182
|
+
const [source, name, url] = namedLinkMatch;
|
1183
|
+
const urlIsValid = url && !/javascript\:/i.test(url);
|
1184
|
+
if (source && name && urlIsValid) {
|
1185
|
+
textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
|
1186
|
+
}
|
1187
|
+
});
|
1188
|
+
return textWithRawAndNamedLinks;
|
1189
|
+
}
|
1190
|
+
wrapRawHttpLinksWithAnchorTags(text) {
|
1191
|
+
let textWithRawLinks = text;
|
1192
|
+
/**
|
1193
|
+
* Keeping track of this index prevents infinite loops
|
1194
|
+
* where a previously processed link starts with the same characters
|
1195
|
+
* as a second link.
|
1196
|
+
* e.g. https://angular.io/docs followed by https://angular.io
|
1197
|
+
*/
|
1198
|
+
let nextIndexToStartReplacingFrom = 0;
|
1199
|
+
const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
|
1200
|
+
rawLinkMatches.forEach((rawLinkMatch) => {
|
1201
|
+
const [url] = rawLinkMatch;
|
1202
|
+
const wrapUrlInAnchor = (sanitizedUrlMatch) => {
|
1203
|
+
const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
|
1204
|
+
const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
|
1205
|
+
const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
|
1206
|
+
textWithRawLinks = firstPart + secondPart;
|
1207
|
+
nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
|
1208
|
+
};
|
1209
|
+
if (url) {
|
1210
|
+
/*
|
1211
|
+
* TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
|
1212
|
+
* The following is RegExp that handles the same stuff as the JS code below:
|
1213
|
+
*
|
1214
|
+
* /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
|
1215
|
+
*
|
1216
|
+
* Demo on regex101: https://regex101.com/r/7Vl9bg/1
|
1217
|
+
*
|
1218
|
+
* Check lookbehind support here: https://caniuse.com/?search=lookbehind
|
1219
|
+
*/
|
1220
|
+
const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
|
1221
|
+
const textUsedToPerformMatching = rawLinkMatch.input;
|
1222
|
+
const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
|
1223
|
+
const twoCharactersInFrontOfTheLink = rawLinkMatch.index > 3
|
1224
|
+
? `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`
|
1225
|
+
: '';
|
1226
|
+
const isMarkdownSyntaxLink = twoCharactersInFrontOfTheLink === '](';
|
1227
|
+
if (!isMarkdownSyntaxLink && lastCharacterInUrl === '.') {
|
1228
|
+
const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
|
1229
|
+
if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
|
1230
|
+
const urlWithoutDotAtTheEnd = url.slice(0, -1);
|
1231
|
+
wrapUrlInAnchor(urlWithoutDotAtTheEnd);
|
1232
|
+
}
|
1233
|
+
}
|
1234
|
+
else if (!isMarkdownSyntaxLink) {
|
1235
|
+
wrapUrlInAnchor(url);
|
1236
|
+
}
|
1237
|
+
}
|
1238
|
+
});
|
1239
|
+
return textWithRawLinks;
|
1240
|
+
}
|
1236
1241
|
getAllRegexMatches(regex, input) {
|
1237
1242
|
let match;
|
1238
1243
|
const matches = [];
|