Merge pull request #560 from stonerl/clickable-links

make links in description clickable
This commit is contained in:
Arkadiusz Fal 2023-11-26 12:28:58 +01:00 committed by GitHub
commit e78f40c555
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -61,7 +61,7 @@ struct VideoDescription: View {
#if !os(iOS) #if !os(iOS)
Group { Group {
if #available(macOS 12, *) { if #available(macOS 12, *) {
Text(description) DescriptionWithLinks(description: description, detailsSize: detailsSize)
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(shouldExpand ? 500 : Self.collapsedLines) .lineLimit(shouldExpand ? 500 : Self.collapsedLines)
#if !os(tvOS) #if !os(tvOS)
@ -79,6 +79,33 @@ struct VideoDescription: View {
#endif #endif
} }
// If possibe convert URLs to clickable links
#if os(macOS)
@available(macOS 12, *)
struct DescriptionWithLinks: View {
let description: String
let detailsSize: CGSize?
let separators = CharacterSet(charactersIn: " \n")
var formattedString: AttributedString {
var attrString = AttributedString(description)
let words = description.unicodeScalars.split(whereSeparator: separators.contains).map(String.init)
words.forEach { word in
if word.hasPrefix("https://") || word.hasPrefix("http://"), let url = URL(string: String(word)) {
if let range = attrString.range(of: word) {
attrString[range].link = url
}
}
}
return attrString
}
var body: some View {
Text(formattedString)
}
}
#endif
@ViewBuilder var keywords: some View { @ViewBuilder var keywords: some View {
if showKeywords { if showKeywords {
ScrollView(.horizontal, showsIndicators: showScrollIndicators) { ScrollView(.horizontal, showsIndicators: showScrollIndicators) {