diff --git a/packages/app/src/components/markdown/renderer.test.ts b/packages/app/src/components/markdown/renderer.test.ts index bba15e3ad1..f95fcf17b0 100644 --- a/packages/app/src/components/markdown/renderer.test.ts +++ b/packages/app/src/components/markdown/renderer.test.ts @@ -302,3 +302,12 @@ it("preserves angle-bracket image destinations and authored link titles during H '![shot]() and [open]( "literal title")', ); }); + +it("uses the first repeated image reference definition", () => { + const source = "![chart][image]\n\n[image]: first.png\n[image]: second.png"; + const prepared = prepareMarkdownSource(source); + expect(prepared.images.map((image) => image.source)).toEqual(["first.png"]); + expect(prepared.render(new Map([["first.png", "blob:first"]]))).toBe( + "![chart]()\n\n[image]: first.png\n[image]: second.png", + ); +}); diff --git a/packages/app/src/components/markdown/source.ts b/packages/app/src/components/markdown/source.ts index d31ad3fa51..89ea46929e 100644 --- a/packages/app/src/components/markdown/source.ts +++ b/packages/app/src/components/markdown/source.ts @@ -74,7 +74,8 @@ export function prepareMarkdownSource( const definitions = new Map(); function definitionsIn(node: Nodes) { - if (node.type === "definition") definitions.set(node.identifier, node); + if (node.type === "definition" && !definitions.has(node.identifier)) + definitions.set(node.identifier, node); if ("children" in node) node.children.forEach(definitionsIn); } definitionsIn(getTree());