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
JavaScript
(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(/\>/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 });
})));