mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Story caption improvements
This commit is contained in:
@@ -9,182 +9,7 @@ import ChatInterfaceState
|
||||
import ChatPresentationInterfaceState
|
||||
import SwiftSignalKit
|
||||
import TextFormat
|
||||
|
||||
struct PossibleContextQueryTypes: OptionSet {
|
||||
var rawValue: Int32
|
||||
|
||||
init() {
|
||||
self.rawValue = 0
|
||||
}
|
||||
|
||||
init(rawValue: Int32) {
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
|
||||
static let emoji = PossibleContextQueryTypes(rawValue: (1 << 0))
|
||||
static let hashtag = PossibleContextQueryTypes(rawValue: (1 << 1))
|
||||
static let mention = PossibleContextQueryTypes(rawValue: (1 << 2))
|
||||
static let command = PossibleContextQueryTypes(rawValue: (1 << 3))
|
||||
static let contextRequest = PossibleContextQueryTypes(rawValue: (1 << 4))
|
||||
static let emojiSearch = PossibleContextQueryTypes(rawValue: (1 << 5))
|
||||
}
|
||||
|
||||
private func makeScalar(_ c: Character) -> Character {
|
||||
return c
|
||||
}
|
||||
|
||||
private let spaceScalar = " " as UnicodeScalar
|
||||
private let newlineScalar = "\n" as UnicodeScalar
|
||||
private let hashScalar = "#" as UnicodeScalar
|
||||
private let atScalar = "@" as UnicodeScalar
|
||||
private let slashScalar = "/" as UnicodeScalar
|
||||
private let colonScalar = ":" as UnicodeScalar
|
||||
private let alphanumerics = CharacterSet.alphanumerics
|
||||
|
||||
private func scalarCanPrependQueryControl(_ c: UnicodeScalar?) -> Bool {
|
||||
if let c = c {
|
||||
if c == " " || c == "\n" || c == "." || c == "," {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func textInputStateContextQueryRangeAndType(_ inputState: ChatTextInputState) -> [(NSRange, PossibleContextQueryTypes, NSRange?)] {
|
||||
if inputState.selectionRange.count != 0 {
|
||||
return []
|
||||
}
|
||||
|
||||
let inputText = inputState.inputText
|
||||
let inputString: NSString = inputText.string as NSString
|
||||
var results: [(NSRange, PossibleContextQueryTypes, NSRange?)] = []
|
||||
let inputLength = inputString.length
|
||||
|
||||
if inputLength != 0 {
|
||||
if inputString.hasPrefix("@") && inputLength != 1 {
|
||||
let startIndex = 1
|
||||
var index = startIndex
|
||||
var contextAddressRange: NSRange?
|
||||
|
||||
while true {
|
||||
if index == inputLength {
|
||||
break
|
||||
}
|
||||
if let c = UnicodeScalar(inputString.character(at: index)) {
|
||||
if c == " " {
|
||||
if index != startIndex {
|
||||
contextAddressRange = NSRange(location: startIndex, length: index - startIndex)
|
||||
index += 1
|
||||
}
|
||||
break
|
||||
} else {
|
||||
if !((c >= "a" && c <= "z") || (c >= "A" && c <= "Z") || (c >= "0" && c <= "9") || c == "_") {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if index == inputLength {
|
||||
break
|
||||
} else {
|
||||
index += 1
|
||||
}
|
||||
} else {
|
||||
index += 1
|
||||
}
|
||||
}
|
||||
|
||||
if let contextAddressRange = contextAddressRange {
|
||||
results.append((contextAddressRange, [.contextRequest], NSRange(location: index, length: inputLength - index)))
|
||||
}
|
||||
}
|
||||
|
||||
let maxIndex = min(inputState.selectionRange.lowerBound, inputLength)
|
||||
if maxIndex == 0 {
|
||||
return results
|
||||
}
|
||||
var index = maxIndex - 1
|
||||
|
||||
var possibleQueryRange: NSRange?
|
||||
|
||||
let string = (inputString as String)
|
||||
let trimmedString = string.trimmingTrailingSpaces()
|
||||
if string.count < 3, trimmedString.isSingleEmoji {
|
||||
if inputText.attribute(ChatTextInputAttributes.customEmoji, at: 0, effectiveRange: nil) == nil {
|
||||
return [(NSRange(location: 0, length: inputString.length - (string.count - trimmedString.count)), [.emoji], nil)]
|
||||
}
|
||||
} else {
|
||||
/*let activeString = inputText.attributedSubstring(from: NSRange(location: 0, length: inputState.selectionRange.upperBound))
|
||||
if let lastCharacter = activeString.string.last, String(lastCharacter).isSingleEmoji {
|
||||
let matchLength = (String(lastCharacter) as NSString).length
|
||||
|
||||
if activeString.attribute(ChatTextInputAttributes.customEmoji, at: activeString.length - matchLength, effectiveRange: nil) == nil {
|
||||
return [(NSRange(location: inputState.selectionRange.upperBound - matchLength, length: matchLength), [.emojiSearch], nil)]
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
var possibleTypes = PossibleContextQueryTypes([.command, .mention, .hashtag, .emojiSearch])
|
||||
var definedType = false
|
||||
|
||||
while true {
|
||||
var previousC: UnicodeScalar?
|
||||
if index != 0 {
|
||||
previousC = UnicodeScalar(inputString.character(at: index - 1))
|
||||
}
|
||||
if let c = UnicodeScalar(inputString.character(at: index)) {
|
||||
if c == spaceScalar || c == newlineScalar {
|
||||
possibleTypes = []
|
||||
} else if c == hashScalar {
|
||||
if scalarCanPrependQueryControl(previousC) {
|
||||
possibleTypes = possibleTypes.intersection([.hashtag])
|
||||
definedType = true
|
||||
index += 1
|
||||
possibleQueryRange = NSRange(location: index, length: maxIndex - index)
|
||||
}
|
||||
break
|
||||
} else if c == atScalar {
|
||||
if scalarCanPrependQueryControl(previousC) {
|
||||
possibleTypes = possibleTypes.intersection([.mention])
|
||||
definedType = true
|
||||
index += 1
|
||||
possibleQueryRange = NSRange(location: index, length: maxIndex - index)
|
||||
}
|
||||
break
|
||||
} else if c == slashScalar {
|
||||
if scalarCanPrependQueryControl(previousC) {
|
||||
possibleTypes = possibleTypes.intersection([.command])
|
||||
definedType = true
|
||||
index += 1
|
||||
possibleQueryRange = NSRange(location: index, length: maxIndex - index)
|
||||
}
|
||||
break
|
||||
} else if c == colonScalar {
|
||||
if scalarCanPrependQueryControl(previousC) {
|
||||
possibleTypes = possibleTypes.intersection([.emojiSearch])
|
||||
definedType = true
|
||||
index += 1
|
||||
possibleQueryRange = NSRange(location: index, length: maxIndex - index)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if index == 0 {
|
||||
break
|
||||
} else {
|
||||
index -= 1
|
||||
possibleQueryRange = NSRange(location: index, length: maxIndex - index)
|
||||
}
|
||||
}
|
||||
|
||||
if let possibleQueryRange = possibleQueryRange, definedType && !possibleTypes.isEmpty {
|
||||
results.append((possibleQueryRange, possibleTypes, nil))
|
||||
}
|
||||
}
|
||||
return results
|
||||
}
|
||||
import ChatContextQuery
|
||||
|
||||
func serviceTasksForChatPresentationIntefaceState(context: AccountContext, chatPresentationInterfaceState: ChatPresentationInterfaceState, updateState: @escaping ((ChatPresentationInterfaceState) -> ChatPresentationInterfaceState) -> Void) -> [AnyHashable: () -> Disposable] {
|
||||
var missingEmoji = Set<Int64>()
|
||||
|
||||
Reference in New Issue
Block a user