From 299a621e9072728fda905f4bc7fffd0d734f1ccf Mon Sep 17 00:00:00 2001 From: Jacob Hearst Date: Fri, 21 Nov 2025 07:29:31 -0600 Subject: [PATCH 1/2] Don't render markdown comments --- Sources/MarkdownUI/Parser/MarkdownParser.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sources/MarkdownUI/Parser/MarkdownParser.swift b/Sources/MarkdownUI/Parser/MarkdownParser.swift index 76bbd193..1dea889e 100644 --- a/Sources/MarkdownUI/Parser/MarkdownParser.swift +++ b/Sources/MarkdownUI/Parser/MarkdownParser.swift @@ -60,6 +60,11 @@ extension BlockNode { case .codeBlock: self = .codeBlock(fenceInfo: unsafeNode.fenceInfo, content: unsafeNode.literal ?? "") case .htmlBlock: + // Don't render comments + let trimmedLiteral = unsafeNode.literal?.trimmingCharacters(in: .whitespacesAndNewlines) + if let trimmedLiteral, trimmedLiteral.hasPrefix("") { + return nil + } self = .htmlBlock(content: unsafeNode.literal ?? "") case .paragraph: self = .paragraph(content: unsafeNode.children.compactMap(InlineNode.init(unsafeNode:))) From ac4adafc8673a579f392b720c8669367f90d426e Mon Sep 17 00:00:00 2001 From: Jacob Hearst Date: Tue, 2 Dec 2025 07:13:04 -0600 Subject: [PATCH 2/2] Add tests --- .../MarkdownContentTests.swift | 18 ++++++++++++++++++ Tests/MarkdownUITests/MarkdownTests.swift | 16 ++++++++++++++++ .../MarkdownTests/testComment.1.png | Bin 0 -> 53358 bytes 3 files changed, 34 insertions(+) create mode 100644 Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testComment.1.png diff --git a/Tests/MarkdownUITests/MarkdownContentTests.swift b/Tests/MarkdownUITests/MarkdownContentTests.swift index 14e6df1f..66ad1111 100644 --- a/Tests/MarkdownUITests/MarkdownContentTests.swift +++ b/Tests/MarkdownUITests/MarkdownContentTests.swift @@ -423,4 +423,22 @@ final class MarkdownContentTests: XCTestCase { ) XCTAssertEqual(markdown, content.renderMarkdown()) } + + func testComment() { + // given + let markdown = """ + + + """ + + // when + let content = MarkdownContent(markdown) + + // then + XCTAssertEqual(MarkdownContent {}, content) + XCTAssertEqual("", content.renderMarkdown()) + } } diff --git a/Tests/MarkdownUITests/MarkdownTests.swift b/Tests/MarkdownUITests/MarkdownTests.swift index 488d991c..8f5afbee 100644 --- a/Tests/MarkdownUITests/MarkdownTests.swift +++ b/Tests/MarkdownUITests/MarkdownTests.swift @@ -342,5 +342,21 @@ assertSnapshot(of: view, as: .image(layout: layout)) } + + func testComment() { + let view = Markdown { + #""" + This is rendered + + + So is this + """# + }.markdownSoftBreakMode(.lineBreak) + + assertSnapshot(of: view, as: .image(layout: layout)) + } } #endif diff --git a/Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testComment.1.png b/Tests/MarkdownUITests/__Snapshots__/MarkdownTests/testComment.1.png new file mode 100644 index 0000000000000000000000000000000000000000..9a05e4e6ffd3f9f724188f9f3d0dfd12e80df7a3 GIT binary patch literal 53358 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 literal 0 HcmV?d00001