@covalent/markdown 4.0.0-beta.1 → 4.0.0-beta.2
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/markdown.component.mjs +23 -18
- package/fesm2015/covalent-markdown.mjs +26 -23
- package/fesm2015/covalent-markdown.mjs.map +1 -1
- package/fesm2020/covalent-markdown.mjs +22 -17
- package/fesm2020/covalent-markdown.mjs.map +1 -1
- package/markdown.component.d.ts +6 -4
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, ElementRef, Input, Output, EventEmitter, Renderer2, SecurityContext, HostBinding,
|
|
1
|
+
import { Component, ElementRef, Input, Output, EventEmitter, Renderer2, SecurityContext, HostBinding, NgZone, } from '@angular/core';
|
|
2
2
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
3
|
import { scrollToAnchor, genHeadingId, isAnchorLink, removeTrailingHash, rawGithubHref, isGithubHref, isRawGithubHref, renderVideoElements, } from './markdown-utils/markdown-utils';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
@@ -106,10 +106,11 @@ function addIdsToHeadings(html) {
|
|
|
106
106
|
return html;
|
|
107
107
|
}
|
|
108
108
|
export class TdMarkdownComponent {
|
|
109
|
-
constructor(_renderer, _elementRef, _domSanitizer) {
|
|
109
|
+
constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
|
|
110
110
|
this._renderer = _renderer;
|
|
111
111
|
this._elementRef = _elementRef;
|
|
112
112
|
this._domSanitizer = _domSanitizer;
|
|
113
|
+
this._ngZone = _ngZone;
|
|
113
114
|
this._simpleLineBreaks = false;
|
|
114
115
|
this._viewInit = false;
|
|
115
116
|
/**
|
|
@@ -159,12 +160,6 @@ export class TdMarkdownComponent {
|
|
|
159
160
|
set anchor(anchor) {
|
|
160
161
|
this._anchor = anchor;
|
|
161
162
|
}
|
|
162
|
-
clickListener(event) {
|
|
163
|
-
const element = event.srcElement;
|
|
164
|
-
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
165
|
-
this.handleAnchorClicks(event);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
163
|
ngOnChanges(changes) {
|
|
169
164
|
// only anchor changed
|
|
170
165
|
if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {
|
|
@@ -179,6 +174,21 @@ export class TdMarkdownComponent {
|
|
|
179
174
|
this._loadContent(this._elementRef.nativeElement.textContent);
|
|
180
175
|
}
|
|
181
176
|
this._viewInit = true;
|
|
177
|
+
// Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM
|
|
178
|
+
// API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.
|
|
179
|
+
// Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.
|
|
180
|
+
// It also calls `markViewDirty()` before calling the actual listener (the decorated class method).
|
|
181
|
+
this._ngZone.runOutsideAngular(() => {
|
|
182
|
+
this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
|
|
183
|
+
const element = event.srcElement;
|
|
184
|
+
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
185
|
+
this.handleAnchorClicks(event);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
ngOnDestroy() {
|
|
191
|
+
this._anchorListener?.();
|
|
182
192
|
}
|
|
183
193
|
refresh() {
|
|
184
194
|
if (this._content) {
|
|
@@ -202,7 +212,7 @@ export class TdMarkdownComponent {
|
|
|
202
212
|
setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);
|
|
203
213
|
this.contentReady.emit();
|
|
204
214
|
}
|
|
205
|
-
|
|
215
|
+
handleAnchorClicks(event) {
|
|
206
216
|
event.preventDefault();
|
|
207
217
|
const url = new URL(event.target.href);
|
|
208
218
|
const hash = decodeURI(url.hash);
|
|
@@ -245,10 +255,8 @@ export class TdMarkdownComponent {
|
|
|
245
255
|
return converter.makeHtml(markdownToParse);
|
|
246
256
|
}
|
|
247
257
|
}
|
|
248
|
-
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵfac = function TdMarkdownComponent_Factory(t) { return new (t || TdMarkdownComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.DomSanitizer)); };
|
|
249
|
-
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) { if (rf &
|
|
250
|
-
i0.ɵɵlistener("click", function TdMarkdownComponent_click_HostBindingHandler($event) { return ctx.clickListener($event); });
|
|
251
|
-
} if (rf & 2) {
|
|
258
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵfac = function TdMarkdownComponent_Factory(t) { return new (t || TdMarkdownComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
259
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
252
260
|
i0.ɵɵclassMap(ctx.class);
|
|
253
261
|
} }, inputs: { content: "content", simpleLineBreaks: "simpleLineBreaks", hostedUrl: "hostedUrl", anchor: "anchor" }, outputs: { contentReady: "contentReady" }, features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function TdMarkdownComponent_Template(rf, ctx) { if (rf & 1) {
|
|
254
262
|
i0.ɵɵprojectionDef();
|
|
@@ -257,7 +265,7 @@ export class TdMarkdownComponent {
|
|
|
257
265
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownComponent, [{
|
|
258
266
|
type: Component,
|
|
259
267
|
args: [{ selector: 'td-markdown', template: "<ng-content></ng-content>\n", styles: [":host.td-markdown::ng-deep a{background-color:transparent}:host.td-markdown::ng-deep a:active,:host.td-markdown::ng-deep a:hover{outline-width:0}:host.td-markdown::ng-deep strong{font-weight:inherit;font-weight:bolder}:host.td-markdown::ng-deep h1{font-size:2em;margin:.67em 0}:host.td-markdown::ng-deep img{border-style:none}:host.td-markdown::ng-deep svg:not(:root){overflow:hidden}:host.td-markdown::ng-deep code,:host.td-markdown::ng-deep kbd,:host.td-markdown::ng-deep pre{font-family:monospace;font-size:1em}:host.td-markdown::ng-deep hr{box-sizing:content-box;height:0;overflow:visible}:host.td-markdown::ng-deep input{font:inherit;margin:0}:host.td-markdown::ng-deep input{overflow:visible}:host.td-markdown::ng-deep button:-moz-focusring,:host.td-markdown::ng-deep [type=button]:-moz-focusring,:host.td-markdown::ng-deep [type=reset]:-moz-focusring,:host.td-markdown::ng-deep [type=submit]:-moz-focusring{outline:1px dotted ButtonText}:host.td-markdown::ng-deep [type=checkbox]{box-sizing:border-box;padding:0}:host.td-markdown::ng-deep table{border-spacing:0;border-collapse:collapse}:host.td-markdown::ng-deep td,:host.td-markdown::ng-deep th{padding:0}:host.td-markdown::ng-deep *{box-sizing:border-box}:host.td-markdown::ng-deep input{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol}:host.td-markdown::ng-deep a{text-decoration:none}:host.td-markdown::ng-deep a:hover,:host.td-markdown::ng-deep a:active{text-decoration:underline}:host.td-markdown::ng-deep hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep hr:before{display:table;content:\"\"}:host.td-markdown::ng-deep hr:after{display:table;clear:both;content:\"\"}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:0;margin-bottom:0;line-height:1.5}:host.td-markdown::ng-deep h1{font-size:30px}:host.td-markdown::ng-deep h2{font-size:21px}:host.td-markdown::ng-deep h3{font-size:16px}:host.td-markdown::ng-deep h4{font-size:14px}:host.td-markdown::ng-deep h5{font-size:12px}:host.td-markdown::ng-deep h6{font-size:11px}:host.td-markdown::ng-deep p{margin-top:0;margin-bottom:10px}:host.td-markdown::ng-deep blockquote{margin:0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:0;margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ul ol{list-style-type:lower-roman}:host.td-markdown::ng-deep ul ul ol,:host.td-markdown::ng-deep ul ol ol,:host.td-markdown::ng-deep ol ul ol,:host.td-markdown::ng-deep ol ol ol{list-style-type:lower-alpha}:host.td-markdown::ng-deep dd{margin-left:0}:host.td-markdown::ng-deep code{font-family:Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:0;font:12px Consolas,Liberation Mono,Menlo,Courier,monospace}:host.td-markdown::ng-deep .pl-0{padding-left:0!important}:host.td-markdown::ng-deep .pl-1{padding-left:3px!important}:host.td-markdown::ng-deep .pl-2{padding-left:6px!important}:host.td-markdown::ng-deep .pl-3{padding-left:12px!important}:host.td-markdown::ng-deep .pl-4{padding-left:24px!important}:host.td-markdown::ng-deep .pl-5{padding-left:36px!important}:host.td-markdown::ng-deep .pl-6{padding-left:48px!important}:host.td-markdown::ng-deep .form-select::-ms-expand{opacity:0}:host.td-markdown::ng-deep a:not([href]){color:inherit;text-decoration:none}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}:host.td-markdown::ng-deep h1 .octicon-link,:host.td-markdown::ng-deep h2 .octicon-link,:host.td-markdown::ng-deep h3 .octicon-link,:host.td-markdown::ng-deep h4 .octicon-link,:host.td-markdown::ng-deep h5 .octicon-link,:host.td-markdown::ng-deep h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}:host.td-markdown::ng-deep h1:hover .anchor,:host.td-markdown::ng-deep h2:hover .anchor,:host.td-markdown::ng-deep h3:hover .anchor,:host.td-markdown::ng-deep h4:hover .anchor,:host.td-markdown::ng-deep h5:hover .anchor,:host.td-markdown::ng-deep h6:hover .anchor{text-decoration:none}:host.td-markdown::ng-deep h1:hover .anchor .octicon-link,:host.td-markdown::ng-deep h2:hover .anchor .octicon-link,:host.td-markdown::ng-deep h3:hover .anchor .octicon-link,:host.td-markdown::ng-deep h4:hover .anchor .octicon-link,:host.td-markdown::ng-deep h5:hover .anchor .octicon-link,:host.td-markdown::ng-deep h6:hover .anchor .octicon-link{visibility:visible}:host.td-markdown::ng-deep h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h1 .anchor{line-height:1}:host.td-markdown::ng-deep h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h2 .anchor{line-height:1}:host.td-markdown::ng-deep h3{font-size:1.5em;line-height:1.43}:host.td-markdown::ng-deep h3 .anchor{line-height:1.2}:host.td-markdown::ng-deep h4{font-size:1.25em}:host.td-markdown::ng-deep h4 .anchor{line-height:1.2}:host.td-markdown::ng-deep h5{font-size:1em}:host.td-markdown::ng-deep h5 .anchor{line-height:1.1}:host.td-markdown::ng-deep h6{font-size:1em}:host.td-markdown::ng-deep h6 .anchor{line-height:1.1}:host.td-markdown::ng-deep p,:host.td-markdown::ng-deep blockquote,:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol,:host.td-markdown::ng-deep dl,:host.td-markdown::ng-deep table,:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:16px}:host.td-markdown::ng-deep hr{margin:16px 0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:2em}:host.td-markdown::ng-deep ul ul,:host.td-markdown::ng-deep ul ol,:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ol ul{margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep li>p{margin-top:16px}:host.td-markdown::ng-deep dl{padding:0}:host.td-markdown::ng-deep dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}:host.td-markdown::ng-deep dl dd{padding:0 16px;margin-bottom:16px}:host.td-markdown::ng-deep blockquote{padding:0 15px;border-left-width:4px;border-left-style:solid}:host.td-markdown::ng-deep blockquote>:first-child{margin-top:0}:host.td-markdown::ng-deep blockquote>:last-child{margin-bottom:0}:host.td-markdown::ng-deep table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}:host.td-markdown::ng-deep table th{font-weight:700}:host.td-markdown::ng-deep table th,:host.td-markdown::ng-deep table td{padding:6px 13px;border-width:1px;border-style:solid}:host.td-markdown::ng-deep table tr{border-top-width:1px;border-top-style:solid}:host.td-markdown::ng-deep img{max-width:100%;box-sizing:content-box}:host.td-markdown::ng-deep code{padding:.2em 0;margin:0;font-size:85%;border-radius:3px}:host.td-markdown::ng-deep code:before,:host.td-markdown::ng-deep code:after{letter-spacing:-.2em}:host.td-markdown::ng-deep pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}:host.td-markdown::ng-deep .highlight{margin-bottom:16px}:host.td-markdown::ng-deep .highlight pre,:host.td-markdown::ng-deep pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}:host.td-markdown::ng-deep .highlight pre{margin-bottom:0;word-break:normal}:host.td-markdown::ng-deep pre{word-wrap:normal}:host.td-markdown::ng-deep pre code{display:inline;max-width:none;max-width:initial;padding:0;margin:0;overflow:visible;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}:host.td-markdown::ng-deep pre code:before,:host.td-markdown::ng-deep pre code:after{content:normal}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px}:host.td-markdown::ng-deep .pl-c{color:#969896}:host.td-markdown::ng-deep .pl-c1,:host.td-markdown::ng-deep .pl-s .pl-v{color:#0086b3}:host.td-markdown::ng-deep .pl-e,:host.td-markdown::ng-deep .pl-en{color:#795da3}:host.td-markdown::ng-deep .pl-s .pl-s1,:host.td-markdown::ng-deep .pl-smi{color:#333}:host.td-markdown::ng-deep .pl-ent{color:#63a35c}:host.td-markdown::ng-deep .pl-k{color:#a71d5d}:host.td-markdown::ng-deep .pl-pds,:host.td-markdown::ng-deep .pl-s,:host.td-markdown::ng-deep .pl-s .pl-pse .pl-s1,:host.td-markdown::ng-deep .pl-sr,:host.td-markdown::ng-deep .pl-sr .pl-cce,:host.td-markdown::ng-deep .pl-sr .pl-sra,:host.td-markdown::ng-deep .pl-sr .pl-sre{color:#183691}:host.td-markdown::ng-deep .pl-v{color:#ed6a43}:host.td-markdown::ng-deep .pl-id{color:#b52a1d}:host.td-markdown::ng-deep .pl-ii{background-color:#b52a1d;color:#f8f8f8}:host.td-markdown::ng-deep .pl-sr .pl-cce{color:#63a35c;font-weight:700}:host.td-markdown::ng-deep .pl-ml{color:#693a17}:host.td-markdown::ng-deep .pl-mh,:host.td-markdown::ng-deep .pl-mh .pl-en,:host.td-markdown::ng-deep .pl-ms{color:#1d3e81;font-weight:700}:host.td-markdown::ng-deep .pl-mq{color:teal}:host.td-markdown::ng-deep .pl-mi{color:#333;font-style:italic}:host.td-markdown::ng-deep .pl-mb{color:#333;font-weight:700}:host.td-markdown::ng-deep .pl-md{background-color:#ffecec;color:#bd2c00}:host.td-markdown::ng-deep .pl-mi1{background-color:#eaffea;color:#55a532}:host.td-markdown::ng-deep .pl-mdr{color:#795da3;font-weight:700}:host.td-markdown::ng-deep .pl-mo{color:#1d3e81}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font:11px Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #cccccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px #bbb}:host.td-markdown::ng-deep .full-commit .btn-outline:not(:disabled):hover{color:#4078c0;border:1px solid #4078c0}:host.td-markdown::ng-deep :checked+.radio-label{position:relative;z-index:1;border-color:#4078c0}:host.td-markdown::ng-deep .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}:host.td-markdown::ng-deep .task-list-item{list-style-type:none}:host.td-markdown::ng-deep .task-list-item+.task-list-item{margin-top:3px}:host.td-markdown::ng-deep .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}\n"] }]
|
|
260
|
-
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }]; }, { class: [{
|
|
268
|
+
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, { class: [{
|
|
261
269
|
type: HostBinding,
|
|
262
270
|
args: ['class']
|
|
263
271
|
}], content: [{
|
|
@@ -274,8 +282,5 @@ export class TdMarkdownComponent {
|
|
|
274
282
|
args: ['anchor']
|
|
275
283
|
}], contentReady: [{
|
|
276
284
|
type: Output
|
|
277
|
-
}], clickListener: [{
|
|
278
|
-
type: HostListener,
|
|
279
|
-
args: ['click', ['$event']]
|
|
280
285
|
}] }); })();
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsYXRmb3JtL21hcmtkb3duL21hcmtkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9tYXJrZG93bi9tYXJrZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsZUFBZSxFQUdmLFdBQVcsRUFDWCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsbUJBQW1CLEdBQ3BCLE1BQU0saUNBQWlDLENBQUM7Ozs7QUFHekMsOEJBQThCO0FBQzlCLElBQUksUUFBUSxHQUFRLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBRXpELG1DQUFtQztBQUNuQyx5QkFBeUI7QUFDekIsU0FBUyxvQkFBb0IsQ0FBQyxXQUFtQixFQUFFLFlBQW9CO0lBQ3JFLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtRQUMvQixNQUFNLFVBQVUsR0FBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBVyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFRLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQywrQkFBK0I7WUFDL0IsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRSxVQUFVLENBQUMsUUFBUSxHQUFHLEdBQUcsVUFBVSxHQUFHLFlBQVksRUFBRSxDQUFDO1NBQ3REO2FBQU07WUFDTCxVQUFVLENBQUMsUUFBUSxHQUFHLEdBQUcsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBWSxFQUFFLFdBQW1CO0lBQzNELElBQUksV0FBVyxFQUFFO1FBQ2YsTUFBTSxRQUFRLEdBQWEsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUF1QixFQUFFLEVBQUU7WUFDdkUsTUFBTSxHQUFHLEdBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sWUFBWSxHQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDdEMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksWUFBWSxFQUFFO29CQUNoQixHQUFHLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO2lCQUN0QjthQUNGO2lCQUFNLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDNUMsaUVBQWlFO2dCQUNqRSxvRUFBb0U7Z0JBQ3BFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2hDLHNCQUFzQjtvQkFFdEIsTUFBTSxlQUFlLEdBQVcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUU5RSxHQUFHLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFFOUQsSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUN2QztvQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ3RCO2dCQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLGtCQUFrQjtnQkFDbEIsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDaEMsSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUN2QztvQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ3RCO2dCQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO2FBQ3hCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksYUFBYSxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDeEQ7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLElBQVksRUFBRSxXQUFtQjtJQUMzRCxJQUFJLFdBQVcsRUFBRTtRQUNmLE1BQU0sUUFBUSxHQUFhLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5RSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBdUIsRUFBRSxFQUFFO1lBQ3hFLE1BQU0sR0FBRyxHQUFXLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSTtnQkFDRixtREFBbUQ7Z0JBQ25ELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixLQUFLLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDaEM7YUFDRjtZQUFDLE1BQU07Z0JBQ04sS0FBSyxDQUFDLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzdHO1lBQ0Qsc0NBQXNDO1lBQ3RDLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxHQUFHLEdBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNqQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3pDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztpQkFDdEI7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3hEO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxRQUFRLEdBQWEsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQW9CLEVBQUUsRUFBRTtZQUNuRixNQUFNLEVBQUUsR0FBVyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3hEO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBT0QsTUFBTSxPQUFPLG1CQUFtQjtJQThEOUIsWUFBb0IsU0FBb0IsRUFBVSxXQUF1QixFQUFVLGFBQTJCO1FBQTFGLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBNUR0RyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFHbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUNuQzs7V0FFRztRQUNtQixVQUFLLEdBQVcsYUFBYSxDQUFDO1FBK0NwRDs7O1dBR0c7UUFDTyxpQkFBWSxHQUE0QixJQUFJLFlBQVksRUFBYSxDQUFDO0lBRWlDLENBQUM7SUFuRGxIOzs7Ozs7T0FNRztJQUNILElBQ0ksT0FBTyxDQUFDLE9BQWU7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDSSxnQkFBZ0IsQ0FBQyxnQkFBeUI7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQ0ksU0FBUyxDQUFDLFNBQWlCO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQ0ksTUFBTSxDQUFDLE1BQWM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQVdELGFBQWEsQ0FBQyxLQUFZO1FBQ3hCLE1BQU0sT0FBTyxHQUE2QixLQUFLLENBQUMsVUFBVSxDQUFDO1FBQzNELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxZQUFZLENBQW9CLE9BQU8sQ0FBQyxFQUFFO1lBQzFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsc0JBQXNCO1FBQ3RCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3pGLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BFO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNsQzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFlLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzlFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLFFBQWdCO1FBQ25DLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLGtCQUFrQjtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUUsK0NBQStDO1lBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDakQ7UUFDRCw2R0FBNkc7UUFDN0csVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFZO1FBQzNDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBUSxJQUFJLEdBQUcsQ0FBcUIsS0FBSyxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksR0FBVyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFNBQWlCO1FBQzFDLHFGQUFxRjtRQUNyRixnREFBZ0Q7UUFDaEQsTUFBTSxHQUFHLEdBQW1CLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFXLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEYsTUFBTSxxQkFBcUIsR0FBVyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sdUJBQXVCLEdBQVcsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25HLE1BQU0sa0JBQWtCLEdBQVcsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3RSxNQUFNLGNBQWMsR0FBYSxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDN0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sT0FBTyxDQUFDLFFBQWdCO1FBQzlCLHFDQUFxQztRQUNyQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLG9DQUFvQztRQUNwQyxJQUFJLEtBQUssR0FBYSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNDLHVFQUF1RTtRQUN2RSxNQUFNLG1CQUFtQixHQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkUsb0VBQW9FO1FBQ3BFLE1BQU0sdUJBQXVCLEdBQVcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLG1CQUFtQixDQUFDLENBQUM7UUFDOUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFZO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILHdDQUF3QztRQUN4QyxNQUFNLGVBQWUsR0FBVyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpELDZCQUE2QjtRQUM3QixNQUFNLFNBQVMsR0FBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwQyxTQUFTLENBQUMsU0FBUyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFNBQVMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEUsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7OzRIQTlKVSxtQkFBbUI7d0hBQW5CLG1CQUFtQjtzR0FBbkIseUJBQXFCOzs7OztRQzVJbEMsa0JBQXlCOzt1RkQ0SVosbUJBQW1CO2NBTC9CLFNBQVM7MkJBQ0UsYUFBYTtnSEFhRCxLQUFLO2tCQUExQixXQUFXO21CQUFDLE9BQU87WUFVaEIsT0FBTztrQkFEVixLQUFLO21CQUFDLFNBQVM7WUFZWixnQkFBZ0I7a0JBRG5CLEtBQUs7bUJBQUMsa0JBQWtCO1lBWXJCLFNBQVM7a0JBRFosS0FBSzttQkFBQyxXQUFXO1lBWWQsTUFBTTtrQkFEVCxLQUFLO21CQUFDLFFBQVE7WUFTTCxZQUFZO2tCQUFyQixNQUFNO1lBS1AsYUFBYTtrQkFEWixZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBSZW5kZXJlcjIsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIHNjcm9sbFRvQW5jaG9yLFxuICBnZW5IZWFkaW5nSWQsXG4gIGlzQW5jaG9yTGluayxcbiAgcmVtb3ZlVHJhaWxpbmdIYXNoLFxuICByYXdHaXRodWJIcmVmLFxuICBpc0dpdGh1YkhyZWYsXG4gIGlzUmF3R2l0aHViSHJlZixcbiAgcmVuZGVyVmlkZW9FbGVtZW50cyxcbn0gZnJvbSAnLi9tYXJrZG93bi11dGlscy9tYXJrZG93bi11dGlscyc7XG5cbmRlY2xhcmUgY29uc3QgcmVxdWlyZTogYW55O1xuLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG5sZXQgc2hvd2Rvd246IGFueSA9IHJlcXVpcmUoJ3Nob3dkb3duL2Rpc3Qvc2hvd2Rvd24uanMnKTtcblxuLy8gVE9ETzogYXNzdW1lcyBpdCBpcyBhIGdpdGh1YiB1cmxcbi8vIGFsbG93IG92ZXJyaWRlIHNvbWVob3dcbmZ1bmN0aW9uIGdlbmVyYXRlQWJzb2x1dGVIcmVmKGN1cnJlbnRIcmVmOiBzdHJpbmcsIHJlbGF0aXZlSHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmICYmIHJlbGF0aXZlSHJlZikge1xuICAgIGNvbnN0IGN1cnJlbnRVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZyA9IGN1cnJlbnRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKS5zbGljZSgxLCAtMSkuam9pbignLycpO1xuICAgIGNvbnN0IGNvcnJlY3RVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuXG4gICAgaWYgKHJlbGF0aXZlSHJlZi5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIC8vIHVybCBpcyByZWxhdGl2ZSB0byB0b3AgbGV2ZWxcbiAgICAgIGNvbnN0IG9yZ0FuZFJlcG86IHN0cmluZyA9IHBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7b3JnQW5kUmVwb30ke3JlbGF0aXZlSHJlZn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7cGF0aH0vJHtyZWxhdGl2ZUhyZWZ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RVcmwuaHJlZjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIdG1sSHJlZnMoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXScpLmZvckVhY2goKGxpbms6IEhUTUxBbmNob3JFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB1cmw6IFVSTCA9IG5ldyBVUkwobGluay5ocmVmKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSGFzaDogc3RyaW5nID0gdXJsLmhhc2g7XG4gICAgICBpZiAoaXNBbmNob3JMaW5rKGxpbmspKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5oYXNoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVybC5ob3N0ID09PSB3aW5kb3cubG9jYXRpb24uaG9zdCkge1xuICAgICAgICAvLyBob3N0cyBtYXRjaCwgbWVhbmluZyBVUkwgTUlHSFQgaGF2ZSBiZWVuIG1hbGZvcm1lZCBieSBzaG93ZG93blxuICAgICAgICAvLyB1cmwgaXMgYSByZWxhdGl2ZSB1cmwgb3IganVzdCBhIGxpbmsgdG8gYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIC8vIG9ubHkgY2hlY2sgLm1kIHVybHNcblxuICAgICAgICAgIGNvbnN0IGhyZWZXaXRob3V0SGFzaDogc3RyaW5nID0gcmVtb3ZlVHJhaWxpbmdIYXNoKGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuXG4gICAgICAgICAgdXJsLmhyZWYgPSBnZW5lcmF0ZUFic29sdXRlSHJlZihjdXJyZW50SHJlZiwgaHJlZldpdGhvdXRIYXNoKTtcblxuICAgICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICAgIHVybC5oYXNoID0gZ2VuSGVhZGluZ0lkKG9yaWdpbmFsSGFzaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cmwgaXMgYWJzb2x1dGVcbiAgICAgICAgaWYgKHVybC5wYXRobmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBpZiAob3JpZ2luYWxIYXNoKSB7XG4gICAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZG9jdW1lbnQpO1xuICB9XG4gIHJldHVybiBodG1sO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbWFnZVNyY3MoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nW3NyY10nKS5mb3JFYWNoKChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc3JjOiBzdHJpbmcgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uICovXG4gICAgICAgIG5ldyBVUkwoc3JjKTtcbiAgICAgICAgaWYgKGlzR2l0aHViSHJlZihzcmMpKSB7XG4gICAgICAgICAgaW1hZ2Uuc3JjID0gcmF3R2l0aHViSHJlZihzcmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW1hZ2Uuc3JjID0gZ2VuZXJhdGVBYnNvbHV0ZUhyZWYoaXNHaXRodWJIcmVmKGN1cnJlbnRIcmVmKSA/IHJhd0dpdGh1YkhyZWYoY3VycmVudEhyZWYpIDogY3VycmVudEhyZWYsIHNyYyk7XG4gICAgICB9XG4gICAgICAvLyBnaCBzdmdzIG5lZWQgdG8gaGF2ZSA/c2FuaXRpemU9dHJ1ZVxuICAgICAgaWYgKGlzUmF3R2l0aHViSHJlZihpbWFnZS5zcmMpKSB7XG4gICAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChpbWFnZS5zcmMpO1xuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcuc3ZnJykpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2FuaXRpemUnLCAndHJ1ZScpO1xuICAgICAgICAgIGltYWdlLnNyYyA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhkb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIGFkZElkc1RvSGVhZGluZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGh0bWwpIHtcbiAgICBjb25zdCBkb2N1bWVudDogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2JykuZm9yRWFjaCgoaGVhZGluZzogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBnZW5IZWFkaW5nSWQoaGVhZGluZy5pbm5lckhUTUwpO1xuICAgICAgaGVhZGluZy5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGRvY3VtZW50KTtcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtbWFya2Rvd24nLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBUZE1hcmtkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSBfY29udGVudDogc3RyaW5nO1xuICBwcml2YXRlIF9zaW1wbGVMaW5lQnJlYWtzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2hvc3RlZFVybDogc3RyaW5nO1xuICBwcml2YXRlIF9hbmNob3I6IHN0cmluZztcbiAgcHJpdmF0ZSBfdmlld0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIC50ZC1tYXJrZG93biBjbGFzcyBhZGRlZCB0byBob3N0IHNvIDo6bmctZGVlcCBnZXRzIHNjb3BlZC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzczogc3RyaW5nID0gJ3RkLW1hcmtkb3duJztcblxuICAvKipcbiAgICogY29udGVudD86IHN0cmluZ1xuICAgKlxuICAgKiBNYXJrZG93biBmb3JtYXQgY29udGVudCB0byBiZSBwYXJzZWQgYXMgaHRtbCBtYXJrdXAuXG4gICAqXG4gICAqIGUuZy4gUkVBRE1FLm1kIGNvbnRlbnQuXG4gICAqL1xuICBASW5wdXQoJ2NvbnRlbnQnKVxuICBzZXQgY29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzaW1wbGVMaW5lQnJlYWtzPzogc3RyaW5nXG4gICAqXG4gICAqIFNldHMgd2hldGhlciBuZXdsaW5lIGNoYXJhY3RlcnMgaW5zaWRlIHBhcmFncmFwaHMgYW5kIHNwYW5zIGFyZSBwYXJzZWQgYXMgPGJyLz4uXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgQElucHV0KCdzaW1wbGVMaW5lQnJlYWtzJylcbiAgc2V0IHNpbXBsZUxpbmVCcmVha3Moc2ltcGxlTGluZUJyZWFrczogYm9vbGVhbikge1xuICAgIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MgPSBzaW1wbGVMaW5lQnJlYWtzO1xuICB9XG5cbiAgLyoqXG4gICAqIGhvc3RlZFVybD86IHN0cmluZ1xuICAgKlxuICAgKiBJZiBtYXJrZG93biBjb250YWlucyByZWxhdGl2ZSBwYXRocywgdGhpcyBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSBjb3JyZWN0IHVybHMuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2hvc3RlZFVybCcpXG4gIHNldCBob3N0ZWRVcmwoaG9zdGVkVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ob3N0ZWRVcmwgPSBob3N0ZWRVcmw7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yPzogc3RyaW5nXG4gICAqXG4gICAqIEFuY2hvciB0byBqdW1wIHRvLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdhbmNob3InKVxuICBzZXQgYW5jaG9yKGFuY2hvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gYW5jaG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbnRlbnRSZWFkeT86IGZ1bmN0aW9uXG4gICAqIEV2ZW50IGVtaXR0ZWQgYWZ0ZXIgdGhlIG1hcmtkb3duIGNvbnRlbnQgcmVuZGVyaW5nIGlzIGZpbmlzaGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGNvbnRlbnRSZWFkeTogRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9kb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsaWNrTGlzdGVuZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudDtcbiAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdhW2hyZWZdJykgJiYgaXNBbmNob3JMaW5rKDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50KSkge1xuICAgICAgdGhpcy5oYW5kbGVBbmNob3JDbGlja3MoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBvbmx5IGFuY2hvciBjaGFuZ2VkXG4gICAgaWYgKGNoYW5nZXMuYW5jaG9yICYmICFjaGFuZ2VzLmNvbnRlbnQgJiYgIWNoYW5nZXMuc2ltcGxlTGluZUJyZWFrcyAmJiAhY2hhbmdlcy5ob3N0ZWRVcmwpIHtcbiAgICAgIHNjcm9sbFRvQW5jaG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fYW5jaG9yLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQoKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50KTtcbiAgICB9XG4gICAgdGhpcy5fdmlld0luaXQgPSB0cnVlO1xuICB9XG5cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQodGhpcy5fY29udGVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl92aWV3SW5pdCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQoKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgdG8gcGFyc2UgYSBzdHJpbmcgbWFya2Rvd24gaW50byBIVE1MIEVsZW1lbnRzIGFuZCBsb2FkIHRoZW0gaW50byB0aGUgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIF9sb2FkQ29udGVudChtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG1hcmtkb3duICYmIG1hcmtkb3duLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDbGVhbiBjb250YWluZXJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsICcnKTtcbiAgICAgIC8vIFBhcnNlIGh0bWwgc3RyaW5nIGludG8gYWN0dWFsIEhUTUwgZWxlbWVudHMuXG4gICAgICB0aGlzLl9lbGVtZW50RnJvbVN0cmluZyh0aGlzLl9yZW5kZXIobWFya2Rvd24pKTtcbiAgICB9XG4gICAgLy8gVE9ETzogdGltZW91dCByZXF1aXJlZCBzaW5jZSByZXNpemluZyBvZiBodG1sIGVsZW1lbnRzIG9jY3VycyB3aGljaCBjYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2Nyb2xsVG9BbmNob3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9hbmNob3IsIHRydWUpLCAyNTApO1xuICAgIHRoaXMuY29udGVudFJlYWR5LmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQW5jaG9yQ2xpY2tzKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdXJsOiBVUkwgPSBuZXcgVVJMKCg8SFRNTEFuY2hvckVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5ocmVmKTtcbiAgICBjb25zdCBoYXNoOiBzdHJpbmcgPSBkZWNvZGVVUkkodXJsLmhhc2gpO1xuICAgIHNjcm9sbFRvQW5jaG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgaGFzaCwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50RnJvbVN0cmluZyhtYXJrdXBTdHI6IHN0cmluZyk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICAvLyBSZW5kZXJlcjIgZG9lc250IGhhdmUgYSBwYXJzaW5nIG1ldGhvZCwgc28gd2UgaGF2ZSB0byBzYW5pdGl6ZSBhbmQgdXNlIFtpbm5lckhUTUxdXG4gICAgLy8gdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIERPTSBlbGVtZW50IGZvciBub3cuXG4gICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZGl2KTtcbiAgICBjb25zdCBodG1sOiBzdHJpbmcgPSB0aGlzLl9kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIG1hcmt1cFN0cik7XG4gICAgY29uc3QgaHRtbFdpdGhBYnNvbHV0ZUhyZWZzOiBzdHJpbmcgPSBub3JtYWxpemVIdG1sSHJlZnMoaHRtbCwgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEFic29sdXRlSW1nU3Jjczogc3RyaW5nID0gbm9ybWFsaXplSW1hZ2VTcmNzKGh0bWxXaXRoQWJzb2x1dGVIcmVmcywgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEhlYWRpbmdJZHM6IHN0cmluZyA9IGFkZElkc1RvSGVhZGluZ3MoaHRtbFdpdGhBYnNvbHV0ZUltZ1NyY3MpO1xuICAgIGNvbnN0IGh0bWxXaXRoVmlkZW9zOiBTYWZlSHRtbCA9IHJlbmRlclZpZGVvRWxlbWVudHMoaHRtbFdpdGhIZWFkaW5nSWRzKTtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eShkaXYsICdpbm5lckhUTUwnLCBodG1sV2l0aFZpZGVvcyk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlcihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG5ld2xpbmVzXG4gICAgbWFya2Rvd24gPSBtYXJrZG93bi5yZXBsYWNlKC9eKFxcc3xcXHQpKlxcbisvZywgJycpLnJlcGxhY2UoLyhcXHN8XFx0KSpcXG4rKFxcc3xcXHQpKiQvZywgJycpO1xuICAgIC8vIFNwbGl0IG1hcmtkb3duIGJ5IGxpbmUgY2hhcmFjdGVyc1xuICAgIGxldCBsaW5lczogc3RyaW5nW10gPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBjaGVjayBob3cgbXVjaCBpbmRlbnRhdGlvbiBpcyB1c2VkIGJ5IHRoZSBmaXJzdCBhY3R1YWwgbWFya2Rvd24gbGluZVxuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2U6IHN0cmluZyA9IGxpbmVzWzBdLm1hdGNoKC9eKFxcc3xcXHQpKi8pWzBdO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBzcGFjZXMgc28gbWFya2Rvd24gY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHlcbiAgICBjb25zdCBzdGFydGluZ1doaXRlc3BhY2VSZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXicgKyBmaXJzdExpbmVXaGl0ZXNwYWNlKTtcbiAgICBsaW5lcyA9IGxpbmVzLm1hcChmdW5jdGlvbiAobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBsaW5lLnJlcGxhY2Uoc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXgsICcnKTtcbiAgICB9KTtcblxuICAgIC8vIEpvaW4gbGluZXMgYWdhaW4gd2l0aCBsaW5lIGNoYXJhY3RlcnNcbiAgICBjb25zdCBtYXJrZG93blRvUGFyc2U6IHN0cmluZyA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29udmVydCBtYXJrZG93biBpbnRvIGh0bWxcbiAgICBjb25zdCBjb252ZXJ0ZXI6IGFueSA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdnaENvZGVCbG9ja3MnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YXNrbGlzdHMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YWJsZXMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzJywgdHJ1ZSk7XG4gICAgY29udmVydGVyLnNldE9wdGlvbignc2ltcGxlTGluZUJyZWFrcycsIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MpO1xuICAgIHJldHVybiBjb252ZXJ0ZXIubWFrZUh0bWwobWFya2Rvd25Ub1BhcnNlKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsYXRmb3JtL21hcmtkb3duL21hcmtkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9tYXJrZG93bi9tYXJrZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsZUFBZSxFQUdmLFdBQVcsRUFDWCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsbUJBQW1CLEdBQ3BCLE1BQU0saUNBQWlDLENBQUM7Ozs7QUFHekMsOEJBQThCO0FBQzlCLElBQUksUUFBUSxHQUFRLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBRXpELG1DQUFtQztBQUNuQyx5QkFBeUI7QUFDekIsU0FBUyxvQkFBb0IsQ0FBQyxXQUFtQixFQUFFLFlBQW9CO0lBQ3JFLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtRQUMvQixNQUFNLFVBQVUsR0FBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBVyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFRLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLElBQUks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QVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7NEhBN0tVLG1CQUFtQjt3SEFBbkIsbUJBQW1COzs7O1FDN0loQyxrQkFBeUI7O3VGRDZJWixtQkFBbUI7Y0FML0IsU0FBUzsyQkFDRSxhQUFhO3FJQWNELEtBQUs7a0JBQTFCLFdBQVc7bUJBQUMsT0FBTztZQVVoQixPQUFPO2tCQURWLEtBQUs7bUJBQUMsU0FBUztZQVlaLGdCQUFnQjtrQkFEbkIsS0FBSzttQkFBQyxrQkFBa0I7WUFZckIsU0FBUztrQkFEWixLQUFLO21CQUFDLFdBQVc7WUFZZCxNQUFNO2tCQURULEtBQUs7bUJBQUMsUUFBUTtZQVNMLFlBQVk7a0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgUmVuZGVyZXIyLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgSG9zdEJpbmRpbmcsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIHNjcm9sbFRvQW5jaG9yLFxuICBnZW5IZWFkaW5nSWQsXG4gIGlzQW5jaG9yTGluayxcbiAgcmVtb3ZlVHJhaWxpbmdIYXNoLFxuICByYXdHaXRodWJIcmVmLFxuICBpc0dpdGh1YkhyZWYsXG4gIGlzUmF3R2l0aHViSHJlZixcbiAgcmVuZGVyVmlkZW9FbGVtZW50cyxcbn0gZnJvbSAnLi9tYXJrZG93bi11dGlscy9tYXJrZG93bi11dGlscyc7XG5cbmRlY2xhcmUgY29uc3QgcmVxdWlyZTogYW55O1xuLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG5sZXQgc2hvd2Rvd246IGFueSA9IHJlcXVpcmUoJ3Nob3dkb3duL2Rpc3Qvc2hvd2Rvd24uanMnKTtcblxuLy8gVE9ETzogYXNzdW1lcyBpdCBpcyBhIGdpdGh1YiB1cmxcbi8vIGFsbG93IG92ZXJyaWRlIHNvbWVob3dcbmZ1bmN0aW9uIGdlbmVyYXRlQWJzb2x1dGVIcmVmKGN1cnJlbnRIcmVmOiBzdHJpbmcsIHJlbGF0aXZlSHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmICYmIHJlbGF0aXZlSHJlZikge1xuICAgIGNvbnN0IGN1cnJlbnRVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZyA9IGN1cnJlbnRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKS5zbGljZSgxLCAtMSkuam9pbignLycpO1xuICAgIGNvbnN0IGNvcnJlY3RVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuXG4gICAgaWYgKHJlbGF0aXZlSHJlZi5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIC8vIHVybCBpcyByZWxhdGl2ZSB0byB0b3AgbGV2ZWxcbiAgICAgIGNvbnN0IG9yZ0FuZFJlcG86IHN0cmluZyA9IHBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7b3JnQW5kUmVwb30ke3JlbGF0aXZlSHJlZn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7cGF0aH0vJHtyZWxhdGl2ZUhyZWZ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RVcmwuaHJlZjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIdG1sSHJlZnMoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXScpLmZvckVhY2goKGxpbms6IEhUTUxBbmNob3JFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB1cmw6IFVSTCA9IG5ldyBVUkwobGluay5ocmVmKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSGFzaDogc3RyaW5nID0gdXJsLmhhc2g7XG4gICAgICBpZiAoaXNBbmNob3JMaW5rKGxpbmspKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5oYXNoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVybC5ob3N0ID09PSB3aW5kb3cubG9jYXRpb24uaG9zdCkge1xuICAgICAgICAvLyBob3N0cyBtYXRjaCwgbWVhbmluZyBVUkwgTUlHSFQgaGF2ZSBiZWVuIG1hbGZvcm1lZCBieSBzaG93ZG93blxuICAgICAgICAvLyB1cmwgaXMgYSByZWxhdGl2ZSB1cmwgb3IganVzdCBhIGxpbmsgdG8gYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIC8vIG9ubHkgY2hlY2sgLm1kIHVybHNcblxuICAgICAgICAgIGNvbnN0IGhyZWZXaXRob3V0SGFzaDogc3RyaW5nID0gcmVtb3ZlVHJhaWxpbmdIYXNoKGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuXG4gICAgICAgICAgdXJsLmhyZWYgPSBnZW5lcmF0ZUFic29sdXRlSHJlZihjdXJyZW50SHJlZiwgaHJlZldpdGhvdXRIYXNoKTtcblxuICAgICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICAgIHVybC5oYXNoID0gZ2VuSGVhZGluZ0lkKG9yaWdpbmFsSGFzaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cmwgaXMgYWJzb2x1dGVcbiAgICAgICAgaWYgKHVybC5wYXRobmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBpZiAob3JpZ2luYWxIYXNoKSB7XG4gICAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZG9jdW1lbnQpO1xuICB9XG4gIHJldHVybiBodG1sO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbWFnZVNyY3MoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nW3NyY10nKS5mb3JFYWNoKChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc3JjOiBzdHJpbmcgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uICovXG4gICAgICAgIG5ldyBVUkwoc3JjKTtcbiAgICAgICAgaWYgKGlzR2l0aHViSHJlZihzcmMpKSB7XG4gICAgICAgICAgaW1hZ2Uuc3JjID0gcmF3R2l0aHViSHJlZihzcmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW1hZ2Uuc3JjID0gZ2VuZXJhdGVBYnNvbHV0ZUhyZWYoaXNHaXRodWJIcmVmKGN1cnJlbnRIcmVmKSA/IHJhd0dpdGh1YkhyZWYoY3VycmVudEhyZWYpIDogY3VycmVudEhyZWYsIHNyYyk7XG4gICAgICB9XG4gICAgICAvLyBnaCBzdmdzIG5lZWQgdG8gaGF2ZSA/c2FuaXRpemU9dHJ1ZVxuICAgICAgaWYgKGlzUmF3R2l0aHViSHJlZihpbWFnZS5zcmMpKSB7XG4gICAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChpbWFnZS5zcmMpO1xuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcuc3ZnJykpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2FuaXRpemUnLCAndHJ1ZScpO1xuICAgICAgICAgIGltYWdlLnNyYyA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhkb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIGFkZElkc1RvSGVhZGluZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGh0bWwpIHtcbiAgICBjb25zdCBkb2N1bWVudDogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2JykuZm9yRWFjaCgoaGVhZGluZzogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBnZW5IZWFkaW5nSWQoaGVhZGluZy5pbm5lckhUTUwpO1xuICAgICAgaGVhZGluZy5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGRvY3VtZW50KTtcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtbWFya2Rvd24nLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBUZE1hcmtkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9jb250ZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgX3NpbXBsZUxpbmVCcmVha3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaG9zdGVkVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgX2FuY2hvcjogc3RyaW5nO1xuICBwcml2YXRlIF92aWV3SW5pdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hbmNob3JMaXN0ZW5lcj86IFZvaWRGdW5jdGlvbjtcbiAgLyoqXG4gICAqIC50ZC1tYXJrZG93biBjbGFzcyBhZGRlZCB0byBob3N0IHNvIDo6bmctZGVlcCBnZXRzIHNjb3BlZC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzczogc3RyaW5nID0gJ3RkLW1hcmtkb3duJztcblxuICAvKipcbiAgICogY29udGVudD86IHN0cmluZ1xuICAgKlxuICAgKiBNYXJrZG93biBmb3JtYXQgY29udGVudCB0byBiZSBwYXJzZWQgYXMgaHRtbCBtYXJrdXAuXG4gICAqXG4gICAqIGUuZy4gUkVBRE1FLm1kIGNvbnRlbnQuXG4gICAqL1xuICBASW5wdXQoJ2NvbnRlbnQnKVxuICBzZXQgY29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzaW1wbGVMaW5lQnJlYWtzPzogc3RyaW5nXG4gICAqXG4gICAqIFNldHMgd2hldGhlciBuZXdsaW5lIGNoYXJhY3RlcnMgaW5zaWRlIHBhcmFncmFwaHMgYW5kIHNwYW5zIGFyZSBwYXJzZWQgYXMgPGJyLz4uXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgQElucHV0KCdzaW1wbGVMaW5lQnJlYWtzJylcbiAgc2V0IHNpbXBsZUxpbmVCcmVha3Moc2ltcGxlTGluZUJyZWFrczogYm9vbGVhbikge1xuICAgIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MgPSBzaW1wbGVMaW5lQnJlYWtzO1xuICB9XG5cbiAgLyoqXG4gICAqIGhvc3RlZFVybD86IHN0cmluZ1xuICAgKlxuICAgKiBJZiBtYXJrZG93biBjb250YWlucyByZWxhdGl2ZSBwYXRocywgdGhpcyBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSBjb3JyZWN0IHVybHMuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2hvc3RlZFVybCcpXG4gIHNldCBob3N0ZWRVcmwoaG9zdGVkVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ob3N0ZWRVcmwgPSBob3N0ZWRVcmw7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yPzogc3RyaW5nXG4gICAqXG4gICAqIEFuY2hvciB0byBqdW1wIHRvLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdhbmNob3InKVxuICBzZXQgYW5jaG9yKGFuY2hvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gYW5jaG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbnRlbnRSZWFkeT86IGZ1bmN0aW9uXG4gICAqIEV2ZW50IGVtaXR0ZWQgYWZ0ZXIgdGhlIG1hcmtkb3duIGNvbnRlbnQgcmVuZGVyaW5nIGlzIGZpbmlzaGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGNvbnRlbnRSZWFkeTogRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gb25seSBhbmNob3IgY2hhbmdlZFxuICAgIGlmIChjaGFuZ2VzLmFuY2hvciAmJiAhY2hhbmdlcy5jb250ZW50ICYmICFjaGFuZ2VzLnNpbXBsZUxpbmVCcmVha3MgJiYgIWNoYW5nZXMuaG9zdGVkVXJsKSB7XG4gICAgICBzY3JvbGxUb0FuY2hvcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2FuY2hvciwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2xvYWRDb250ZW50KCg8SFRNTEVsZW1lbnQ+dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS50ZXh0Q29udGVudCk7XG4gICAgfVxuICAgIHRoaXMuX3ZpZXdJbml0ID0gdHJ1ZTtcblxuICAgIC8vIENhcmV0YWtlciBub3RlOiB0aGUgYHNjcm9sbFRvQW5jaG9yYCBjYWxscyBgZWxlbWVudC5zY3JvbGxJbnRvVmlld2AsIGEgbmF0aXZlIHN5bmNocm9ub3VzIERPTVxuICAgIC8vIEFQSSBhbmQgaXQgZG9lc24ndCByZXF1aXJlIEFuZ3VsYXIgcnVubmluZyBgQXBwbGljYXRpb25SZWYudGljaygpYCBlYWNoIHRpbWUgdGhlIG1hcmtkb3duIGNvbXBvbmVudCBpcyBjbGlja2VkLlxuICAgIC8vIEhvc3QgbGlzdGVuZXIgKGFkZGVkIHRocm91Z2ggYEBIb3N0TGlzdGVuZXJgKSBjYXVzZSBBbmd1bGFyIHRvIGFkZCBhbiBldmVudCBsaXN0ZW5lciB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAvLyBJdCBhbHNvIGNhbGxzIGBtYXJrVmlld0RpcnR5KClgIGJlZm9yZSBjYWxsaW5nIHRoZSBhY3R1YWwgbGlzdGVuZXIgKHRoZSBkZWNvcmF0ZWQgY2xhc3MgbWV0aG9kKS5cbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5fYW5jaG9yTGlzdGVuZXIgPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnYVtocmVmXScpICYmIGlzQW5jaG9yTGluayg8SFRNTEFuY2hvckVsZW1lbnQ+ZWxlbWVudCkpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUFuY2hvckNsaWNrcyhldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fYW5jaG9yTGlzdGVuZXI/LigpO1xuICB9XG5cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQodGhpcy5fY29udGVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl92aWV3SW5pdCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQoKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgdG8gcGFyc2UgYSBzdHJpbmcgbWFya2Rvd24gaW50byBIVE1MIEVsZW1lbnRzIGFuZCBsb2FkIHRoZW0gaW50byB0aGUgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIF9sb2FkQ29udGVudChtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG1hcmtkb3duICYmIG1hcmtkb3duLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDbGVhbiBjb250YWluZXJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsICcnKTtcbiAgICAgIC8vIFBhcnNlIGh0bWwgc3RyaW5nIGludG8gYWN0dWFsIEhUTUwgZWxlbWVudHMuXG4gICAgICB0aGlzLl9lbGVtZW50RnJvbVN0cmluZyh0aGlzLl9yZW5kZXIobWFya2Rvd24pKTtcbiAgICB9XG4gICAgLy8gVE9ETzogdGltZW91dCByZXF1aXJlZCBzaW5jZSByZXNpemluZyBvZiBodG1sIGVsZW1lbnRzIG9jY3VycyB3aGljaCBjYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2Nyb2xsVG9BbmNob3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9hbmNob3IsIHRydWUpLCAyNTApO1xuICAgIHRoaXMuY29udGVudFJlYWR5LmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQW5jaG9yQ2xpY2tzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdXJsOiBVUkwgPSBuZXcgVVJMKCg8SFRNTEFuY2hvckVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5ocmVmKTtcbiAgICBjb25zdCBoYXNoOiBzdHJpbmcgPSBkZWNvZGVVUkkodXJsLmhhc2gpO1xuICAgIHNjcm9sbFRvQW5jaG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgaGFzaCwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50RnJvbVN0cmluZyhtYXJrdXBTdHI6IHN0cmluZyk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICAvLyBSZW5kZXJlcjIgZG9lc250IGhhdmUgYSBwYXJzaW5nIG1ldGhvZCwgc28gd2UgaGF2ZSB0byBzYW5pdGl6ZSBhbmQgdXNlIFtpbm5lckhUTUxdXG4gICAgLy8gdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIERPTSBlbGVtZW50IGZvciBub3cuXG4gICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZGl2KTtcbiAgICBjb25zdCBodG1sOiBzdHJpbmcgPSB0aGlzLl9kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIG1hcmt1cFN0cik7XG4gICAgY29uc3QgaHRtbFdpdGhBYnNvbHV0ZUhyZWZzOiBzdHJpbmcgPSBub3JtYWxpemVIdG1sSHJlZnMoaHRtbCwgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEFic29sdXRlSW1nU3Jjczogc3RyaW5nID0gbm9ybWFsaXplSW1hZ2VTcmNzKGh0bWxXaXRoQWJzb2x1dGVIcmVmcywgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEhlYWRpbmdJZHM6IHN0cmluZyA9IGFkZElkc1RvSGVhZGluZ3MoaHRtbFdpdGhBYnNvbHV0ZUltZ1NyY3MpO1xuICAgIGNvbnN0IGh0bWxXaXRoVmlkZW9zOiBTYWZlSHRtbCA9IHJlbmRlclZpZGVvRWxlbWVudHMoaHRtbFdpdGhIZWFkaW5nSWRzKTtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eShkaXYsICdpbm5lckhUTUwnLCBodG1sV2l0aFZpZGVvcyk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlcihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG5ld2xpbmVzXG4gICAgbWFya2Rvd24gPSBtYXJrZG93bi5yZXBsYWNlKC9eKFxcc3xcXHQpKlxcbisvZywgJycpLnJlcGxhY2UoLyhcXHN8XFx0KSpcXG4rKFxcc3xcXHQpKiQvZywgJycpO1xuICAgIC8vIFNwbGl0IG1hcmtkb3duIGJ5IGxpbmUgY2hhcmFjdGVyc1xuICAgIGxldCBsaW5lczogc3RyaW5nW10gPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBjaGVjayBob3cgbXVjaCBpbmRlbnRhdGlvbiBpcyB1c2VkIGJ5IHRoZSBmaXJzdCBhY3R1YWwgbWFya2Rvd24gbGluZVxuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2U6IHN0cmluZyA9IGxpbmVzWzBdLm1hdGNoKC9eKFxcc3xcXHQpKi8pWzBdO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBzcGFjZXMgc28gbWFya2Rvd24gY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHlcbiAgICBjb25zdCBzdGFydGluZ1doaXRlc3BhY2VSZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXicgKyBmaXJzdExpbmVXaGl0ZXNwYWNlKTtcbiAgICBsaW5lcyA9IGxpbmVzLm1hcChmdW5jdGlvbiAobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBsaW5lLnJlcGxhY2Uoc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXgsICcnKTtcbiAgICB9KTtcblxuICAgIC8vIEpvaW4gbGluZXMgYWdhaW4gd2l0aCBsaW5lIGNoYXJhY3RlcnNcbiAgICBjb25zdCBtYXJrZG93blRvUGFyc2U6IHN0cmluZyA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29udmVydCBtYXJrZG93biBpbnRvIGh0bWxcbiAgICBjb25zdCBjb252ZXJ0ZXI6IGFueSA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdnaENvZGVCbG9ja3MnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YXNrbGlzdHMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YWJsZXMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzJywgdHJ1ZSk7XG4gICAgY29udmVydGVyLnNldE9wdGlvbignc2ltcGxlTGluZUJyZWFrcycsIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MpO1xuICAgIHJldHVybiBjb252ZXJ0ZXIubWFrZUh0bWwobWFya2Rvd25Ub1BhcnNlKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, SecurityContext, Component, HostBinding, Input, Output,
|
|
2
|
+
import { EventEmitter, SecurityContext, Component, HostBinding, Input, Output, Injectable, NgModule } from '@angular/core';
|
|
3
3
|
import { CommonModule } from '@angular/common';
|
|
4
4
|
import * as i1$1 from '@angular/common/http';
|
|
5
5
|
import { HttpClientModule } from '@angular/common/http';
|
|
6
|
-
import { __awaiter } from 'tslib';
|
|
7
6
|
import * as i1 from '@angular/platform-browser';
|
|
7
|
+
import { __awaiter } from 'tslib';
|
|
8
8
|
|
|
9
9
|
function removeLeadingHash(str) {
|
|
10
10
|
if (str) {
|
|
@@ -224,10 +224,11 @@ function addIdsToHeadings(html) {
|
|
|
224
224
|
return html;
|
|
225
225
|
}
|
|
226
226
|
class TdMarkdownComponent {
|
|
227
|
-
constructor(_renderer, _elementRef, _domSanitizer) {
|
|
227
|
+
constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
|
|
228
228
|
this._renderer = _renderer;
|
|
229
229
|
this._elementRef = _elementRef;
|
|
230
230
|
this._domSanitizer = _domSanitizer;
|
|
231
|
+
this._ngZone = _ngZone;
|
|
231
232
|
this._simpleLineBreaks = false;
|
|
232
233
|
this._viewInit = false;
|
|
233
234
|
/**
|
|
@@ -277,12 +278,6 @@ class TdMarkdownComponent {
|
|
|
277
278
|
set anchor(anchor) {
|
|
278
279
|
this._anchor = anchor;
|
|
279
280
|
}
|
|
280
|
-
clickListener(event) {
|
|
281
|
-
const element = event.srcElement;
|
|
282
|
-
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
283
|
-
this.handleAnchorClicks(event);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
281
|
ngOnChanges(changes) {
|
|
287
282
|
// only anchor changed
|
|
288
283
|
if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {
|
|
@@ -297,6 +292,22 @@ class TdMarkdownComponent {
|
|
|
297
292
|
this._loadContent(this._elementRef.nativeElement.textContent);
|
|
298
293
|
}
|
|
299
294
|
this._viewInit = true;
|
|
295
|
+
// Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM
|
|
296
|
+
// API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.
|
|
297
|
+
// Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.
|
|
298
|
+
// It also calls `markViewDirty()` before calling the actual listener (the decorated class method).
|
|
299
|
+
this._ngZone.runOutsideAngular(() => {
|
|
300
|
+
this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
|
|
301
|
+
const element = event.srcElement;
|
|
302
|
+
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
303
|
+
this.handleAnchorClicks(event);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
ngOnDestroy() {
|
|
309
|
+
var _a;
|
|
310
|
+
(_a = this._anchorListener) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
300
311
|
}
|
|
301
312
|
refresh() {
|
|
302
313
|
if (this._content) {
|
|
@@ -321,12 +332,10 @@ class TdMarkdownComponent {
|
|
|
321
332
|
this.contentReady.emit();
|
|
322
333
|
}
|
|
323
334
|
handleAnchorClicks(event) {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
scrollToAnchor(this._elementRef.nativeElement, hash, true);
|
|
329
|
-
});
|
|
335
|
+
event.preventDefault();
|
|
336
|
+
const url = new URL(event.target.href);
|
|
337
|
+
const hash = decodeURI(url.hash);
|
|
338
|
+
scrollToAnchor(this._elementRef.nativeElement, hash, true);
|
|
330
339
|
}
|
|
331
340
|
_elementFromString(markupStr) {
|
|
332
341
|
// Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]
|
|
@@ -365,11 +374,8 @@ class TdMarkdownComponent {
|
|
|
365
374
|
return converter.makeHtml(markdownToParse);
|
|
366
375
|
}
|
|
367
376
|
}
|
|
368
|
-
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵfac = function TdMarkdownComponent_Factory(t) { return new (t || TdMarkdownComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.DomSanitizer)); };
|
|
377
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵfac = function TdMarkdownComponent_Factory(t) { return new (t || TdMarkdownComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
369
378
|
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) {
|
|
370
|
-
if (rf & 1) {
|
|
371
|
-
i0.ɵɵlistener("click", function TdMarkdownComponent_click_HostBindingHandler($event) { return ctx.clickListener($event); });
|
|
372
|
-
}
|
|
373
379
|
if (rf & 2) {
|
|
374
380
|
i0.ɵɵclassMap(ctx.class);
|
|
375
381
|
}
|
|
@@ -383,7 +389,7 @@ class TdMarkdownComponent {
|
|
|
383
389
|
(typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownComponent, [{
|
|
384
390
|
type: Component,
|
|
385
391
|
args: [{ selector: 'td-markdown', template: "<ng-content></ng-content>\n", styles: [":host.td-markdown::ng-deep a{background-color:transparent}:host.td-markdown::ng-deep a:active,:host.td-markdown::ng-deep a:hover{outline-width:0}:host.td-markdown::ng-deep strong{font-weight:inherit;font-weight:bolder}:host.td-markdown::ng-deep h1{font-size:2em;margin:.67em 0}:host.td-markdown::ng-deep img{border-style:none}:host.td-markdown::ng-deep svg:not(:root){overflow:hidden}:host.td-markdown::ng-deep code,:host.td-markdown::ng-deep kbd,:host.td-markdown::ng-deep pre{font-family:monospace;font-size:1em}:host.td-markdown::ng-deep hr{box-sizing:content-box;height:0;overflow:visible}:host.td-markdown::ng-deep input{font:inherit;margin:0}:host.td-markdown::ng-deep input{overflow:visible}:host.td-markdown::ng-deep button:-moz-focusring,:host.td-markdown::ng-deep [type=button]:-moz-focusring,:host.td-markdown::ng-deep [type=reset]:-moz-focusring,:host.td-markdown::ng-deep [type=submit]:-moz-focusring{outline:1px dotted ButtonText}:host.td-markdown::ng-deep [type=checkbox]{box-sizing:border-box;padding:0}:host.td-markdown::ng-deep table{border-spacing:0;border-collapse:collapse}:host.td-markdown::ng-deep td,:host.td-markdown::ng-deep th{padding:0}:host.td-markdown::ng-deep *{box-sizing:border-box}:host.td-markdown::ng-deep input{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol}:host.td-markdown::ng-deep a{text-decoration:none}:host.td-markdown::ng-deep a:hover,:host.td-markdown::ng-deep a:active{text-decoration:underline}:host.td-markdown::ng-deep hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep hr:before{display:table;content:\"\"}:host.td-markdown::ng-deep hr:after{display:table;clear:both;content:\"\"}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:0;margin-bottom:0;line-height:1.5}:host.td-markdown::ng-deep h1{font-size:30px}:host.td-markdown::ng-deep h2{font-size:21px}:host.td-markdown::ng-deep h3{font-size:16px}:host.td-markdown::ng-deep h4{font-size:14px}:host.td-markdown::ng-deep h5{font-size:12px}:host.td-markdown::ng-deep h6{font-size:11px}:host.td-markdown::ng-deep p{margin-top:0;margin-bottom:10px}:host.td-markdown::ng-deep blockquote{margin:0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:0;margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ul ol{list-style-type:lower-roman}:host.td-markdown::ng-deep ul ul ol,:host.td-markdown::ng-deep ul ol ol,:host.td-markdown::ng-deep ol ul ol,:host.td-markdown::ng-deep ol ol ol{list-style-type:lower-alpha}:host.td-markdown::ng-deep dd{margin-left:0}:host.td-markdown::ng-deep code{font-family:Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:0;font:12px Consolas,Liberation Mono,Menlo,Courier,monospace}:host.td-markdown::ng-deep .pl-0{padding-left:0!important}:host.td-markdown::ng-deep .pl-1{padding-left:3px!important}:host.td-markdown::ng-deep .pl-2{padding-left:6px!important}:host.td-markdown::ng-deep .pl-3{padding-left:12px!important}:host.td-markdown::ng-deep .pl-4{padding-left:24px!important}:host.td-markdown::ng-deep .pl-5{padding-left:36px!important}:host.td-markdown::ng-deep .pl-6{padding-left:48px!important}:host.td-markdown::ng-deep .form-select::-ms-expand{opacity:0}:host.td-markdown::ng-deep a:not([href]){color:inherit;text-decoration:none}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}:host.td-markdown::ng-deep h1 .octicon-link,:host.td-markdown::ng-deep h2 .octicon-link,:host.td-markdown::ng-deep h3 .octicon-link,:host.td-markdown::ng-deep h4 .octicon-link,:host.td-markdown::ng-deep h5 .octicon-link,:host.td-markdown::ng-deep h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}:host.td-markdown::ng-deep h1:hover .anchor,:host.td-markdown::ng-deep h2:hover .anchor,:host.td-markdown::ng-deep h3:hover .anchor,:host.td-markdown::ng-deep h4:hover .anchor,:host.td-markdown::ng-deep h5:hover .anchor,:host.td-markdown::ng-deep h6:hover .anchor{text-decoration:none}:host.td-markdown::ng-deep h1:hover .anchor .octicon-link,:host.td-markdown::ng-deep h2:hover .anchor .octicon-link,:host.td-markdown::ng-deep h3:hover .anchor .octicon-link,:host.td-markdown::ng-deep h4:hover .anchor .octicon-link,:host.td-markdown::ng-deep h5:hover .anchor .octicon-link,:host.td-markdown::ng-deep h6:hover .anchor .octicon-link{visibility:visible}:host.td-markdown::ng-deep h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h1 .anchor{line-height:1}:host.td-markdown::ng-deep h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h2 .anchor{line-height:1}:host.td-markdown::ng-deep h3{font-size:1.5em;line-height:1.43}:host.td-markdown::ng-deep h3 .anchor{line-height:1.2}:host.td-markdown::ng-deep h4{font-size:1.25em}:host.td-markdown::ng-deep h4 .anchor{line-height:1.2}:host.td-markdown::ng-deep h5{font-size:1em}:host.td-markdown::ng-deep h5 .anchor{line-height:1.1}:host.td-markdown::ng-deep h6{font-size:1em}:host.td-markdown::ng-deep h6 .anchor{line-height:1.1}:host.td-markdown::ng-deep p,:host.td-markdown::ng-deep blockquote,:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol,:host.td-markdown::ng-deep dl,:host.td-markdown::ng-deep table,:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:16px}:host.td-markdown::ng-deep hr{margin:16px 0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:2em}:host.td-markdown::ng-deep ul ul,:host.td-markdown::ng-deep ul ol,:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ol ul{margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep li>p{margin-top:16px}:host.td-markdown::ng-deep dl{padding:0}:host.td-markdown::ng-deep dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}:host.td-markdown::ng-deep dl dd{padding:0 16px;margin-bottom:16px}:host.td-markdown::ng-deep blockquote{padding:0 15px;border-left-width:4px;border-left-style:solid}:host.td-markdown::ng-deep blockquote>:first-child{margin-top:0}:host.td-markdown::ng-deep blockquote>:last-child{margin-bottom:0}:host.td-markdown::ng-deep table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}:host.td-markdown::ng-deep table th{font-weight:700}:host.td-markdown::ng-deep table th,:host.td-markdown::ng-deep table td{padding:6px 13px;border-width:1px;border-style:solid}:host.td-markdown::ng-deep table tr{border-top-width:1px;border-top-style:solid}:host.td-markdown::ng-deep img{max-width:100%;box-sizing:content-box}:host.td-markdown::ng-deep code{padding:.2em 0;margin:0;font-size:85%;border-radius:3px}:host.td-markdown::ng-deep code:before,:host.td-markdown::ng-deep code:after{letter-spacing:-.2em}:host.td-markdown::ng-deep pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}:host.td-markdown::ng-deep .highlight{margin-bottom:16px}:host.td-markdown::ng-deep .highlight pre,:host.td-markdown::ng-deep pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}:host.td-markdown::ng-deep .highlight pre{margin-bottom:0;word-break:normal}:host.td-markdown::ng-deep pre{word-wrap:normal}:host.td-markdown::ng-deep pre code{display:inline;max-width:none;max-width:initial;padding:0;margin:0;overflow:visible;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}:host.td-markdown::ng-deep pre code:before,:host.td-markdown::ng-deep pre code:after{content:normal}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px}:host.td-markdown::ng-deep .pl-c{color:#969896}:host.td-markdown::ng-deep .pl-c1,:host.td-markdown::ng-deep .pl-s .pl-v{color:#0086b3}:host.td-markdown::ng-deep .pl-e,:host.td-markdown::ng-deep .pl-en{color:#795da3}:host.td-markdown::ng-deep .pl-s .pl-s1,:host.td-markdown::ng-deep .pl-smi{color:#333}:host.td-markdown::ng-deep .pl-ent{color:#63a35c}:host.td-markdown::ng-deep .pl-k{color:#a71d5d}:host.td-markdown::ng-deep .pl-pds,:host.td-markdown::ng-deep .pl-s,:host.td-markdown::ng-deep .pl-s .pl-pse .pl-s1,:host.td-markdown::ng-deep .pl-sr,:host.td-markdown::ng-deep .pl-sr .pl-cce,:host.td-markdown::ng-deep .pl-sr .pl-sra,:host.td-markdown::ng-deep .pl-sr .pl-sre{color:#183691}:host.td-markdown::ng-deep .pl-v{color:#ed6a43}:host.td-markdown::ng-deep .pl-id{color:#b52a1d}:host.td-markdown::ng-deep .pl-ii{background-color:#b52a1d;color:#f8f8f8}:host.td-markdown::ng-deep .pl-sr .pl-cce{color:#63a35c;font-weight:700}:host.td-markdown::ng-deep .pl-ml{color:#693a17}:host.td-markdown::ng-deep .pl-mh,:host.td-markdown::ng-deep .pl-mh .pl-en,:host.td-markdown::ng-deep .pl-ms{color:#1d3e81;font-weight:700}:host.td-markdown::ng-deep .pl-mq{color:teal}:host.td-markdown::ng-deep .pl-mi{color:#333;font-style:italic}:host.td-markdown::ng-deep .pl-mb{color:#333;font-weight:700}:host.td-markdown::ng-deep .pl-md{background-color:#ffecec;color:#bd2c00}:host.td-markdown::ng-deep .pl-mi1{background-color:#eaffea;color:#55a532}:host.td-markdown::ng-deep .pl-mdr{color:#795da3;font-weight:700}:host.td-markdown::ng-deep .pl-mo{color:#1d3e81}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font:11px Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #cccccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px #bbb}:host.td-markdown::ng-deep .full-commit .btn-outline:not(:disabled):hover{color:#4078c0;border:1px solid #4078c0}:host.td-markdown::ng-deep :checked+.radio-label{position:relative;z-index:1;border-color:#4078c0}:host.td-markdown::ng-deep .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}:host.td-markdown::ng-deep .task-list-item{list-style-type:none}:host.td-markdown::ng-deep .task-list-item+.task-list-item{margin-top:3px}:host.td-markdown::ng-deep .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}\n"] }]
|
|
386
|
-
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }]; }, { class: [{
|
|
392
|
+
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, { class: [{
|
|
387
393
|
type: HostBinding,
|
|
388
394
|
args: ['class']
|
|
389
395
|
}], content: [{
|
|
@@ -400,9 +406,6 @@ class TdMarkdownComponent {
|
|
|
400
406
|
args: ['anchor']
|
|
401
407
|
}], contentReady: [{
|
|
402
408
|
type: Output
|
|
403
|
-
}], clickListener: [{
|
|
404
|
-
type: HostListener,
|
|
405
|
-
args: ['click', ['$event']]
|
|
406
409
|
}] });
|
|
407
410
|
})();
|
|
408
411
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"covalent-markdown.mjs","sources":["../../../../src/platform/markdown/markdown-utils/markdown-utils.ts","../../../../src/platform/markdown/markdown.component.ts","../../../../src/platform/markdown/markdown.component.html","../../../../src/platform/markdown/markdown-loader/markdown-loader.service.ts","../../../../src/platform/markdown/markdown.module.ts","../../../../src/platform/markdown/covalent-markdown.ts"],"sourcesContent":["export function removeLeadingHash(str: string): string {\n if (str) {\n return str.replace(/^#+/, '');\n }\n return '';\n}\n\nexport function removeTrailingHash(str: string): string {\n if (str) {\n return str.replace(/\\#.*/, '');\n }\n return '';\n}\n\nexport function genHeadingId(str: string): string {\n if (str) {\n return removeLeadingHash(\n str\n .replace(/(_|-|\\s)+/g, '')\n // Remove certain special chars to create heading ids similar to those in github\n // borrowed from showdown\n // https://github.com/showdownjs/showdown/blob/develop/src/subParsers/makehtml/headers.js#L94\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, ''),\n ).toLowerCase();\n }\n return '';\n}\n\nexport function scrollToAnchor(scope: HTMLElement, anchor: string, tryParent: boolean): boolean {\n if (scope && anchor) {\n const normalizedAnchor: string = genHeadingId(anchor);\n let headingToJumpTo: HTMLElement;\n const headingWithinComponent: HTMLElement = scope.querySelector(`[id=\"${normalizedAnchor}\"]`);\n\n if (headingWithinComponent) {\n headingToJumpTo = headingWithinComponent;\n } else if (tryParent) {\n const parent: HTMLElement = scope.parentElement;\n if (parent) {\n headingToJumpTo = parent.querySelector(`[id=\"${normalizedAnchor}\"]`);\n }\n }\n if (headingToJumpTo) {\n headingToJumpTo.scrollIntoView({ behavior: 'auto' });\n return true;\n }\n }\n return false;\n}\n\nexport function isAnchorLink(anchor: HTMLAnchorElement): boolean {\n if (anchor) {\n const href: string = anchor.getAttribute('href');\n if (href) {\n return href.startsWith('#');\n }\n }\n return false;\n}\nconst RAW_GITHUB_HOSTNAME: string = 'raw.githubusercontent.com';\n\nexport function rawGithubHref(githubHref: string): string {\n if (githubHref) {\n try {\n const url: URL = new URL(githubHref);\n if (url.hostname === RAW_GITHUB_HOSTNAME) {\n return url.href;\n } else if (isGithubHref(githubHref)) {\n url.hostname = RAW_GITHUB_HOSTNAME;\n url.pathname = url.pathname.split('/blob', 2).join('');\n return url.href;\n }\n } catch {\n return '';\n }\n }\n return '';\n}\n\nexport function isGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === 'github.com';\n } catch {\n return false;\n }\n}\n\nexport function isRawGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === RAW_GITHUB_HOSTNAME;\n } catch {\n return false;\n }\n}\n\nexport function renderVideoElements(html: string): string {\n const ytLongEmbed: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:embed\\/)([\\w-]{11})(\\?[\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?)]/gi;\n const ytLongWatch: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:watch\\?v=)([\\w-]{11})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n const ytShort: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)?youtu.be\\/([\\w-]{11})\\??([\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?]/gi;\n const ytPlaylist: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:playlist\\?list=)([\\w-]{34})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n\n function convert(match: string, id: string, flags: string): string {\n if (flags) {\n id += '?' + flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/${id}\"></iframe>`;\n }\n function convertPL(match: string, id: string, flags: string): string {\n if (flags) {\n id += flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/videoseries?list=${id}\"></iframe>`;\n }\n\n return html\n .replace(ytLongWatch, convert)\n .replace(ytLongEmbed, convert)\n .replace(ytShort, convert)\n .replace(ytPlaylist, convertPL);\n}\n","import {\n Component,\n AfterViewInit,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n Renderer2,\n SecurityContext,\n OnChanges,\n SimpleChanges,\n HostBinding,\n HostListener,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n scrollToAnchor,\n genHeadingId,\n isAnchorLink,\n removeTrailingHash,\n rawGithubHref,\n isGithubHref,\n isRawGithubHref,\n renderVideoElements,\n} from './markdown-utils/markdown-utils';\n\ndeclare const require: any;\n/* tslint:disable-next-line */\nlet showdown: any = require('showdown/dist/showdown.js');\n\n// TODO: assumes it is a github url\n// allow override somehow\nfunction generateAbsoluteHref(currentHref: string, relativeHref: string): string {\n if (currentHref && relativeHref) {\n const currentUrl: URL = new URL(currentHref);\n const path: string = currentUrl.pathname.split('/').slice(1, -1).join('/');\n const correctUrl: URL = new URL(currentHref);\n\n if (relativeHref.startsWith('/')) {\n // url is relative to top level\n const orgAndRepo: string = path.split('/').slice(0, 3).join('/');\n correctUrl.pathname = `${orgAndRepo}${relativeHref}`;\n } else {\n correctUrl.pathname = `${path}/${relativeHref}`;\n }\n return correctUrl.href;\n }\n return undefined;\n}\n\nfunction normalizeHtmlHrefs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('a[href]').forEach((link: HTMLAnchorElement) => {\n const url: URL = new URL(link.href);\n const originalHash: string = url.hash;\n if (isAnchorLink(link)) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n link.href = url.hash;\n }\n } else if (url.host === window.location.host) {\n // hosts match, meaning URL MIGHT have been malformed by showdown\n // url is a relative url or just a link to a part of the application\n if (url.pathname.endsWith('.md')) {\n // only check .md urls\n\n const hrefWithoutHash: string = removeTrailingHash(link.getAttribute('href'));\n\n url.href = generateAbsoluteHref(currentHref, hrefWithoutHash);\n\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n } else {\n // url is absolute\n if (url.pathname.endsWith('.md')) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction normalizeImageSrcs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('img[src]').forEach((image: HTMLImageElement) => {\n const src: string = image.getAttribute('src');\n try {\n /* tslint:disable-next-line:no-unused-expression */\n new URL(src);\n if (isGithubHref(src)) {\n image.src = rawGithubHref(src);\n }\n } catch {\n image.src = generateAbsoluteHref(isGithubHref(currentHref) ? rawGithubHref(currentHref) : currentHref, src);\n }\n // gh svgs need to have ?sanitize=true\n if (isRawGithubHref(image.src)) {\n const url: URL = new URL(image.src);\n if (url.pathname.endsWith('.svg')) {\n url.searchParams.set('sanitize', 'true');\n image.src = url.href;\n }\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction addIdsToHeadings(html: string): string {\n if (html) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((heading: HTMLElement) => {\n const id: string = genHeadingId(heading.innerHTML);\n heading.setAttribute('id', id);\n });\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\n@Component({\n selector: 'td-markdown',\n styleUrls: ['./markdown.component.scss'],\n templateUrl: './markdown.component.html',\n})\nexport class TdMarkdownComponent implements OnChanges, AfterViewInit {\n private _content: string;\n private _simpleLineBreaks: boolean = false;\n private _hostedUrl: string;\n private _anchor: string;\n private _viewInit: boolean = false;\n /**\n * .td-markdown class added to host so ::ng-deep gets scoped.\n */\n @HostBinding('class') class: string = 'td-markdown';\n\n /**\n * content?: string\n *\n * Markdown format content to be parsed as html markup.\n *\n * e.g. README.md content.\n */\n @Input('content')\n set content(content: string) {\n this._content = content;\n }\n\n /**\n * simpleLineBreaks?: string\n *\n * Sets whether newline characters inside paragraphs and spans are parsed as <br/>.\n * Defaults to false.\n */\n @Input('simpleLineBreaks')\n set simpleLineBreaks(simpleLineBreaks: boolean) {\n this._simpleLineBreaks = simpleLineBreaks;\n }\n\n /**\n * hostedUrl?: string\n *\n * If markdown contains relative paths, this is required to generate correct urls.\n *\n */\n @Input('hostedUrl')\n set hostedUrl(hostedUrl: string) {\n this._hostedUrl = hostedUrl;\n }\n\n /**\n * anchor?: string\n *\n * Anchor to jump to.\n *\n */\n @Input('anchor')\n set anchor(anchor: string) {\n this._anchor = anchor;\n }\n\n /**\n * contentReady?: function\n * Event emitted after the markdown content rendering is finished.\n */\n @Output() contentReady: EventEmitter<undefined> = new EventEmitter<undefined>();\n\n constructor(private _renderer: Renderer2, private _elementRef: ElementRef, private _domSanitizer: DomSanitizer) {}\n\n @HostListener('click', ['$event'])\n clickListener(event: Event): void {\n const element: HTMLElement = <HTMLElement>event.srcElement;\n if (element.matches('a[href]') && isAnchorLink(<HTMLAnchorElement>element)) {\n this.handleAnchorClicks(event);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // only anchor changed\n if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {\n scrollToAnchor(this._elementRef.nativeElement, this._anchor, true);\n } else {\n this.refresh();\n }\n }\n\n ngAfterViewInit(): void {\n if (!this._content) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n this._viewInit = true;\n }\n\n refresh(): void {\n if (this._content) {\n this._loadContent(this._content);\n } else if (this._viewInit) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n }\n\n /**\n * General method to parse a string markdown into HTML Elements and load them into the container\n */\n private _loadContent(markdown: string): void {\n if (markdown && markdown.trim().length > 0) {\n // Clean container\n this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');\n // Parse html string into actual HTML elements.\n this._elementFromString(this._render(markdown));\n }\n // TODO: timeout required since resizing of html elements occurs which causes a change in the scroll position\n setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);\n this.contentReady.emit();\n }\n\n private async handleAnchorClicks(event: Event): Promise<void> {\n event.preventDefault();\n const url: URL = new URL((<HTMLAnchorElement>event.target).href);\n const hash: string = decodeURI(url.hash);\n scrollToAnchor(this._elementRef.nativeElement, hash, true);\n }\n\n private _elementFromString(markupStr: string): HTMLDivElement {\n // Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]\n // to parse the string into DOM element for now.\n const div: HTMLDivElement = this._renderer.createElement('div');\n this._renderer.appendChild(this._elementRef.nativeElement, div);\n const html: string = this._domSanitizer.sanitize(SecurityContext.HTML, markupStr);\n const htmlWithAbsoluteHrefs: string = normalizeHtmlHrefs(html, this._hostedUrl);\n const htmlWithAbsoluteImgSrcs: string = normalizeImageSrcs(htmlWithAbsoluteHrefs, this._hostedUrl);\n const htmlWithHeadingIds: string = addIdsToHeadings(htmlWithAbsoluteImgSrcs);\n const htmlWithVideos: SafeHtml = renderVideoElements(htmlWithHeadingIds);\n this._renderer.setProperty(div, 'innerHTML', htmlWithVideos);\n return div;\n }\n\n private _render(markdown: string): string {\n // Trim leading and trailing newlines\n markdown = markdown.replace(/^(\\s|\\t)*\\n+/g, '').replace(/(\\s|\\t)*\\n+(\\s|\\t)*$/g, '');\n // Split markdown by line characters\n let lines: string[] = markdown.split('\\n');\n\n // check how much indentation is used by the first actual markdown line\n const firstLineWhitespace: string = lines[0].match(/^(\\s|\\t)*/)[0];\n\n // Remove all indentation spaces so markdown can be parsed correctly\n const startingWhitespaceRegex: RegExp = new RegExp('^' + firstLineWhitespace);\n lines = lines.map(function (line: string): string {\n return line.replace(startingWhitespaceRegex, '');\n });\n\n // Join lines again with line characters\n const markdownToParse: string = lines.join('\\n');\n\n // Convert markdown into html\n const converter: any = new showdown.Converter();\n converter.setOption('ghCodeBlocks', true);\n converter.setOption('tasklists', true);\n converter.setOption('tables', true);\n converter.setOption('literalMidWordUnderscores', true);\n converter.setOption('simpleLineBreaks', this._simpleLineBreaks);\n return converter.makeHtml(markdownToParse);\n }\n}\n","<ng-content></ng-content>\n","import { Injectable, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { isGithubHref, rawGithubHref } from '../markdown-utils/markdown-utils';\n\n@Injectable()\nexport class TdMarkdownLoaderService {\n constructor(private _http: HttpClient, private _sanitizer: DomSanitizer) {}\n\n async load(url: string, httpOptions: object = {}): Promise<string> {\n const sanitizedUrl: string = this._sanitizer.sanitize(SecurityContext.URL, url);\n let urlToGet: string = sanitizedUrl;\n if (isGithubHref(sanitizedUrl)) {\n urlToGet = rawGithubHref(sanitizedUrl);\n }\n\n const response: HttpResponse<string> = await this._http\n .get(urlToGet, { ...httpOptions, responseType: 'text', observe: 'response' })\n .toPromise();\n const contentType: string = response.headers.get('Content-Type');\n if (contentType.includes('text/plain') || contentType.includes('text/markdown')) {\n return response.body;\n } else {\n throw Error(`${contentType} is not a handled content type`);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { HttpClientModule } from '@angular/common/http';\n\nimport { TdMarkdownComponent } from './markdown.component';\nimport { TdMarkdownLoaderService } from './markdown-loader/markdown-loader.service';\n\n@NgModule({\n imports: [CommonModule, HttpClientModule],\n declarations: [TdMarkdownComponent],\n exports: [TdMarkdownComponent],\n providers: [TdMarkdownLoaderService],\n})\nexport class CovalentMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"covalent-markdown.mjs","sources":["../../../../src/platform/markdown/markdown-utils/markdown-utils.ts","../../../../src/platform/markdown/markdown.component.ts","../../../../src/platform/markdown/markdown.component.html","../../../../src/platform/markdown/markdown-loader/markdown-loader.service.ts","../../../../src/platform/markdown/markdown.module.ts","../../../../src/platform/markdown/covalent-markdown.ts"],"sourcesContent":["export function removeLeadingHash(str: string): string {\n if (str) {\n return str.replace(/^#+/, '');\n }\n return '';\n}\n\nexport function removeTrailingHash(str: string): string {\n if (str) {\n return str.replace(/\\#.*/, '');\n }\n return '';\n}\n\nexport function genHeadingId(str: string): string {\n if (str) {\n return removeLeadingHash(\n str\n .replace(/(_|-|\\s)+/g, '')\n // Remove certain special chars to create heading ids similar to those in github\n // borrowed from showdown\n // https://github.com/showdownjs/showdown/blob/develop/src/subParsers/makehtml/headers.js#L94\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, ''),\n ).toLowerCase();\n }\n return '';\n}\n\nexport function scrollToAnchor(scope: HTMLElement, anchor: string, tryParent: boolean): boolean {\n if (scope && anchor) {\n const normalizedAnchor: string = genHeadingId(anchor);\n let headingToJumpTo: HTMLElement;\n const headingWithinComponent: HTMLElement = scope.querySelector(`[id=\"${normalizedAnchor}\"]`);\n\n if (headingWithinComponent) {\n headingToJumpTo = headingWithinComponent;\n } else if (tryParent) {\n const parent: HTMLElement = scope.parentElement;\n if (parent) {\n headingToJumpTo = parent.querySelector(`[id=\"${normalizedAnchor}\"]`);\n }\n }\n if (headingToJumpTo) {\n headingToJumpTo.scrollIntoView({ behavior: 'auto' });\n return true;\n }\n }\n return false;\n}\n\nexport function isAnchorLink(anchor: HTMLAnchorElement): boolean {\n if (anchor) {\n const href: string = anchor.getAttribute('href');\n if (href) {\n return href.startsWith('#');\n }\n }\n return false;\n}\nconst RAW_GITHUB_HOSTNAME: string = 'raw.githubusercontent.com';\n\nexport function rawGithubHref(githubHref: string): string {\n if (githubHref) {\n try {\n const url: URL = new URL(githubHref);\n if (url.hostname === RAW_GITHUB_HOSTNAME) {\n return url.href;\n } else if (isGithubHref(githubHref)) {\n url.hostname = RAW_GITHUB_HOSTNAME;\n url.pathname = url.pathname.split('/blob', 2).join('');\n return url.href;\n }\n } catch {\n return '';\n }\n }\n return '';\n}\n\nexport function isGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === 'github.com';\n } catch {\n return false;\n }\n}\n\nexport function isRawGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === RAW_GITHUB_HOSTNAME;\n } catch {\n return false;\n }\n}\n\nexport function renderVideoElements(html: string): string {\n const ytLongEmbed: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:embed\\/)([\\w-]{11})(\\?[\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?)]/gi;\n const ytLongWatch: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:watch\\?v=)([\\w-]{11})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n const ytShort: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)?youtu.be\\/([\\w-]{11})\\??([\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?]/gi;\n const ytPlaylist: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:playlist\\?list=)([\\w-]{34})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n\n function convert(match: string, id: string, flags: string): string {\n if (flags) {\n id += '?' + flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/${id}\"></iframe>`;\n }\n function convertPL(match: string, id: string, flags: string): string {\n if (flags) {\n id += flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/videoseries?list=${id}\"></iframe>`;\n }\n\n return html\n .replace(ytLongWatch, convert)\n .replace(ytLongEmbed, convert)\n .replace(ytShort, convert)\n .replace(ytPlaylist, convertPL);\n}\n","import {\n Component,\n AfterViewInit,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n Renderer2,\n SecurityContext,\n OnChanges,\n SimpleChanges,\n HostBinding,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n scrollToAnchor,\n genHeadingId,\n isAnchorLink,\n removeTrailingHash,\n rawGithubHref,\n isGithubHref,\n isRawGithubHref,\n renderVideoElements,\n} from './markdown-utils/markdown-utils';\n\ndeclare const require: any;\n/* tslint:disable-next-line */\nlet showdown: any = require('showdown/dist/showdown.js');\n\n// TODO: assumes it is a github url\n// allow override somehow\nfunction generateAbsoluteHref(currentHref: string, relativeHref: string): string {\n if (currentHref && relativeHref) {\n const currentUrl: URL = new URL(currentHref);\n const path: string = currentUrl.pathname.split('/').slice(1, -1).join('/');\n const correctUrl: URL = new URL(currentHref);\n\n if (relativeHref.startsWith('/')) {\n // url is relative to top level\n const orgAndRepo: string = path.split('/').slice(0, 3).join('/');\n correctUrl.pathname = `${orgAndRepo}${relativeHref}`;\n } else {\n correctUrl.pathname = `${path}/${relativeHref}`;\n }\n return correctUrl.href;\n }\n return undefined;\n}\n\nfunction normalizeHtmlHrefs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('a[href]').forEach((link: HTMLAnchorElement) => {\n const url: URL = new URL(link.href);\n const originalHash: string = url.hash;\n if (isAnchorLink(link)) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n link.href = url.hash;\n }\n } else if (url.host === window.location.host) {\n // hosts match, meaning URL MIGHT have been malformed by showdown\n // url is a relative url or just a link to a part of the application\n if (url.pathname.endsWith('.md')) {\n // only check .md urls\n\n const hrefWithoutHash: string = removeTrailingHash(link.getAttribute('href'));\n\n url.href = generateAbsoluteHref(currentHref, hrefWithoutHash);\n\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n } else {\n // url is absolute\n if (url.pathname.endsWith('.md')) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction normalizeImageSrcs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('img[src]').forEach((image: HTMLImageElement) => {\n const src: string = image.getAttribute('src');\n try {\n /* tslint:disable-next-line:no-unused-expression */\n new URL(src);\n if (isGithubHref(src)) {\n image.src = rawGithubHref(src);\n }\n } catch {\n image.src = generateAbsoluteHref(isGithubHref(currentHref) ? rawGithubHref(currentHref) : currentHref, src);\n }\n // gh svgs need to have ?sanitize=true\n if (isRawGithubHref(image.src)) {\n const url: URL = new URL(image.src);\n if (url.pathname.endsWith('.svg')) {\n url.searchParams.set('sanitize', 'true');\n image.src = url.href;\n }\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction addIdsToHeadings(html: string): string {\n if (html) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((heading: HTMLElement) => {\n const id: string = genHeadingId(heading.innerHTML);\n heading.setAttribute('id', id);\n });\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\n@Component({\n selector: 'td-markdown',\n styleUrls: ['./markdown.component.scss'],\n templateUrl: './markdown.component.html',\n})\nexport class TdMarkdownComponent implements OnChanges, AfterViewInit, OnDestroy {\n private _content: string;\n private _simpleLineBreaks: boolean = false;\n private _hostedUrl: string;\n private _anchor: string;\n private _viewInit: boolean = false;\n private _anchorListener?: VoidFunction;\n /**\n * .td-markdown class added to host so ::ng-deep gets scoped.\n */\n @HostBinding('class') class: string = 'td-markdown';\n\n /**\n * content?: string\n *\n * Markdown format content to be parsed as html markup.\n *\n * e.g. README.md content.\n */\n @Input('content')\n set content(content: string) {\n this._content = content;\n }\n\n /**\n * simpleLineBreaks?: string\n *\n * Sets whether newline characters inside paragraphs and spans are parsed as <br/>.\n * Defaults to false.\n */\n @Input('simpleLineBreaks')\n set simpleLineBreaks(simpleLineBreaks: boolean) {\n this._simpleLineBreaks = simpleLineBreaks;\n }\n\n /**\n * hostedUrl?: string\n *\n * If markdown contains relative paths, this is required to generate correct urls.\n *\n */\n @Input('hostedUrl')\n set hostedUrl(hostedUrl: string) {\n this._hostedUrl = hostedUrl;\n }\n\n /**\n * anchor?: string\n *\n * Anchor to jump to.\n *\n */\n @Input('anchor')\n set anchor(anchor: string) {\n this._anchor = anchor;\n }\n\n /**\n * contentReady?: function\n * Event emitted after the markdown content rendering is finished.\n */\n @Output() contentReady: EventEmitter<undefined> = new EventEmitter<undefined>();\n\n constructor(\n private _renderer: Renderer2,\n private _elementRef: ElementRef,\n private _domSanitizer: DomSanitizer,\n private _ngZone: NgZone,\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n // only anchor changed\n if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {\n scrollToAnchor(this._elementRef.nativeElement, this._anchor, true);\n } else {\n this.refresh();\n }\n }\n\n ngAfterViewInit(): void {\n if (!this._content) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n this._viewInit = true;\n\n // Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM\n // API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.\n // Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.\n // It also calls `markViewDirty()` before calling the actual listener (the decorated class method).\n this._ngZone.runOutsideAngular(() => {\n this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event: MouseEvent) => {\n const element: HTMLElement = <HTMLElement>event.srcElement;\n if (element.matches('a[href]') && isAnchorLink(<HTMLAnchorElement>element)) {\n this.handleAnchorClicks(event);\n }\n });\n });\n }\n\n ngOnDestroy(): void {\n this._anchorListener?.();\n }\n\n refresh(): void {\n if (this._content) {\n this._loadContent(this._content);\n } else if (this._viewInit) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n }\n\n /**\n * General method to parse a string markdown into HTML Elements and load them into the container\n */\n private _loadContent(markdown: string): void {\n if (markdown && markdown.trim().length > 0) {\n // Clean container\n this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');\n // Parse html string into actual HTML elements.\n this._elementFromString(this._render(markdown));\n }\n // TODO: timeout required since resizing of html elements occurs which causes a change in the scroll position\n setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);\n this.contentReady.emit();\n }\n\n private handleAnchorClicks(event: Event): void {\n event.preventDefault();\n const url: URL = new URL((<HTMLAnchorElement>event.target).href);\n const hash: string = decodeURI(url.hash);\n scrollToAnchor(this._elementRef.nativeElement, hash, true);\n }\n\n private _elementFromString(markupStr: string): HTMLDivElement {\n // Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]\n // to parse the string into DOM element for now.\n const div: HTMLDivElement = this._renderer.createElement('div');\n this._renderer.appendChild(this._elementRef.nativeElement, div);\n const html: string = this._domSanitizer.sanitize(SecurityContext.HTML, markupStr);\n const htmlWithAbsoluteHrefs: string = normalizeHtmlHrefs(html, this._hostedUrl);\n const htmlWithAbsoluteImgSrcs: string = normalizeImageSrcs(htmlWithAbsoluteHrefs, this._hostedUrl);\n const htmlWithHeadingIds: string = addIdsToHeadings(htmlWithAbsoluteImgSrcs);\n const htmlWithVideos: SafeHtml = renderVideoElements(htmlWithHeadingIds);\n this._renderer.setProperty(div, 'innerHTML', htmlWithVideos);\n return div;\n }\n\n private _render(markdown: string): string {\n // Trim leading and trailing newlines\n markdown = markdown.replace(/^(\\s|\\t)*\\n+/g, '').replace(/(\\s|\\t)*\\n+(\\s|\\t)*$/g, '');\n // Split markdown by line characters\n let lines: string[] = markdown.split('\\n');\n\n // check how much indentation is used by the first actual markdown line\n const firstLineWhitespace: string = lines[0].match(/^(\\s|\\t)*/)[0];\n\n // Remove all indentation spaces so markdown can be parsed correctly\n const startingWhitespaceRegex: RegExp = new RegExp('^' + firstLineWhitespace);\n lines = lines.map(function (line: string): string {\n return line.replace(startingWhitespaceRegex, '');\n });\n\n // Join lines again with line characters\n const markdownToParse: string = lines.join('\\n');\n\n // Convert markdown into html\n const converter: any = new showdown.Converter();\n converter.setOption('ghCodeBlocks', true);\n converter.setOption('tasklists', true);\n converter.setOption('tables', true);\n converter.setOption('literalMidWordUnderscores', true);\n converter.setOption('simpleLineBreaks', this._simpleLineBreaks);\n return converter.makeHtml(markdownToParse);\n }\n}\n","<ng-content></ng-content>\n","import { Injectable, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { isGithubHref, rawGithubHref } from '../markdown-utils/markdown-utils';\n\n@Injectable()\nexport class TdMarkdownLoaderService {\n constructor(private _http: HttpClient, private _sanitizer: DomSanitizer) {}\n\n async load(url: string, httpOptions: object = {}): Promise<string> {\n const sanitizedUrl: string = this._sanitizer.sanitize(SecurityContext.URL, url);\n let urlToGet: string = sanitizedUrl;\n if (isGithubHref(sanitizedUrl)) {\n urlToGet = rawGithubHref(sanitizedUrl);\n }\n\n const response: HttpResponse<string> = await this._http\n .get(urlToGet, { ...httpOptions, responseType: 'text', observe: 'response' })\n .toPromise();\n const contentType: string = response.headers.get('Content-Type');\n if (contentType.includes('text/plain') || contentType.includes('text/markdown')) {\n return response.body;\n } else {\n throw Error(`${contentType} is not a handled content type`);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { HttpClientModule } from '@angular/common/http';\n\nimport { TdMarkdownComponent } from './markdown.component';\nimport { TdMarkdownLoaderService } from './markdown-loader/markdown-loader.service';\n\n@NgModule({\n imports: [CommonModule, HttpClientModule],\n declarations: [TdMarkdownComponent],\n exports: [TdMarkdownComponent],\n providers: [TdMarkdownLoaderService],\n})\nexport class CovalentMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, SecurityContext, Component, HostBinding, Input, Output,
|
|
2
|
+
import { EventEmitter, SecurityContext, Component, HostBinding, Input, Output, Injectable, NgModule } from '@angular/core';
|
|
3
3
|
import { CommonModule } from '@angular/common';
|
|
4
4
|
import * as i1$1 from '@angular/common/http';
|
|
5
5
|
import { HttpClientModule } from '@angular/common/http';
|
|
@@ -223,10 +223,11 @@ function addIdsToHeadings(html) {
|
|
|
223
223
|
return html;
|
|
224
224
|
}
|
|
225
225
|
class TdMarkdownComponent {
|
|
226
|
-
constructor(_renderer, _elementRef, _domSanitizer) {
|
|
226
|
+
constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
|
|
227
227
|
this._renderer = _renderer;
|
|
228
228
|
this._elementRef = _elementRef;
|
|
229
229
|
this._domSanitizer = _domSanitizer;
|
|
230
|
+
this._ngZone = _ngZone;
|
|
230
231
|
this._simpleLineBreaks = false;
|
|
231
232
|
this._viewInit = false;
|
|
232
233
|
/**
|
|
@@ -276,12 +277,6 @@ class TdMarkdownComponent {
|
|
|
276
277
|
set anchor(anchor) {
|
|
277
278
|
this._anchor = anchor;
|
|
278
279
|
}
|
|
279
|
-
clickListener(event) {
|
|
280
|
-
const element = event.srcElement;
|
|
281
|
-
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
282
|
-
this.handleAnchorClicks(event);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
280
|
ngOnChanges(changes) {
|
|
286
281
|
// only anchor changed
|
|
287
282
|
if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {
|
|
@@ -296,6 +291,21 @@ class TdMarkdownComponent {
|
|
|
296
291
|
this._loadContent(this._elementRef.nativeElement.textContent);
|
|
297
292
|
}
|
|
298
293
|
this._viewInit = true;
|
|
294
|
+
// Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM
|
|
295
|
+
// API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.
|
|
296
|
+
// Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.
|
|
297
|
+
// It also calls `markViewDirty()` before calling the actual listener (the decorated class method).
|
|
298
|
+
this._ngZone.runOutsideAngular(() => {
|
|
299
|
+
this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
|
|
300
|
+
const element = event.srcElement;
|
|
301
|
+
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
302
|
+
this.handleAnchorClicks(event);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
ngOnDestroy() {
|
|
308
|
+
this._anchorListener?.();
|
|
299
309
|
}
|
|
300
310
|
refresh() {
|
|
301
311
|
if (this._content) {
|
|
@@ -319,7 +329,7 @@ class TdMarkdownComponent {
|
|
|
319
329
|
setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);
|
|
320
330
|
this.contentReady.emit();
|
|
321
331
|
}
|
|
322
|
-
|
|
332
|
+
handleAnchorClicks(event) {
|
|
323
333
|
event.preventDefault();
|
|
324
334
|
const url = new URL(event.target.href);
|
|
325
335
|
const hash = decodeURI(url.hash);
|
|
@@ -362,10 +372,8 @@ class TdMarkdownComponent {
|
|
|
362
372
|
return converter.makeHtml(markdownToParse);
|
|
363
373
|
}
|
|
364
374
|
}
|
|
365
|
-
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵfac = function TdMarkdownComponent_Factory(t) { return new (t || TdMarkdownComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.DomSanitizer)); };
|
|
366
|
-
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) { if (rf &
|
|
367
|
-
i0.ɵɵlistener("click", function TdMarkdownComponent_click_HostBindingHandler($event) { return ctx.clickListener($event); });
|
|
368
|
-
} if (rf & 2) {
|
|
375
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵfac = function TdMarkdownComponent_Factory(t) { return new (t || TdMarkdownComponent)(i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
376
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
369
377
|
i0.ɵɵclassMap(ctx.class);
|
|
370
378
|
} }, inputs: { content: "content", simpleLineBreaks: "simpleLineBreaks", hostedUrl: "hostedUrl", anchor: "anchor" }, outputs: { contentReady: "contentReady" }, features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function TdMarkdownComponent_Template(rf, ctx) { if (rf & 1) {
|
|
371
379
|
i0.ɵɵprojectionDef();
|
|
@@ -374,7 +382,7 @@ class TdMarkdownComponent {
|
|
|
374
382
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownComponent, [{
|
|
375
383
|
type: Component,
|
|
376
384
|
args: [{ selector: 'td-markdown', template: "<ng-content></ng-content>\n", styles: [":host.td-markdown::ng-deep a{background-color:transparent}:host.td-markdown::ng-deep a:active,:host.td-markdown::ng-deep a:hover{outline-width:0}:host.td-markdown::ng-deep strong{font-weight:inherit;font-weight:bolder}:host.td-markdown::ng-deep h1{font-size:2em;margin:.67em 0}:host.td-markdown::ng-deep img{border-style:none}:host.td-markdown::ng-deep svg:not(:root){overflow:hidden}:host.td-markdown::ng-deep code,:host.td-markdown::ng-deep kbd,:host.td-markdown::ng-deep pre{font-family:monospace;font-size:1em}:host.td-markdown::ng-deep hr{box-sizing:content-box;height:0;overflow:visible}:host.td-markdown::ng-deep input{font:inherit;margin:0}:host.td-markdown::ng-deep input{overflow:visible}:host.td-markdown::ng-deep button:-moz-focusring,:host.td-markdown::ng-deep [type=button]:-moz-focusring,:host.td-markdown::ng-deep [type=reset]:-moz-focusring,:host.td-markdown::ng-deep [type=submit]:-moz-focusring{outline:1px dotted ButtonText}:host.td-markdown::ng-deep [type=checkbox]{box-sizing:border-box;padding:0}:host.td-markdown::ng-deep table{border-spacing:0;border-collapse:collapse}:host.td-markdown::ng-deep td,:host.td-markdown::ng-deep th{padding:0}:host.td-markdown::ng-deep *{box-sizing:border-box}:host.td-markdown::ng-deep input{font:13px/1.4 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol}:host.td-markdown::ng-deep a{text-decoration:none}:host.td-markdown::ng-deep a:hover,:host.td-markdown::ng-deep a:active{text-decoration:underline}:host.td-markdown::ng-deep hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep hr:before{display:table;content:\"\"}:host.td-markdown::ng-deep hr:after{display:table;clear:both;content:\"\"}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:0;margin-bottom:0;line-height:1.5}:host.td-markdown::ng-deep h1{font-size:30px}:host.td-markdown::ng-deep h2{font-size:21px}:host.td-markdown::ng-deep h3{font-size:16px}:host.td-markdown::ng-deep h4{font-size:14px}:host.td-markdown::ng-deep h5{font-size:12px}:host.td-markdown::ng-deep h6{font-size:11px}:host.td-markdown::ng-deep p{margin-top:0;margin-bottom:10px}:host.td-markdown::ng-deep blockquote{margin:0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:0;margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ul ol{list-style-type:lower-roman}:host.td-markdown::ng-deep ul ul ol,:host.td-markdown::ng-deep ul ol ol,:host.td-markdown::ng-deep ol ul ol,:host.td-markdown::ng-deep ol ol ol{list-style-type:lower-alpha}:host.td-markdown::ng-deep dd{margin-left:0}:host.td-markdown::ng-deep code{font-family:Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px}:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:0;font:12px Consolas,Liberation Mono,Menlo,Courier,monospace}:host.td-markdown::ng-deep .pl-0{padding-left:0!important}:host.td-markdown::ng-deep .pl-1{padding-left:3px!important}:host.td-markdown::ng-deep .pl-2{padding-left:6px!important}:host.td-markdown::ng-deep .pl-3{padding-left:12px!important}:host.td-markdown::ng-deep .pl-4{padding-left:24px!important}:host.td-markdown::ng-deep .pl-5{padding-left:36px!important}:host.td-markdown::ng-deep .pl-6{padding-left:48px!important}:host.td-markdown::ng-deep .form-select::-ms-expand{opacity:0}:host.td-markdown::ng-deep a:not([href]){color:inherit;text-decoration:none}:host.td-markdown::ng-deep h1,:host.td-markdown::ng-deep h2,:host.td-markdown::ng-deep h3,:host.td-markdown::ng-deep h4,:host.td-markdown::ng-deep h5,:host.td-markdown::ng-deep h6{margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}:host.td-markdown::ng-deep h1 .octicon-link,:host.td-markdown::ng-deep h2 .octicon-link,:host.td-markdown::ng-deep h3 .octicon-link,:host.td-markdown::ng-deep h4 .octicon-link,:host.td-markdown::ng-deep h5 .octicon-link,:host.td-markdown::ng-deep h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}:host.td-markdown::ng-deep h1:hover .anchor,:host.td-markdown::ng-deep h2:hover .anchor,:host.td-markdown::ng-deep h3:hover .anchor,:host.td-markdown::ng-deep h4:hover .anchor,:host.td-markdown::ng-deep h5:hover .anchor,:host.td-markdown::ng-deep h6:hover .anchor{text-decoration:none}:host.td-markdown::ng-deep h1:hover .anchor .octicon-link,:host.td-markdown::ng-deep h2:hover .anchor .octicon-link,:host.td-markdown::ng-deep h3:hover .anchor .octicon-link,:host.td-markdown::ng-deep h4:hover .anchor .octicon-link,:host.td-markdown::ng-deep h5:hover .anchor .octicon-link,:host.td-markdown::ng-deep h6:hover .anchor .octicon-link{visibility:visible}:host.td-markdown::ng-deep h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h1 .anchor{line-height:1}:host.td-markdown::ng-deep h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom-width:1px;border-bottom-style:solid}:host.td-markdown::ng-deep h2 .anchor{line-height:1}:host.td-markdown::ng-deep h3{font-size:1.5em;line-height:1.43}:host.td-markdown::ng-deep h3 .anchor{line-height:1.2}:host.td-markdown::ng-deep h4{font-size:1.25em}:host.td-markdown::ng-deep h4 .anchor{line-height:1.2}:host.td-markdown::ng-deep h5{font-size:1em}:host.td-markdown::ng-deep h5 .anchor{line-height:1.1}:host.td-markdown::ng-deep h6{font-size:1em}:host.td-markdown::ng-deep h6 .anchor{line-height:1.1}:host.td-markdown::ng-deep p,:host.td-markdown::ng-deep blockquote,:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol,:host.td-markdown::ng-deep dl,:host.td-markdown::ng-deep table,:host.td-markdown::ng-deep pre{margin-top:0;margin-bottom:16px}:host.td-markdown::ng-deep hr{margin:16px 0}:host.td-markdown::ng-deep ul,:host.td-markdown::ng-deep ol{padding-left:2em}:host.td-markdown::ng-deep ul ul,:host.td-markdown::ng-deep ul ol,:host.td-markdown::ng-deep ol ol,:host.td-markdown::ng-deep ol ul{margin-top:0;margin-bottom:0}:host.td-markdown::ng-deep li>p{margin-top:16px}:host.td-markdown::ng-deep dl{padding:0}:host.td-markdown::ng-deep dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}:host.td-markdown::ng-deep dl dd{padding:0 16px;margin-bottom:16px}:host.td-markdown::ng-deep blockquote{padding:0 15px;border-left-width:4px;border-left-style:solid}:host.td-markdown::ng-deep blockquote>:first-child{margin-top:0}:host.td-markdown::ng-deep blockquote>:last-child{margin-bottom:0}:host.td-markdown::ng-deep table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}:host.td-markdown::ng-deep table th{font-weight:700}:host.td-markdown::ng-deep table th,:host.td-markdown::ng-deep table td{padding:6px 13px;border-width:1px;border-style:solid}:host.td-markdown::ng-deep table tr{border-top-width:1px;border-top-style:solid}:host.td-markdown::ng-deep img{max-width:100%;box-sizing:content-box}:host.td-markdown::ng-deep code{padding:.2em 0;margin:0;font-size:85%;border-radius:3px}:host.td-markdown::ng-deep code:before,:host.td-markdown::ng-deep code:after{letter-spacing:-.2em}:host.td-markdown::ng-deep pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}:host.td-markdown::ng-deep .highlight{margin-bottom:16px}:host.td-markdown::ng-deep .highlight pre,:host.td-markdown::ng-deep pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;border-radius:3px}:host.td-markdown::ng-deep .highlight pre{margin-bottom:0;word-break:normal}:host.td-markdown::ng-deep pre{word-wrap:normal}:host.td-markdown::ng-deep pre code{display:inline;max-width:none;max-width:initial;padding:0;margin:0;overflow:visible;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}:host.td-markdown::ng-deep pre code:before,:host.td-markdown::ng-deep pre code:after{content:normal}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;vertical-align:middle;border-style:solid;border-width:1px;border-radius:3px}:host.td-markdown::ng-deep .pl-c{color:#969896}:host.td-markdown::ng-deep .pl-c1,:host.td-markdown::ng-deep .pl-s .pl-v{color:#0086b3}:host.td-markdown::ng-deep .pl-e,:host.td-markdown::ng-deep .pl-en{color:#795da3}:host.td-markdown::ng-deep .pl-s .pl-s1,:host.td-markdown::ng-deep .pl-smi{color:#333}:host.td-markdown::ng-deep .pl-ent{color:#63a35c}:host.td-markdown::ng-deep .pl-k{color:#a71d5d}:host.td-markdown::ng-deep .pl-pds,:host.td-markdown::ng-deep .pl-s,:host.td-markdown::ng-deep .pl-s .pl-pse .pl-s1,:host.td-markdown::ng-deep .pl-sr,:host.td-markdown::ng-deep .pl-sr .pl-cce,:host.td-markdown::ng-deep .pl-sr .pl-sra,:host.td-markdown::ng-deep .pl-sr .pl-sre{color:#183691}:host.td-markdown::ng-deep .pl-v{color:#ed6a43}:host.td-markdown::ng-deep .pl-id{color:#b52a1d}:host.td-markdown::ng-deep .pl-ii{background-color:#b52a1d;color:#f8f8f8}:host.td-markdown::ng-deep .pl-sr .pl-cce{color:#63a35c;font-weight:700}:host.td-markdown::ng-deep .pl-ml{color:#693a17}:host.td-markdown::ng-deep .pl-mh,:host.td-markdown::ng-deep .pl-mh .pl-en,:host.td-markdown::ng-deep .pl-ms{color:#1d3e81;font-weight:700}:host.td-markdown::ng-deep .pl-mq{color:teal}:host.td-markdown::ng-deep .pl-mi{color:#333;font-style:italic}:host.td-markdown::ng-deep .pl-mb{color:#333;font-weight:700}:host.td-markdown::ng-deep .pl-md{background-color:#ffecec;color:#bd2c00}:host.td-markdown::ng-deep .pl-mi1{background-color:#eaffea;color:#55a532}:host.td-markdown::ng-deep .pl-mdr{color:#795da3;font-weight:700}:host.td-markdown::ng-deep .pl-mo{color:#1d3e81}:host.td-markdown::ng-deep kbd{display:inline-block;padding:3px 5px;font:11px Consolas,Liberation Mono,Menlo,Courier,monospace;line-height:10px;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #cccccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px #bbb}:host.td-markdown::ng-deep .full-commit .btn-outline:not(:disabled):hover{color:#4078c0;border:1px solid #4078c0}:host.td-markdown::ng-deep :checked+.radio-label{position:relative;z-index:1;border-color:#4078c0}:host.td-markdown::ng-deep .octicon{display:inline-block;vertical-align:text-top;fill:currentColor}:host.td-markdown::ng-deep .task-list-item{list-style-type:none}:host.td-markdown::ng-deep .task-list-item+.task-list-item{margin-top:3px}:host.td-markdown::ng-deep .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}\n"] }]
|
|
377
|
-
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }]; }, { class: [{
|
|
385
|
+
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, { class: [{
|
|
378
386
|
type: HostBinding,
|
|
379
387
|
args: ['class']
|
|
380
388
|
}], content: [{
|
|
@@ -391,9 +399,6 @@ class TdMarkdownComponent {
|
|
|
391
399
|
args: ['anchor']
|
|
392
400
|
}], contentReady: [{
|
|
393
401
|
type: Output
|
|
394
|
-
}], clickListener: [{
|
|
395
|
-
type: HostListener,
|
|
396
|
-
args: ['click', ['$event']]
|
|
397
402
|
}] }); })();
|
|
398
403
|
|
|
399
404
|
class TdMarkdownLoaderService {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"covalent-markdown.mjs","sources":["../../../../src/platform/markdown/markdown-utils/markdown-utils.ts","../../../../src/platform/markdown/markdown.component.ts","../../../../src/platform/markdown/markdown.component.html","../../../../src/platform/markdown/markdown-loader/markdown-loader.service.ts","../../../../src/platform/markdown/markdown.module.ts","../../../../src/platform/markdown/covalent-markdown.ts"],"sourcesContent":["export function removeLeadingHash(str: string): string {\n if (str) {\n return str.replace(/^#+/, '');\n }\n return '';\n}\n\nexport function removeTrailingHash(str: string): string {\n if (str) {\n return str.replace(/\\#.*/, '');\n }\n return '';\n}\n\nexport function genHeadingId(str: string): string {\n if (str) {\n return removeLeadingHash(\n str\n .replace(/(_|-|\\s)+/g, '')\n // Remove certain special chars to create heading ids similar to those in github\n // borrowed from showdown\n // https://github.com/showdownjs/showdown/blob/develop/src/subParsers/makehtml/headers.js#L94\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, ''),\n ).toLowerCase();\n }\n return '';\n}\n\nexport function scrollToAnchor(scope: HTMLElement, anchor: string, tryParent: boolean): boolean {\n if (scope && anchor) {\n const normalizedAnchor: string = genHeadingId(anchor);\n let headingToJumpTo: HTMLElement;\n const headingWithinComponent: HTMLElement = scope.querySelector(`[id=\"${normalizedAnchor}\"]`);\n\n if (headingWithinComponent) {\n headingToJumpTo = headingWithinComponent;\n } else if (tryParent) {\n const parent: HTMLElement = scope.parentElement;\n if (parent) {\n headingToJumpTo = parent.querySelector(`[id=\"${normalizedAnchor}\"]`);\n }\n }\n if (headingToJumpTo) {\n headingToJumpTo.scrollIntoView({ behavior: 'auto' });\n return true;\n }\n }\n return false;\n}\n\nexport function isAnchorLink(anchor: HTMLAnchorElement): boolean {\n if (anchor) {\n const href: string = anchor.getAttribute('href');\n if (href) {\n return href.startsWith('#');\n }\n }\n return false;\n}\nconst RAW_GITHUB_HOSTNAME: string = 'raw.githubusercontent.com';\n\nexport function rawGithubHref(githubHref: string): string {\n if (githubHref) {\n try {\n const url: URL = new URL(githubHref);\n if (url.hostname === RAW_GITHUB_HOSTNAME) {\n return url.href;\n } else if (isGithubHref(githubHref)) {\n url.hostname = RAW_GITHUB_HOSTNAME;\n url.pathname = url.pathname.split('/blob', 2).join('');\n return url.href;\n }\n } catch {\n return '';\n }\n }\n return '';\n}\n\nexport function isGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === 'github.com';\n } catch {\n return false;\n }\n}\n\nexport function isRawGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === RAW_GITHUB_HOSTNAME;\n } catch {\n return false;\n }\n}\n\nexport function renderVideoElements(html: string): string {\n const ytLongEmbed: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:embed\\/)([\\w-]{11})(\\?[\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?)]/gi;\n const ytLongWatch: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:watch\\?v=)([\\w-]{11})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n const ytShort: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)?youtu.be\\/([\\w-]{11})\\??([\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?]/gi;\n const ytPlaylist: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:playlist\\?list=)([\\w-]{34})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n\n function convert(match: string, id: string, flags: string): string {\n if (flags) {\n id += '?' + flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/${id}\"></iframe>`;\n }\n function convertPL(match: string, id: string, flags: string): string {\n if (flags) {\n id += flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/videoseries?list=${id}\"></iframe>`;\n }\n\n return html\n .replace(ytLongWatch, convert)\n .replace(ytLongEmbed, convert)\n .replace(ytShort, convert)\n .replace(ytPlaylist, convertPL);\n}\n","import {\n Component,\n AfterViewInit,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n Renderer2,\n SecurityContext,\n OnChanges,\n SimpleChanges,\n HostBinding,\n HostListener,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n scrollToAnchor,\n genHeadingId,\n isAnchorLink,\n removeTrailingHash,\n rawGithubHref,\n isGithubHref,\n isRawGithubHref,\n renderVideoElements,\n} from './markdown-utils/markdown-utils';\n\ndeclare const require: any;\n/* tslint:disable-next-line */\nlet showdown: any = require('showdown/dist/showdown.js');\n\n// TODO: assumes it is a github url\n// allow override somehow\nfunction generateAbsoluteHref(currentHref: string, relativeHref: string): string {\n if (currentHref && relativeHref) {\n const currentUrl: URL = new URL(currentHref);\n const path: string = currentUrl.pathname.split('/').slice(1, -1).join('/');\n const correctUrl: URL = new URL(currentHref);\n\n if (relativeHref.startsWith('/')) {\n // url is relative to top level\n const orgAndRepo: string = path.split('/').slice(0, 3).join('/');\n correctUrl.pathname = `${orgAndRepo}${relativeHref}`;\n } else {\n correctUrl.pathname = `${path}/${relativeHref}`;\n }\n return correctUrl.href;\n }\n return undefined;\n}\n\nfunction normalizeHtmlHrefs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('a[href]').forEach((link: HTMLAnchorElement) => {\n const url: URL = new URL(link.href);\n const originalHash: string = url.hash;\n if (isAnchorLink(link)) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n link.href = url.hash;\n }\n } else if (url.host === window.location.host) {\n // hosts match, meaning URL MIGHT have been malformed by showdown\n // url is a relative url or just a link to a part of the application\n if (url.pathname.endsWith('.md')) {\n // only check .md urls\n\n const hrefWithoutHash: string = removeTrailingHash(link.getAttribute('href'));\n\n url.href = generateAbsoluteHref(currentHref, hrefWithoutHash);\n\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n } else {\n // url is absolute\n if (url.pathname.endsWith('.md')) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction normalizeImageSrcs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('img[src]').forEach((image: HTMLImageElement) => {\n const src: string = image.getAttribute('src');\n try {\n /* tslint:disable-next-line:no-unused-expression */\n new URL(src);\n if (isGithubHref(src)) {\n image.src = rawGithubHref(src);\n }\n } catch {\n image.src = generateAbsoluteHref(isGithubHref(currentHref) ? rawGithubHref(currentHref) : currentHref, src);\n }\n // gh svgs need to have ?sanitize=true\n if (isRawGithubHref(image.src)) {\n const url: URL = new URL(image.src);\n if (url.pathname.endsWith('.svg')) {\n url.searchParams.set('sanitize', 'true');\n image.src = url.href;\n }\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction addIdsToHeadings(html: string): string {\n if (html) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((heading: HTMLElement) => {\n const id: string = genHeadingId(heading.innerHTML);\n heading.setAttribute('id', id);\n });\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\n@Component({\n selector: 'td-markdown',\n styleUrls: ['./markdown.component.scss'],\n templateUrl: './markdown.component.html',\n})\nexport class TdMarkdownComponent implements OnChanges, AfterViewInit {\n private _content: string;\n private _simpleLineBreaks: boolean = false;\n private _hostedUrl: string;\n private _anchor: string;\n private _viewInit: boolean = false;\n /**\n * .td-markdown class added to host so ::ng-deep gets scoped.\n */\n @HostBinding('class') class: string = 'td-markdown';\n\n /**\n * content?: string\n *\n * Markdown format content to be parsed as html markup.\n *\n * e.g. README.md content.\n */\n @Input('content')\n set content(content: string) {\n this._content = content;\n }\n\n /**\n * simpleLineBreaks?: string\n *\n * Sets whether newline characters inside paragraphs and spans are parsed as <br/>.\n * Defaults to false.\n */\n @Input('simpleLineBreaks')\n set simpleLineBreaks(simpleLineBreaks: boolean) {\n this._simpleLineBreaks = simpleLineBreaks;\n }\n\n /**\n * hostedUrl?: string\n *\n * If markdown contains relative paths, this is required to generate correct urls.\n *\n */\n @Input('hostedUrl')\n set hostedUrl(hostedUrl: string) {\n this._hostedUrl = hostedUrl;\n }\n\n /**\n * anchor?: string\n *\n * Anchor to jump to.\n *\n */\n @Input('anchor')\n set anchor(anchor: string) {\n this._anchor = anchor;\n }\n\n /**\n * contentReady?: function\n * Event emitted after the markdown content rendering is finished.\n */\n @Output() contentReady: EventEmitter<undefined> = new EventEmitter<undefined>();\n\n constructor(private _renderer: Renderer2, private _elementRef: ElementRef, private _domSanitizer: DomSanitizer) {}\n\n @HostListener('click', ['$event'])\n clickListener(event: Event): void {\n const element: HTMLElement = <HTMLElement>event.srcElement;\n if (element.matches('a[href]') && isAnchorLink(<HTMLAnchorElement>element)) {\n this.handleAnchorClicks(event);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // only anchor changed\n if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {\n scrollToAnchor(this._elementRef.nativeElement, this._anchor, true);\n } else {\n this.refresh();\n }\n }\n\n ngAfterViewInit(): void {\n if (!this._content) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n this._viewInit = true;\n }\n\n refresh(): void {\n if (this._content) {\n this._loadContent(this._content);\n } else if (this._viewInit) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n }\n\n /**\n * General method to parse a string markdown into HTML Elements and load them into the container\n */\n private _loadContent(markdown: string): void {\n if (markdown && markdown.trim().length > 0) {\n // Clean container\n this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');\n // Parse html string into actual HTML elements.\n this._elementFromString(this._render(markdown));\n }\n // TODO: timeout required since resizing of html elements occurs which causes a change in the scroll position\n setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);\n this.contentReady.emit();\n }\n\n private async handleAnchorClicks(event: Event): Promise<void> {\n event.preventDefault();\n const url: URL = new URL((<HTMLAnchorElement>event.target).href);\n const hash: string = decodeURI(url.hash);\n scrollToAnchor(this._elementRef.nativeElement, hash, true);\n }\n\n private _elementFromString(markupStr: string): HTMLDivElement {\n // Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]\n // to parse the string into DOM element for now.\n const div: HTMLDivElement = this._renderer.createElement('div');\n this._renderer.appendChild(this._elementRef.nativeElement, div);\n const html: string = this._domSanitizer.sanitize(SecurityContext.HTML, markupStr);\n const htmlWithAbsoluteHrefs: string = normalizeHtmlHrefs(html, this._hostedUrl);\n const htmlWithAbsoluteImgSrcs: string = normalizeImageSrcs(htmlWithAbsoluteHrefs, this._hostedUrl);\n const htmlWithHeadingIds: string = addIdsToHeadings(htmlWithAbsoluteImgSrcs);\n const htmlWithVideos: SafeHtml = renderVideoElements(htmlWithHeadingIds);\n this._renderer.setProperty(div, 'innerHTML', htmlWithVideos);\n return div;\n }\n\n private _render(markdown: string): string {\n // Trim leading and trailing newlines\n markdown = markdown.replace(/^(\\s|\\t)*\\n+/g, '').replace(/(\\s|\\t)*\\n+(\\s|\\t)*$/g, '');\n // Split markdown by line characters\n let lines: string[] = markdown.split('\\n');\n\n // check how much indentation is used by the first actual markdown line\n const firstLineWhitespace: string = lines[0].match(/^(\\s|\\t)*/)[0];\n\n // Remove all indentation spaces so markdown can be parsed correctly\n const startingWhitespaceRegex: RegExp = new RegExp('^' + firstLineWhitespace);\n lines = lines.map(function (line: string): string {\n return line.replace(startingWhitespaceRegex, '');\n });\n\n // Join lines again with line characters\n const markdownToParse: string = lines.join('\\n');\n\n // Convert markdown into html\n const converter: any = new showdown.Converter();\n converter.setOption('ghCodeBlocks', true);\n converter.setOption('tasklists', true);\n converter.setOption('tables', true);\n converter.setOption('literalMidWordUnderscores', true);\n converter.setOption('simpleLineBreaks', this._simpleLineBreaks);\n return converter.makeHtml(markdownToParse);\n }\n}\n","<ng-content></ng-content>\n","import { Injectable, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { isGithubHref, rawGithubHref } from '../markdown-utils/markdown-utils';\n\n@Injectable()\nexport class TdMarkdownLoaderService {\n constructor(private _http: HttpClient, private _sanitizer: DomSanitizer) {}\n\n async load(url: string, httpOptions: object = {}): Promise<string> {\n const sanitizedUrl: string = this._sanitizer.sanitize(SecurityContext.URL, url);\n let urlToGet: string = sanitizedUrl;\n if (isGithubHref(sanitizedUrl)) {\n urlToGet = rawGithubHref(sanitizedUrl);\n }\n\n const response: HttpResponse<string> = await this._http\n .get(urlToGet, { ...httpOptions, responseType: 'text', observe: 'response' })\n .toPromise();\n const contentType: string = response.headers.get('Content-Type');\n if (contentType.includes('text/plain') || contentType.includes('text/markdown')) {\n return response.body;\n } else {\n throw Error(`${contentType} is not a handled content type`);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { HttpClientModule } from '@angular/common/http';\n\nimport { TdMarkdownComponent } from './markdown.component';\nimport { TdMarkdownLoaderService } from './markdown-loader/markdown-loader.service';\n\n@NgModule({\n imports: [CommonModule, HttpClientModule],\n declarations: [TdMarkdownComponent],\n exports: [TdMarkdownComponent],\n providers: [TdMarkdownLoaderService],\n})\nexport class CovalentMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"covalent-markdown.mjs","sources":["../../../../src/platform/markdown/markdown-utils/markdown-utils.ts","../../../../src/platform/markdown/markdown.component.ts","../../../../src/platform/markdown/markdown.component.html","../../../../src/platform/markdown/markdown-loader/markdown-loader.service.ts","../../../../src/platform/markdown/markdown.module.ts","../../../../src/platform/markdown/covalent-markdown.ts"],"sourcesContent":["export function removeLeadingHash(str: string): string {\n if (str) {\n return str.replace(/^#+/, '');\n }\n return '';\n}\n\nexport function removeTrailingHash(str: string): string {\n if (str) {\n return str.replace(/\\#.*/, '');\n }\n return '';\n}\n\nexport function genHeadingId(str: string): string {\n if (str) {\n return removeLeadingHash(\n str\n .replace(/(_|-|\\s)+/g, '')\n // Remove certain special chars to create heading ids similar to those in github\n // borrowed from showdown\n // https://github.com/showdownjs/showdown/blob/develop/src/subParsers/makehtml/headers.js#L94\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, ''),\n ).toLowerCase();\n }\n return '';\n}\n\nexport function scrollToAnchor(scope: HTMLElement, anchor: string, tryParent: boolean): boolean {\n if (scope && anchor) {\n const normalizedAnchor: string = genHeadingId(anchor);\n let headingToJumpTo: HTMLElement;\n const headingWithinComponent: HTMLElement = scope.querySelector(`[id=\"${normalizedAnchor}\"]`);\n\n if (headingWithinComponent) {\n headingToJumpTo = headingWithinComponent;\n } else if (tryParent) {\n const parent: HTMLElement = scope.parentElement;\n if (parent) {\n headingToJumpTo = parent.querySelector(`[id=\"${normalizedAnchor}\"]`);\n }\n }\n if (headingToJumpTo) {\n headingToJumpTo.scrollIntoView({ behavior: 'auto' });\n return true;\n }\n }\n return false;\n}\n\nexport function isAnchorLink(anchor: HTMLAnchorElement): boolean {\n if (anchor) {\n const href: string = anchor.getAttribute('href');\n if (href) {\n return href.startsWith('#');\n }\n }\n return false;\n}\nconst RAW_GITHUB_HOSTNAME: string = 'raw.githubusercontent.com';\n\nexport function rawGithubHref(githubHref: string): string {\n if (githubHref) {\n try {\n const url: URL = new URL(githubHref);\n if (url.hostname === RAW_GITHUB_HOSTNAME) {\n return url.href;\n } else if (isGithubHref(githubHref)) {\n url.hostname = RAW_GITHUB_HOSTNAME;\n url.pathname = url.pathname.split('/blob', 2).join('');\n return url.href;\n }\n } catch {\n return '';\n }\n }\n return '';\n}\n\nexport function isGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === 'github.com';\n } catch {\n return false;\n }\n}\n\nexport function isRawGithubHref(href: string): boolean {\n try {\n const temp: URL = new URL(href);\n return temp.hostname === RAW_GITHUB_HOSTNAME;\n } catch {\n return false;\n }\n}\n\nexport function renderVideoElements(html: string): string {\n const ytLongEmbed: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:embed\\/)([\\w-]{11})(\\?[\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?)]/gi;\n const ytLongWatch: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:watch\\?v=)([\\w-]{11})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n const ytShort: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)?youtu.be\\/([\\w-]{11})\\??([\\w%;-]+(?:=[\\w%;-]+)?(?:&[\\w%;-]+(?:=[\\w%;-]+)?)*)?]/gi;\n const ytPlaylist: RegExp =\n /!\\[(?:(?:https?:)?(?:\\/\\/)?)(?:(?:www)?.)?youtube.(?:.+?)\\/(?:(?:playlist\\?list=)([\\w-]{34})(&[\\w%;-]+(?:=[\\w%;-]+)?)*)]/gi;\n\n function convert(match: string, id: string, flags: string): string {\n if (flags) {\n id += '?' + flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/${id}\"></iframe>`;\n }\n function convertPL(match: string, id: string, flags: string): string {\n if (flags) {\n id += flags.replace(/&/gi, '&');\n }\n return `<iframe allow=\"fullscreen\" frameborder=\"0\" src=\"https://www.youtube.com/embed/videoseries?list=${id}\"></iframe>`;\n }\n\n return html\n .replace(ytLongWatch, convert)\n .replace(ytLongEmbed, convert)\n .replace(ytShort, convert)\n .replace(ytPlaylist, convertPL);\n}\n","import {\n Component,\n AfterViewInit,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n Renderer2,\n SecurityContext,\n OnChanges,\n SimpleChanges,\n HostBinding,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n scrollToAnchor,\n genHeadingId,\n isAnchorLink,\n removeTrailingHash,\n rawGithubHref,\n isGithubHref,\n isRawGithubHref,\n renderVideoElements,\n} from './markdown-utils/markdown-utils';\n\ndeclare const require: any;\n/* tslint:disable-next-line */\nlet showdown: any = require('showdown/dist/showdown.js');\n\n// TODO: assumes it is a github url\n// allow override somehow\nfunction generateAbsoluteHref(currentHref: string, relativeHref: string): string {\n if (currentHref && relativeHref) {\n const currentUrl: URL = new URL(currentHref);\n const path: string = currentUrl.pathname.split('/').slice(1, -1).join('/');\n const correctUrl: URL = new URL(currentHref);\n\n if (relativeHref.startsWith('/')) {\n // url is relative to top level\n const orgAndRepo: string = path.split('/').slice(0, 3).join('/');\n correctUrl.pathname = `${orgAndRepo}${relativeHref}`;\n } else {\n correctUrl.pathname = `${path}/${relativeHref}`;\n }\n return correctUrl.href;\n }\n return undefined;\n}\n\nfunction normalizeHtmlHrefs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('a[href]').forEach((link: HTMLAnchorElement) => {\n const url: URL = new URL(link.href);\n const originalHash: string = url.hash;\n if (isAnchorLink(link)) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n link.href = url.hash;\n }\n } else if (url.host === window.location.host) {\n // hosts match, meaning URL MIGHT have been malformed by showdown\n // url is a relative url or just a link to a part of the application\n if (url.pathname.endsWith('.md')) {\n // only check .md urls\n\n const hrefWithoutHash: string = removeTrailingHash(link.getAttribute('href'));\n\n url.href = generateAbsoluteHref(currentHref, hrefWithoutHash);\n\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n } else {\n // url is absolute\n if (url.pathname.endsWith('.md')) {\n if (originalHash) {\n url.hash = genHeadingId(originalHash);\n }\n link.href = url.href;\n }\n link.target = '_blank';\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction normalizeImageSrcs(html: string, currentHref: string): string {\n if (currentHref) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('img[src]').forEach((image: HTMLImageElement) => {\n const src: string = image.getAttribute('src');\n try {\n /* tslint:disable-next-line:no-unused-expression */\n new URL(src);\n if (isGithubHref(src)) {\n image.src = rawGithubHref(src);\n }\n } catch {\n image.src = generateAbsoluteHref(isGithubHref(currentHref) ? rawGithubHref(currentHref) : currentHref, src);\n }\n // gh svgs need to have ?sanitize=true\n if (isRawGithubHref(image.src)) {\n const url: URL = new URL(image.src);\n if (url.pathname.endsWith('.svg')) {\n url.searchParams.set('sanitize', 'true');\n image.src = url.href;\n }\n }\n });\n\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\nfunction addIdsToHeadings(html: string): string {\n if (html) {\n const document: Document = new DOMParser().parseFromString(html, 'text/html');\n document.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((heading: HTMLElement) => {\n const id: string = genHeadingId(heading.innerHTML);\n heading.setAttribute('id', id);\n });\n return new XMLSerializer().serializeToString(document);\n }\n return html;\n}\n\n@Component({\n selector: 'td-markdown',\n styleUrls: ['./markdown.component.scss'],\n templateUrl: './markdown.component.html',\n})\nexport class TdMarkdownComponent implements OnChanges, AfterViewInit, OnDestroy {\n private _content: string;\n private _simpleLineBreaks: boolean = false;\n private _hostedUrl: string;\n private _anchor: string;\n private _viewInit: boolean = false;\n private _anchorListener?: VoidFunction;\n /**\n * .td-markdown class added to host so ::ng-deep gets scoped.\n */\n @HostBinding('class') class: string = 'td-markdown';\n\n /**\n * content?: string\n *\n * Markdown format content to be parsed as html markup.\n *\n * e.g. README.md content.\n */\n @Input('content')\n set content(content: string) {\n this._content = content;\n }\n\n /**\n * simpleLineBreaks?: string\n *\n * Sets whether newline characters inside paragraphs and spans are parsed as <br/>.\n * Defaults to false.\n */\n @Input('simpleLineBreaks')\n set simpleLineBreaks(simpleLineBreaks: boolean) {\n this._simpleLineBreaks = simpleLineBreaks;\n }\n\n /**\n * hostedUrl?: string\n *\n * If markdown contains relative paths, this is required to generate correct urls.\n *\n */\n @Input('hostedUrl')\n set hostedUrl(hostedUrl: string) {\n this._hostedUrl = hostedUrl;\n }\n\n /**\n * anchor?: string\n *\n * Anchor to jump to.\n *\n */\n @Input('anchor')\n set anchor(anchor: string) {\n this._anchor = anchor;\n }\n\n /**\n * contentReady?: function\n * Event emitted after the markdown content rendering is finished.\n */\n @Output() contentReady: EventEmitter<undefined> = new EventEmitter<undefined>();\n\n constructor(\n private _renderer: Renderer2,\n private _elementRef: ElementRef,\n private _domSanitizer: DomSanitizer,\n private _ngZone: NgZone,\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n // only anchor changed\n if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {\n scrollToAnchor(this._elementRef.nativeElement, this._anchor, true);\n } else {\n this.refresh();\n }\n }\n\n ngAfterViewInit(): void {\n if (!this._content) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n this._viewInit = true;\n\n // Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM\n // API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.\n // Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.\n // It also calls `markViewDirty()` before calling the actual listener (the decorated class method).\n this._ngZone.runOutsideAngular(() => {\n this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event: MouseEvent) => {\n const element: HTMLElement = <HTMLElement>event.srcElement;\n if (element.matches('a[href]') && isAnchorLink(<HTMLAnchorElement>element)) {\n this.handleAnchorClicks(event);\n }\n });\n });\n }\n\n ngOnDestroy(): void {\n this._anchorListener?.();\n }\n\n refresh(): void {\n if (this._content) {\n this._loadContent(this._content);\n } else if (this._viewInit) {\n this._loadContent((<HTMLElement>this._elementRef.nativeElement).textContent);\n }\n }\n\n /**\n * General method to parse a string markdown into HTML Elements and load them into the container\n */\n private _loadContent(markdown: string): void {\n if (markdown && markdown.trim().length > 0) {\n // Clean container\n this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');\n // Parse html string into actual HTML elements.\n this._elementFromString(this._render(markdown));\n }\n // TODO: timeout required since resizing of html elements occurs which causes a change in the scroll position\n setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);\n this.contentReady.emit();\n }\n\n private handleAnchorClicks(event: Event): void {\n event.preventDefault();\n const url: URL = new URL((<HTMLAnchorElement>event.target).href);\n const hash: string = decodeURI(url.hash);\n scrollToAnchor(this._elementRef.nativeElement, hash, true);\n }\n\n private _elementFromString(markupStr: string): HTMLDivElement {\n // Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]\n // to parse the string into DOM element for now.\n const div: HTMLDivElement = this._renderer.createElement('div');\n this._renderer.appendChild(this._elementRef.nativeElement, div);\n const html: string = this._domSanitizer.sanitize(SecurityContext.HTML, markupStr);\n const htmlWithAbsoluteHrefs: string = normalizeHtmlHrefs(html, this._hostedUrl);\n const htmlWithAbsoluteImgSrcs: string = normalizeImageSrcs(htmlWithAbsoluteHrefs, this._hostedUrl);\n const htmlWithHeadingIds: string = addIdsToHeadings(htmlWithAbsoluteImgSrcs);\n const htmlWithVideos: SafeHtml = renderVideoElements(htmlWithHeadingIds);\n this._renderer.setProperty(div, 'innerHTML', htmlWithVideos);\n return div;\n }\n\n private _render(markdown: string): string {\n // Trim leading and trailing newlines\n markdown = markdown.replace(/^(\\s|\\t)*\\n+/g, '').replace(/(\\s|\\t)*\\n+(\\s|\\t)*$/g, '');\n // Split markdown by line characters\n let lines: string[] = markdown.split('\\n');\n\n // check how much indentation is used by the first actual markdown line\n const firstLineWhitespace: string = lines[0].match(/^(\\s|\\t)*/)[0];\n\n // Remove all indentation spaces so markdown can be parsed correctly\n const startingWhitespaceRegex: RegExp = new RegExp('^' + firstLineWhitespace);\n lines = lines.map(function (line: string): string {\n return line.replace(startingWhitespaceRegex, '');\n });\n\n // Join lines again with line characters\n const markdownToParse: string = lines.join('\\n');\n\n // Convert markdown into html\n const converter: any = new showdown.Converter();\n converter.setOption('ghCodeBlocks', true);\n converter.setOption('tasklists', true);\n converter.setOption('tables', true);\n converter.setOption('literalMidWordUnderscores', true);\n converter.setOption('simpleLineBreaks', this._simpleLineBreaks);\n return converter.makeHtml(markdownToParse);\n }\n}\n","<ng-content></ng-content>\n","import { Injectable, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { isGithubHref, rawGithubHref } from '../markdown-utils/markdown-utils';\n\n@Injectable()\nexport class TdMarkdownLoaderService {\n constructor(private _http: HttpClient, private _sanitizer: DomSanitizer) {}\n\n async load(url: string, httpOptions: object = {}): Promise<string> {\n const sanitizedUrl: string = this._sanitizer.sanitize(SecurityContext.URL, url);\n let urlToGet: string = sanitizedUrl;\n if (isGithubHref(sanitizedUrl)) {\n urlToGet = rawGithubHref(sanitizedUrl);\n }\n\n const response: HttpResponse<string> = await this._http\n .get(urlToGet, { ...httpOptions, responseType: 'text', observe: 'response' })\n .toPromise();\n const contentType: string = response.headers.get('Content-Type');\n if (contentType.includes('text/plain') || contentType.includes('text/markdown')) {\n return response.body;\n } else {\n throw Error(`${contentType} is not a handled content type`);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { HttpClientModule } from '@angular/common/http';\n\nimport { TdMarkdownComponent } from './markdown.component';\nimport { TdMarkdownLoaderService } from './markdown-loader/markdown-loader.service';\n\n@NgModule({\n imports: [CommonModule, HttpClientModule],\n declarations: [TdMarkdownComponent],\n exports: [TdMarkdownComponent],\n providers: [TdMarkdownLoaderService],\n})\nexport class CovalentMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/markdown.component.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { AfterViewInit, ElementRef, EventEmitter, Renderer2, OnChanges, SimpleChanges } from '@angular/core';
|
|
1
|
+
import { AfterViewInit, ElementRef, EventEmitter, Renderer2, OnChanges, SimpleChanges, NgZone, OnDestroy } from '@angular/core';
|
|
2
2
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class TdMarkdownComponent implements OnChanges, AfterViewInit {
|
|
4
|
+
export declare class TdMarkdownComponent implements OnChanges, AfterViewInit, OnDestroy {
|
|
5
5
|
private _renderer;
|
|
6
6
|
private _elementRef;
|
|
7
7
|
private _domSanitizer;
|
|
8
|
+
private _ngZone;
|
|
8
9
|
private _content;
|
|
9
10
|
private _simpleLineBreaks;
|
|
10
11
|
private _hostedUrl;
|
|
11
12
|
private _anchor;
|
|
12
13
|
private _viewInit;
|
|
14
|
+
private _anchorListener?;
|
|
13
15
|
/**
|
|
14
16
|
* .td-markdown class added to host so ::ng-deep gets scoped.
|
|
15
17
|
*/
|
|
@@ -48,10 +50,10 @@ export declare class TdMarkdownComponent implements OnChanges, AfterViewInit {
|
|
|
48
50
|
* Event emitted after the markdown content rendering is finished.
|
|
49
51
|
*/
|
|
50
52
|
contentReady: EventEmitter<undefined>;
|
|
51
|
-
constructor(_renderer: Renderer2, _elementRef: ElementRef, _domSanitizer: DomSanitizer);
|
|
52
|
-
clickListener(event: Event): void;
|
|
53
|
+
constructor(_renderer: Renderer2, _elementRef: ElementRef, _domSanitizer: DomSanitizer, _ngZone: NgZone);
|
|
53
54
|
ngOnChanges(changes: SimpleChanges): void;
|
|
54
55
|
ngAfterViewInit(): void;
|
|
56
|
+
ngOnDestroy(): void;
|
|
55
57
|
refresh(): void;
|
|
56
58
|
/**
|
|
57
59
|
* General method to parse a string markdown into HTML Elements and load them into the container
|