// // StatusContentTextView.swift // Tusker // // Created by Shadowfacts on 1/18/20. // Copyright © 2020 Shadowfacts. All rights reserved. // import UIKit import Pachyderm import WebURLFoundationExtras class StatusContentTextView: ContentTextView { private var statusID: String? func setTextFrom(status: some StatusProtocol, precomputed attributedText: NSAttributedString? = nil) { statusID = status.id if let attributedText { self.attributedText = attributedText } else { setTextFromHtml(status.content) } setEmojis(status.emojis, identifier: status.id) } override func getMention(for url: URL, text: String) -> Mention? { let mention: Mention? if let statusID = statusID, let mastodonController = mastodonController, let status = mastodonController.persistentContainer.status(for: statusID) { mention = status.mentions.first { (mention) in url.host == mention.url.host!.serialized && ( text.dropFirst() == mention.username // Mastodon and Pleroma include @ in the text || text.dropFirst() == mention.acct // Misskey includes @ and uses the whole acct || text == mention.username // GNU Social does not include the @ in the text, so we don't need to drop it ) } } else { mention = nil } return mention ?? super.getMention(for: url, text: text) } override func getHashtag(for url: URL, text: String) -> Hashtag? { let hashtag: Hashtag? if let statusID = statusID, let mastodonController = mastodonController, let status = mastodonController.persistentContainer.status(for: statusID) { hashtag = status.hashtags.first { (hashtag) in URL(hashtag.url) == url } } else { hashtag = nil } return hashtag ?? super.getHashtag(for: url, text: text) } }