From 71c49619bc161f71899c8078ddd472052c924e9f Mon Sep 17 00:00:00 2001 From: Hossam Youssof Date: Wed, 24 Sep 2025 08:59:23 +0300 Subject: [PATCH 1/3] Refactor markdownFormatter to use DefaultMarkdownFormatter and update MarkdownFormatter protocol for improved formatting capabilities --- Sources/StreamChatSwiftUI/Utils.swift | 2 +- .../Utils/MarkdownFormatter.swift | 25 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Sources/StreamChatSwiftUI/Utils.swift b/Sources/StreamChatSwiftUI/Utils.swift index f39985f10..93ce8273b 100644 --- a/Sources/StreamChatSwiftUI/Utils.swift +++ b/Sources/StreamChatSwiftUI/Utils.swift @@ -8,7 +8,7 @@ import StreamChat /// Class providing implementations of several utilities used in the SDK. /// The default implementations can be replaced in the init method, or directly via the variables. public class Utils { - var markdownFormatter = MarkdownFormatter() + public var markdownFormatter: MarkdownFormatter = DefaultMarkdownFormatter() public var dateFormatter: DateFormatter diff --git a/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift b/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift index 97faebdca..b3b11709d 100644 --- a/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift +++ b/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift @@ -6,15 +6,34 @@ import Foundation import StreamChat import SwiftUI +public protocol MarkdownFormatter { + /// Formats a Markdown string into an `AttributedString`, merging Markdown styles with the provided base attributes and honoring the given layout direction. + /// - Parameters: + /// - string: The Markdown-formatted source string to render. + /// - attributes: Base attributes applied to the entire string; Markdown-specific styling is merged on top of these defaults. + /// - layoutDirection: The text layout direction (left-to-right or right-to-left) used when interpreting and rendering Markdown blocks (for example, lists, block quotes, and headings). + /// - Returns: An `AttributedString` containing the rendered Markdown with the resolved attributes. + @available(iOS 15, *) + func format( + _ string: String, + attributes: AttributeContainer, + layoutDirection: LayoutDirection + ) -> AttributedString +} + /// Converts markdown string to AttributedString with styling attributes. -final class MarkdownFormatter { +open class DefaultMarkdownFormatter: MarkdownFormatter { @Injected(\.colors) private var colors @Injected(\.fonts) private var fonts - private let markdownParser = MarkdownParser() + private let markdownParser: MarkdownParser + + public init() { + markdownParser = MarkdownParser() + } @available(iOS 15, *) - func format( + public func format( _ string: String, attributes: AttributeContainer, layoutDirection: LayoutDirection From 626df03854c5a68f3cae3754099284a45b98f509 Mon Sep 17 00:00:00 2001 From: Hossam Youssof Date: Wed, 24 Sep 2025 09:19:13 +0300 Subject: [PATCH 2/3] Update Utils to allow custom markdownFormatter initialization --- Sources/StreamChatSwiftUI/Utils.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/StreamChatSwiftUI/Utils.swift b/Sources/StreamChatSwiftUI/Utils.swift index 93ce8273b..3d41ba3df 100644 --- a/Sources/StreamChatSwiftUI/Utils.swift +++ b/Sources/StreamChatSwiftUI/Utils.swift @@ -8,7 +8,7 @@ import StreamChat /// Class providing implementations of several utilities used in the SDK. /// The default implementations can be replaced in the init method, or directly via the variables. public class Utils { - public var markdownFormatter: MarkdownFormatter = DefaultMarkdownFormatter() + public var markdownFormatter: MarkdownFormatter public var dateFormatter: DateFormatter @@ -75,6 +75,7 @@ public class Utils { internal var pollsDateFormatter = PollsDateFormatter() public init( + markdownFormatter: MarkdownFormatter = DefaultMarkdownFormatter(), dateFormatter: DateFormatter = .makeDefault(), messageRelativeDateFormatter: DateFormatter = MessageRelativeDateFormatter(), videoPreviewLoader: VideoPreviewLoader = DefaultVideoPreviewLoader(), @@ -102,6 +103,7 @@ public class Utils { sortReactions: @escaping (MessageReactionType, MessageReactionType) -> Bool = Utils.defaultSortReactions, shouldSyncChannelControllerOnAppear: @escaping (ChatChannelController) -> Bool = { _ in true } ) { + self.markdownFormatter = markdownFormatter self.dateFormatter = dateFormatter self.messageRelativeDateFormatter = messageRelativeDateFormatter self.videoPreviewLoader = videoPreviewLoader From e707c317436fa60a09c49d5b7aae8126aa5e7bcc Mon Sep 17 00:00:00 2001 From: Hossam Youssof Date: Wed, 24 Sep 2025 15:40:41 +0300 Subject: [PATCH 3/3] feat(Formatter): make format method open for better accessibility --- Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift b/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift index b3b11709d..31a16db6b 100644 --- a/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift +++ b/Sources/StreamChatSwiftUI/Utils/MarkdownFormatter.swift @@ -33,7 +33,7 @@ open class DefaultMarkdownFormatter: MarkdownFormatter { } @available(iOS 15, *) - public func format( + open func format( _ string: String, attributes: AttributeContainer, layoutDirection: LayoutDirection