From 16e858bd7ae2e91f86ea78cfa3aa711af01208fb Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Mon, 4 Mar 2024 09:40:24 +0100 Subject: [PATCH] Update footnote regex to handle footnotes with spaces --- src/lib/markdown.ts | 2 +- tests/fixtures/repos/markdown.tar.bz2 | Bin 5214 -> 4938 bytes tests/visual/desktop/markdown.spec.ts | 22 ++++++++++++++++------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts index 18c747b0f..ba9c2ae71 100644 --- a/src/lib/markdown.ts +++ b/src/lib/markdown.ts @@ -53,7 +53,7 @@ const footnoteReferenceMarkedExtension = { renderer: (token: Tokens.Generic): string => `[${token.text}]`, }; -const footnoteMatch = /^\[\^([^\]]+)\]:\s([\S]*)/; +const footnoteMatch = /^\[\^([^\]]+)\]:\s([\S].*)/; const footnoteMarkedExtension = { name: "footnote", level: "block", diff --git a/tests/fixtures/repos/markdown.tar.bz2 b/tests/fixtures/repos/markdown.tar.bz2 index 04278788b29123bb6a84b689111cdf789238897f..99eb2ec01ce98d18fe57147e3689c7a811814c33 100644 GIT binary patch literal 4938 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 I+5k`h060vcumAu6 literal 5214 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 Y%*MkY> { }); await expect( page.locator( - "text=This is an example footnote[0]. And some radicle[1] examples.", + "text=This is an example footnote[1]. And some radicle[2] examples.[3]", ), ).toBeVisible(); await page.getByRole("button", { name: "Collapse" }).click(); - await expect(page.getByText("0. https://example.com ↩")).toBeVisible(); - await expect(page.getByText("1. https://radicle.xyz ↩")).toBeVisible(); + await expect(page.getByText("1. https://example.com ↩")).toBeVisible(); + await expect(page.getByText("2. https://radicle.xyz ↩")).toBeVisible(); + await expect( + page.getByText( + "3. A corporeal grounding, though one hardly to the exclusion of the cerebral as in the erroneous sense of a mind/body dichotomy, except insofar as what is most squarely in the cerebral would land here only on the periphery of our focus. ↩", + ), + ).toBeVisible(); await expect(page).toHaveScreenshot({ fullPage: true }); await page.getByText("Code").click(); await expect( page.locator( - "text=This is an example footnote[^0]. And some radicle[^1] examples.", + "text=This is an example footnote[^1]. And some radicle[^2] examples.[^3]", + ), + ).toBeVisible(); + await expect(page.getByText("[^1]: https://example.com")).toBeVisible(); + await expect(page.getByText("[^2]: https://radicle.xyz")).toBeVisible(); + await expect( + page.getByText( + "[^3]: A corporeal grounding, though one hardly to the exclusion of the _cerebral_ as in the erroneous sense of a mind/body dichotomy, except insofar as what is most squarely in the cerebral would land here only on the periphery of our focus.", ), ).toBeVisible(); - await expect(page.getByText("[^0]: https://example.com")).toBeVisible(); - await expect(page.getByText("[^1]: https://radicle.xyz")).toBeVisible(); }); test("math", async ({ page }) => {