mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fixed emoji detection
This commit is contained in:
parent
c73cfb3a3a
commit
0bbf8bf0fb
@ -5,22 +5,9 @@ import AVFoundation
|
|||||||
public extension UnicodeScalar {
|
public extension UnicodeScalar {
|
||||||
var isEmoji: Bool {
|
var isEmoji: Bool {
|
||||||
switch self.value {
|
switch self.value {
|
||||||
case 0x1F600...0x1F64F, // Emoticons
|
case 0x1F600...0x1F64F, 0x1F300...0x1F5FF, 0x1F680...0x1F6FF, 0x1F1E6...0x1F1FF, 0xE0020...0xE007F, 0xFE00...0xFE0F, 0x1F900...0x1F9FF, 0x1F018...0x1F0F5, 0x1F200...0x1F270, 65024...65039, 9100...9300, 8400...8447, 0x1F004, 0x1F18E, 0x1F191...0x1F19A, 0x1F5E8:
|
||||||
0x1F300...0x1F5FF, // Misc Symbols and Pictographs
|
|
||||||
0x1F680...0x1F6FF, // Transport and Map
|
|
||||||
0x1F1E6...0x1F1FF, // Regional country flags
|
|
||||||
0xE0020...0xE007F, // Tags
|
|
||||||
0xFE00...0xFE0F, // Variation Selectors
|
|
||||||
0x1F900...0x1F9FF, // Supplemental Symbols and Pictographs
|
|
||||||
0x1F018...0x1F0F5,
|
|
||||||
0x1F200...0x1F270, // Various asian characters
|
|
||||||
65024...65039, // Variation selector
|
|
||||||
9100...9300, // Misc items
|
|
||||||
8400...8447: // Combining Diacritical Marks for Symbols
|
|
||||||
return true
|
return true
|
||||||
case 0x1f004:
|
case 0x265F, 0x267E, 0x2692, 0x26C8, 0x26CE, 0x26CF, 0x26D1...0x26D3, 0x26E9, 0x26F0...0x26F9, 0x2705, 0x270A, 0x270B, 0x2728, 0x274E, 0x2753...0x2755, 0x274C, 0x2795...0x2797, 0x27B0, 0x27BF:
|
||||||
return true
|
|
||||||
case 0x270b, 0x2728:
|
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
@ -29,24 +16,19 @@ public extension UnicodeScalar {
|
|||||||
|
|
||||||
var maybeEmoji: Bool {
|
var maybeEmoji: Bool {
|
||||||
switch self.value {
|
switch self.value {
|
||||||
case 0x2600...0x26FF, // Misc symbols
|
case 0x2A, 0x23, 0x30...0x39, 0xA9, 0xAE:
|
||||||
0x2700...0x27BF, // Dingbats
|
return true
|
||||||
0x1F100...0x1F1FF: //Enclosed Alphanumeric
|
case 0x2600...0x26FF, 0x2700...0x27BF, 0x1F100...0x1F1FF:
|
||||||
|
return true
|
||||||
|
case 0x203C, 0x2049, 0x2122, 0x2194...0x2199, 0x21A9, 0x21AA, 0x2139, 0x2328, 0x231A, 0x231B, 0x24C2, 0x25AA, 0x25AB, 0x25B6, 0x25FB...0x25FE, 0x25C0, 0x2934, 0x2935, 0x2B05...0x2B07, 0x2B1B...0x2B1E, 0x2B50, 0x2B55, 0x3030, 0x3297, 0x3299:
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var isZeroWidthJoiner: Bool {
|
static var ZeroWidthJoiner = UnicodeScalar(0x200D)!
|
||||||
return self.value == 8205
|
static var VariationSelector = UnicodeScalar(0xFE0F)!
|
||||||
}
|
|
||||||
|
|
||||||
var isVariationSelector: Bool {
|
|
||||||
return self.value == 0xfe0f
|
|
||||||
}
|
|
||||||
|
|
||||||
static var VariationSelector = UnicodeScalar(0xfe0f)!
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class FrameworkClass: NSObject {
|
private final class FrameworkClass: NSObject {
|
||||||
@ -76,7 +58,7 @@ public extension String {
|
|||||||
var nextShouldBeVariationSelector = false
|
var nextShouldBeVariationSelector = false
|
||||||
for scalar in self.unicodeScalars {
|
for scalar in self.unicodeScalars {
|
||||||
if nextShouldBeVariationSelector {
|
if nextShouldBeVariationSelector {
|
||||||
if scalar.isVariationSelector {
|
if scalar == UnicodeScalar.VariationSelector {
|
||||||
nextShouldBeVariationSelector = false
|
nextShouldBeVariationSelector = false
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
@ -86,7 +68,7 @@ public extension String {
|
|||||||
if !scalar.isEmoji && scalar.maybeEmoji {
|
if !scalar.isEmoji && scalar.maybeEmoji {
|
||||||
nextShouldBeVariationSelector = true
|
nextShouldBeVariationSelector = true
|
||||||
}
|
}
|
||||||
else if !scalar.isEmoji && !scalar.isZeroWidthJoiner {
|
else if !scalar.isEmoji && scalar != UnicodeScalar.ZeroWidthJoiner {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,7 +101,7 @@ public extension String {
|
|||||||
var nextShouldBeVariationSelector = false
|
var nextShouldBeVariationSelector = false
|
||||||
for scalar in self.unicodeScalars {
|
for scalar in self.unicodeScalars {
|
||||||
if nextShouldBeVariationSelector {
|
if nextShouldBeVariationSelector {
|
||||||
if !scalar.isVariationSelector{
|
if scalar != UnicodeScalar.VariationSelector {
|
||||||
string.unicodeScalars.append(UnicodeScalar.VariationSelector)
|
string.unicodeScalars.append(UnicodeScalar.VariationSelector)
|
||||||
}
|
}
|
||||||
nextShouldBeVariationSelector = false
|
nextShouldBeVariationSelector = false
|
||||||
|
@ -174,21 +174,23 @@ private func matchingEmojiEntry(_ emoji: String) -> (UInt8, UInt8, UInt8)? {
|
|||||||
special = "👩❤️👨"
|
special = "👩❤️👨"
|
||||||
} else if emoji == "\u{01f46a}" {
|
} else if emoji == "\u{01f46a}" {
|
||||||
special = "👨👩👦"
|
special = "👨👩👦"
|
||||||
|
} else if emoji == "\u{01f441}\u{200d}\u{01f5e8}" {
|
||||||
|
special = "👁️🗨️"
|
||||||
}
|
}
|
||||||
if let special = special, let entry = emojiMapping[special] {
|
if let special = special, let entry = emojiMapping[special] {
|
||||||
return entry
|
return entry
|
||||||
}
|
}
|
||||||
|
|
||||||
let manSuffix = "\u{200d}\u{2642}\u{fe0f}"
|
let maleSuffix = "\u{200d}\u{2642}\u{fe0f}"
|
||||||
let womanSuffix = "\u{200d}\u{2640}\u{fe0f}"
|
let femaleSuffix = "\u{200d}\u{2640}\u{fe0f}"
|
||||||
var preferredSuffix = womanSuffix
|
var preferredSuffix = femaleSuffix
|
||||||
|
|
||||||
let defaultMaleEmojis = ["\u{01f46e}", "\u{01f473}", "\u{1f477}", "\u{1f482}", "\u{01f575}", "\u{01f471}", "\u{01f647}", "\u{01f6b6}", "\u{01f3c3}", "\u{01f3cc}", "\u{01f3c4}", "\u{01f3ca}", "\u{26f9}", "\u{01f3cb}", "\u{01f6b4}", "\u{01f6b5}"]
|
let defaultMaleEmojis = ["\u{01f46e}", "\u{01f473}", "\u{1f477}", "\u{1f482}", "\u{01f575}", "\u{01f471}", "\u{01f647}", "\u{01f6b6}", "\u{01f3c3}", "\u{01f3cc}", "\u{01f3c4}", "\u{01f3ca}", "\u{26f9}", "\u{01f3cb}", "\u{01f6b4}", "\u{01f6b5}"]
|
||||||
if defaultMaleEmojis.contains(emoji) {
|
if defaultMaleEmojis.contains(emoji) {
|
||||||
preferredSuffix = manSuffix
|
preferredSuffix = maleSuffix
|
||||||
}
|
}
|
||||||
if let trimmedEmoji = trimmedEmoji, defaultMaleEmojis.contains(trimmedEmoji) {
|
if let trimmedEmoji = trimmedEmoji, defaultMaleEmojis.contains(trimmedEmoji) {
|
||||||
preferredSuffix = manSuffix
|
preferredSuffix = maleSuffix
|
||||||
}
|
}
|
||||||
|
|
||||||
if let entry = emojiMapping["\(emoji)\(preferredSuffix)"] {
|
if let entry = emojiMapping["\(emoji)\(preferredSuffix)"] {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user