diff --git a/packages/app/src/components/markdown/html.ts b/packages/app/src/components/markdown/html.ts index 34c88b2d5b..5babb682c2 100644 --- a/packages/app/src/components/markdown/html.ts +++ b/packages/app/src/components/markdown/html.ts @@ -85,15 +85,11 @@ export function normalizeMarkdownHtml(source: string): string { // Inline HTML code has separate opening/closing AST nodes. Convert the pair // together so its contents keep backslashes and get a safe backtick delimiter. const code = /^]*>[\s\S]*?<\/code\s*>/i.exec(source.slice(range.start)); - if (code) { - result += convert(code[0], range.start); - cursor = range.start + code[0].length; - } else { - result += source - .slice(range.start, range.end) - .replace(HTML, (raw, offset) => convert(raw, range.start + offset)); - cursor = range.end; - } + const end = code ? Math.max(range.end, range.start + code[0].length) : range.end; + result += source + .slice(range.start, end) + .replace(HTML, (raw, offset) => convert(raw, range.start + offset)); + cursor = end; } return result + source.slice(cursor); } diff --git a/packages/app/src/components/markdown/renderer.test.ts b/packages/app/src/components/markdown/renderer.test.ts index a7da4c792f..1489c815bc 100644 --- a/packages/app/src/components/markdown/renderer.test.ts +++ b/packages/app/src/components/markdown/renderer.test.ts @@ -328,3 +328,10 @@ it("keeps paragraph, heading and table-row boundaries when stripping HTML", () = const rendered = prepareMarkdownSource(source).render(); expect(rendered).toBe("First\n\nSecond \nline\n\nHeading\n\nA B\n\nC D"); }); + +it("normalizes images following HTML code in the same HTML block", () => { + const prepared = prepareMarkdownSource('\nx\n\n'); + expect(prepared.images.map((image) => image.source)).toEqual(["shot.png"]); + expect(prepared.render(new Map([["shot.png", "blob:shot"]]))).toContain("![]()"); + expect(prepared.render()).toContain("`\nx\n`"); +});