diff --git a/packages/docusaurus-utils/src/__tests__/markdownParser.test.ts b/packages/docusaurus-utils/src/__tests__/markdownParser.test.ts index 2f36481e4b..c79d50b4d4 100644 --- a/packages/docusaurus-utils/src/__tests__/markdownParser.test.ts +++ b/packages/docusaurus-utils/src/__tests__/markdownParser.test.ts @@ -129,6 +129,19 @@ describe('createExcerpt', () => { `), ).toEqual('Markdown title'); }); + + test('should create excerpt for content with various code blocks', () => { + expect( + createExcerpt(dedent` + \`\`\`jsx + import React from 'react'; + import Layout from '@theme/Layout'; + \`\`\` + + Lorem \`ipsum\` dolor sit amet, consectetur \`adipiscing elit\`. + `), + ).toEqual('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); + }); }); describe('parseMarkdownContentTitle', () => { diff --git a/packages/docusaurus-utils/src/markdownParser.ts b/packages/docusaurus-utils/src/markdownParser.ts index 1f9377dfdd..5adac2653d 100644 --- a/packages/docusaurus-utils/src/markdownParser.ts +++ b/packages/docusaurus-utils/src/markdownParser.ts @@ -18,6 +18,7 @@ export function createExcerpt(fileString: string): string | undefined { // Remove Markdown alternate title .replace(/^[^\n]*\n[=]+/g, '') .split('\n'); + let inCode = false; /* eslint-disable no-continue */ // eslint-disable-next-line no-restricted-syntax @@ -32,6 +33,14 @@ export function createExcerpt(fileString: string): string | undefined { continue; } + // Skip code block line. + if (fileLine.trim().startsWith('```')) { + inCode = !inCode; + continue; + } else if (inCode) { + continue; + } + const cleanedLine = fileLine // Remove HTML tags. .replace(/<[^>]*>/g, '')