From 24b6343ca2dc56eda58de2c9c4bb8d383bd93ba6 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Mon, 18 Jul 2022 19:16:00 +0800 Subject: [PATCH] fix(utils): recognize ~~~ as code fences in link replacement (#7801) --- .../__snapshots__/markdownLinks.test.ts.snap | 12 ++++++++++++ .../src/__tests__/markdownLinks.test.ts | 12 ++++++++++++ packages/docusaurus-utils/src/markdownLinks.ts | 16 +++++++--------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/packages/docusaurus-utils/src/__tests__/__snapshots__/markdownLinks.test.ts.snap b/packages/docusaurus-utils/src/__tests__/__snapshots__/markdownLinks.test.ts.snap index f42727544ff0..18260d1b6051 100644 --- a/packages/docusaurus-utils/src/__tests__/__snapshots__/markdownLinks.test.ts.snap +++ b/packages/docusaurus-utils/src/__tests__/__snapshots__/markdownLinks.test.ts.snap @@ -76,6 +76,18 @@ exports[`replaceMarkdownLinks ignores links in fenced blocks 1`] = ` \`\`\` [foo](foo.md) \`\`\`\` + +~~~js +[foo](foo.md) +~~~ + +~~~js +[foo](foo.md) +\`\`\` +[foo](foo.md) +\`\`\` +[foo](foo.md) +~~~ ", } `; diff --git a/packages/docusaurus-utils/src/__tests__/markdownLinks.test.ts b/packages/docusaurus-utils/src/__tests__/markdownLinks.test.ts index 46df9f1e6629..4a17e1140afb 100644 --- a/packages/docusaurus-utils/src/__tests__/markdownLinks.test.ts +++ b/packages/docusaurus-utils/src/__tests__/markdownLinks.test.ts @@ -179,6 +179,18 @@ The following operations are defined for [URI]s: \`\`\` [foo](foo.md) \`\`\`\` + +~~~js +[foo](foo.md) +~~~ + +~~~js +[foo](foo.md) +\`\`\` +[foo](foo.md) +\`\`\` +[foo](foo.md) +~~~ `, }), ).toMatchSnapshot(); diff --git a/packages/docusaurus-utils/src/markdownLinks.ts b/packages/docusaurus-utils/src/markdownLinks.ts index af322fe840d2..6a34b275f3d4 100644 --- a/packages/docusaurus-utils/src/markdownLinks.ts +++ b/packages/docusaurus-utils/src/markdownLinks.ts @@ -82,21 +82,19 @@ export function replaceMarkdownLinks({ const brokenMarkdownLinks: BrokenMarkdownLink[] = []; // Replace internal markdown linking (except in fenced blocks). - let fencedBlock = false; - let lastCodeFence = ''; + let lastCodeFence: string | null = null; const lines = fileString.split('\n').map((line) => { - if (line.trim().startsWith('```')) { - const codeFence = line.trim().match(/^`+/)![0]!; - if (!fencedBlock) { - fencedBlock = true; + const codeFence = line.trimStart().match(/^`{3,}|^~{3,}/)?.[0]; + if (codeFence) { + if (!lastCodeFence) { lastCodeFence = codeFence; // If we are in a ````-fenced block, all ``` would be plain text instead // of fences - } else if (codeFence.length >= lastCodeFence.length) { - fencedBlock = false; + } else if (codeFence.startsWith(lastCodeFence)) { + lastCodeFence = null; } } - if (fencedBlock) { + if (lastCodeFence) { return line; }