From 012f1de05aeb2485324b7823024a1589ef6dff07 Mon Sep 17 00:00:00 2001 From: Andrew Stelmach Date: Fri, 8 May 2026 00:45:31 -0400 Subject: [PATCH] Cache list indentation regexes --- src/rules.ts | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/rules.ts b/src/rules.ts index e90f3e25d0..2bd1cf645a 100644 --- a/src/rules.ts +++ b/src/rules.ts @@ -1,5 +1,19 @@ const noopTest = { exec: () => null } as unknown as RegExp; +function cachedIndentRegex(createRegex: (indent: number) => RegExp) { + const cache: RegExp[] = []; + return (indent: number) => { + const cappedIndent = Math.min(3, indent - 1); + const cacheIndex = cappedIndent + 1; + let regex = cache[cacheIndex]; + if (!regex) { + regex = createRegex(cappedIndent); + cache[cacheIndex] = regex; + } + return regex; + }; +} + function edit(regex: string | RegExp, opt = '') { let source = typeof regex === 'string' ? regex : regex.source; const obj = { @@ -78,12 +92,12 @@ export const other = { notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`), - nextBulletRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`), - hrRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), - fencesBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`), - headingBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`), - htmlBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'), - blockquoteBeginRegex: (indent: number) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}>`), + nextBulletRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`)), + hrRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)), + fencesBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:\`\`\`|~~~)`)), + headingBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}#`)), + htmlBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}<(?:[a-z].*>|!--)`, 'i')), + blockquoteBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}>`)), }; /**