Replace emoji detection implementation with a simpler one

This commit is contained in:
Stefan Ceriu
2024-02-13 17:29:26 +02:00
committed by Stefan Ceriu
parent f2e9c32e8d
commit 2019984918
2 changed files with 36 additions and 40 deletions
+29 -34
View File
@@ -16,51 +16,46 @@
import Foundation import Foundation
extension UnicodeScalar { // Taken from https://gist.github.com/krummler/879e1ce942893db3104783d1d0e67b34
var isZeroWidthJoiner: Bool { extension Character {
value == 8205 /// A simple emoji is one scalar and presented to the user as an Emoji
var isSimpleEmoji: Bool {
unicodeScalars.count == 1 && unicodeScalars.first?.properties.isEmojiPresentation ?? false
} }
var isKeycap: Bool { /// Checks if the scalars will be merged into and emoji
value == 8419 var isCombinedIntoEmoji: Bool {
unicodeScalars.count > 1 &&
unicodeScalars.contains { $0.properties.isJoinControl || $0.properties.isVariationSelector }
} }
var isNumber: Bool { var isEmoji: Bool {
switch value { isSimpleEmoji || isCombinedIntoEmoji
case 48...57:
return true
default:
return false
}
} }
} }
extension String { extension String {
var isSingleEmoji: Bool {
count == 1 && containsEmoji
}
var containsEmoji: Bool {
contains { $0.isEmoji }
}
var containsOnlyEmoji: Bool { var containsOnlyEmoji: Bool {
guard !isEmpty else { !isEmpty && !contains { !$0.isEmoji }
return false }
}
var emojiMarkerCount = 0 var emojiString: String {
for scalar in unicodeScalars { emojis.map { String($0) }.reduce("", +)
let isEmojiMarker = scalar.properties.isEmoji || }
scalar.properties.isEmojiPresentation ||
scalar.isZeroWidthJoiner ||
scalar.properties.isDefaultIgnorableCodePoint ||
scalar.isKeycap
guard isEmojiMarker else { var emojis: [Character] {
return false filter(\.isEmoji)
} }
emojiMarkerCount += 1 var emojiScalars: [UnicodeScalar] {
} filter(\.isEmoji).flatMap(\.unicodeScalars)
// Plain numbers like 0 return true for .isEmoji. We don't want that
let markersRequiringSiblings = unicodeScalars.filter {
$0.properties.isEmoji && $0.isNumber
}
return markersRequiringSiblings.count != emojiMarkerCount && emojiMarkerCount == unicodeScalars.count
} }
} }
+2 -1
View File
@@ -40,9 +40,10 @@ class EmojiDetectionTests: XCTestCase {
XCTAssertTrue("👍".containsOnlyEmoji) XCTAssertTrue("👍".containsOnlyEmoji)
XCTAssertTrue("🫱🏼‍🫲🏾".containsOnlyEmoji) XCTAssertTrue("🫱🏼‍🫲🏾".containsOnlyEmoji)
XCTAssertTrue("👁❤️🍝".containsOnlyEmoji)
XCTAssertFalse("🙂 ".containsOnlyEmoji) XCTAssertFalse("🙂 ".containsOnlyEmoji)
XCTAssertFalse("Hello 👋".containsOnlyEmoji) XCTAssertFalse("Hello 👋".containsOnlyEmoji)
XCTAssertFalse("Thanks".containsOnlyEmoji) XCTAssertFalse("Thanks".containsOnlyEmoji)
XCTAssertFalse("0*".containsOnlyEmoji)
} }
} }