// // FormattedBodyText.swift // ElementX // // Created by Stefan Ceriu on 24/03/2022. // Copyright © 2022 Element. All rights reserved. // import Foundation import SwiftUI struct FormattedBodyText: View { let attributedComponents: [AttributedStringBuilderComponent] var body: some View { VStack(alignment: .leading, spacing: 8.0) { ForEach(attributedComponents, id: \.self) { component in if component.isBlockquote { HStack(spacing: 4.0) { Rectangle() .foregroundColor(Color.red) .frame(width: 4.0) Text(component.attributedString) .fixedSize(horizontal: false, vertical: true) } } else { Text(component.attributedString) .fixedSize(horizontal: false, vertical: true) } } } .tint(.element.accent) } } struct FormattedBodyText_Previews: PreviewProvider { static var previews: some View { body.preferredColorScheme(.light) body.preferredColorScheme(.dark) } @ViewBuilder static var body: some View { let htmlStrings = [ """ Text before blockquote
bold italic
Text after blockquote """, """
First blockquote with a link in it
Second blockquote with a link in it
Third blockquote with a link in it
""", """ Hello world

Text

Hello world

Text

Hello world """] let attributedStringBuilder = AttributedStringBuilder() VStack(alignment: .leading, spacing: 24.0) { ForEach(htmlStrings, id: \.self) { htmlString in let attributedString = attributedStringBuilder.fromHTML(htmlString) if let components = attributedStringBuilder.blockquoteCoalescedComponentsFrom(attributedString) { FormattedBodyText(attributedComponents: components) .fixedSize() } } } } }