mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Merge branch 'master' into bazel
This commit is contained in:
@@ -6,34 +6,50 @@ public func findSubstringRanges(in string: String, query: String) -> ([Range<Str
|
||||
|
||||
let text = string.lowercased()
|
||||
let searchRange = text.startIndex ..< text.endIndex
|
||||
text.enumerateSubstrings(in: searchRange, options: .byWords) { (substring, range, _, _) in
|
||||
guard let substring = substring else {
|
||||
text.enumerateSubstrings(in: searchRange, options: .byWords) { (rawSubstring, rawRange, _, _) in
|
||||
guard let rawSubstring = rawSubstring else {
|
||||
return
|
||||
}
|
||||
for var word in queryWords {
|
||||
var count = 0
|
||||
var hasLeadingSymbol = false
|
||||
if word.hasPrefix("#") || word.hasPrefix("@") {
|
||||
hasLeadingSymbol = true
|
||||
word.removeFirst()
|
||||
var substrings: [(String, Range<String.Index>)] = []
|
||||
if let index = rawSubstring.firstIndex(of: "'") {
|
||||
let leftString = String(rawSubstring[..<index])
|
||||
let rightString = String(rawSubstring[rawSubstring.index(after: index)...])
|
||||
if !leftString.isEmpty {
|
||||
substrings.append((leftString, rawRange.lowerBound ..< text.index(rawRange.lowerBound, offsetBy: leftString.count)))
|
||||
}
|
||||
inner: for (c1, c2) in zip(word, substring) {
|
||||
if c1 != c2 {
|
||||
break inner
|
||||
if !rightString.isEmpty {
|
||||
substrings.append((rightString, text.index(rawRange.lowerBound, offsetBy: leftString.count + 1) ..< rawRange.upperBound))
|
||||
}
|
||||
} else {
|
||||
substrings.append((rawSubstring, rawRange))
|
||||
}
|
||||
|
||||
for (substring, range) in substrings {
|
||||
for var word in queryWords {
|
||||
var count = 0
|
||||
var hasLeadingSymbol = false
|
||||
if word.hasPrefix("#") || word.hasPrefix("@") {
|
||||
hasLeadingSymbol = true
|
||||
word.removeFirst()
|
||||
}
|
||||
count += 1
|
||||
}
|
||||
if count > 0 {
|
||||
let length = Double(max(word.count, substring.count))
|
||||
if length > 0 {
|
||||
let difference = abs(length - Double(count))
|
||||
let rating = difference / length
|
||||
if rating < 0.33 {
|
||||
var range = range
|
||||
if hasLeadingSymbol && range.lowerBound > searchRange.lowerBound {
|
||||
range = text.index(before: range.lowerBound)..<range.upperBound
|
||||
inner: for (c1, c2) in zip(word, substring) {
|
||||
if c1 != c2 {
|
||||
break inner
|
||||
}
|
||||
count += 1
|
||||
}
|
||||
if count > 0 {
|
||||
let length = Double(max(word.count, substring.count))
|
||||
if length > 0 {
|
||||
let difference = abs(length - Double(count))
|
||||
let rating = difference / length
|
||||
if rating < 0.33 {
|
||||
var range = range
|
||||
if hasLeadingSymbol && range.lowerBound > searchRange.lowerBound {
|
||||
range = text.index(before: range.lowerBound)..<range.upperBound
|
||||
}
|
||||
ranges.append(range)
|
||||
}
|
||||
ranges.append(range)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user