UNPKG

ng2-markdown-to-html

Version:

Angular 2+ library that uses marked to parse markdown to html combined with Prism.js for synthax highlights

190 lines (182 loc) 8.32 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/http'), require('rxjs/Observable'), require('rxjs/add/operator/catch'), require('rxjs/add/operator/map'), require('marked'), require('prismjs'), require('prismjs/prism'), require('prismjs/components/prism-c'), require('prismjs/components/prism-cpp'), require('prismjs/components/prism-csharp'), require('prismjs/components/prism-css'), require('prismjs/components/prism-diff'), require('prismjs/components/prism-java'), require('prismjs/components/prism-javascript'), require('prismjs/components/prism-perl'), require('prismjs/components/prism-php'), require('prismjs/components/prism-python'), require('prismjs/components/prism-sass'), require('prismjs/components/prism-scss'), require('prismjs/components/prism-typescript')) : typeof define === 'function' && define.amd ? define(['exports', '@angular/core', '@angular/http', 'rxjs/Observable', 'rxjs/add/operator/catch', 'rxjs/add/operator/map', 'marked', 'prismjs', 'prismjs/prism', 'prismjs/components/prism-c', 'prismjs/components/prism-cpp', 'prismjs/components/prism-csharp', 'prismjs/components/prism-css', 'prismjs/components/prism-diff', 'prismjs/components/prism-java', 'prismjs/components/prism-javascript', 'prismjs/components/prism-perl', 'prismjs/components/prism-php', 'prismjs/components/prism-python', 'prismjs/components/prism-sass', 'prismjs/components/prism-scss', 'prismjs/components/prism-typescript'], factory) : (factory((global.ng = global.ng || {}, global.ng.markdowntohtml = {}),global.ng.core,global.ng.http,global.Rx,null,null,global.marked,global.prismjs)); }(this, (function (exports,core,http,Observable,_catch,map,_marked,Prism) { 'use strict'; var LanguagePipe = (function () { function LanguagePipe() { } LanguagePipe.prototype.transform = function (value, language) { if (typeof language !== 'string') { console.error("LanguagePipe has been invoked with an invalid parameter [" + language + "]"); return value; } return '```' + language + '\n' + value + '\n```'; }; LanguagePipe.decorators = [ { type: core.Pipe, args: [{ name: 'language', },] }, ]; /** @nocollapse */ LanguagePipe.ctorParameters = function () { return []; }; return LanguagePipe; }()); var MarkdownToHtmlService = (function () { function MarkdownToHtmlService(http$$1) { this.http = http$$1; } MarkdownToHtmlService.prototype.getSource = function (src) { return this.http.get(src) .map(this.extractData) .catch(this.handleError); }; MarkdownToHtmlService.prototype.extractData = function (response) { return response.text() || ''; }; MarkdownToHtmlService.prototype.handleError = function (error) { var errMsg; if (error instanceof http.Response) { var body = error.json() || ''; var err = body.error || JSON.stringify(body); errMsg = error.status + " - " + (error.statusText || '') + " " + err; } else { errMsg = error.message ? error.message : error.toString(); } console.error(errMsg); return Observable.Observable.throw(errMsg); }; MarkdownToHtmlService.decorators = [ { type: core.Injectable }, ]; /** @nocollapse */ MarkdownToHtmlService.ctorParameters = function () { return [ { type: http.Http, }, ]; }; return MarkdownToHtmlService; }()); var marked = _marked; var MarkdownToHtmlComponent = (function () { function MarkdownToHtmlComponent(element, mthService) { this.element = element; this.mthService = mthService; } MarkdownToHtmlComponent.prototype.ngAfterViewInit = function () { if (this.data) { this.handleData(); return; } if (this.src) { this.handleSrc(); return; } this.handleRaw(this.element.nativeElement.innerHTML); }; // SimpleChanges parameter is required for AoT compilation (do not remove) MarkdownToHtmlComponent.prototype.ngOnChanges = function (changes) { if ('data' in changes) { this.handleData(); return; } if ('src' in changes) { this.handleSrc(); return; } }; MarkdownToHtmlComponent.prototype.handleData = function () { this.handleRaw(this.data); }; MarkdownToHtmlComponent.prototype.handleSrc = function () { var _this = this; var extension = this.src ? this.src.split('.').splice(-1).join() : null; this.mthService.getSource(this.src) .subscribe(function (data) { var raw = extension !== 'md' ? '```' + extension + '\n' + data + '\n```' : data; _this.handleRaw(raw); }); }; MarkdownToHtmlComponent.prototype.handleRaw = function (raw) { var markdown = this.prepare(raw); this.element.nativeElement.innerHTML = marked(markdown); Prism.highlightAll(false); }; MarkdownToHtmlComponent.prototype.prepare = function (raw) { if (!raw) { return ''; } var indentStart; return raw .replace(/\&gt;/g, '>') .split('\n') .map(function (line) { // find position of 1st non-whitespace character // to determine the markdown indentation start if (line.length > 0 && isNaN(indentStart)) { indentStart = line.search(/\S|$/); } // remove whitespaces before indentation start return indentStart ? line.substring(indentStart) : line; }).join('\n'); }; MarkdownToHtmlComponent.decorators = [ { type: core.Component, args: [{ selector: 'markdown-to-html, [markdown-to-html]', template: '<ng-content></ng-content>', styles: [":host /deep/ table{border-spacing:0;border-collapse:collapse;margin-bottom:16px}:host /deep/ table td,:host /deep/ table th{padding:6px 13px;border:1px solid #ddd}:host /deep/ table tr:nth-child(2n){background-color:rgba(0,0,0,.03)}:host /deep/ blockquote{padding:0 1em;color:rgba(0,0,0,.535);border-left:.25em solid rgba(0,0,0,.11)}"], },] }, ]; /** @nocollapse */ MarkdownToHtmlComponent.ctorParameters = function () { return [ { type: core.ElementRef, }, { type: MarkdownToHtmlService, }, ]; }; MarkdownToHtmlComponent.propDecorators = { 'data': [{ type: core.Input },], 'src': [{ type: core.Input },], }; return MarkdownToHtmlComponent; }()); var MarkdownToHtmlModule = (function () { function MarkdownToHtmlModule() { } MarkdownToHtmlModule.forRoot = function () { return { ngModule: MarkdownToHtmlModule, providers: [MarkdownToHtmlService], }; }; MarkdownToHtmlModule.forChild = function () { return { ngModule: MarkdownToHtmlModule, }; }; MarkdownToHtmlModule.decorators = [ { type: core.NgModule, args: [{ exports: [ MarkdownToHtmlComponent, LanguagePipe, ], imports: [http.HttpModule], declarations: [ MarkdownToHtmlComponent, LanguagePipe, ], },] }, ]; /** @nocollapse */ MarkdownToHtmlModule.ctorParameters = function () { return []; }; return MarkdownToHtmlModule; }()); exports.LanguagePipe = LanguagePipe; exports.MarkdownToHtmlComponent = MarkdownToHtmlComponent; exports.MarkdownToHtmlModule = MarkdownToHtmlModule; exports.MarkdownToHtmlService = MarkdownToHtmlService; Object.defineProperty(exports, '__esModule', { value: true }); })));