From e5c8abab9e9e2c215972208f203ddbd53551a8cf Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 15 Jan 2026 00:27:27 +0000 Subject: [PATCH] fix: preserve markdown code fences --- src/markdown/ir.ts | 13 ++++++++++--- src/slack/format.ts | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/markdown/ir.ts b/src/markdown/ir.ts index 9dc3922b6..b9a537bbe 100644 --- a/src/markdown/ir.ts +++ b/src/markdown/ir.ts @@ -459,11 +459,18 @@ export function markdownToIR(markdown: string, options: MarkdownParseOptions = { const trimmedText = state.text.trimEnd(); const trimmedLength = trimmedText.length; + let codeBlockEnd = 0; + for (const span of state.styles) { + if (span.style !== "code_block") continue; + if (span.end > codeBlockEnd) codeBlockEnd = span.end; + } + const finalLength = Math.max(trimmedLength, codeBlockEnd); + const finalText = finalLength === state.text.length ? state.text : state.text.slice(0, finalLength); return { - text: trimmedText, - styles: mergeStyleSpans(clampStyleSpans(state.styles, trimmedLength)), - links: clampLinkSpans(state.links, trimmedLength), + text: finalText, + styles: mergeStyleSpans(clampStyleSpans(state.styles, finalLength)), + links: clampLinkSpans(state.links, finalLength), }; } diff --git a/src/slack/format.ts b/src/slack/format.ts index fddc014ec..575841921 100644 --- a/src/slack/format.ts +++ b/src/slack/format.ts @@ -24,7 +24,7 @@ function isAllowedSlackAngleToken(token: string): boolean { ); } -function escapeSlackMrkdwnText(text: string): string { +function escapeSlackMrkdwnContent(text: string): string { if (!text.includes("&") && !text.includes("<") && !text.includes(">")) { return text; } @@ -49,6 +49,22 @@ function escapeSlackMrkdwnText(text: string): string { return out.join(""); } +function escapeSlackMrkdwnText(text: string): string { + if (!text.includes("&") && !text.includes("<") && !text.includes(">")) { + return text; + } + + return text + .split("\n") + .map((line) => { + if (line.startsWith("> ")) { + return `> ${escapeSlackMrkdwnContent(line.slice(2))}`; + } + return escapeSlackMrkdwnContent(line); + }) + .join("\n"); +} + function buildSlackLink(link: MarkdownLinkSpan, text: string) { const href = link.href.trim(); if (!href) return null;