Skip to content

Commit c01b4bf

Browse files
authored
fix(richtext-lexical): ensure markdown normalization does not merge escaped code block lines (#10230)
1 parent 2111a86 commit c01b4bf

File tree

12 files changed

+1991
-1442
lines changed

12 files changed

+1991
-1442
lines changed

packages/richtext-lexical/src/utilities/jsx/lexicalMarkdownCopy.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ const UNORDERED_LIST_REGEX = /^(\s*)[-*+]\s/
1818
const CHECK_LIST_REGEX = /^(\s*)(?:-\s)?\s?(\[(\s|x)?\])\s/i
1919
const HEADING_REGEX = /^(#{1,6})\s/
2020
const QUOTE_REGEX = /^>\s/
21-
const CODE_START_REGEX = /^[ \t]*```(\w+)?/
22-
const CODE_END_REGEX = /[ \t]*```$/
21+
// Match start of ``` or escaped \`\`\` code blocks
22+
const CODE_START_REGEX = /^[ \t]*(\\`\\`\\`|```)(\w+)?/
23+
// Match end of ``` or escaped \`\`\` code blocks
24+
const CODE_END_REGEX = /[ \t]*(\\`\\`\\`|```)$/
2325
const CODE_SINGLE_LINE_REGEX = /^[ \t]*```[^`]+(?:(?:`{1,2}|`{4,})[^`]+)*```(?:[^`]|$)/
2426
const TABLE_ROW_REG_EXP = /^\|(.+)\|\s?$/
2527
const TABLE_ROW_DIVIDER_REG_EXP = /^(\| ?:?-*:? ?)+\|\s?$/
@@ -41,15 +43,15 @@ export function normalizeMarkdown(input: string, shouldMergeAdjacentLines = fals
4143
continue
4244
}
4345

44-
if (
45-
(CODE_START_REGEX.test(line) && !inCodeBlock) ||
46-
(CODE_END_REGEX.test(line) && inCodeBlock)
47-
) {
48-
inCodeBlock = !inCodeBlock
46+
// Toggle inCodeBlock state when encountering start or end of a code block
47+
if (CODE_START_REGEX.test(line)) {
48+
inCodeBlock = true
49+
sanitizedLines.push(line)
50+
continue
4951
}
5052

51-
// Detect the start or end of a code block
52-
if (CODE_START_REGEX.test(line) || CODE_END_REGEX.test(line)) {
53+
if (CODE_END_REGEX.test(line)) {
54+
inCodeBlock = false
5355
sanitizedLines.push(line)
5456
continue
5557
}

test/lexical-mdx/collections/Posts/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { InlineCodeBlock } from '../../mdx/jsxBlocks/inlineCode.js'
1515
import { PackageInstallOptions } from '../../mdx/jsxBlocks/packageInstallOptions.js'
1616
import { TextContainerBlock } from '../../mdx/jsxBlocks/TextContainer.js'
1717
import { TextContainerNoTrimBlock } from '../../mdx/jsxBlocks/TextContainerNoTrim.js'
18+
import { RestExamplesBlock } from '../../mdx/jsxBlocks/restExamples/index.js'
1819

1920
export const postsSlug = 'posts'
2021

@@ -72,6 +73,7 @@ export const PostsCollection: CollectionConfig = {
7273
PackageInstallOptions,
7374
TextContainerNoTrimBlock,
7475
TextContainerBlock,
76+
RestExamplesBlock,
7577
],
7678
inlineBlocks: [InlineCodeBlock],
7779
}),
@@ -94,6 +96,7 @@ export const PostsCollection: CollectionConfig = {
9496
PackageInstallOptions,
9597
TextContainerNoTrimBlock,
9698
TextContainerBlock,
99+
RestExamplesBlock,
97100
],
98101
inlineBlocks: [InlineCodeBlock],
99102
}),

0 commit comments

Comments
 (0)