From c4f73445641dbcb2580e8c9bcecd30a329ca3ef2 Mon Sep 17 00:00:00 2001 From: cmp Date: Tue, 29 Aug 2023 22:39:39 -0500 Subject: [PATCH] Ensure markdown links have the noopener and nofollow rel tags as well. (#2100) --- src/shared/markdown.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/shared/markdown.ts b/src/shared/markdown.ts index 97568b51..65ff3404 100644 --- a/src/shared/markdown.ts +++ b/src/shared/markdown.ts @@ -15,7 +15,7 @@ import markdown_it_sub from "markdown-it-sub"; import markdown_it_sup from "markdown-it-sup"; import Renderer from "markdown-it/lib/renderer"; import Token from "markdown-it/lib/token"; -import { instanceLinkRegex } from "./config"; +import { instanceLinkRegex, relTags } from "./config"; export let Tribute: any; @@ -185,7 +185,7 @@ export function setupMarkdown() { // defs: emojiDefs, // }) .disable("image"); - const defaultRenderer = md.renderer.rules.image; + const defaultImageRenderer = md.renderer.rules.image; md.renderer.rules.image = function ( tokens: Token[], idx: number, @@ -205,7 +205,7 @@ export function setupMarkdown() { const isLocalEmoji = customEmoji !== undefined; if (!isLocalEmoji) { const imgElement = - defaultRenderer?.(tokens, idx, options, env, self) ?? ""; + defaultImageRenderer?.(tokens, idx, options, env, self) ?? ""; if (imgElement) { return `'; }; + const defaultLinkRenderer = + md.renderer.rules.link_open || + function (tokens, idx, options, _env, self) { + return self.renderToken(tokens, idx, options); + }; + md.renderer.rules.link_open = function ( + tokens: Token[], + idx: number, + options: MarkdownIt.Options, + env: any, + self: Renderer, + ) { + tokens[idx].attrPush(["rel", relTags]); + return defaultLinkRenderer(tokens, idx, options, env, self); + }; } export function setupEmojiDataModel(custom_emoji_views: CustomEmojiView[]) {