UNPKG

@yuiblog/markdown

Version:

Markdown renderer for YuiBlog.

174 lines (150 loc) 6.73 kB
'use strict'; 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;