From e3549eb5bc41b8544f660c0aaffe605808869095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Tue, 25 Feb 2025 11:04:28 +0100 Subject: [PATCH] perf(escaping): Remove catastrophic backtracking regex for code escape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- CDMarkdownKitTests/TestCode.swift | 12 ++++++++++++ CDMarkdownKitTests/TestSyntax.swift | 8 ++++++++ Source/CDMarkdownCodeEscaping.swift | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CDMarkdownKitTests/TestCode.swift b/CDMarkdownKitTests/TestCode.swift index 695b25f..2b33fd7 100644 --- a/CDMarkdownKitTests/TestCode.swift +++ b/CDMarkdownKitTests/TestCode.swift @@ -44,6 +44,18 @@ final class TestCode: XCTestCase { XCTAssertTrue(TestHelpers.isMonospaced(testString: parsed, at: 0)) } + + func testCodeMultiple() throws { + let parser = getParser() + + let parsed = parser.parse("`test` abc `test` abc") + XCTAssertEqual(parsed.string, "test abc test abc") + XCTAssertTrue(TestHelpers.isMonospaced(testString: parsed, at: 2)) + XCTAssertFalse(TestHelpers.isMonospaced(testString: parsed, at: 6)) + XCTAssertTrue(TestHelpers.isMonospaced(testString: parsed, at: 11)) + XCTAssertFalse(TestHelpers.isMonospaced(testString: parsed, at: 15)) + } + func testCodeSentence() throws { let parser = getParser() diff --git a/CDMarkdownKitTests/TestSyntax.swift b/CDMarkdownKitTests/TestSyntax.swift index 06d1870..1f7eed7 100644 --- a/CDMarkdownKitTests/TestSyntax.swift +++ b/CDMarkdownKitTests/TestSyntax.swift @@ -112,4 +112,12 @@ final class TestSyntax: XCTestCase { XCTAssertFalse(TestHelpers.anyBold(testString: parsed)) XCTAssertFalse(TestHelpers.anyItalic(testString: parsed)) } + + func testSyntaxOnlyStart() throws { + let parser = getParser() + + let parsed = parser.parse("```\nsyntax\n") + XCTAssertEqual(parsed.string, "```\nsyntax\n") + XCTAssertFalse(TestHelpers.isMonospaced(testString: parsed, at: 4)) + } } diff --git a/Source/CDMarkdownCodeEscaping.swift b/Source/CDMarkdownCodeEscaping.swift index da0fbdf..2c0cf9c 100644 --- a/Source/CDMarkdownCodeEscaping.swift +++ b/Source/CDMarkdownCodeEscaping.swift @@ -33,12 +33,12 @@ open class CDMarkdownCodeEscaping: CDMarkdownElement { - fileprivate static let regex = ["(?