From e5a903807f7ec3082834e0ba428ee114e6980f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Heinrichs?= Date: Fri, 4 Oct 2019 14:58:54 +0200 Subject: [PATCH 1/2] Added support to open links in new Tab (Markdown) Rendered markdown will add target="_blank" if the given option is set. Fixes #636. --- src/core/operations/RenderMarkdown.mjs | 38 +++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/core/operations/RenderMarkdown.mjs b/src/core/operations/RenderMarkdown.mjs index c656bf5b..824643ed 100644 --- a/src/core/operations/RenderMarkdown.mjs +++ b/src/core/operations/RenderMarkdown.mjs @@ -35,6 +35,11 @@ class RenderMarkdown extends Operation { name: "Enable syntax highlighting", type: "boolean", value: true + }, + { + name: "Open links in new tab.", + type: "boolean", + value: false } ]; } @@ -45,7 +50,7 @@ class RenderMarkdown extends Operation { * @returns {html} */ run(input, args) { - const [convertLinks, enableHighlighting] = args, + const [convertLinks, enableHighlighting, openLinksBlank] = args, md = new MarkdownIt({ linkify: convertLinks, html: false, // Explicitly disable HTML rendering @@ -58,12 +63,37 @@ class RenderMarkdown extends Operation { return ""; } - }), - rendered = md.render(input); - + }); + if (openLinksBlank) { + this.makeLinksOpenInNewTab(md); + } + const rendered = md.render(input); return `
${rendered}
`; } + /** + * Adds target="_blank" to links. + * @param {MarkdownIt} md + */ + makeLinksOpenInNewTab(md) { + // Adapted from: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer + // Remember old renderer, if overridden, or proxy to default renderer + const defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) { + return self.renderToken(tokens, idx, options); + }; + + md.renderer.rules.link_open = function (tokens, idx, options, env, self) { + const token = tokens[idx]; + if (token.attrIndex('target') >= 0) { + // Target attribute already set, do not replace. + return; + } + token.attrPush(['target', '_blank']); // add new attribute + + // pass token to default renderer. + return defaultRender(tokens, idx, options, env, self); + }; + } } export default RenderMarkdown; From 6402bb6003ad368c436decbf5eb4a8b181ea5509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Heinrichs?= Date: Fri, 4 Oct 2019 15:16:08 +0200 Subject: [PATCH 2/2] Fix linting errors --- src/core/operations/RenderMarkdown.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/operations/RenderMarkdown.mjs b/src/core/operations/RenderMarkdown.mjs index 824643ed..20966cca 100644 --- a/src/core/operations/RenderMarkdown.mjs +++ b/src/core/operations/RenderMarkdown.mjs @@ -82,13 +82,14 @@ class RenderMarkdown extends Operation { return self.renderToken(tokens, idx, options); }; + // eslint-disable-next-line camelcase md.renderer.rules.link_open = function (tokens, idx, options, env, self) { const token = tokens[idx]; - if (token.attrIndex('target') >= 0) { + if (token.attrIndex("target") >= 0) { // Target attribute already set, do not replace. return; } - token.attrPush(['target', '_blank']); // add new attribute + token.attrPush(["target", "_blank"]); // add new attribute // pass token to default renderer. return defaultRender(tokens, idx, options, env, self);