From 21b70ccaf51783e7f4054bfca661bf4305c311c4 Mon Sep 17 00:00:00 2001 From: YuF-9468 <150006551+YuF-9468@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:39:45 +0800 Subject: [PATCH 1/2] Fix post preview to trim leading/trailing newlines --- Sources/WordPressData/Swift/Post.swift | 9 +++++++-- Tests/KeystoneTests/Tests/Models/PostTests.swift | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Sources/WordPressData/Swift/Post.swift b/Sources/WordPressData/Swift/Post.swift index 46a0621b1e5b..add91a2e68ae 100644 --- a/Sources/WordPressData/Swift/Post.swift +++ b/Sources/WordPressData/Swift/Post.swift @@ -219,14 +219,14 @@ public class Post: AbstractPost { if let preview = PostPreviewCache.shared.excerpt[excerpt] { return preview } - let preview = excerpt.makePlainText().withCollapsedNewlines() + let preview = excerpt.makePlainText().withCollapsedNewlines().trimmedForPreview() PostPreviewCache.shared.excerpt[excerpt] = preview return preview } else if let content { if let preview = PostPreviewCache.shared.content[content] { return preview } - let preview = GutenbergExcerptGenerator.firstParagraph(from: content, maxLength: 200).withCollapsedNewlines() + let preview = GutenbergExcerptGenerator.firstParagraph(from: content, maxLength: 200).withCollapsedNewlines().trimmedForPreview() PostPreviewCache.shared.content[content] = preview return preview } else { @@ -253,6 +253,11 @@ private extension String { func withCollapsedNewlines() -> String { replacingOccurrences(of: "[\n]{2,}", with: "\n", options: .regularExpression) } + + // Remove leading/trailing line breaks to avoid rendering blank trailing lines in preview labels. + func trimmedForPreview() -> String { + trimmingCharacters(in: .whitespacesAndNewlines) + } } private final class PostPreviewCache { diff --git a/Tests/KeystoneTests/Tests/Models/PostTests.swift b/Tests/KeystoneTests/Tests/Models/PostTests.swift index bef189b9d973..fdde3abcf684 100644 --- a/Tests/KeystoneTests/Tests/Models/PostTests.swift +++ b/Tests/KeystoneTests/Tests/Models/PostTests.swift @@ -259,6 +259,15 @@ class PostTests: CoreDataTestCase { XCTAssertEqual(post.contentPreviewForDisplay(), "some contents\u{A0}go here") } + func testThatContentPreviewForDisplayTrimsLeadingAndTrailingNewlines() { + let post = newTestPost() + + post.content = "

Paragraph 1

Paragraph 2

" + let preview = post.contentPreviewForDisplay() + + XCTAssertEqual(preview, preview.trimmingCharacters(in: .whitespacesAndNewlines)) + } + func testThatEnablingDisablingPublicizeConnectionsWorks() { let post = newTestPost() From 13989204d5466680d36918ffefc00d0735f577de Mon Sep 17 00:00:00 2001 From: YuF-9468 <2060563720+YuF-9468@users.noreply.github.com> Date: Sat, 7 Mar 2026 11:00:19 +0800 Subject: [PATCH 2/2] test: assert explicit preview content for newline trim case --- Tests/KeystoneTests/Tests/Models/PostTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/KeystoneTests/Tests/Models/PostTests.swift b/Tests/KeystoneTests/Tests/Models/PostTests.swift index fdde3abcf684..af8a71bca73b 100644 --- a/Tests/KeystoneTests/Tests/Models/PostTests.swift +++ b/Tests/KeystoneTests/Tests/Models/PostTests.swift @@ -265,7 +265,7 @@ class PostTests: CoreDataTestCase { post.content = "

Paragraph 1

Paragraph 2

" let preview = post.contentPreviewForDisplay() - XCTAssertEqual(preview, preview.trimmingCharacters(in: .whitespacesAndNewlines)) + XCTAssertEqual("Paragraph 1\nParagraph 2", preview) } func testThatEnablingDisablingPublicizeConnectionsWorks() {