From 02b30394ed4d313ef22659cc85eb3470981974bf Mon Sep 17 00:00:00 2001 From: Arkadiusz Fal Date: Tue, 13 Dec 2022 00:38:45 +0100 Subject: [PATCH] Fix parsing Piped comments --- Model/Applications/PipedAPI.swift | 43 +++++++++++++++++++------------ 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/Model/Applications/PipedAPI.swift b/Model/Applications/PipedAPI.swift index c4001eaa..5ba495fa 100644 --- a/Model/Applications/PipedAPI.swift +++ b/Model/Applications/PipedAPI.swift @@ -528,11 +528,13 @@ final class PipedAPI: Service, ObservableObject, VideosAPI { } private func extractDescription(from content: JSON) -> String? { - guard var description = content.dictionaryValue["description"]?.string else { - return nil - } + guard let description = content.dictionaryValue["description"]?.string else { return nil } - description = description.replacingOccurrences( + return replaceHTML(description) + } + + private func replaceHTML(_ string: String) -> String { + var string = string.replacingOccurrences( of: "
|
|
", with: "\n", options: .regularExpression, @@ -541,9 +543,8 @@ final class PipedAPI: Service, ObservableObject, VideosAPI { let linkRegex = #"(]*?\s+)?href=\"[^"]*\">[^<]*<\/a>)"# let hrefRegex = #"href=\"([^"]*)\">"# - guard let hrefRegex = try? NSRegularExpression(pattern: hrefRegex) else { return description } - - description = description.replacingMatches(regex: linkRegex) { matchingGroup in + guard let hrefRegex = try? NSRegularExpression(pattern: hrefRegex) else { return string } + string = string.replacingMatches(regex: linkRegex) { matchingGroup in let results = hrefRegex.matches(in: matchingGroup, range: NSRange(matchingGroup.startIndex..., in: matchingGroup)) if let result = results.first { @@ -555,16 +556,17 @@ final class PipedAPI: Service, ObservableObject, VideosAPI { return matchingGroup } - description = description.replacingOccurrences(of: "&", with: "&") + string = string + .replacingOccurrences(of: "&", with: "&") + .replacingOccurrences(of: " ", with: " ") + .replacingOccurrences( + of: "<[^>]+>", + with: "", + options: .regularExpression, + range: nil + ) - description = description.replacingOccurrences( - of: "<[^>]+>", - with: "", - options: .regularExpression, - range: nil - ) - - return description + return string } private func extractVideos(from content: JSON) -> [Video] { @@ -653,6 +655,7 @@ final class PipedAPI: Service, ObservableObject, VideosAPI { let author = details["author"]?.string ?? "" let commentorUrl = details["commentorUrl"]?.string let channelId = commentorUrl?.components(separatedBy: "/")[2] ?? "" + return Comment( id: details["commentId"]?.string ?? UUID().uuidString, author: author, @@ -661,12 +664,18 @@ final class PipedAPI: Service, ObservableObject, VideosAPI { pinned: details["pinned"]?.bool ?? false, hearted: details["hearted"]?.bool ?? false, likeCount: details["likeCount"]?.int ?? 0, - text: details["commentText"]?.string ?? "", + text: extractCommentText(from: details["commentText"]?.stringValue), repliesPage: details["repliesPage"]?.string, channel: Channel(id: channelId, name: author) ) } + private func extractCommentText(from string: String?) -> String { + guard let string, !string.isEmpty else { return "" } + + return replaceHTML(string) + } + private func extractChapters(from content: JSON) -> [Chapter] { guard let chapters = content.dictionaryValue["chapters"]?.array else { return .init()