From badb802fb99af60c52bb6c43572f1f91c694479e Mon Sep 17 00:00:00 2001 From: Dongyu Zhao Date: Tue, 15 Jul 2025 01:24:16 +0800 Subject: [PATCH] Handle backslash escapes in Markdown tokenizer --- .../SwiftParser/Languages/MarkdownLanguage.swift | 14 ++++++++++++-- Tests/SwiftParserTests/SwiftParserTests.swift | 9 +++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftParser/Languages/MarkdownLanguage.swift b/Sources/SwiftParser/Languages/MarkdownLanguage.swift index 4d364fa..188ffe5 100644 --- a/Sources/SwiftParser/Languages/MarkdownLanguage.swift +++ b/Sources/SwiftParser/Languages/MarkdownLanguage.swift @@ -126,7 +126,17 @@ public struct MarkdownLanguage: CodeLanguage { func add(_ t: Token) { tokens.append(t) } while index < input.endIndex { let ch = input[index] - if ch == "#" { + if ch == "\\" { + let start = index + advance() + if index < input.endIndex { + let escaped = input[index] + advance() + add(.text(String(escaped), start..!~|;&=".contains(input[index]) && + !"#-*+_`[].()<>!~|;&=\\".contains(input[index]) && !input[index].isNumber { advance() } diff --git a/Tests/SwiftParserTests/SwiftParserTests.swift b/Tests/SwiftParserTests/SwiftParserTests.swift index 7fc1f74..d98f1ee 100644 --- a/Tests/SwiftParserTests/SwiftParserTests.swift +++ b/Tests/SwiftParserTests/SwiftParserTests.swift @@ -92,6 +92,15 @@ final class SwiftParserTests: XCTestCase { XCTAssertEqual(result.root.children.first?.type as? MarkdownLanguage.Element, .image) } + func testMarkdownEscapedCharacters() { + let parser = SwiftParser() + let source = "\\*not italic\\*" + let result = parser.parse(source, language: MarkdownLanguage()) + XCTAssertEqual(result.errors.count, 0) + XCTAssertEqual(result.root.children.count, 1) + XCTAssertEqual(result.root.children.first?.value, "*not italic*") + } + func testPrattExpression() { let parser = SwiftParser() let source = "x = 1 + 2 * 3"