// // 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 italicText 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()
}
}
}
}
}