ngx-markdown
Version:
Angular library that uses marked to parse markdown to html combined with Prism.js for synthax highlights
187 lines (186 loc) • 15.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { isPlatformBrowser } from '@angular/common';
import { HttpClient } from '@angular/common/http';
import { Inject, Injectable, Optional, PLATFORM_ID, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { parse, Renderer } from 'marked';
import { map } from 'rxjs/operators';
import { MarkedOptions } from './marked-options';
/** @type {?} */
export var errorSrcWithoutHttpClient = '[ngx-markdown] When using the [src] attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information';
var MarkdownService = /** @class */ (function () {
function MarkdownService(platform, http, domSanitizer, options) {
this.platform = platform;
this.http = http;
this.domSanitizer = domSanitizer;
this.options = options;
if (!this.renderer) {
this.renderer = new Renderer();
}
}
Object.defineProperty(MarkdownService.prototype, "renderer", {
get: /**
* @return {?}
*/
function () { return this.options.renderer; },
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.options.renderer = value;
},
enumerable: true,
configurable: true
});
/**
* @param {?} markdown
* @param {?=} decodeHtml
* @param {?=} markedOptions
* @return {?}
*/
MarkdownService.prototype.compile = /**
* @param {?} markdown
* @param {?=} decodeHtml
* @param {?=} markedOptions
* @return {?}
*/
function (markdown, decodeHtml, markedOptions) {
if (decodeHtml === void 0) { decodeHtml = false; }
if (markedOptions === void 0) { markedOptions = this.options; }
/** @type {?} */
var precompiled = this.precompile(markdown);
/** @type {?} */
var compiled = parse(decodeHtml ? this.decodeHtml(precompiled) : precompiled, markedOptions);
return markedOptions.sanitize && !markedOptions.sanitizer
? this.domSanitizer.sanitize(SecurityContext.HTML, compiled)
: compiled;
};
/**
* @param {?} src
* @return {?}
*/
MarkdownService.prototype.getSource = /**
* @param {?} src
* @return {?}
*/
function (src) {
var _this = this;
if (!this.http) {
throw new Error(errorSrcWithoutHttpClient);
}
return this.http
.get(src, { responseType: 'text' })
.pipe(map(function (markdown) { return _this.handleExtension(src, markdown); }));
};
/**
* @return {?}
*/
MarkdownService.prototype.highlight = /**
* @return {?}
*/
function () {
if (isPlatformBrowser(this.platform) && typeof Prism !== 'undefined') {
Prism.highlightAll(false);
}
};
/**
* @param {?} html
* @return {?}
*/
MarkdownService.prototype.decodeHtml = /**
* @param {?} html
* @return {?}
*/
function (html) {
if (isPlatformBrowser(this.platform)) {
/** @type {?} */
var textarea = document.createElement('textarea');
textarea.innerHTML = html;
return textarea.value;
}
return html;
};
/**
* @param {?} src
* @param {?} markdown
* @return {?}
*/
MarkdownService.prototype.handleExtension = /**
* @param {?} src
* @param {?} markdown
* @return {?}
*/
function (src, markdown) {
/** @type {?} */
var extension = src
? src.split('.').splice(-1).join()
: null;
return extension !== 'md'
? '```' + extension + '\n' + markdown + '\n```'
: markdown;
};
/**
* @param {?} markdown
* @return {?}
*/
MarkdownService.prototype.precompile = /**
* @param {?} markdown
* @return {?}
*/
function (markdown) {
if (!markdown) {
return '';
}
/** @type {?} */
var indentStart;
return markdown
.split('\n')
.map(function (line) {
/** @type {?} */
var lineIdentStart = indentStart;
// find position of 1st non-whitespace character
// to determine the current line indentation start
if (line.length > 0) {
lineIdentStart = isNaN(lineIdentStart)
? line.search(/\S|$/)
: Math.min(line.search(/\S|$/), lineIdentStart);
}
// keep 1st non-whitespace line indentation
// as base reference for other lines
if (isNaN(indentStart)) {
indentStart = lineIdentStart;
}
// remove whitespaces before current line indentation
return !!lineIdentStart
? line.substring(lineIdentStart)
: line;
}).join('\n');
};
MarkdownService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
MarkdownService.ctorParameters = function () { return [
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: HttpClient, decorators: [{ type: Optional }] },
{ type: DomSanitizer },
{ type: MarkedOptions }
]; };
return MarkdownService;
}());
export { MarkdownService };
if (false) {
/** @type {?} */
MarkdownService.prototype.platform;
/** @type {?} */
MarkdownService.prototype.http;
/** @type {?} */
MarkdownService.prototype.domSanitizer;
/** @type {?} */
MarkdownService.prototype.options;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXJrZG93bi8iLCJzb3VyY2VzIjpbInNyYy9tYXJrZG93bi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBT2pELFdBQWEseUJBQXlCLEdBQUcsMkpBQTJKLENBQUM7O0lBU25NLHlCQUMrQixRQUFnQixFQUN6QixJQUFnQixFQUM1QixjQUNEO1FBSHNCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUM1QixpQkFBWSxHQUFaLFlBQVk7UUFDYixZQUFPLEdBQVAsT0FBTztRQUVkLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztTQUNoQztLQUNGO0lBZEQsc0JBQUkscUNBQVE7Ozs7UUFBWixjQUEyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Ozs7O1FBQzFELFVBQWEsS0FBc0I7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQy9COzs7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QUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDbkQ7OztZQUdELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0QixXQUFXLEdBQUcsY0FBYyxDQUFDO2FBQzlCOztZQUVELE9BQU8sQ0FBQyxDQUFDLGNBQWM7Z0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7OztnQkF2Rm5CLFVBQVU7Ozs7Z0JBUWdDLE1BQU0sdUJBQTVDLE1BQU0sU0FBQyxXQUFXO2dCQXhCZCxVQUFVLHVCQXlCZCxRQUFRO2dCQXZCSixZQUFZO2dCQUtaLGFBQWE7OzBCQVJ0Qjs7U0FrQmEsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgUExBVEZPUk1fSUQsIFNlY3VyaXR5Q29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgcGFyc2UsIFJlbmRlcmVyIH0gZnJvbSAnbWFya2VkJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBNYXJrZWRPcHRpb25zIH0gZnJvbSAnLi9tYXJrZWQtb3B0aW9ucyc7XHJcblxyXG5kZWNsYXJlIHZhciBQcmlzbToge1xyXG4gIGhpZ2hsaWdodEFsbDogKGFzeW5jOiBib29sZWFuKSA9PiB2b2lkO1xyXG59O1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG5leHBvcnQgY29uc3QgZXJyb3JTcmNXaXRob3V0SHR0cENsaWVudCA9ICdbbmd4LW1hcmtkb3duXSBXaGVuIHVzaW5nIHRoZSBbc3JjXSBhdHRyaWJ1dGUgeW91ICpoYXZlIHRvKiBwYXNzIHRoZSBgSHR0cENsaWVudGAgYXMgYSBwYXJhbWV0ZXIgb2YgdGhlIGBmb3JSb290YCBtZXRob2QuIFNlZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTWFya2Rvd25TZXJ2aWNlIHtcclxuICBnZXQgcmVuZGVyZXIoKTogUmVuZGVyZXIgeyByZXR1cm4gdGhpcy5vcHRpb25zLnJlbmRlcmVyOyB9XHJcbiAgc2V0IHJlbmRlcmVyKHZhbHVlOiBtYXJrZWQuUmVuZGVyZXIpIHtcclxuICAgIHRoaXMub3B0aW9ucy5yZW5kZXJlciA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtOiBPYmplY3QsXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgcHVibGljIG9wdGlvbnM6IE1hcmtlZE9wdGlvbnMsXHJcbiAgKSB7XHJcbiAgICBpZiAoIXRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tcGlsZShtYXJrZG93bjogc3RyaW5nLCBkZWNvZGVIdG1sID0gZmFsc2UsIG1hcmtlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcHJlY29tcGlsZWQgPSB0aGlzLnByZWNvbXBpbGUobWFya2Rvd24pO1xyXG4gICAgY29uc3QgY29tcGlsZWQgPSBwYXJzZShcclxuICAgICAgZGVjb2RlSHRtbCA/IHRoaXMuZGVjb2RlSHRtbChwcmVjb21waWxlZCkgOiBwcmVjb21waWxlZCxcclxuICAgICAgbWFya2VkT3B0aW9ucyk7XHJcbiAgICByZXR1cm4gbWFya2VkT3B0aW9ucy5zYW5pdGl6ZSAmJiAhbWFya2VkT3B0aW9ucy5zYW5pdGl6ZXJcclxuICAgICAgPyB0aGlzLmRvbVNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgY29tcGlsZWQpXHJcbiAgICAgIDogY29tcGlsZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRTb3VyY2Uoc3JjOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgaWYgKCF0aGlzLmh0dHApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yU3JjV2l0aG91dEh0dHBDbGllbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KHNyYywgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KVxyXG4gICAgICAucGlwZShtYXAobWFya2Rvd24gPT4gdGhpcy5oYW5kbGVFeHRlbnNpb24oc3JjLCBtYXJrZG93bikpKTtcclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodCgpIHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtKSAmJiB0eXBlb2YgUHJpc20gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIFByaXNtLmhpZ2hsaWdodEFsbChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlY29kZUh0bWwoaHRtbDogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybSkpIHtcclxuICAgICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xyXG4gICAgICB0ZXh0YXJlYS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICByZXR1cm4gdGV4dGFyZWEudmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaHRtbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRXh0ZW5zaW9uKHNyYzogc3RyaW5nLCBtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHNyY1xyXG4gICAgICA/IHNyYy5zcGxpdCgnLicpLnNwbGljZSgtMSkuam9pbigpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIHJldHVybiBleHRlbnNpb24gIT09ICdtZCdcclxuICAgICAgPyAnYGBgJyArIGV4dGVuc2lvbiArICdcXG4nICsgbWFya2Rvd24gKyAnXFxuYGBgJ1xyXG4gICAgICA6IG1hcmtkb3duO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVjb21waWxlKG1hcmtkb3duOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFtYXJrZG93bikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgaW5kZW50U3RhcnQ6IG51bWJlcjtcclxuICAgIHJldHVybiBtYXJrZG93blxyXG4gICAgICAuc3BsaXQoJ1xcbicpXHJcbiAgICAgIC5tYXAobGluZSA9PiB7XHJcbiAgICAgICAgLy8gc2V0IGN1cnJlbnQgbGluZSBpZGVudCBzdGFydCB0byBiYXNlIHJlZmVyZW5jZSBpbmRlbnRhdGlvblxyXG4gICAgICAgIGxldCBsaW5lSWRlbnRTdGFydCA9IGluZGVudFN0YXJ0O1xyXG4gICAgICAgIC8vIGZpbmQgcG9zaXRpb24gb2YgMXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlclxyXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBsaW5lIGluZGVudGF0aW9uIHN0YXJ0XHJcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGluZUlkZW50U3RhcnQgPSBpc05hTihsaW5lSWRlbnRTdGFydClcclxuICAgICAgICAgICAgPyBsaW5lLnNlYXJjaCgvXFxTfCQvKVxyXG4gICAgICAgICAgICA6IE1hdGgubWluKGxpbmUuc2VhcmNoKC9cXFN8JC8pLCBsaW5lSWRlbnRTdGFydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGtlZXAgMXN0IG5vbi13aGl0ZXNwYWNlIGxpbmUgaW5kZW50YXRpb25cclxuICAgICAgICAvLyBhcyBiYXNlIHJlZmVyZW5jZSBmb3Igb3RoZXIgbGluZXNcclxuICAgICAgICBpZiAoaXNOYU4oaW5kZW50U3RhcnQpKSB7XHJcbiAgICAgICAgICBpbmRlbnRTdGFydCA9IGxpbmVJZGVudFN0YXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgd2hpdGVzcGFjZXMgYmVmb3JlIGN1cnJlbnQgbGluZSBpbmRlbnRhdGlvblxyXG4gICAgICAgIHJldHVybiAhIWxpbmVJZGVudFN0YXJ0XHJcbiAgICAgICAgICA/IGxpbmUuc3Vic3RyaW5nKGxpbmVJZGVudFN0YXJ0KVxyXG4gICAgICAgICAgOiBsaW5lO1xyXG4gICAgICB9KS5qb2luKCdcXG4nKTtcclxuICB9XHJcbn1cclxuIl19