EmojiUtils.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //
  2. // SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. import Foundation
  6. // based on https://stackoverflow.com/a/39425959/2512312
  7. extension Character {
  8. /// A simple emoji is one scalar and presented to the user as an Emoji
  9. var isSimpleEmoji: Bool {
  10. guard let firstScalar = unicodeScalars.first else { return false }
  11. return firstScalar.properties.isEmoji && firstScalar.value > 0x238C
  12. }
  13. /// Checks if the scalars will be merged into an emoji
  14. var isCombinedIntoEmoji: Bool { unicodeScalars.count > 1 && unicodeScalars.first?.properties.isEmoji ?? false }
  15. var isEmoji: Bool { isSimpleEmoji || isCombinedIntoEmoji }
  16. }
  17. extension String {
  18. var isSingleEmoji: Bool { count == 1 && containsEmoji }
  19. var containsEmoji: Bool { contains { $0.isEmoji } }
  20. var containsOnlyEmoji: Bool { !isEmpty && !contains { !$0.isEmoji } }
  21. var emojiString: String { emojis.map { String($0) }.reduce("", +) }
  22. var emojis: [Character] { filter { $0.isEmoji } }
  23. var emojiScalars: [UnicodeScalar] { filter { $0.isEmoji }.flatMap { $0.unicodeScalars } }
  24. }
  25. extension UIView {
  26. // https://stackoverflow.com/a/41288197
  27. // Using a function since `var image` might conflict with an existing variable
  28. // (like on `UIImageView`)
  29. func asImage() -> UIImage {
  30. let renderer = UIGraphicsImageRenderer(bounds: bounds)
  31. return renderer.image { rendererContext in
  32. layer.render(in: rendererContext.cgContext)
  33. }
  34. }
  35. }
  36. @objc extension NSString {
  37. public var containsOnlyEmoji: Bool {
  38. let str = self as String
  39. return str.containsOnlyEmoji
  40. }
  41. public var isSingleEmoji: Bool {
  42. let str = self as String
  43. return str.isSingleEmoji
  44. }
  45. public var emojiCount: Int {
  46. let str = self as String
  47. return str.emojis.count
  48. }
  49. }