From 2bdd27a6c0f94f965a4f1975cfdaf489bd5ec555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Castiel?= Date: Thu, 2 Feb 2023 03:48:28 -0500 Subject: [PATCH] fix(utils): handle CRLF when parsing MDX imports (#8606) --- .../src/__tests__/markdownUtils.test.ts | 20 +++++++++++++++++++ .../docusaurus-utils/src/markdownUtils.ts | 8 +++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/docusaurus-utils/src/__tests__/markdownUtils.test.ts b/packages/docusaurus-utils/src/__tests__/markdownUtils.test.ts index 579c47e826a0..014709f4df01 100644 --- a/packages/docusaurus-utils/src/__tests__/markdownUtils.test.ts +++ b/packages/docusaurus-utils/src/__tests__/markdownUtils.test.ts @@ -130,6 +130,26 @@ describe('createExcerpt', () => { ); }); + it('creates excerpt for content with imports/exports declarations, with CRLF line endings', () => { + expect( + createExcerpt( + dedent` + import Component from '@site/src/components/Component'; + + export function ItemCol(props) { + return + } + + Lorem **ipsum** dolor sit \`amet\`[^1], consectetur _adipiscing_ elit. [**Vestibulum**](https://wiktionary.org/wiki/vestibulum) ex urna[^note], ~~molestie~~ et sagittis ut, varius ac justo :wink:. + + Nunc porttitor libero nec vulputate venenatis. Nam nec rhoncus mauris. Morbi tempus est et nibh maximus, tempus venenatis arcu lobortis. + `.replace(/\n/g, '\r\n'), + ), + ).toBe( + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ex urna, molestie et sagittis ut, varius ac justo.', + ); + }); + it('creates excerpt for heading specified with anchor-id syntax', () => { expect( createExcerpt(dedent` diff --git a/packages/docusaurus-utils/src/markdownUtils.ts b/packages/docusaurus-utils/src/markdownUtils.ts index f97638a49d60..fb395a02c211 100644 --- a/packages/docusaurus-utils/src/markdownUtils.ts +++ b/packages/docusaurus-utils/src/markdownUtils.ts @@ -55,16 +55,18 @@ export function createExcerpt(fileString: string): string | undefined { const fileLines = fileString .trimStart() // Remove Markdown alternate title - .replace(/^[^\n]*\n[=]+/g, '') - .split('\n'); + .replace(/^[^\r\n]*\r?\n[=]+/g, '') + .split(/\r?\n/); let inCode = false; let inImport = false; let lastCodeFence = ''; for (const fileLine of fileLines) { - if (fileLine === '' && inImport) { + // An empty line marks the end of imports + if (!fileLine.trim() && inImport) { inImport = false; } + // Skip empty line. if (!fileLine.trim()) { continue;