From 2aec6deee87d5e3e8f4d10ccf6c3483e7b088a50 Mon Sep 17 00:00:00 2001 From: Bretton <36870434+BrettM86@users.noreply.github.com> Date: Wed, 15 Jul 2026 23:45:58 -0700 Subject: [PATCH] fix(post): stop rendering nested anchors inside post title links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Titles are rendered as inline markdown inside the permalink anchor, so autolinked text like 'Space.com' produced an inside an — invalid HTML that browsers split, sending the first words of the title to an external site. Add a noLinks mode to Markdown that renders links as plain text and use it for titles. Co-Authored-By: Claude Fable 5 --- src/lib/app/markdown/Markdown.svelte | 19 ++++++++++++++++++- .../markdown/renderers/MdPassthrough.svelte | 9 +++++++++ src/lib/feature/post/PostMeta.svelte | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/lib/app/markdown/renderers/MdPassthrough.svelte diff --git a/src/lib/app/markdown/Markdown.svelte b/src/lib/app/markdown/Markdown.svelte index bed7f106..bd0044f1 100644 --- a/src/lib/app/markdown/Markdown.svelte +++ b/src/lib/app/markdown/Markdown.svelte @@ -13,6 +13,7 @@ import MdList from './renderers/MdList.svelte' import MdListItem from './renderers/MdListItem.svelte' import MdParagraph from './renderers/MdParagraph.svelte' + import MdPassthrough from './renderers/MdPassthrough.svelte' import MdQuote from './renderers/MdQuote.svelte' import MdSpoiler from './renderers/MdSpoiler.svelte' import MdSubscript from './renderers/MdSubscript.svelte' @@ -115,6 +116,13 @@ codespan: MdCodespan, } + // For text rendered inside an existing (e.g. post titles): links become + // plain text, since nested anchors are invalid HTML and split in browsers. + export const linklessInlineRenderers = { + ...inlineRenderers, + link: MdPassthrough, + } + export type Renderer = keyof typeof renderers @@ -127,6 +135,7 @@ interface Props { source?: string inline?: boolean + noLinks?: boolean noStyle?: boolean style?: string class?: ClassValue @@ -136,6 +145,7 @@ let { source = '', inline = false, + noLinks = false, noStyle = false, style = '', class: clazz = '', @@ -159,5 +169,12 @@ class={[!noStyle && 'break-words space-y-4 leading-normal', clazz]} {style} > - + diff --git a/src/lib/app/markdown/renderers/MdPassthrough.svelte b/src/lib/app/markdown/renderers/MdPassthrough.svelte new file mode 100644 index 00000000..a2c0d1c3 --- /dev/null +++ b/src/lib/app/markdown/renderers/MdPassthrough.svelte @@ -0,0 +1,9 @@ + + +{@render children?.()} diff --git a/src/lib/feature/post/PostMeta.svelte b/src/lib/feature/post/PostMeta.svelte index 21f1c4f0..391c938d 100644 --- a/src/lib/feature/post/PostMeta.svelte +++ b/src/lib/feature/post/PostMeta.svelte @@ -312,6 +312,7 @@ > -- 2.51.2