@covalent/markdown 4.0.0-beta.1 → 4.0.0-beta.5
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 +24 -20
- package/fesm2015/covalent-markdown.mjs +27 -25
- package/fesm2015/covalent-markdown.mjs.map +1 -1
- package/fesm2020/covalent-markdown.mjs +23 -19
- package/fesm2020/covalent-markdown.mjs.map +1 -1
- package/markdown.component.d.ts +6 -4
- package/package.json +1 -1
|
@@ -1,11 +1,10 @@
|
|
|
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
|
+
import * as showdown from 'showdown/dist/showdown.js';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
import * as i1 from "@angular/platform-browser";
|
|
6
7
|
const _c0 = ["*"];
|
|
7
|
-
/* tslint:disable-next-line */
|
|
8
|
-
let showdown = require('showdown/dist/showdown.js');
|
|
9
8
|
// TODO: assumes it is a github url
|
|
10
9
|
// allow override somehow
|
|
11
10
|
function generateAbsoluteHref(currentHref, relativeHref) {
|
|
@@ -106,10 +105,11 @@ function addIdsToHeadings(html) {
|
|
|
106
105
|
return html;
|
|
107
106
|
}
|
|
108
107
|
export class TdMarkdownComponent {
|
|
109
|
-
constructor(_renderer, _elementRef, _domSanitizer) {
|
|
108
|
+
constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
|
|
110
109
|
this._renderer = _renderer;
|
|
111
110
|
this._elementRef = _elementRef;
|
|
112
111
|
this._domSanitizer = _domSanitizer;
|
|
112
|
+
this._ngZone = _ngZone;
|
|
113
113
|
this._simpleLineBreaks = false;
|
|
114
114
|
this._viewInit = false;
|
|
115
115
|
/**
|
|
@@ -159,12 +159,6 @@ export class TdMarkdownComponent {
|
|
|
159
159
|
set anchor(anchor) {
|
|
160
160
|
this._anchor = anchor;
|
|
161
161
|
}
|
|
162
|
-
clickListener(event) {
|
|
163
|
-
const element = event.srcElement;
|
|
164
|
-
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
165
|
-
this.handleAnchorClicks(event);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
162
|
ngOnChanges(changes) {
|
|
169
163
|
// only anchor changed
|
|
170
164
|
if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {
|
|
@@ -179,6 +173,21 @@ export class TdMarkdownComponent {
|
|
|
179
173
|
this._loadContent(this._elementRef.nativeElement.textContent);
|
|
180
174
|
}
|
|
181
175
|
this._viewInit = true;
|
|
176
|
+
// Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM
|
|
177
|
+
// API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.
|
|
178
|
+
// Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.
|
|
179
|
+
// It also calls `markViewDirty()` before calling the actual listener (the decorated class method).
|
|
180
|
+
this._ngZone.runOutsideAngular(() => {
|
|
181
|
+
this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
|
|
182
|
+
const element = event.srcElement;
|
|
183
|
+
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
184
|
+
this.handleAnchorClicks(event);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
ngOnDestroy() {
|
|
190
|
+
this._anchorListener?.();
|
|
182
191
|
}
|
|
183
192
|
refresh() {
|
|
184
193
|
if (this._content) {
|
|
@@ -202,7 +211,7 @@ export class TdMarkdownComponent {
|
|
|
202
211
|
setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);
|
|
203
212
|
this.contentReady.emit();
|
|
204
213
|
}
|
|
205
|
-
|
|
214
|
+
handleAnchorClicks(event) {
|
|
206
215
|
event.preventDefault();
|
|
207
216
|
const url = new URL(event.target.href);
|
|
208
217
|
const hash = decodeURI(url.hash);
|
|
@@ -245,10 +254,8 @@ export class TdMarkdownComponent {
|
|
|
245
254
|
return converter.makeHtml(markdownToParse);
|
|
246
255
|
}
|
|
247
256
|
}
|
|
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) {
|
|
257
|
+
/** @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)); };
|
|
258
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
252
259
|
i0.ɵɵclassMap(ctx.class);
|
|
253
260
|
} }, 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
261
|
i0.ɵɵprojectionDef();
|
|
@@ -257,7 +264,7 @@ export class TdMarkdownComponent {
|
|
|
257
264
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownComponent, [{
|
|
258
265
|
type: Component,
|
|
259
266
|
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: [{
|
|
267
|
+
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, { class: [{
|
|
261
268
|
type: HostBinding,
|
|
262
269
|
args: ['class']
|
|
263
270
|
}], content: [{
|
|
@@ -274,8 +281,5 @@ export class TdMarkdownComponent {
|
|
|
274
281
|
args: ['anchor']
|
|
275
282
|
}], contentReady: [{
|
|
276
283
|
type: Output
|
|
277
|
-
}], clickListener: [{
|
|
278
|
-
type: HostListener,
|
|
279
|
-
args: ['click', ['$event']]
|
|
280
284
|
}] }); })();
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsYXRmb3JtL21hcmtkb3duL21hcmtkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9tYXJrZG93bi9tYXJrZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsZUFBZSxFQUdmLFdBQVcsRUFDWCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsbUJBQW1CLEdBQ3BCLE1BQU0saUNBQWlDLENBQUM7Ozs7QUFHekMsOEJBQThCO0FBQzlCLElBQUksUUFBUSxHQUFRLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBRXpELG1DQUFtQztBQUNuQyx5QkFBeUI7QUFDekIsU0FBUyxvQkFBb0IsQ0FBQyxXQUFtQixFQUFFLFlBQW9CO0lBQ3JFLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtRQUMvQixNQUFNLFVBQVUsR0FBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBVyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sVUFBVSxHQUFRLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLElBQUks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TCxZQUFZO2tCQUFyQixNQUFNO1lBS1AsYUFBYTtrQkFEWixZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBSZW5kZXJlcjIsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7XG4gIHNjcm9sbFRvQW5jaG9yLFxuICBnZW5IZWFkaW5nSWQsXG4gIGlzQW5jaG9yTGluayxcbiAgcmVtb3ZlVHJhaWxpbmdIYXNoLFxuICByYXdHaXRodWJIcmVmLFxuICBpc0dpdGh1YkhyZWYsXG4gIGlzUmF3R2l0aHViSHJlZixcbiAgcmVuZGVyVmlkZW9FbGVtZW50cyxcbn0gZnJvbSAnLi9tYXJrZG93bi11dGlscy9tYXJrZG93bi11dGlscyc7XG5cbmRlY2xhcmUgY29uc3QgcmVxdWlyZTogYW55O1xuLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG5sZXQgc2hvd2Rvd246IGFueSA9IHJlcXVpcmUoJ3Nob3dkb3duL2Rpc3Qvc2hvd2Rvd24uanMnKTtcblxuLy8gVE9ETzogYXNzdW1lcyBpdCBpcyBhIGdpdGh1YiB1cmxcbi8vIGFsbG93IG92ZXJyaWRlIHNvbWVob3dcbmZ1bmN0aW9uIGdlbmVyYXRlQWJzb2x1dGVIcmVmKGN1cnJlbnRIcmVmOiBzdHJpbmcsIHJlbGF0aXZlSHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmICYmIHJlbGF0aXZlSHJlZikge1xuICAgIGNvbnN0IGN1cnJlbnRVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZyA9IGN1cnJlbnRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKS5zbGljZSgxLCAtMSkuam9pbignLycpO1xuICAgIGNvbnN0IGNvcnJlY3RVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuXG4gICAgaWYgKHJlbGF0aXZlSHJlZi5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIC8vIHVybCBpcyByZWxhdGl2ZSB0byB0b3AgbGV2ZWxcbiAgICAgIGNvbnN0IG9yZ0FuZFJlcG86IHN0cmluZyA9IHBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7b3JnQW5kUmVwb30ke3JlbGF0aXZlSHJlZn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7cGF0aH0vJHtyZWxhdGl2ZUhyZWZ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RVcmwuaHJlZjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIdG1sSHJlZnMoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXScpLmZvckVhY2goKGxpbms6IEhUTUxBbmNob3JFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB1cmw6IFVSTCA9IG5ldyBVUkwobGluay5ocmVmKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSGFzaDogc3RyaW5nID0gdXJsLmhhc2g7XG4gICAgICBpZiAoaXNBbmNob3JMaW5rKGxpbmspKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5oYXNoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVybC5ob3N0ID09PSB3aW5kb3cubG9jYXRpb24uaG9zdCkge1xuICAgICAgICAvLyBob3N0cyBtYXRjaCwgbWVhbmluZyBVUkwgTUlHSFQgaGF2ZSBiZWVuIG1hbGZvcm1lZCBieSBzaG93ZG93blxuICAgICAgICAvLyB1cmwgaXMgYSByZWxhdGl2ZSB1cmwgb3IganVzdCBhIGxpbmsgdG8gYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIC8vIG9ubHkgY2hlY2sgLm1kIHVybHNcblxuICAgICAgICAgIGNvbnN0IGhyZWZXaXRob3V0SGFzaDogc3RyaW5nID0gcmVtb3ZlVHJhaWxpbmdIYXNoKGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuXG4gICAgICAgICAgdXJsLmhyZWYgPSBnZW5lcmF0ZUFic29sdXRlSHJlZihjdXJyZW50SHJlZiwgaHJlZldpdGhvdXRIYXNoKTtcblxuICAgICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICAgIHVybC5oYXNoID0gZ2VuSGVhZGluZ0lkKG9yaWdpbmFsSGFzaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cmwgaXMgYWJzb2x1dGVcbiAgICAgICAgaWYgKHVybC5wYXRobmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBpZiAob3JpZ2luYWxIYXNoKSB7XG4gICAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZG9jdW1lbnQpO1xuICB9XG4gIHJldHVybiBodG1sO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbWFnZVNyY3MoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nW3NyY10nKS5mb3JFYWNoKChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc3JjOiBzdHJpbmcgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uICovXG4gICAgICAgIG5ldyBVUkwoc3JjKTtcbiAgICAgICAgaWYgKGlzR2l0aHViSHJlZihzcmMpKSB7XG4gICAgICAgICAgaW1hZ2Uuc3JjID0gcmF3R2l0aHViSHJlZihzcmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW1hZ2Uuc3JjID0gZ2VuZXJhdGVBYnNvbHV0ZUhyZWYoaXNHaXRodWJIcmVmKGN1cnJlbnRIcmVmKSA/IHJhd0dpdGh1YkhyZWYoY3VycmVudEhyZWYpIDogY3VycmVudEhyZWYsIHNyYyk7XG4gICAgICB9XG4gICAgICAvLyBnaCBzdmdzIG5lZWQgdG8gaGF2ZSA/c2FuaXRpemU9dHJ1ZVxuICAgICAgaWYgKGlzUmF3R2l0aHViSHJlZihpbWFnZS5zcmMpKSB7XG4gICAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChpbWFnZS5zcmMpO1xuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcuc3ZnJykpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2FuaXRpemUnLCAndHJ1ZScpO1xuICAgICAgICAgIGltYWdlLnNyYyA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhkb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIGFkZElkc1RvSGVhZGluZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGh0bWwpIHtcbiAgICBjb25zdCBkb2N1bWVudDogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2JykuZm9yRWFjaCgoaGVhZGluZzogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBnZW5IZWFkaW5nSWQoaGVhZGluZy5pbm5lckhUTUwpO1xuICAgICAgaGVhZGluZy5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGRvY3VtZW50KTtcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtbWFya2Rvd24nLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBUZE1hcmtkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSBfY29udGVudDogc3RyaW5nO1xuICBwcml2YXRlIF9zaW1wbGVMaW5lQnJlYWtzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2hvc3RlZFVybDogc3RyaW5nO1xuICBwcml2YXRlIF9hbmNob3I6IHN0cmluZztcbiAgcHJpdmF0ZSBfdmlld0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIC50ZC1tYXJrZG93biBjbGFzcyBhZGRlZCB0byBob3N0IHNvIDo6bmctZGVlcCBnZXRzIHNjb3BlZC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzczogc3RyaW5nID0gJ3RkLW1hcmtkb3duJztcblxuICAvKipcbiAgICogY29udGVudD86IHN0cmluZ1xuICAgKlxuICAgKiBNYXJrZG93biBmb3JtYXQgY29udGVudCB0byBiZSBwYXJzZWQgYXMgaHRtbCBtYXJrdXAuXG4gICAqXG4gICAqIGUuZy4gUkVBRE1FLm1kIGNvbnRlbnQuXG4gICAqL1xuICBASW5wdXQoJ2NvbnRlbnQnKVxuICBzZXQgY29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzaW1wbGVMaW5lQnJlYWtzPzogc3RyaW5nXG4gICAqXG4gICAqIFNldHMgd2hldGhlciBuZXdsaW5lIGNoYXJhY3RlcnMgaW5zaWRlIHBhcmFncmFwaHMgYW5kIHNwYW5zIGFyZSBwYXJzZWQgYXMgPGJyLz4uXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgQElucHV0KCdzaW1wbGVMaW5lQnJlYWtzJylcbiAgc2V0IHNpbXBsZUxpbmVCcmVha3Moc2ltcGxlTGluZUJyZWFrczogYm9vbGVhbikge1xuICAgIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MgPSBzaW1wbGVMaW5lQnJlYWtzO1xuICB9XG5cbiAgLyoqXG4gICAqIGhvc3RlZFVybD86IHN0cmluZ1xuICAgKlxuICAgKiBJZiBtYXJrZG93biBjb250YWlucyByZWxhdGl2ZSBwYXRocywgdGhpcyBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSBjb3JyZWN0IHVybHMuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2hvc3RlZFVybCcpXG4gIHNldCBob3N0ZWRVcmwoaG9zdGVkVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ob3N0ZWRVcmwgPSBob3N0ZWRVcmw7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yPzogc3RyaW5nXG4gICAqXG4gICAqIEFuY2hvciB0byBqdW1wIHRvLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdhbmNob3InKVxuICBzZXQgYW5jaG9yKGFuY2hvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gYW5jaG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbnRlbnRSZWFkeT86IGZ1bmN0aW9uXG4gICAqIEV2ZW50IGVtaXR0ZWQgYWZ0ZXIgdGhlIG1hcmtkb3duIGNvbnRlbnQgcmVuZGVyaW5nIGlzIGZpbmlzaGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGNvbnRlbnRSZWFkeTogRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9kb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsaWNrTGlzdGVuZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudDtcbiAgICBpZiAoZWxlbWVudC5tYXRjaGVzKCdhW2hyZWZdJykgJiYgaXNBbmNob3JMaW5rKDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50KSkge1xuICAgICAgdGhpcy5oYW5kbGVBbmNob3JDbGlja3MoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBvbmx5IGFuY2hvciBjaGFuZ2VkXG4gICAgaWYgKGNoYW5nZXMuYW5jaG9yICYmICFjaGFuZ2VzLmNvbnRlbnQgJiYgIWNoYW5nZXMuc2ltcGxlTGluZUJyZWFrcyAmJiAhY2hhbmdlcy5ob3N0ZWRVcmwpIHtcbiAgICAgIHNjcm9sbFRvQW5jaG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fYW5jaG9yLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQoKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50KTtcbiAgICB9XG4gICAgdGhpcy5fdmlld0luaXQgPSB0cnVlO1xuICB9XG5cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQodGhpcy5fY29udGVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl92aWV3SW5pdCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQoKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgdG8gcGFyc2UgYSBzdHJpbmcgbWFya2Rvd24gaW50byBIVE1MIEVsZW1lbnRzIGFuZCBsb2FkIHRoZW0gaW50byB0aGUgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIF9sb2FkQ29udGVudChtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG1hcmtkb3duICYmIG1hcmtkb3duLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDbGVhbiBjb250YWluZXJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsICcnKTtcbiAgICAgIC8vIFBhcnNlIGh0bWwgc3RyaW5nIGludG8gYWN0dWFsIEhUTUwgZWxlbWVudHMuXG4gICAgICB0aGlzLl9lbGVtZW50RnJvbVN0cmluZyh0aGlzLl9yZW5kZXIobWFya2Rvd24pKTtcbiAgICB9XG4gICAgLy8gVE9ETzogdGltZW91dCByZXF1aXJlZCBzaW5jZSByZXNpemluZyBvZiBodG1sIGVsZW1lbnRzIG9jY3VycyB3aGljaCBjYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2Nyb2xsVG9BbmNob3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9hbmNob3IsIHRydWUpLCAyNTApO1xuICAgIHRoaXMuY29udGVudFJlYWR5LmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQW5jaG9yQ2xpY2tzKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdXJsOiBVUkwgPSBuZXcgVVJMKCg8SFRNTEFuY2hvckVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5ocmVmKTtcbiAgICBjb25zdCBoYXNoOiBzdHJpbmcgPSBkZWNvZGVVUkkodXJsLmhhc2gpO1xuICAgIHNjcm9sbFRvQW5jaG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgaGFzaCwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50RnJvbVN0cmluZyhtYXJrdXBTdHI6IHN0cmluZyk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICAvLyBSZW5kZXJlcjIgZG9lc250IGhhdmUgYSBwYXJzaW5nIG1ldGhvZCwgc28gd2UgaGF2ZSB0byBzYW5pdGl6ZSBhbmQgdXNlIFtpbm5lckhUTUxdXG4gICAgLy8gdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIERPTSBlbGVtZW50IGZvciBub3cuXG4gICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZGl2KTtcbiAgICBjb25zdCBodG1sOiBzdHJpbmcgPSB0aGlzLl9kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIG1hcmt1cFN0cik7XG4gICAgY29uc3QgaHRtbFdpdGhBYnNvbHV0ZUhyZWZzOiBzdHJpbmcgPSBub3JtYWxpemVIdG1sSHJlZnMoaHRtbCwgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEFic29sdXRlSW1nU3Jjczogc3RyaW5nID0gbm9ybWFsaXplSW1hZ2VTcmNzKGh0bWxXaXRoQWJzb2x1dGVIcmVmcywgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEhlYWRpbmdJZHM6IHN0cmluZyA9IGFkZElkc1RvSGVhZGluZ3MoaHRtbFdpdGhBYnNvbHV0ZUltZ1NyY3MpO1xuICAgIGNvbnN0IGh0bWxXaXRoVmlkZW9zOiBTYWZlSHRtbCA9IHJlbmRlclZpZGVvRWxlbWVudHMoaHRtbFdpdGhIZWFkaW5nSWRzKTtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eShkaXYsICdpbm5lckhUTUwnLCBodG1sV2l0aFZpZGVvcyk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlcihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG5ld2xpbmVzXG4gICAgbWFya2Rvd24gPSBtYXJrZG93bi5yZXBsYWNlKC9eKFxcc3xcXHQpKlxcbisvZywgJycpLnJlcGxhY2UoLyhcXHN8XFx0KSpcXG4rKFxcc3xcXHQpKiQvZywgJycpO1xuICAgIC8vIFNwbGl0IG1hcmtkb3duIGJ5IGxpbmUgY2hhcmFjdGVyc1xuICAgIGxldCBsaW5lczogc3RyaW5nW10gPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBjaGVjayBob3cgbXVjaCBpbmRlbnRhdGlvbiBpcyB1c2VkIGJ5IHRoZSBmaXJzdCBhY3R1YWwgbWFya2Rvd24gbGluZVxuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2U6IHN0cmluZyA9IGxpbmVzWzBdLm1hdGNoKC9eKFxcc3xcXHQpKi8pWzBdO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBzcGFjZXMgc28gbWFya2Rvd24gY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHlcbiAgICBjb25zdCBzdGFydGluZ1doaXRlc3BhY2VSZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXicgKyBmaXJzdExpbmVXaGl0ZXNwYWNlKTtcbiAgICBsaW5lcyA9IGxpbmVzLm1hcChmdW5jdGlvbiAobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBsaW5lLnJlcGxhY2Uoc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXgsICcnKTtcbiAgICB9KTtcblxuICAgIC8vIEpvaW4gbGluZXMgYWdhaW4gd2l0aCBsaW5lIGNoYXJhY3RlcnNcbiAgICBjb25zdCBtYXJrZG93blRvUGFyc2U6IHN0cmluZyA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29udmVydCBtYXJrZG93biBpbnRvIGh0bWxcbiAgICBjb25zdCBjb252ZXJ0ZXI6IGFueSA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdnaENvZGVCbG9ja3MnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YXNrbGlzdHMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YWJsZXMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzJywgdHJ1ZSk7XG4gICAgY29udmVydGVyLnNldE9wdGlvbignc2ltcGxlTGluZUJyZWFrcycsIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MpO1xuICAgIHJldHVybiBjb252ZXJ0ZXIubWFrZUh0bWwobWFya2Rvd25Ub1BhcnNlKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsYXRmb3JtL21hcmtkb3duL21hcmtkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9tYXJrZG93bi9tYXJrZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsZUFBZSxFQUdmLFdBQVcsRUFDWCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsbUJBQW1CLEdBQ3BCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxLQUFLLFFBQVEsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQUV0RCxtQ0FBbUM7QUFDbkMseUJBQXlCO0FBQ3pCLFNBQVMsb0JBQW9CLENBQUMsV0FBbUIsRUFBRSxZQUFvQjtJQUNyRSxJQUFJLFdBQVcsSUFBSSxZQUFZLEVBQUU7UUFDL0IsTUFBTSxVQUFVLEdBQVEsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQVcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRSxNQUFNLFVBQVUsR0FBUSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU3QyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FB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Q0FBQyxDQUFDO0lBQzdDLENBQUM7OzRIQTdLVSxtQkFBbUI7d0hBQW5CLG1CQUFtQjs7OztRQzNJaEMsa0JBQXlCOzt1RkQySVosbUJBQW1CO2NBTC9CLFNBQVM7MkJBQ0UsYUFBYTtxSUFjRCxLQUFLO2tCQUExQixXQUFXO21CQUFDLE9BQU87WUFVaEIsT0FBTztrQkFEVixLQUFLO21CQUFDLFNBQVM7WUFZWixnQkFBZ0I7a0JBRG5CLEtBQUs7bUJBQUMsa0JBQWtCO1lBWXJCLFNBQVM7a0JBRFosS0FBSzttQkFBQyxXQUFXO1lBWWQsTUFBTTtrQkFEVCxLQUFLO21CQUFDLFFBQVE7WUFTTCxZQUFZO2tCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBBZnRlclZpZXdJbml0LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFJlbmRlcmVyMixcbiAgU2VjdXJpdHlDb250ZXh0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEhvc3RCaW5kaW5nLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge1xuICBzY3JvbGxUb0FuY2hvcixcbiAgZ2VuSGVhZGluZ0lkLFxuICBpc0FuY2hvckxpbmssXG4gIHJlbW92ZVRyYWlsaW5nSGFzaCxcbiAgcmF3R2l0aHViSHJlZixcbiAgaXNHaXRodWJIcmVmLFxuICBpc1Jhd0dpdGh1YkhyZWYsXG4gIHJlbmRlclZpZGVvRWxlbWVudHMsXG59IGZyb20gJy4vbWFya2Rvd24tdXRpbHMvbWFya2Rvd24tdXRpbHMnO1xuXG5pbXBvcnQgKiBhcyBzaG93ZG93biBmcm9tICdzaG93ZG93bi9kaXN0L3Nob3dkb3duLmpzJztcblxuLy8gVE9ETzogYXNzdW1lcyBpdCBpcyBhIGdpdGh1YiB1cmxcbi8vIGFsbG93IG92ZXJyaWRlIHNvbWVob3dcbmZ1bmN0aW9uIGdlbmVyYXRlQWJzb2x1dGVIcmVmKGN1cnJlbnRIcmVmOiBzdHJpbmcsIHJlbGF0aXZlSHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmICYmIHJlbGF0aXZlSHJlZikge1xuICAgIGNvbnN0IGN1cnJlbnRVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZyA9IGN1cnJlbnRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKS5zbGljZSgxLCAtMSkuam9pbignLycpO1xuICAgIGNvbnN0IGNvcnJlY3RVcmw6IFVSTCA9IG5ldyBVUkwoY3VycmVudEhyZWYpO1xuXG4gICAgaWYgKHJlbGF0aXZlSHJlZi5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIC8vIHVybCBpcyByZWxhdGl2ZSB0byB0b3AgbGV2ZWxcbiAgICAgIGNvbnN0IG9yZ0FuZFJlcG86IHN0cmluZyA9IHBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAzKS5qb2luKCcvJyk7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7b3JnQW5kUmVwb30ke3JlbGF0aXZlSHJlZn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3JyZWN0VXJsLnBhdGhuYW1lID0gYCR7cGF0aH0vJHtyZWxhdGl2ZUhyZWZ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcnJlY3RVcmwuaHJlZjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIdG1sSHJlZnMoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXScpLmZvckVhY2goKGxpbms6IEhUTUxBbmNob3JFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCB1cmw6IFVSTCA9IG5ldyBVUkwobGluay5ocmVmKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSGFzaDogc3RyaW5nID0gdXJsLmhhc2g7XG4gICAgICBpZiAoaXNBbmNob3JMaW5rKGxpbmspKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5oYXNoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVybC5ob3N0ID09PSB3aW5kb3cubG9jYXRpb24uaG9zdCkge1xuICAgICAgICAvLyBob3N0cyBtYXRjaCwgbWVhbmluZyBVUkwgTUlHSFQgaGF2ZSBiZWVuIG1hbGZvcm1lZCBieSBzaG93ZG93blxuICAgICAgICAvLyB1cmwgaXMgYSByZWxhdGl2ZSB1cmwgb3IganVzdCBhIGxpbmsgdG8gYSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIC8vIG9ubHkgY2hlY2sgLm1kIHVybHNcblxuICAgICAgICAgIGNvbnN0IGhyZWZXaXRob3V0SGFzaDogc3RyaW5nID0gcmVtb3ZlVHJhaWxpbmdIYXNoKGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuXG4gICAgICAgICAgdXJsLmhyZWYgPSBnZW5lcmF0ZUFic29sdXRlSHJlZihjdXJyZW50SHJlZiwgaHJlZldpdGhvdXRIYXNoKTtcblxuICAgICAgICAgIGlmIChvcmlnaW5hbEhhc2gpIHtcbiAgICAgICAgICAgIHVybC5oYXNoID0gZ2VuSGVhZGluZ0lkKG9yaWdpbmFsSGFzaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1cmwgaXMgYWJzb2x1dGVcbiAgICAgICAgaWYgKHVybC5wYXRobmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBpZiAob3JpZ2luYWxIYXNoKSB7XG4gICAgICAgICAgICB1cmwuaGFzaCA9IGdlbkhlYWRpbmdJZChvcmlnaW5hbEhhc2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgICAgfVxuICAgICAgICBsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZG9jdW1lbnQpO1xuICB9XG4gIHJldHVybiBodG1sO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbWFnZVNyY3MoaHRtbDogc3RyaW5nLCBjdXJyZW50SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGN1cnJlbnRIcmVmKSB7XG4gICAgY29uc3QgZG9jdW1lbnQ6IERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nW3NyY10nKS5mb3JFYWNoKChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc3JjOiBzdHJpbmcgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uICovXG4gICAgICAgIG5ldyBVUkwoc3JjKTtcbiAgICAgICAgaWYgKGlzR2l0aHViSHJlZihzcmMpKSB7XG4gICAgICAgICAgaW1hZ2Uuc3JjID0gcmF3R2l0aHViSHJlZihzcmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW1hZ2Uuc3JjID0gZ2VuZXJhdGVBYnNvbHV0ZUhyZWYoaXNHaXRodWJIcmVmKGN1cnJlbnRIcmVmKSA/IHJhd0dpdGh1YkhyZWYoY3VycmVudEhyZWYpIDogY3VycmVudEhyZWYsIHNyYyk7XG4gICAgICB9XG4gICAgICAvLyBnaCBzdmdzIG5lZWQgdG8gaGF2ZSA/c2FuaXRpemU9dHJ1ZVxuICAgICAgaWYgKGlzUmF3R2l0aHViSHJlZihpbWFnZS5zcmMpKSB7XG4gICAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChpbWFnZS5zcmMpO1xuICAgICAgICBpZiAodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCcuc3ZnJykpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2FuaXRpemUnLCAndHJ1ZScpO1xuICAgICAgICAgIGltYWdlLnNyYyA9IHVybC5ocmVmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhkb2N1bWVudCk7XG4gIH1cbiAgcmV0dXJuIGh0bWw7XG59XG5cbmZ1bmN0aW9uIGFkZElkc1RvSGVhZGluZ3MoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGh0bWwpIHtcbiAgICBjb25zdCBkb2N1bWVudDogRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2JykuZm9yRWFjaCgoaGVhZGluZzogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBnZW5IZWFkaW5nSWQoaGVhZGluZy5pbm5lckhUTUwpO1xuICAgICAgaGVhZGluZy5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGRvY3VtZW50KTtcbiAgfVxuICByZXR1cm4gaHRtbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtbWFya2Rvd24nLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBUZE1hcmtkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9jb250ZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgX3NpbXBsZUxpbmVCcmVha3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaG9zdGVkVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgX2FuY2hvcjogc3RyaW5nO1xuICBwcml2YXRlIF92aWV3SW5pdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hbmNob3JMaXN0ZW5lcj86IFZvaWRGdW5jdGlvbjtcbiAgLyoqXG4gICAqIC50ZC1tYXJrZG93biBjbGFzcyBhZGRlZCB0byBob3N0IHNvIDo6bmctZGVlcCBnZXRzIHNjb3BlZC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzczogc3RyaW5nID0gJ3RkLW1hcmtkb3duJztcblxuICAvKipcbiAgICogY29udGVudD86IHN0cmluZ1xuICAgKlxuICAgKiBNYXJrZG93biBmb3JtYXQgY29udGVudCB0byBiZSBwYXJzZWQgYXMgaHRtbCBtYXJrdXAuXG4gICAqXG4gICAqIGUuZy4gUkVBRE1FLm1kIGNvbnRlbnQuXG4gICAqL1xuICBASW5wdXQoJ2NvbnRlbnQnKVxuICBzZXQgY29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzaW1wbGVMaW5lQnJlYWtzPzogc3RyaW5nXG4gICAqXG4gICAqIFNldHMgd2hldGhlciBuZXdsaW5lIGNoYXJhY3RlcnMgaW5zaWRlIHBhcmFncmFwaHMgYW5kIHNwYW5zIGFyZSBwYXJzZWQgYXMgPGJyLz4uXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgQElucHV0KCdzaW1wbGVMaW5lQnJlYWtzJylcbiAgc2V0IHNpbXBsZUxpbmVCcmVha3Moc2ltcGxlTGluZUJyZWFrczogYm9vbGVhbikge1xuICAgIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MgPSBzaW1wbGVMaW5lQnJlYWtzO1xuICB9XG5cbiAgLyoqXG4gICAqIGhvc3RlZFVybD86IHN0cmluZ1xuICAgKlxuICAgKiBJZiBtYXJrZG93biBjb250YWlucyByZWxhdGl2ZSBwYXRocywgdGhpcyBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSBjb3JyZWN0IHVybHMuXG4gICAqXG4gICAqL1xuICBASW5wdXQoJ2hvc3RlZFVybCcpXG4gIHNldCBob3N0ZWRVcmwoaG9zdGVkVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ob3N0ZWRVcmwgPSBob3N0ZWRVcmw7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yPzogc3RyaW5nXG4gICAqXG4gICAqIEFuY2hvciB0byBqdW1wIHRvLlxuICAgKlxuICAgKi9cbiAgQElucHV0KCdhbmNob3InKVxuICBzZXQgYW5jaG9yKGFuY2hvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fYW5jaG9yID0gYW5jaG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbnRlbnRSZWFkeT86IGZ1bmN0aW9uXG4gICAqIEV2ZW50IGVtaXR0ZWQgYWZ0ZXIgdGhlIG1hcmtkb3duIGNvbnRlbnQgcmVuZGVyaW5nIGlzIGZpbmlzaGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGNvbnRlbnRSZWFkeTogRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHVuZGVmaW5lZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gb25seSBhbmNob3IgY2hhbmdlZFxuICAgIGlmIChjaGFuZ2VzLmFuY2hvciAmJiAhY2hhbmdlcy5jb250ZW50ICYmICFjaGFuZ2VzLnNpbXBsZUxpbmVCcmVha3MgJiYgIWNoYW5nZXMuaG9zdGVkVXJsKSB7XG4gICAgICBzY3JvbGxUb0FuY2hvcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2FuY2hvciwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2xvYWRDb250ZW50KCg8SFRNTEVsZW1lbnQ+dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS50ZXh0Q29udGVudCk7XG4gICAgfVxuICAgIHRoaXMuX3ZpZXdJbml0ID0gdHJ1ZTtcblxuICAgIC8vIENhcmV0YWtlciBub3RlOiB0aGUgYHNjcm9sbFRvQW5jaG9yYCBjYWxscyBgZWxlbWVudC5zY3JvbGxJbnRvVmlld2AsIGEgbmF0aXZlIHN5bmNocm9ub3VzIERPTVxuICAgIC8vIEFQSSBhbmQgaXQgZG9lc24ndCByZXF1aXJlIEFuZ3VsYXIgcnVubmluZyBgQXBwbGljYXRpb25SZWYudGljaygpYCBlYWNoIHRpbWUgdGhlIG1hcmtkb3duIGNvbXBvbmVudCBpcyBjbGlja2VkLlxuICAgIC8vIEhvc3QgbGlzdGVuZXIgKGFkZGVkIHRocm91Z2ggYEBIb3N0TGlzdGVuZXJgKSBjYXVzZSBBbmd1bGFyIHRvIGFkZCBhbiBldmVudCBsaXN0ZW5lciB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAvLyBJdCBhbHNvIGNhbGxzIGBtYXJrVmlld0RpcnR5KClgIGJlZm9yZSBjYWxsaW5nIHRoZSBhY3R1YWwgbGlzdGVuZXIgKHRoZSBkZWNvcmF0ZWQgY2xhc3MgbWV0aG9kKS5cbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5fYW5jaG9yTGlzdGVuZXIgPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcygnYVtocmVmXScpICYmIGlzQW5jaG9yTGluayg8SFRNTEFuY2hvckVsZW1lbnQ+ZWxlbWVudCkpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUFuY2hvckNsaWNrcyhldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fYW5jaG9yTGlzdGVuZXI/LigpO1xuICB9XG5cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQodGhpcy5fY29udGVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl92aWV3SW5pdCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQoKDxIVE1MRWxlbWVudD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgdG8gcGFyc2UgYSBzdHJpbmcgbWFya2Rvd24gaW50byBIVE1MIEVsZW1lbnRzIGFuZCBsb2FkIHRoZW0gaW50byB0aGUgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIF9sb2FkQ29udGVudChtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG1hcmtkb3duICYmIG1hcmtkb3duLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDbGVhbiBjb250YWluZXJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsICcnKTtcbiAgICAgIC8vIFBhcnNlIGh0bWwgc3RyaW5nIGludG8gYWN0dWFsIEhUTUwgZWxlbWVudHMuXG4gICAgICB0aGlzLl9lbGVtZW50RnJvbVN0cmluZyh0aGlzLl9yZW5kZXIobWFya2Rvd24pKTtcbiAgICB9XG4gICAgLy8gVE9ETzogdGltZW91dCByZXF1aXJlZCBzaW5jZSByZXNpemluZyBvZiBodG1sIGVsZW1lbnRzIG9jY3VycyB3aGljaCBjYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2Nyb2xsVG9BbmNob3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9hbmNob3IsIHRydWUpLCAyNTApO1xuICAgIHRoaXMuY29udGVudFJlYWR5LmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQW5jaG9yQ2xpY2tzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdXJsOiBVUkwgPSBuZXcgVVJMKCg8SFRNTEFuY2hvckVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5ocmVmKTtcbiAgICBjb25zdCBoYXNoOiBzdHJpbmcgPSBkZWNvZGVVUkkodXJsLmhhc2gpO1xuICAgIHNjcm9sbFRvQW5jaG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgaGFzaCwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50RnJvbVN0cmluZyhtYXJrdXBTdHI6IHN0cmluZyk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICAvLyBSZW5kZXJlcjIgZG9lc250IGhhdmUgYSBwYXJzaW5nIG1ldGhvZCwgc28gd2UgaGF2ZSB0byBzYW5pdGl6ZSBhbmQgdXNlIFtpbm5lckhUTUxdXG4gICAgLy8gdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIERPTSBlbGVtZW50IGZvciBub3cuXG4gICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZGl2KTtcbiAgICBjb25zdCBodG1sOiBzdHJpbmcgPSB0aGlzLl9kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIG1hcmt1cFN0cik7XG4gICAgY29uc3QgaHRtbFdpdGhBYnNvbHV0ZUhyZWZzOiBzdHJpbmcgPSBub3JtYWxpemVIdG1sSHJlZnMoaHRtbCwgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEFic29sdXRlSW1nU3Jjczogc3RyaW5nID0gbm9ybWFsaXplSW1hZ2VTcmNzKGh0bWxXaXRoQWJzb2x1dGVIcmVmcywgdGhpcy5faG9zdGVkVXJsKTtcbiAgICBjb25zdCBodG1sV2l0aEhlYWRpbmdJZHM6IHN0cmluZyA9IGFkZElkc1RvSGVhZGluZ3MoaHRtbFdpdGhBYnNvbHV0ZUltZ1NyY3MpO1xuICAgIGNvbnN0IGh0bWxXaXRoVmlkZW9zOiBTYWZlSHRtbCA9IHJlbmRlclZpZGVvRWxlbWVudHMoaHRtbFdpdGhIZWFkaW5nSWRzKTtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eShkaXYsICdpbm5lckhUTUwnLCBodG1sV2l0aFZpZGVvcyk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlcihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG5ld2xpbmVzXG4gICAgbWFya2Rvd24gPSBtYXJrZG93bi5yZXBsYWNlKC9eKFxcc3xcXHQpKlxcbisvZywgJycpLnJlcGxhY2UoLyhcXHN8XFx0KSpcXG4rKFxcc3xcXHQpKiQvZywgJycpO1xuICAgIC8vIFNwbGl0IG1hcmtkb3duIGJ5IGxpbmUgY2hhcmFjdGVyc1xuICAgIGxldCBsaW5lczogc3RyaW5nW10gPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBjaGVjayBob3cgbXVjaCBpbmRlbnRhdGlvbiBpcyB1c2VkIGJ5IHRoZSBmaXJzdCBhY3R1YWwgbWFya2Rvd24gbGluZVxuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2U6IHN0cmluZyA9IGxpbmVzWzBdLm1hdGNoKC9eKFxcc3xcXHQpKi8pWzBdO1xuXG4gICAgLy8gUmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBzcGFjZXMgc28gbWFya2Rvd24gY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHlcbiAgICBjb25zdCBzdGFydGluZ1doaXRlc3BhY2VSZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXicgKyBmaXJzdExpbmVXaGl0ZXNwYWNlKTtcbiAgICBsaW5lcyA9IGxpbmVzLm1hcChmdW5jdGlvbiAobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBsaW5lLnJlcGxhY2Uoc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXgsICcnKTtcbiAgICB9KTtcblxuICAgIC8vIEpvaW4gbGluZXMgYWdhaW4gd2l0aCBsaW5lIGNoYXJhY3RlcnNcbiAgICBjb25zdCBtYXJrZG93blRvUGFyc2U6IHN0cmluZyA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29udmVydCBtYXJrZG93biBpbnRvIGh0bWxcbiAgICBjb25zdCBjb252ZXJ0ZXI6IGFueSA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdnaENvZGVCbG9ja3MnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YXNrbGlzdHMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCd0YWJsZXMnLCB0cnVlKTtcbiAgICBjb252ZXJ0ZXIuc2V0T3B0aW9uKCdsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzJywgdHJ1ZSk7XG4gICAgY29udmVydGVyLnNldE9wdGlvbignc2ltcGxlTGluZUJyZWFrcycsIHRoaXMuX3NpbXBsZUxpbmVCcmVha3MpO1xuICAgIHJldHVybiBjb252ZXJ0ZXIubWFrZUh0bWwobWFya2Rvd25Ub1BhcnNlKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19
|
|
@@ -1,10 +1,11 @@
|
|
|
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
|
|
6
|
+
import * as showdown from 'showdown/dist/showdown.js';
|
|
7
7
|
import * as i1 from '@angular/platform-browser';
|
|
8
|
+
import { __awaiter } from 'tslib';
|
|
8
9
|
|
|
9
10
|
function removeLeadingHash(str) {
|
|
10
11
|
if (str) {
|
|
@@ -122,8 +123,6 @@ function renderVideoElements(html) {
|
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
const _c0 = ["*"];
|
|
125
|
-
/* tslint:disable-next-line */
|
|
126
|
-
let showdown = require('showdown/dist/showdown.js');
|
|
127
126
|
// TODO: assumes it is a github url
|
|
128
127
|
// allow override somehow
|
|
129
128
|
function generateAbsoluteHref(currentHref, relativeHref) {
|
|
@@ -224,10 +223,11 @@ function addIdsToHeadings(html) {
|
|
|
224
223
|
return html;
|
|
225
224
|
}
|
|
226
225
|
class TdMarkdownComponent {
|
|
227
|
-
constructor(_renderer, _elementRef, _domSanitizer) {
|
|
226
|
+
constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
|
|
228
227
|
this._renderer = _renderer;
|
|
229
228
|
this._elementRef = _elementRef;
|
|
230
229
|
this._domSanitizer = _domSanitizer;
|
|
230
|
+
this._ngZone = _ngZone;
|
|
231
231
|
this._simpleLineBreaks = false;
|
|
232
232
|
this._viewInit = false;
|
|
233
233
|
/**
|
|
@@ -277,12 +277,6 @@ class TdMarkdownComponent {
|
|
|
277
277
|
set anchor(anchor) {
|
|
278
278
|
this._anchor = anchor;
|
|
279
279
|
}
|
|
280
|
-
clickListener(event) {
|
|
281
|
-
const element = event.srcElement;
|
|
282
|
-
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
283
|
-
this.handleAnchorClicks(event);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
280
|
ngOnChanges(changes) {
|
|
287
281
|
// only anchor changed
|
|
288
282
|
if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {
|
|
@@ -297,6 +291,22 @@ class TdMarkdownComponent {
|
|
|
297
291
|
this._loadContent(this._elementRef.nativeElement.textContent);
|
|
298
292
|
}
|
|
299
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
|
+
var _a;
|
|
309
|
+
(_a = this._anchorListener) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
300
310
|
}
|
|
301
311
|
refresh() {
|
|
302
312
|
if (this._content) {
|
|
@@ -321,12 +331,10 @@ class TdMarkdownComponent {
|
|
|
321
331
|
this.contentReady.emit();
|
|
322
332
|
}
|
|
323
333
|
handleAnchorClicks(event) {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
scrollToAnchor(this._elementRef.nativeElement, hash, true);
|
|
329
|
-
});
|
|
334
|
+
event.preventDefault();
|
|
335
|
+
const url = new URL(event.target.href);
|
|
336
|
+
const hash = decodeURI(url.hash);
|
|
337
|
+
scrollToAnchor(this._elementRef.nativeElement, hash, true);
|
|
330
338
|
}
|
|
331
339
|
_elementFromString(markupStr) {
|
|
332
340
|
// Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]
|
|
@@ -365,11 +373,8 @@ class TdMarkdownComponent {
|
|
|
365
373
|
return converter.makeHtml(markdownToParse);
|
|
366
374
|
}
|
|
367
375
|
}
|
|
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)); };
|
|
376
|
+
/** @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
377
|
/** @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
378
|
if (rf & 2) {
|
|
374
379
|
i0.ɵɵclassMap(ctx.class);
|
|
375
380
|
}
|
|
@@ -383,7 +388,7 @@ class TdMarkdownComponent {
|
|
|
383
388
|
(typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownComponent, [{
|
|
384
389
|
type: Component,
|
|
385
390
|
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: [{
|
|
391
|
+
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, { class: [{
|
|
387
392
|
type: HostBinding,
|
|
388
393
|
args: ['class']
|
|
389
394
|
}], content: [{
|
|
@@ -400,9 +405,6 @@ class TdMarkdownComponent {
|
|
|
400
405
|
args: ['anchor']
|
|
401
406
|
}], contentReady: [{
|
|
402
407
|
type: Output
|
|
403
|
-
}], clickListener: [{
|
|
404
|
-
type: HostListener,
|
|
405
|
-
args: ['click', ['$event']]
|
|
406
408
|
}] });
|
|
407
409
|
})();
|
|
408
410
|
|
|
@@ -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\nimport * as showdown from '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,9 +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
6
|
import * as i1 from '@angular/platform-browser';
|
|
7
|
+
import * as showdown from 'showdown/dist/showdown.js';
|
|
7
8
|
|
|
8
9
|
function removeLeadingHash(str) {
|
|
9
10
|
if (str) {
|
|
@@ -121,8 +122,6 @@ function renderVideoElements(html) {
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
const _c0 = ["*"];
|
|
124
|
-
/* tslint:disable-next-line */
|
|
125
|
-
let showdown = require('showdown/dist/showdown.js');
|
|
126
125
|
// TODO: assumes it is a github url
|
|
127
126
|
// allow override somehow
|
|
128
127
|
function generateAbsoluteHref(currentHref, relativeHref) {
|
|
@@ -223,10 +222,11 @@ function addIdsToHeadings(html) {
|
|
|
223
222
|
return html;
|
|
224
223
|
}
|
|
225
224
|
class TdMarkdownComponent {
|
|
226
|
-
constructor(_renderer, _elementRef, _domSanitizer) {
|
|
225
|
+
constructor(_renderer, _elementRef, _domSanitizer, _ngZone) {
|
|
227
226
|
this._renderer = _renderer;
|
|
228
227
|
this._elementRef = _elementRef;
|
|
229
228
|
this._domSanitizer = _domSanitizer;
|
|
229
|
+
this._ngZone = _ngZone;
|
|
230
230
|
this._simpleLineBreaks = false;
|
|
231
231
|
this._viewInit = false;
|
|
232
232
|
/**
|
|
@@ -276,12 +276,6 @@ class TdMarkdownComponent {
|
|
|
276
276
|
set anchor(anchor) {
|
|
277
277
|
this._anchor = anchor;
|
|
278
278
|
}
|
|
279
|
-
clickListener(event) {
|
|
280
|
-
const element = event.srcElement;
|
|
281
|
-
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
282
|
-
this.handleAnchorClicks(event);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
279
|
ngOnChanges(changes) {
|
|
286
280
|
// only anchor changed
|
|
287
281
|
if (changes.anchor && !changes.content && !changes.simpleLineBreaks && !changes.hostedUrl) {
|
|
@@ -296,6 +290,21 @@ class TdMarkdownComponent {
|
|
|
296
290
|
this._loadContent(this._elementRef.nativeElement.textContent);
|
|
297
291
|
}
|
|
298
292
|
this._viewInit = true;
|
|
293
|
+
// Caretaker note: the `scrollToAnchor` calls `element.scrollIntoView`, a native synchronous DOM
|
|
294
|
+
// API and it doesn't require Angular running `ApplicationRef.tick()` each time the markdown component is clicked.
|
|
295
|
+
// Host listener (added through `@HostListener`) cause Angular to add an event listener within the Angular zone.
|
|
296
|
+
// It also calls `markViewDirty()` before calling the actual listener (the decorated class method).
|
|
297
|
+
this._ngZone.runOutsideAngular(() => {
|
|
298
|
+
this._anchorListener = this._renderer.listen(this._elementRef.nativeElement, 'click', (event) => {
|
|
299
|
+
const element = event.srcElement;
|
|
300
|
+
if (element.matches('a[href]') && isAnchorLink(element)) {
|
|
301
|
+
this.handleAnchorClicks(event);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
ngOnDestroy() {
|
|
307
|
+
this._anchorListener?.();
|
|
299
308
|
}
|
|
300
309
|
refresh() {
|
|
301
310
|
if (this._content) {
|
|
@@ -319,7 +328,7 @@ class TdMarkdownComponent {
|
|
|
319
328
|
setTimeout(() => scrollToAnchor(this._elementRef.nativeElement, this._anchor, true), 250);
|
|
320
329
|
this.contentReady.emit();
|
|
321
330
|
}
|
|
322
|
-
|
|
331
|
+
handleAnchorClicks(event) {
|
|
323
332
|
event.preventDefault();
|
|
324
333
|
const url = new URL(event.target.href);
|
|
325
334
|
const hash = decodeURI(url.hash);
|
|
@@ -362,10 +371,8 @@ class TdMarkdownComponent {
|
|
|
362
371
|
return converter.makeHtml(markdownToParse);
|
|
363
372
|
}
|
|
364
373
|
}
|
|
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) {
|
|
374
|
+
/** @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)); };
|
|
375
|
+
/** @nocollapse */ /** @nocollapse */ TdMarkdownComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: TdMarkdownComponent, selectors: [["td-markdown"]], hostVars: 2, hostBindings: function TdMarkdownComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
369
376
|
i0.ɵɵclassMap(ctx.class);
|
|
370
377
|
} }, 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
378
|
i0.ɵɵprojectionDef();
|
|
@@ -374,7 +381,7 @@ class TdMarkdownComponent {
|
|
|
374
381
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownComponent, [{
|
|
375
382
|
type: Component,
|
|
376
383
|
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: [{
|
|
384
|
+
}], function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.NgZone }]; }, { class: [{
|
|
378
385
|
type: HostBinding,
|
|
379
386
|
args: ['class']
|
|
380
387
|
}], content: [{
|
|
@@ -391,9 +398,6 @@ class TdMarkdownComponent {
|
|
|
391
398
|
args: ['anchor']
|
|
392
399
|
}], contentReady: [{
|
|
393
400
|
type: Output
|
|
394
|
-
}], clickListener: [{
|
|
395
|
-
type: HostListener,
|
|
396
|
-
args: ['click', ['$event']]
|
|
397
401
|
}] }); })();
|
|
398
402
|
|
|
399
403
|
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\nimport * as showdown from '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
|