@yuiblog/markdown
Version:
Markdown renderer for YuiBlog.
174 lines (150 loc) • 6.73 kB
JavaScript
;
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var Marked = _interopDefault(require('marked'));
var vuePropertyDecorator = require('vue-property-decorator');
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function parseOptions(options) {
try {
return Function("return " + options)();
}
catch (e) {
return { name: options };
}
}
function toAttributes(options) {
var attrs = [];
if (options.name) {
attrs.push("data-name=\"" + options.name + "\"");
}
return attrs.join(" ");
}
function toClasses(options) {
var classes = [];
return classes.join(" ");
}
function highlight(code, lang) {
var language = lang ? lang : "plain";
var options = {};
if (lang.indexOf(":") > 0 && lang.split(":")[1] !== "") {
language = lang.substr(0, lang.indexOf(":"));
options = parseOptions(lang.substr(lang.indexOf(":") + 1));
}
return "<pre class=\"language-" + language + " " + toClasses(options) + "\" " + toAttributes(options) + ">" +
("<code class=\"language-" + language + "\">") +
(Prism.languages[language] ? Prism.highlight(code, Prism.languages[language]) : code) +
"</code></pre>";
}
function parse(markdown) {
var renderer = new Marked.Renderer();
renderer.blockquote = function (quote) { return "<blockquote class=\"border-l-4 pl-4 py-1 bg-grey-lightest\">" + quote + "</blockquote>"; };
renderer.code = function (code, lang) { return highlight(code, lang); };
renderer.heading = function (text, level, _raw, slugger) {
var classes = ["mt-6", "mb-3"];
if (level == 1 || level == 2) {
classes.push("border-b pb-1");
}
return "<h" + level + " id=\"" + slugger.slug(text) + "\" class=\"" + classes.join(" ") + "\">" + text + "</h" + level + ">";
};
renderer.hr = function () { return "<hr class=\"border-2\"/>"; };
renderer.listitem = function (text) { return "<li class=\"leading-normal\">" + text + "</li>\n"; };
renderer.paragraph = function (text) { return "<p class=\"my-4 leading-normal\">" + text + "</p>\n"; };
renderer.codespan = function (code) { return "<code class=\"font-mono rounded bg-black text-white p-1\">" + code + "</code>"; };
renderer.link = function (href, title, text) {
var external = /^https?:\/\//.test(href);
var attributes = external ? "target=\"_blank\" rel=\"noopener noreferrer\"" : "";
return "<a href=\"" + href + "\" " + attributes + " " + (title ? "title=\"" + title + "\"" : "") + ">" + text + "</a>";
};
Marked.setOptions({
gfm: true,
tables: true
});
return Marked.parse(markdown, { renderer: renderer });
}
var MarkdownRenderer = (function (_super) {
__extends(MarkdownRenderer, _super);
function MarkdownRenderer() {
return _super !== null && _super.apply(this, arguments) || this;
}
MarkdownRenderer.prototype.render = function (h) {
var html = parse(this.markdown);
return h("div", { domProps: { innerHTML: html } });
};
__decorate([
vuePropertyDecorator.Prop({ required: true, type: String })
], MarkdownRenderer.prototype, "markdown", void 0);
MarkdownRenderer = __decorate([
vuePropertyDecorator.Component({ name: "markdown-renderer" })
], MarkdownRenderer);
return MarkdownRenderer;
}(vuePropertyDecorator.Vue));
/* script */
const __vue_script__ = MarkdownRenderer;
/* template */
/* style */
const __vue_inject_styles__ = undefined;
/* scoped */
const __vue_scope_id__ = "data-v-550f458a";
/* module identifier */
const __vue_module_identifier__ = undefined;
/* functional template */
const __vue_is_functional_template__ = undefined;
/* component normalizer */
function __vue_normalize__(
template, style, script,
scope, functional, moduleIdentifier,
createInjector, createInjectorSSR
) {
const component = (typeof script === 'function' ? script.options : script) || {};
// For security concerns, we use only base name in production mode.
component.__file = "MarkdownRenderer.vue";
if (!component.render) {
component.render = template.render;
component.staticRenderFns = template.staticRenderFns;
component._compiled = true;
if (functional) component.functional = true;
}
component._scopeId = scope;
return component
}
/* style inject */
/* style inject SSR */
var MarkdownRenderer$1 = __vue_normalize__(
{},
__vue_inject_styles__,
__vue_script__,
__vue_scope_id__,
__vue_is_functional_template__,
__vue_module_identifier__,
undefined,
undefined
);
module.exports = MarkdownRenderer$1;