Various fixes

This commit is contained in:
Ilya Laktyushin
2023-03-04 20:17:12 +04:00
parent cc014328f1
commit ca8f59565b
6 changed files with 59 additions and 38 deletions

View File

@@ -376,6 +376,19 @@ private func refreshTextMentions(text: NSString, initialAttributedText: NSAttrib
}
}
private let textUrlEdgeCharacters: CharacterSet = {
var set: CharacterSet = .alphanumerics
set.formUnion(.symbols)
set.formUnion(.punctuationCharacters)
return set
}()
private let textUrlCharacters: CharacterSet = {
var set: CharacterSet = textUrlEdgeCharacters
set.formUnion(.whitespacesAndNewlines)
return set
}()
private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributedString, attributedText: NSMutableAttributedString, fullRange: NSRange) {
var textUrlRanges: [(NSRange, ChatTextInputTextUrlAttribute)] = []
initialAttributedText.enumerateAttribute(ChatTextInputAttributes.textUrl, in: fullRange, options: [], using: { value, range, _ in
@@ -392,7 +405,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
var validLower = range.lowerBound
inner1: for i in range.lowerBound ..< range.upperBound {
if let c = UnicodeScalar(text.character(at: i)) {
if alphanumericCharacters.contains(c) || c == " " as UnicodeScalar {
if textUrlCharacters.contains(c) {
validLower = i
break inner1
}
@@ -403,7 +416,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
var validUpper = range.upperBound
inner2: for i in (validLower ..< range.upperBound).reversed() {
if let c = UnicodeScalar(text.character(at: i)) {
if alphanumericCharacters.contains(c) || c == " " as UnicodeScalar {
if textUrlCharacters.contains(c) {
validUpper = i + 1
break inner2
}
@@ -415,7 +428,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
let minLower = (i == 0) ? fullRange.lowerBound : textUrlRanges[i - 1].0.upperBound
inner3: for i in (minLower ..< validLower).reversed() {
if let c = UnicodeScalar(text.character(at: i)) {
if alphanumericCharacters.contains(c) {
if textUrlEdgeCharacters.contains(c) {
validLower = i
} else {
break inner3
@@ -428,7 +441,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
let maxUpper = (i == textUrlRanges.count - 1) ? fullRange.upperBound : textUrlRanges[i + 1].0.lowerBound
inner3: for i in validUpper ..< maxUpper {
if let c = UnicodeScalar(text.character(at: i)) {
if alphanumericCharacters.contains(c) {
if textUrlEdgeCharacters.contains(c) {
validUpper = i + 1
} else {
break inner3
@@ -450,7 +463,7 @@ private func refreshTextUrls(text: NSString, initialAttributedText: NSAttributed
var combine = true
inner: for j in textUrlRanges[i].0.upperBound ..< textUrlRanges[i + 1].0.lowerBound {
if let c = UnicodeScalar(text.character(at: j)) {
if alphanumericCharacters.contains(c) || c == " " as UnicodeScalar {
if textUrlCharacters.contains(c) {
} else {
combine = false
break inner