diff --git a/package.json b/package.json index fddf38f106..b8db8cfd4c 100644 --- a/package.json +++ b/package.json @@ -126,6 +126,7 @@ "lodash": "^4.17.15", "loglevel": "^1.6.3", "loglevel-message-prefix": "^3.0.0", + "markdown-it": "^9.0.0", "moment": "^2.24.0", "moment-timezone": "^0.5.25", "ngeohash": "^0.6.3", diff --git a/src/core/operations/RenderMarkdown.mjs b/src/core/operations/RenderMarkdown.mjs new file mode 100644 index 0000000000..60afa0fb94 --- /dev/null +++ b/src/core/operations/RenderMarkdown.mjs @@ -0,0 +1,69 @@ +/** + * @author j433866 [j433866@gmail.com] + * @copyright Crown Copyright 2019 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import MarkdownIt from "markdown-it"; +import hljs from "highlight.js"; + +/** + * Render Markdown operation + */ +class RenderMarkdown extends Operation { + + /** + * RenderMarkdown constructor + */ + constructor() { + super(); + + this.name = "Render Markdown"; + this.module = "Default"; + this.description = "Renders input Markdown as HTML."; + this.infoURL = "https://wikipedia.org/wiki/Markdown"; + this.inputType = "string"; + this.outputType = "html"; + this.args = [ + { + name: "Autoconvert URLs to links", + type: "boolean", + value: false + }, + { + name: "Enable syntax highlighting", + type: "boolean", + value: true + } + ]; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {html} + */ + run(input, args) { + const [convertLinks, enableHighlighting] = args, + md = new MarkdownIt({ + linkify: convertLinks, + html: false, // Explicitly disable HTML rendering + highlight: function(str, lang) { + if (lang && hljs.getLanguage(lang) && enableHighlighting) { + try { + return hljs.highlight(lang, str).value; + } catch (__) {} + } + + return ""; + } + }), + rendered = md.render(input); + + return `
${rendered}
`; + } + +} + +export default RenderMarkdown;