mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			122 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Swift
		
	
| 
											3 years ago
										 | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | ||
|  | 
 | ||
|  | import Foundation | ||
|  | 
 | ||
|  | public extension UnicodeScalar { | ||
|  |     class EmojiRange { | ||
|  |         // rangeStart and rangeEnd are inclusive. | ||
|  |         let rangeStart: UInt32 | ||
|  |         let rangeEnd: UInt32 | ||
|  | 
 | ||
|  |         // MARK: - Initializers | ||
|  | 
 | ||
|  |         init(rangeStart: UInt32, rangeEnd: UInt32) { | ||
|  |             self.rangeStart = rangeStart | ||
|  |             self.rangeEnd = rangeEnd | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     // From: | ||
|  |     // https://www.unicode.org/Public/emoji/ | ||
|  |     // Current Version: | ||
|  |     // https://www.unicode.org/Public/emoji/6.0/emoji-data.txt | ||
|  |     // | ||
|  |     // These ranges can be code-generated using: | ||
|  |     // | ||
|  |     // * Scripts/emoji-data.txt | ||
|  |     // * Scripts/emoji_ranges.py | ||
|  |     static let kEmojiRanges = [ | ||
|  |         // NOTE: Don't treat Pound Sign # as Jumbomoji. | ||
|  |         //        EmojiRange(rangeStart:0x23, rangeEnd:0x23), | ||
|  |         // NOTE: Don't treat Asterisk * as Jumbomoji. | ||
|  |         //        EmojiRange(rangeStart:0x2A, rangeEnd:0x2A), | ||
|  |         // NOTE: Don't treat Digits 0..9 as Jumbomoji. | ||
|  |         //        EmojiRange(rangeStart:0x30, rangeEnd:0x39), | ||
|  |         // NOTE: Don't treat Copyright Symbol © as Jumbomoji. | ||
|  |         //        EmojiRange(rangeStart:0xA9, rangeEnd:0xA9), | ||
|  |         // NOTE: Don't treat Trademark Sign ® as Jumbomoji. | ||
|  |         //        EmojiRange(rangeStart:0xAE, rangeEnd:0xAE), | ||
|  |         EmojiRange(rangeStart: 0x200D, rangeEnd: 0x200D), | ||
|  |         EmojiRange(rangeStart: 0x203C, rangeEnd: 0x203C), | ||
|  |         EmojiRange(rangeStart: 0x2049, rangeEnd: 0x2049), | ||
|  |         EmojiRange(rangeStart: 0x20D0, rangeEnd: 0x20FF), | ||
|  |         EmojiRange(rangeStart: 0x2122, rangeEnd: 0x2122), | ||
|  |         EmojiRange(rangeStart: 0x2139, rangeEnd: 0x2139), | ||
|  |         EmojiRange(rangeStart: 0x2194, rangeEnd: 0x2199), | ||
|  |         EmojiRange(rangeStart: 0x21A9, rangeEnd: 0x21AA), | ||
|  |         EmojiRange(rangeStart: 0x231A, rangeEnd: 0x231B), | ||
|  |         EmojiRange(rangeStart: 0x2328, rangeEnd: 0x2328), | ||
|  |         EmojiRange(rangeStart: 0x2388, rangeEnd: 0x2388), | ||
|  |         EmojiRange(rangeStart: 0x23CF, rangeEnd: 0x23CF), | ||
|  |         EmojiRange(rangeStart: 0x23E9, rangeEnd: 0x23F3), | ||
|  |         EmojiRange(rangeStart: 0x23F8, rangeEnd: 0x23FA), | ||
|  |         EmojiRange(rangeStart: 0x24C2, rangeEnd: 0x24C2), | ||
|  |         EmojiRange(rangeStart: 0x25AA, rangeEnd: 0x25AB), | ||
|  |         EmojiRange(rangeStart: 0x25B6, rangeEnd: 0x25B6), | ||
|  |         EmojiRange(rangeStart: 0x25C0, rangeEnd: 0x25C0), | ||
|  |         EmojiRange(rangeStart: 0x25FB, rangeEnd: 0x25FE), | ||
|  |         EmojiRange(rangeStart: 0x2600, rangeEnd: 0x27BF), | ||
|  |         EmojiRange(rangeStart: 0x2934, rangeEnd: 0x2935), | ||
|  |         EmojiRange(rangeStart: 0x2B05, rangeEnd: 0x2B07), | ||
|  |         EmojiRange(rangeStart: 0x2B1B, rangeEnd: 0x2B1C), | ||
|  |         EmojiRange(rangeStart: 0x2B50, rangeEnd: 0x2B50), | ||
|  |         EmojiRange(rangeStart: 0x2B55, rangeEnd: 0x2B55), | ||
|  |         EmojiRange(rangeStart: 0x3030, rangeEnd: 0x3030), | ||
|  |         EmojiRange(rangeStart: 0x303D, rangeEnd: 0x303D), | ||
|  |         EmojiRange(rangeStart: 0x3297, rangeEnd: 0x3297), | ||
|  |         EmojiRange(rangeStart: 0x3299, rangeEnd: 0x3299), | ||
|  |         EmojiRange(rangeStart: 0xFE00, rangeEnd: 0xFE0F), | ||
|  |         EmojiRange(rangeStart: 0x1F000, rangeEnd: 0x1F0FF), | ||
|  |         EmojiRange(rangeStart: 0x1F10D, rangeEnd: 0x1F10F), | ||
|  |         EmojiRange(rangeStart: 0x1F12F, rangeEnd: 0x1F12F), | ||
|  |         EmojiRange(rangeStart: 0x1F16C, rangeEnd: 0x1F171), | ||
|  |         EmojiRange(rangeStart: 0x1F17E, rangeEnd: 0x1F17F), | ||
|  |         EmojiRange(rangeStart: 0x1F18E, rangeEnd: 0x1F18E), | ||
|  |         EmojiRange(rangeStart: 0x1F191, rangeEnd: 0x1F19A), | ||
|  |         EmojiRange(rangeStart: 0x1F1AD, rangeEnd: 0x1F1FF), | ||
|  |         EmojiRange(rangeStart: 0x1F201, rangeEnd: 0x1F20F), | ||
|  |         EmojiRange(rangeStart: 0x1F21A, rangeEnd: 0x1F21A), | ||
|  |         EmojiRange(rangeStart: 0x1F22F, rangeEnd: 0x1F22F), | ||
|  |         EmojiRange(rangeStart: 0x1F232, rangeEnd: 0x1F23A), | ||
|  |         EmojiRange(rangeStart: 0x1F23C, rangeEnd: 0x1F23F), | ||
|  |         EmojiRange(rangeStart: 0x1F249, rangeEnd: 0x1F64F), | ||
|  |         EmojiRange(rangeStart: 0x1F680, rangeEnd: 0x1F6FF), | ||
|  |         EmojiRange(rangeStart: 0x1F774, rangeEnd: 0x1F77F), | ||
|  |         EmojiRange(rangeStart: 0x1F7D5, rangeEnd: 0x1F7FF), | ||
|  |         EmojiRange(rangeStart: 0x1F80C, rangeEnd: 0x1F80F), | ||
|  |         EmojiRange(rangeStart: 0x1F848, rangeEnd: 0x1F84F), | ||
|  |         EmojiRange(rangeStart: 0x1F85A, rangeEnd: 0x1F85F), | ||
|  |         EmojiRange(rangeStart: 0x1F888, rangeEnd: 0x1F88F), | ||
|  |         EmojiRange(rangeStart: 0x1F8AE, rangeEnd: 0x1FFFD), | ||
|  |         EmojiRange(rangeStart: 0xE0020, rangeEnd: 0xE007F) | ||
|  |     ] | ||
|  | 
 | ||
|  |     var isEmoji: Bool { | ||
|  |         // Binary search | ||
|  |         var left: Int = 0 | ||
|  |         var right = Int(UnicodeScalar.kEmojiRanges.count - 1) | ||
|  |          | ||
|  |         while true { | ||
|  |             let mid = (left + right) / 2 | ||
|  |             let midRange = UnicodeScalar.kEmojiRanges[mid] | ||
|  |             if value < midRange.rangeStart { | ||
|  |                 if mid == left { | ||
|  |                     return false | ||
|  |                 } | ||
|  |                 right = mid - 1 | ||
|  |             } else if value > midRange.rangeEnd { | ||
|  |                 if mid == right { | ||
|  |                     return false | ||
|  |                 } | ||
|  |                 left = mid + 1 | ||
|  |             } else { | ||
|  |                 return true | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     var isZeroWidthJoiner: Bool { | ||
|  |         return value == 8205 | ||
|  |     } | ||
|  | } |