ngx-markdown-it
Version:
An Angular library that renders markdown using [markdown-it](https://github.com/markdown-it/markdown-it).
81 lines • 8.57 kB
JavaScript
/*
* @file ngx-markdown-it.component.ts
*
* @brief Component to render markdown to html
* @author David Suárez
* @date Mon, 21 Jun 20 19:45:15 +0200
*
* @license
*
* ngx-markdown-it: angular markdown-it module
*
* Copyright (c) 2021 David Suárez
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
*/
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./ngx-markdown-it.service";
export class NgxMarkdownItComponent {
element;
markdownService;
_markdown;
ready = new EventEmitter();
set markdown(val) {
this._markdown = val;
this.render(this._markdown);
}
constructor(element, markdownService) {
this.element = element;
this.markdownService = markdownService;
}
ngAfterViewInit() {
if (this._markdown == null) {
this.render(this.element.nativeElement.innerHTML.trim());
return;
}
else {
/*
* This is probably done in markdown() setter, but because before the view is init, our component or parents ones
* are not in a safe state, we should signal again.
*/
this.ready.emit();
return;
}
}
render(markdown) {
this.element.nativeElement.innerHTML = this.markdownService.render(markdown);
this.ready.emit();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: NgxMarkdownItComponent, deps: [{ token: i0.ElementRef }, { token: i1.NgxMarkdownItService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: NgxMarkdownItComponent, selector: "markdown-it", inputs: { markdown: "markdown" }, outputs: { ready: "ready" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: NgxMarkdownItComponent, decorators: [{
type: Component,
args: [{ selector: 'markdown-it', template: `<ng-content></ng-content>` }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.NgxMarkdownItService }]; }, propDecorators: { ready: [{
type: Output
}], markdown: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hcmtkb3duLWl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9uZ3gtbWFya2Rvd24taXQvc3JjL2xpYi9uZ3gtbWFya2Rvd24taXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBaUIsWUFBWSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVNsRyxNQUFNLE9BQU8sc0JBQXNCO0lBYXhCO0lBQ0M7SUFaVixTQUFTLENBQXFCO0lBRXBCLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRTNDLElBQ0ksUUFBUSxDQUFDLEdBQVc7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQ1MsT0FBZ0MsRUFDL0IsZUFBcUM7UUFEdEMsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDL0Isb0JBQWUsR0FBZixlQUFlLENBQXNCO0lBQzNDLENBQUM7SUFFTCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE9BQU87U0FFUjthQUFNO1lBQ0w7OztlQUdHO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixPQUFPO1NBQ1I7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQWdCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BCLENBQUM7dUdBbkNVLHNCQUFzQjsyRkFBdEIsc0JBQXNCLGtIQUh2QiwyQkFBMkI7OzJGQUcxQixzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsYUFBYSxZQUNiLDJCQUEyQjtvSUFPM0IsS0FBSztzQkFBZCxNQUFNO2dCQUdILFFBQVE7c0JBRFgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAZmlsZSBuZ3gtbWFya2Rvd24taXQuY29tcG9uZW50LnRzXG4gKlxuICogQGJyaWVmIENvbXBvbmVudCB0byByZW5kZXIgbWFya2Rvd24gdG8gaHRtbFxuICogQGF1dGhvciBEYXZpZCBTdcOhcmV6XG4gKiBAZGF0ZSBNb24sIDIxIEp1biAyMCAxOTo0NToxNSArMDIwMFxuICpcbiAqIEBsaWNlbnNlXG4gKlxuICogbmd4LW1hcmtkb3duLWl0OiBhbmd1bGFyIG1hcmtkb3duLWl0IG1vZHVsZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMSBEYXZpZCBTdcOhcmV6XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb25cbiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uXG4gKiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXRcbiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLFxuICogY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZVxuICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmdcbiAqIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVNcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG4gKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksXG4gKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1JcbiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmd4TWFya2Rvd25JdFNlcnZpY2UgfSBmcm9tIFwiLi9uZ3gtbWFya2Rvd24taXQuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXJrZG93bi1pdCcsXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmAsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWFya2Rvd25JdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQgIHtcblxuICBfbWFya2Rvd246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IG1hcmtkb3duKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFya2Rvd24gPSB2YWw7XG4gICAgdGhpcy5yZW5kZXIodGhpcy5fbWFya2Rvd24pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgbWFya2Rvd25TZXJ2aWNlOiBOZ3hNYXJrZG93bkl0U2VydmljZSxcbiAgKSB7IH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21hcmtkb3duID09IG51bGwpIHtcbiAgICAgIHRoaXMucmVuZGVyKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTC50cmltKCkpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGlzIGlzIHByb2JhYmx5IGRvbmUgaW4gbWFya2Rvd24oKSBzZXR0ZXIsIGJ1dCBiZWNhdXNlIGJlZm9yZSB0aGUgdmlldyBpcyBpbml0LCBvdXIgY29tcG9uZW50IG9yIHBhcmVudHMgb25lc1xuICAgICAgICogIGFyZSBub3QgaW4gYSBzYWZlIHN0YXRlLCB3ZSBzaG91bGQgc2lnbmFsIGFnYWluLlxuICAgICAgICovXG4gICAgICB0aGlzLnJlYWR5LmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIobWFya2Rvd246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMubWFya2Rvd25TZXJ2aWNlLnJlbmRlcihtYXJrZG93bik7XG4gICAgdGhpcy5yZWFkeS5lbWl0KCk7XG4gIH1cbn1cbiJdfQ==