├── .gitignore ├── .slather.yml ├── .swift-version ├── .travis.yml ├── CONTRIBUTING.md ├── Example └── SmileDemo │ ├── Podfile │ ├── Podfile.lock │ ├── SmileDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── SmileDemo.xcscheme │ ├── SmileDemo.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── SmileDemo │ ├── Base.lproj │ └── LaunchScreen.storyboard │ ├── Info.plist │ ├── Resources │ └── Assets.xcassets │ │ └── AppIcon.appiconset │ │ └── Contents.json │ └── Sources │ ├── AppDelegate.swift │ └── ViewController.swift ├── LICENSE.md ├── Package.swift ├── README.md ├── Screenshots └── Banner.png ├── Script ├── node_modules │ ├── fs │ │ ├── index.js │ │ └── package.json │ ├── http │ │ └── package.json │ └── https │ │ └── package.json ├── npm-debug.log ├── package.json └── parser.js ├── Smile.podspec ├── Smile.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── Smile-Mac.xcscheme │ └── Smile-iOS.xcscheme ├── Smile ├── Info-Mac.plist └── Info-iOS.plist ├── SmileTests ├── Info-Mac.plist ├── Info-iOS.plist └── Tests.swift └── Sources ├── Categories.swift ├── Emoji.swift ├── Sequence.swift ├── Smile.swift └── Utils.swift /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | Icon 6 | ._* 7 | .Spotlight-V100 8 | .Trashes 9 | 10 | # Xcode 11 | # 12 | build/ 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata 22 | *.xccheckout 23 | *.moved-aside 24 | DerivedData 25 | *.hmap 26 | *.ipa 27 | *.xcuserstate 28 | 29 | # CocoaPods 30 | Pods 31 | 32 | # Carthage 33 | Carthage 34 | 35 | # SPM 36 | .build/ 37 | -------------------------------------------------------------------------------- /.slather.yml: -------------------------------------------------------------------------------- 1 | ci_service: travis_ci 2 | coverage_service: coveralls 3 | xcodeproj: Smile.xcodeproj 4 | source_directory: Sources 5 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.0 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | osx_image: xcode7.3 2 | language: objective-c 3 | 4 | before_install: 5 | - brew update 6 | - if brew outdated | grep -qx carthage; then brew upgrade carthage; fi 7 | - travis_wait 35 carthage bootstrap --platform iOS,Mac 8 | 9 | script: 10 | - xcodebuild clean build -project Smile.xcodeproj -scheme Smile-iOS -sdk iphonesimulator 11 | - xcodebuild test -project Smile.xcodeproj -scheme Smile-iOS -sdk iphonesimulator 12 | - xcodebuild clean build -project Smile.xcodeproj -scheme Smile-Mac -sdk macosx 13 | - xcodebuild test -project Smile.xcodeproj -scheme Smile-Mac -sdk macosx 14 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | GitHub Issues is for reporting bugs, discussing features and general feedback in **Smile**. Be sure to check our [documentation](http://cocoadocs.org/docsets/Smile), [FAQ](https://github.com/onmyway133/Smile/wiki/FAQ) and [past issues](https://github.com/onmyway133/Smile/issues?state=closed) before opening any new issues. 2 | 3 | If you are posting about a crash in your application, a stack trace is helpful, but additional context, in the form of code and explanation, is necessary to be of any use. 4 | -------------------------------------------------------------------------------- /Example/SmileDemo/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '8.0' 4 | 5 | target 'SmileDemo' do 6 | pod 'Smile', path: '../../' 7 | end 8 | 9 | -------------------------------------------------------------------------------- /Example/SmileDemo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Smile (2.1.1) 3 | 4 | DEPENDENCIES: 5 | - Smile (from `../../`) 6 | 7 | EXTERNAL SOURCES: 8 | Smile: 9 | :path: "../../" 10 | 11 | SPEC CHECKSUMS: 12 | Smile: 50023dc068fb11984df713916970b89e6b705d68 13 | 14 | PODFILE CHECKSUM: 2a22bdd6f8616b3738af9f9fd7985e146d46ccdb 15 | 16 | COCOAPODS: 1.10.1 17 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CED3E4A7D4EFDBAEFDB69364 /* Pods_SmileDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EA9222FC584E401BC787699 /* Pods_SmileDemo.framework */; }; 11 | D5C7F74E1C3BC9CE008CDDBA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */; }; 12 | D5C7F75B1C3BCA1E008CDDBA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */; }; 13 | D5C7F75C1C3BCA1E008CDDBA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */; }; 14 | D5C7F75D1C3BCA1E008CDDBA /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | 7BC293A7219067CF36D7722D /* Pods-SmileDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SmileDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-SmileDemo/Pods-SmileDemo.release.xcconfig"; sourceTree = ""; }; 19 | 86162FD037018B2C29483948 /* Pods-SmileDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SmileDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SmileDemo/Pods-SmileDemo.debug.xcconfig"; sourceTree = ""; }; 20 | 8EA9222FC584E401BC787699 /* Pods_SmileDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SmileDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | D5C7F7401C3BC9CE008CDDBA /* SmileDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SmileDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | D5C7F74D1C3BC9CE008CDDBA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 23 | D5C7F74F1C3BC9CE008CDDBA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 24 | D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 25 | D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 26 | D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | D5C7F73D1C3BC9CE008CDDBA /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | CED3E4A7D4EFDBAEFDB69364 /* Pods_SmileDemo.framework in Frameworks */, 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | 52BF78DDC1B850820471A1EA /* Pods */ = { 42 | isa = PBXGroup; 43 | children = ( 44 | 86162FD037018B2C29483948 /* Pods-SmileDemo.debug.xcconfig */, 45 | 7BC293A7219067CF36D7722D /* Pods-SmileDemo.release.xcconfig */, 46 | ); 47 | name = Pods; 48 | sourceTree = ""; 49 | }; 50 | BE65CFF3FDCE7DA9E898D6E7 /* Frameworks */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 8EA9222FC584E401BC787699 /* Pods_SmileDemo.framework */, 54 | ); 55 | name = Frameworks; 56 | sourceTree = ""; 57 | }; 58 | D5C7F7371C3BC9CE008CDDBA = { 59 | isa = PBXGroup; 60 | children = ( 61 | D5C7F7421C3BC9CE008CDDBA /* SmileDemo */, 62 | D5C7F7411C3BC9CE008CDDBA /* Products */, 63 | 52BF78DDC1B850820471A1EA /* Pods */, 64 | BE65CFF3FDCE7DA9E898D6E7 /* Frameworks */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | D5C7F7411C3BC9CE008CDDBA /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | D5C7F7401C3BC9CE008CDDBA /* SmileDemo.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | D5C7F7421C3BC9CE008CDDBA /* SmileDemo */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | D5C7F7561C3BCA1E008CDDBA /* Resources */, 80 | D5C7F7581C3BCA1E008CDDBA /* Sources */, 81 | D5C7F7551C3BC9EA008CDDBA /* Supporting Files */, 82 | ); 83 | path = SmileDemo; 84 | sourceTree = ""; 85 | }; 86 | D5C7F7551C3BC9EA008CDDBA /* Supporting Files */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */, 90 | D5C7F74F1C3BC9CE008CDDBA /* Info.plist */, 91 | ); 92 | name = "Supporting Files"; 93 | sourceTree = ""; 94 | }; 95 | D5C7F7561C3BCA1E008CDDBA /* Resources */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | D5C7F7571C3BCA1E008CDDBA /* Assets.xcassets */, 99 | ); 100 | path = Resources; 101 | sourceTree = ""; 102 | }; 103 | D5C7F7581C3BCA1E008CDDBA /* Sources */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | D5C7F7591C3BCA1E008CDDBA /* AppDelegate.swift */, 107 | D5C7F75A1C3BCA1E008CDDBA /* ViewController.swift */, 108 | ); 109 | path = Sources; 110 | sourceTree = ""; 111 | }; 112 | /* End PBXGroup section */ 113 | 114 | /* Begin PBXNativeTarget section */ 115 | D5C7F73F1C3BC9CE008CDDBA /* SmileDemo */ = { 116 | isa = PBXNativeTarget; 117 | buildConfigurationList = D5C7F7521C3BC9CE008CDDBA /* Build configuration list for PBXNativeTarget "SmileDemo" */; 118 | buildPhases = ( 119 | 958879E5FAE1F9CDE66F25C1 /* [CP] Check Pods Manifest.lock */, 120 | 9658ED299D391486F6CB3C02 /* 📦 Check Pods Manifest.lock */, 121 | D5C7F73C1C3BC9CE008CDDBA /* Sources */, 122 | D5C7F73D1C3BC9CE008CDDBA /* Frameworks */, 123 | D5C7F73E1C3BC9CE008CDDBA /* Resources */, 124 | 48BB4DBEF34A3FDA0D35C4F1 /* 📦 Embed Pods Frameworks */, 125 | D2A827DAD3D200AAC493F087 /* [CP] Embed Pods Frameworks */, 126 | ); 127 | buildRules = ( 128 | ); 129 | dependencies = ( 130 | ); 131 | name = SmileDemo; 132 | productName = SmileDemo; 133 | productReference = D5C7F7401C3BC9CE008CDDBA /* SmileDemo.app */; 134 | productType = "com.apple.product-type.application"; 135 | }; 136 | /* End PBXNativeTarget section */ 137 | 138 | /* Begin PBXProject section */ 139 | D5C7F7381C3BC9CE008CDDBA /* Project object */ = { 140 | isa = PBXProject; 141 | attributes = { 142 | LastSwiftUpdateCheck = 0720; 143 | LastUpgradeCheck = 0720; 144 | ORGANIZATIONNAME = "Hyper Interaktiv AS"; 145 | TargetAttributes = { 146 | D5C7F73F1C3BC9CE008CDDBA = { 147 | CreatedOnToolsVersion = 7.2; 148 | }; 149 | }; 150 | }; 151 | buildConfigurationList = D5C7F73B1C3BC9CE008CDDBA /* Build configuration list for PBXProject "SmileDemo" */; 152 | compatibilityVersion = "Xcode 3.2"; 153 | developmentRegion = English; 154 | hasScannedForEncodings = 0; 155 | knownRegions = ( 156 | English, 157 | en, 158 | Base, 159 | ); 160 | mainGroup = D5C7F7371C3BC9CE008CDDBA; 161 | productRefGroup = D5C7F7411C3BC9CE008CDDBA /* Products */; 162 | projectDirPath = ""; 163 | projectRoot = ""; 164 | targets = ( 165 | D5C7F73F1C3BC9CE008CDDBA /* SmileDemo */, 166 | ); 167 | }; 168 | /* End PBXProject section */ 169 | 170 | /* Begin PBXResourcesBuildPhase section */ 171 | D5C7F73E1C3BC9CE008CDDBA /* Resources */ = { 172 | isa = PBXResourcesBuildPhase; 173 | buildActionMask = 2147483647; 174 | files = ( 175 | D5C7F75B1C3BCA1E008CDDBA /* Assets.xcassets in Resources */, 176 | D5C7F74E1C3BC9CE008CDDBA /* LaunchScreen.storyboard in Resources */, 177 | ); 178 | runOnlyForDeploymentPostprocessing = 0; 179 | }; 180 | /* End PBXResourcesBuildPhase section */ 181 | 182 | /* Begin PBXShellScriptBuildPhase section */ 183 | 48BB4DBEF34A3FDA0D35C4F1 /* 📦 Embed Pods Frameworks */ = { 184 | isa = PBXShellScriptBuildPhase; 185 | buildActionMask = 2147483647; 186 | files = ( 187 | ); 188 | inputPaths = ( 189 | ); 190 | name = "📦 Embed Pods Frameworks"; 191 | outputPaths = ( 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | shellPath = /bin/sh; 195 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SmileDemo/Pods-SmileDemo-frameworks.sh\"\n"; 196 | showEnvVarsInLog = 0; 197 | }; 198 | 958879E5FAE1F9CDE66F25C1 /* [CP] Check Pods Manifest.lock */ = { 199 | isa = PBXShellScriptBuildPhase; 200 | buildActionMask = 2147483647; 201 | files = ( 202 | ); 203 | inputFileListPaths = ( 204 | ); 205 | inputPaths = ( 206 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 207 | "${PODS_ROOT}/Manifest.lock", 208 | ); 209 | name = "[CP] Check Pods Manifest.lock"; 210 | outputFileListPaths = ( 211 | ); 212 | outputPaths = ( 213 | "$(DERIVED_FILE_DIR)/Pods-SmileDemo-checkManifestLockResult.txt", 214 | ); 215 | runOnlyForDeploymentPostprocessing = 0; 216 | shellPath = /bin/sh; 217 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 218 | showEnvVarsInLog = 0; 219 | }; 220 | 9658ED299D391486F6CB3C02 /* 📦 Check Pods Manifest.lock */ = { 221 | isa = PBXShellScriptBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | ); 225 | inputPaths = ( 226 | ); 227 | name = "📦 Check Pods Manifest.lock"; 228 | outputPaths = ( 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | shellPath = /bin/sh; 232 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 233 | showEnvVarsInLog = 0; 234 | }; 235 | D2A827DAD3D200AAC493F087 /* [CP] Embed Pods Frameworks */ = { 236 | isa = PBXShellScriptBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | inputPaths = ( 241 | "${PODS_ROOT}/Target Support Files/Pods-SmileDemo/Pods-SmileDemo-frameworks.sh", 242 | "${BUILT_PRODUCTS_DIR}/Smile/Smile.framework", 243 | ); 244 | name = "[CP] Embed Pods Frameworks"; 245 | outputPaths = ( 246 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Smile.framework", 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | shellPath = /bin/sh; 250 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SmileDemo/Pods-SmileDemo-frameworks.sh\"\n"; 251 | showEnvVarsInLog = 0; 252 | }; 253 | /* End PBXShellScriptBuildPhase section */ 254 | 255 | /* Begin PBXSourcesBuildPhase section */ 256 | D5C7F73C1C3BC9CE008CDDBA /* Sources */ = { 257 | isa = PBXSourcesBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | D5C7F75D1C3BCA1E008CDDBA /* ViewController.swift in Sources */, 261 | D5C7F75C1C3BCA1E008CDDBA /* AppDelegate.swift in Sources */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | /* End PBXSourcesBuildPhase section */ 266 | 267 | /* Begin PBXVariantGroup section */ 268 | D5C7F74C1C3BC9CE008CDDBA /* LaunchScreen.storyboard */ = { 269 | isa = PBXVariantGroup; 270 | children = ( 271 | D5C7F74D1C3BC9CE008CDDBA /* Base */, 272 | ); 273 | name = LaunchScreen.storyboard; 274 | sourceTree = ""; 275 | }; 276 | /* End PBXVariantGroup section */ 277 | 278 | /* Begin XCBuildConfiguration section */ 279 | D5C7F7501C3BC9CE008CDDBA /* Debug */ = { 280 | isa = XCBuildConfiguration; 281 | buildSettings = { 282 | ALWAYS_SEARCH_USER_PATHS = NO; 283 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 284 | CLANG_CXX_LIBRARY = "libc++"; 285 | CLANG_ENABLE_MODULES = YES; 286 | CLANG_ENABLE_OBJC_ARC = YES; 287 | CLANG_WARN_BOOL_CONVERSION = YES; 288 | CLANG_WARN_CONSTANT_CONVERSION = YES; 289 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 290 | CLANG_WARN_EMPTY_BODY = YES; 291 | CLANG_WARN_ENUM_CONVERSION = YES; 292 | CLANG_WARN_INT_CONVERSION = YES; 293 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 294 | CLANG_WARN_UNREACHABLE_CODE = YES; 295 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 296 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 297 | COPY_PHASE_STRIP = NO; 298 | DEBUG_INFORMATION_FORMAT = dwarf; 299 | ENABLE_STRICT_OBJC_MSGSEND = YES; 300 | ENABLE_TESTABILITY = YES; 301 | GCC_C_LANGUAGE_STANDARD = gnu99; 302 | GCC_DYNAMIC_NO_PIC = NO; 303 | GCC_NO_COMMON_BLOCKS = YES; 304 | GCC_OPTIMIZATION_LEVEL = 0; 305 | GCC_PREPROCESSOR_DEFINITIONS = ( 306 | "DEBUG=1", 307 | "$(inherited)", 308 | ); 309 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 310 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 311 | GCC_WARN_UNDECLARED_SELECTOR = YES; 312 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 313 | GCC_WARN_UNUSED_FUNCTION = YES; 314 | GCC_WARN_UNUSED_VARIABLE = YES; 315 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 316 | MTL_ENABLE_DEBUG_INFO = YES; 317 | ONLY_ACTIVE_ARCH = YES; 318 | SDKROOT = iphoneos; 319 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 320 | }; 321 | name = Debug; 322 | }; 323 | D5C7F7511C3BC9CE008CDDBA /* Release */ = { 324 | isa = XCBuildConfiguration; 325 | buildSettings = { 326 | ALWAYS_SEARCH_USER_PATHS = NO; 327 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 328 | CLANG_CXX_LIBRARY = "libc++"; 329 | CLANG_ENABLE_MODULES = YES; 330 | CLANG_ENABLE_OBJC_ARC = YES; 331 | CLANG_WARN_BOOL_CONVERSION = YES; 332 | CLANG_WARN_CONSTANT_CONVERSION = YES; 333 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 334 | CLANG_WARN_EMPTY_BODY = YES; 335 | CLANG_WARN_ENUM_CONVERSION = YES; 336 | CLANG_WARN_INT_CONVERSION = YES; 337 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 338 | CLANG_WARN_UNREACHABLE_CODE = YES; 339 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 340 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 341 | COPY_PHASE_STRIP = NO; 342 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 343 | ENABLE_NS_ASSERTIONS = NO; 344 | ENABLE_STRICT_OBJC_MSGSEND = YES; 345 | GCC_C_LANGUAGE_STANDARD = gnu99; 346 | GCC_NO_COMMON_BLOCKS = YES; 347 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 348 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 349 | GCC_WARN_UNDECLARED_SELECTOR = YES; 350 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 351 | GCC_WARN_UNUSED_FUNCTION = YES; 352 | GCC_WARN_UNUSED_VARIABLE = YES; 353 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 354 | MTL_ENABLE_DEBUG_INFO = NO; 355 | SDKROOT = iphoneos; 356 | VALIDATE_PRODUCT = YES; 357 | }; 358 | name = Release; 359 | }; 360 | D5C7F7531C3BC9CE008CDDBA /* Debug */ = { 361 | isa = XCBuildConfiguration; 362 | baseConfigurationReference = 86162FD037018B2C29483948 /* Pods-SmileDemo.debug.xcconfig */; 363 | buildSettings = { 364 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 365 | INFOPLIST_FILE = SmileDemo/Info.plist; 366 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 367 | PRODUCT_BUNDLE_IDENTIFIER = com.fantageek.Smile.SmileDemo; 368 | PRODUCT_NAME = "$(TARGET_NAME)"; 369 | SWIFT_VERSION = 5.0; 370 | }; 371 | name = Debug; 372 | }; 373 | D5C7F7541C3BC9CE008CDDBA /* Release */ = { 374 | isa = XCBuildConfiguration; 375 | baseConfigurationReference = 7BC293A7219067CF36D7722D /* Pods-SmileDemo.release.xcconfig */; 376 | buildSettings = { 377 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 378 | INFOPLIST_FILE = SmileDemo/Info.plist; 379 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 380 | PRODUCT_BUNDLE_IDENTIFIER = com.fantageek.Smile.SmileDemo; 381 | PRODUCT_NAME = "$(TARGET_NAME)"; 382 | SWIFT_VERSION = 5.0; 383 | }; 384 | name = Release; 385 | }; 386 | /* End XCBuildConfiguration section */ 387 | 388 | /* Begin XCConfigurationList section */ 389 | D5C7F73B1C3BC9CE008CDDBA /* Build configuration list for PBXProject "SmileDemo" */ = { 390 | isa = XCConfigurationList; 391 | buildConfigurations = ( 392 | D5C7F7501C3BC9CE008CDDBA /* Debug */, 393 | D5C7F7511C3BC9CE008CDDBA /* Release */, 394 | ); 395 | defaultConfigurationIsVisible = 0; 396 | defaultConfigurationName = Release; 397 | }; 398 | D5C7F7521C3BC9CE008CDDBA /* Build configuration list for PBXNativeTarget "SmileDemo" */ = { 399 | isa = XCConfigurationList; 400 | buildConfigurations = ( 401 | D5C7F7531C3BC9CE008CDDBA /* Debug */, 402 | D5C7F7541C3BC9CE008CDDBA /* Release */, 403 | ); 404 | defaultConfigurationIsVisible = 0; 405 | defaultConfigurationName = Release; 406 | }; 407 | /* End XCConfigurationList section */ 408 | }; 409 | rootObject = D5C7F7381C3BC9CE008CDDBA /* Project object */; 410 | } 411 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo.xcodeproj/xcshareddata/xcschemes/SmileDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo/Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Smile 3 | 4 | @UIApplicationMain 5 | class AppDelegate: UIResponder, UIApplicationDelegate { 6 | 7 | var window: UIWindow? 8 | 9 | lazy var navigationController: UINavigationController = { [unowned self] in 10 | let controller = UINavigationController(rootViewController: self.viewController) 11 | return controller 12 | }() 13 | 14 | lazy var viewController: ViewController = { 15 | let controller = ViewController() 16 | return controller 17 | }() 18 | 19 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { 20 | window = UIWindow(frame: UIScreen.main.bounds) 21 | window?.rootViewController = navigationController 22 | window?.makeKeyAndVisible() 23 | return true 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Example/SmileDemo/SmileDemo/Sources/ViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Smile 3 | 4 | class ViewController: UIViewController { 5 | 6 | override func viewDidLoad() { 7 | super.viewDidLoad() 8 | view.backgroundColor = UIColor.white 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Licensed under the **MIT** license 2 | 3 | > Copyright (c) 2015 Khoa Pham 4 | > 5 | > Permission is hereby granted, free of charge, to any person obtaining 6 | > a copy of this software and associated documentation files (the 7 | > "Software"), to deal in the Software without restriction, including 8 | > without limitation the rights to use, copy, modify, merge, publish, 9 | > distribute, sublicense, and/or sell copies of the Software, and to 10 | > permit persons to whom the Software is furnished to do so, subject to 11 | > the following conditions: 12 | > 13 | > The above copyright notice and this permission notice shall be 14 | > included in all copies or substantial portions of the Software. 15 | > 16 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.2 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Smile", 8 | products: [ 9 | // Products define the executables and libraries produced by a package, and make them visible to other packages. 10 | .library( 11 | name: "Smile", 12 | targets: ["Smile"]), 13 | ], 14 | dependencies: [ 15 | // Dependencies declare other packages that this package depends on. 16 | // .package(url: /* package url */, from: "1.0.0"), 17 | ], 18 | targets: [ 19 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 20 | // Targets can depend on other targets in this package, and on products in packages which this package depends on. 21 | .target( 22 | name: "Smile", 23 | dependencies: [], 24 | path: "Sources"), 25 | .testTarget( 26 | name: "SmileTests", 27 | dependencies: ["Smile"], 28 | path: "SmileTests"), 29 | ] 30 | ) 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Smile 2 | 3 | ❤️ Support my apps ❤️ 4 | 5 | - [Push Hero - pure Swift native macOS application to test push notifications](https://onmyway133.com/pushhero) 6 | - [PastePal - Pasteboard, note and shortcut manager](https://onmyway133.com/pastepal) 7 | - [Quick Check - smart todo manager](https://onmyway133.com/quickcheck) 8 | - [Alias - App and file shortcut manager](https://onmyway133.com/alias) 9 | - [My other apps](https://onmyway133.com/apps/) 10 | 11 | ❤️❤️😇😍🤘❤️❤️ 12 | 13 | Emoji in Swift. For reference, go to https://github.com/onmyway133/emoji 14 | 15 | [![CI Status](http://img.shields.io/travis/onmyway133/Smile.svg?style=flat)](https://travis-ci.org/onmyway133/Smile) 16 | [![Version](https://img.shields.io/cocoapods/v/Smile.svg?style=flat)](http://cocoadocs.org/docsets/Smile) 17 | [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 18 | [![License](https://img.shields.io/cocoapods/l/Smile.svg?style=flat)](http://cocoadocs.org/docsets/Smile) 19 | [![Platform](https://img.shields.io/cocoapods/p/Smile.svg?style=flat)](http://cocoadocs.org/docsets/Smile) 20 | ![Swift](https://img.shields.io/badge/%20in-swift%204.0-orange.svg) 21 | 22 | ![](Screenshots/Banner.png) 23 | 24 | ## Features 25 | 26 | - [x] Support emoji sequences 27 | - [x] Handle skin tones, marks, genders, variation selectors 28 | - [x] Support new iOS emojis 29 | 30 | ### List 31 | 32 | #### List all emojis 33 | 34 | ```swift 35 | Smile.list() 36 | emojiList 37 | emojiCategories 38 | ``` 39 | 40 | ### Emoji 41 | 42 | #### Check if a character is emoji 43 | 44 | ```swift 45 | Smile.isEmoji(character: "🎉") // true 46 | ``` 47 | 48 | #### Check if a string contains any emoji 49 | 50 | ```swift 51 | Smile.containsEmoji(string: "🎈 and 🎁") // true 52 | ``` 53 | 54 | #### Count number of emoji characters in a string 55 | 56 | ```swift 57 | Smile.countEmoji("🎈 and 🎁") // 2 58 | ``` 59 | 60 | #### Count number of non-emoji characters in a string 61 | 62 | ```swift 63 | Smile.countNonEmoji("🎈 and 🎁") // 5 64 | ``` 65 | 66 | #### Check if a string contains only a single emoji 67 | 68 | ```swift 69 | Smile.isSingleEmoji("🎈 and 🎁") // false 70 | Smile.isSingleEmoji("👨‍") // true 71 | Smile.isSingleEmoji("👩🏽‍🧑‍") // false 72 | Smile.isSingleEmoji("just plain text") // false 73 | ``` 74 | 75 | #### Check if a string contains only emojis 76 | 77 | ```swift 78 | Smile.isEmojiOnly("🎈 and 🎁") // false 79 | Smile.isEmojiOnly("👨‍") // true 80 | Smile.isEmojiOnly("👩🏽‍🧑‍") // true 81 | Smile.isEmojiOnly("just plain text") // false 82 | ``` 83 | 84 | #### Get emoji from unicode values 85 | 86 | ```swift 87 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x1F47B]), "👻") 88 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x0001F468, 0x200D, 0x2708]), "👨‍✈") 89 | ``` 90 | 91 | #### Unmodify an emoji 92 | 93 | ```swift 94 | Smile.unmodify(emoji: "👨🏿") // 👨 95 | ``` 96 | 97 | ### Name 98 | 99 | #### Show standard name of an emoji 100 | 101 | ```swift 102 | Smile.name(emoji: "🇳🇴") // ["REGIONAL INDICATOR SYMBOL LETTER N", "REGIONAL INDICATOR SYMBOL LETTER O"]) 103 | ``` 104 | 105 | #### Search emoji by keywords 106 | 107 | ```swift 108 | Smile.emojis(keywords: ["GRINNING"]) // 😁, 😸 109 | ``` 110 | 111 | ### Flag 112 | 113 | #### Search emoji flag by country code 114 | 115 | ```swift 116 | Smile.emoji(countryCode: "no") // 🇳🇴 117 | ``` 118 | 119 | ### Alias 120 | 121 | #### Search emoji by alias 122 | 123 | Emoji data is from https://github.com/github/gemoji/blob/master/db/emoji.json 124 | 125 | ```swift 126 | Smile.emoji(alias: "japanese_castle") // 🏯 127 | ``` 128 | 129 | #### Find alias by emoji 130 | 131 | ```swift 132 | Smile.alias(emoji: "🏯") // japanese_castle 133 | ``` 134 | 135 | #### Replace alias within a string 136 | 137 | ```swift 138 | Smile.replaceAlias(string: ":santa: is coming to :european_castle:") // 🎅 is coming to 🏰 139 | ``` 140 | 141 | ### Category 142 | 143 | #### Find category of emoji 144 | 145 | Emoji data is from https://github.com/github/gemoji/blob/master/db/Category-Emoji.json 146 | 147 | ```swift 148 | Smile.category(emoji: "😁") // people 149 | ``` 150 | 151 | ### Manipulation 152 | 153 | #### Extract all emojis within a string 154 | 155 | ```swift 156 | Smile.extractEmojis(string: "Find 🔑and🔎") // 🔑🔎 157 | ``` 158 | 159 | #### Remove all emojis within a string 160 | 161 | ```swift 162 | Smile.removeEmojis(string: "Find 🔑and🔎") // Find and 163 | ``` 164 | 165 | #### Assemble 166 | 167 | ```swift 168 | Smile.assemble(emojis: ["👨", "🏫") // 👨‍🏫 169 | Smile.assemble(emojis: ["👨", "👩", "👧", "👦"] // 👨‍👩‍👧‍👦 170 | ``` 171 | 172 | #### Disassemble 173 | 174 | ```swift 175 | Smile.disassemble(emoji: "👨‍🏫") // [👨, 🏫] 176 | ``` 177 | 178 | ## Script 179 | 180 | Update emoji list by running 181 | 182 | ```js 183 | node parser.js 184 | ``` 185 | 186 | ## Installation 187 | 188 | **Smile** is available through [CocoaPods](http://cocoapods.org). To install 189 | it, simply add the following line to your Podfile: 190 | 191 | ```ruby 192 | pod 'Smile' 193 | ``` 194 | 195 | **Smile** is also available through [Carthage](https://github.com/Carthage/Carthage). 196 | To install just write into your Cartfile: 197 | 198 | ```ruby 199 | github "onmyway133/Smile" 200 | ``` 201 | 202 | ## Author 203 | 204 | Khoa Pham, onmyway133@gmail.com 205 | 206 | ## Contributing 207 | 208 | We would love you to contribute to **Smile**, check the [CONTRIBUTING](https://github.com/onmyway133/Smile/blob/master/CONTRIBUTING.md) file for more info. 209 | 210 | ## License 211 | 212 | **Smile** is available under the MIT license. See the [LICENSE](https://github.com/onmyway133/Smile/blob/master/LICENSE.md) file for more info. 213 | -------------------------------------------------------------------------------- /Screenshots/Banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onmyway133/Smile/2afe344d17f30dee646ef4c54a6926b6dd021e7d/Screenshots/Banner.png -------------------------------------------------------------------------------- /Script/node_modules/fs/index.js: -------------------------------------------------------------------------------- 1 | console.log("I'm `fs` modules"); 2 | -------------------------------------------------------------------------------- /Script/node_modules/fs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_args": [ 3 | [ 4 | "fs", 5 | "/Users/khoa/XcodeProject3/Smile/Script" 6 | ] 7 | ], 8 | "_from": "fs@latest", 9 | "_id": "fs@0.0.2", 10 | "_inCache": true, 11 | "_installable": true, 12 | "_location": "/fs", 13 | "_npmUser": { 14 | "email": "alsotang@gmail.com", 15 | "name": "alsotang" 16 | }, 17 | "_npmVersion": "1.4.14", 18 | "_phantomChildren": {}, 19 | "_requested": { 20 | "name": "fs", 21 | "raw": "fs", 22 | "rawSpec": "", 23 | "scope": null, 24 | "spec": "latest", 25 | "type": "tag" 26 | }, 27 | "_requiredBy": [ 28 | "#USER" 29 | ], 30 | "_resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", 31 | "_shasum": "e1f244ef3933c1b2a64bd4799136060d0f5914f8", 32 | "_shrinkwrap": null, 33 | "_spec": "fs", 34 | "_where": "/Users/khoa/XcodeProject3/Smile/Script", 35 | "author": "", 36 | "dependencies": {}, 37 | "description": "", 38 | "devDependencies": {}, 39 | "directories": {}, 40 | "dist": { 41 | "shasum": "e1f244ef3933c1b2a64bd4799136060d0f5914f8", 42 | "tarball": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz" 43 | }, 44 | "license": "MIT", 45 | "main": "index.js", 46 | "maintainers": [ 47 | { 48 | "name": "alsotang", 49 | "email": "alsotang@gmail.com" 50 | } 51 | ], 52 | "name": "fs", 53 | "optionalDependencies": {}, 54 | "readme": "ERROR: No README data found!", 55 | "scripts": { 56 | "test": "echo \"Error: no test specified\" && exit 1" 57 | }, 58 | "version": "0.0.2" 59 | } 60 | -------------------------------------------------------------------------------- /Script/node_modules/http/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_args": [ 3 | [ 4 | "http", 5 | "/Users/khoa/XcodeProject3/Smile/Script" 6 | ] 7 | ], 8 | "_from": "http@latest", 9 | "_id": "http@0.0.0", 10 | "_inCache": true, 11 | "_installable": true, 12 | "_location": "/http", 13 | "_npmUser": { 14 | "email": "yuanyan.cao@gmail.com", 15 | "name": "yuanyan" 16 | }, 17 | "_npmVersion": "1.3.15", 18 | "_phantomChildren": {}, 19 | "_requested": { 20 | "name": "http", 21 | "raw": "http", 22 | "rawSpec": "", 23 | "scope": null, 24 | "spec": "latest", 25 | "type": "tag" 26 | }, 27 | "_requiredBy": [ 28 | "#USER" 29 | ], 30 | "_resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz", 31 | "_shasum": "86e6326d29c5d039de9fac584a45689f929f4f72", 32 | "_shrinkwrap": null, 33 | "_spec": "http", 34 | "_where": "/Users/khoa/XcodeProject3/Smile/Script", 35 | "author": "", 36 | "dependencies": {}, 37 | "devDependencies": {}, 38 | "directories": {}, 39 | "dist": { 40 | "shasum": "86e6326d29c5d039de9fac584a45689f929f4f72", 41 | "tarball": "https://registry.npmjs.org/http/-/http-0.0.0.tgz" 42 | }, 43 | "license": "BSD-2-Clause", 44 | "main": "index.js", 45 | "maintainers": [ 46 | { 47 | "name": "yuanyan", 48 | "email": "yuanyan.cao@gmail.com" 49 | } 50 | ], 51 | "name": "http", 52 | "optionalDependencies": {}, 53 | "readme": "ERROR: No README data found!", 54 | "scripts": { 55 | "test": "echo \"Error: no test specified\" && exit 1" 56 | }, 57 | "version": "0.0.0" 58 | } 59 | -------------------------------------------------------------------------------- /Script/node_modules/https/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_args": [ 3 | [ 4 | "https", 5 | "/Users/khoa/XcodeProject3/Smile/Script" 6 | ] 7 | ], 8 | "_from": "https@latest", 9 | "_id": "https@1.0.0", 10 | "_inCache": true, 11 | "_installable": true, 12 | "_location": "/https", 13 | "_nodeVersion": "0.10.3", 14 | "_npmUser": { 15 | "email": "hardus@sunfork.com", 16 | "name": "hardus" 17 | }, 18 | "_npmVersion": "2.1.18", 19 | "_phantomChildren": {}, 20 | "_requested": { 21 | "name": "https", 22 | "raw": "https", 23 | "rawSpec": "", 24 | "scope": null, 25 | "spec": "latest", 26 | "type": "tag" 27 | }, 28 | "_requiredBy": [ 29 | "#USER" 30 | ], 31 | "_resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", 32 | "_shasum": "3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4", 33 | "_shrinkwrap": null, 34 | "_spec": "https", 35 | "_where": "/Users/khoa/XcodeProject3/Smile/Script", 36 | "author": { 37 | "email": "hardus@sunfork.com", 38 | "name": "hardus van der berg", 39 | "url": "http://www.sunfork.com" 40 | }, 41 | "dependencies": {}, 42 | "description": "https mediation", 43 | "devDependencies": {}, 44 | "directories": {}, 45 | "dist": { 46 | "shasum": "3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4", 47 | "tarball": "https://registry.npmjs.org/https/-/https-1.0.0.tgz" 48 | }, 49 | "keywords": [ 50 | "https", 51 | "mediation" 52 | ], 53 | "license": "ISC", 54 | "main": "index.js", 55 | "maintainers": [ 56 | { 57 | "name": "hardus", 58 | "email": "hardus@sunfork.com" 59 | } 60 | ], 61 | "name": "https", 62 | "optionalDependencies": {}, 63 | "readme": "ERROR: No README data found!", 64 | "scripts": { 65 | "test": "echo \"Error: no test specified\" && exit 1" 66 | }, 67 | "version": "1.0.0" 68 | } 69 | -------------------------------------------------------------------------------- /Script/npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ '/usr/local/bin/node', 3 | 1 verbose cli '/usr/local/bin/npm', 4 | 1 verbose cli 'start', 5 | 1 verbose cli 'parser.js' ] 6 | 2 info using npm@3.6.0 7 | 3 info using node@v5.7.0 8 | 4 verbose run-script [ 'prestart', 'start', 'poststart' ] 9 | 5 info lifecycle parser@1.0.0~prestart: parser@1.0.0 10 | 6 silly lifecycle parser@1.0.0~prestart: no script for prestart, continuing 11 | 7 info lifecycle parser@1.0.0~start: parser@1.0.0 12 | 8 verbose lifecycle parser@1.0.0~start: unsafe-perm in lifecycle true 13 | 9 verbose lifecycle parser@1.0.0~start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/khoa/XcodeProject3/Smile/Script/node_modules/.bin:/Users/khoa/.swiftenv/shims:/Users/khoa/.swiftenv/shims:/Users/khoa/.swiftenv/shims:/Users/khoa/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 14 | 10 verbose lifecycle parser@1.0.0~start: CWD: /Users/khoa/XcodeProject3/Smile/Script 15 | 11 silly lifecycle parser@1.0.0~start: Args: [ '-c', 'node parser.js "parser.js"' ] 16 | 12 silly lifecycle parser@1.0.0~start: Returned: code: 1 signal: null 17 | 13 info lifecycle parser@1.0.0~start: Failed to exec start script 18 | 14 verbose stack Error: parser@1.0.0 start: `node parser.js "parser.js"` 19 | 14 verbose stack Exit status 1 20 | 14 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:232:16) 21 | 14 verbose stack at emitTwo (events.js:100:13) 22 | 14 verbose stack at EventEmitter.emit (events.js:185:7) 23 | 14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14) 24 | 14 verbose stack at emitTwo (events.js:100:13) 25 | 14 verbose stack at ChildProcess.emit (events.js:185:7) 26 | 14 verbose stack at maybeClose (internal/child_process.js:827:16) 27 | 14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5) 28 | 15 verbose pkgid parser@1.0.0 29 | 16 verbose cwd /Users/khoa/XcodeProject3/Smile/Script 30 | 17 error Darwin 15.5.0 31 | 18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "start" "parser.js" 32 | 19 error node v5.7.0 33 | 20 error npm v3.6.0 34 | 21 error code ELIFECYCLE 35 | 22 error parser@1.0.0 start: `node parser.js "parser.js"` 36 | 22 error Exit status 1 37 | 23 error Failed at the parser@1.0.0 start script 'node parser.js "parser.js"'. 38 | 23 error Make sure you have the latest version of node.js and npm installed. 39 | 23 error If you do, this is most likely a problem with the parser package, 40 | 23 error not with npm itself. 41 | 23 error Tell the author that this fails on your system: 42 | 23 error node parser.js "parser.js" 43 | 23 error You can get information on how to open an issue for this project with: 44 | 23 error npm bugs parser 45 | 23 error Or if that isn't available, you can get their info via: 46 | 23 error npm owner ls parser 47 | 23 error There is likely additional logging output above. 48 | 24 verbose exit [ 1, true ] 49 | -------------------------------------------------------------------------------- /Script/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "parser", 3 | "version": "1.0.0", 4 | "description": "parse", 5 | "main": "parser.js", 6 | "scripts": { 7 | "start": "node parser.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "Khoa Pham", 11 | "license": "MIT" 12 | } 13 | -------------------------------------------------------------------------------- /Script/parser.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var https = require('https'); 4 | var fs = require('fs'); 5 | 6 | function download(url, callback) { 7 | https.get(url, function(res) { 8 | var data = ""; 9 | res.on('data', function (chunk) { 10 | data += chunk; 11 | }); 12 | 13 | res.on("end", function() { 14 | callback(data); 15 | }); 16 | 17 | }).on("error", function() { 18 | callback(null); 19 | }); 20 | } 21 | var categories = {}; 22 | 23 | download('https://cdn.rawgit.com/github/gemoji/master/db/emoji.json', function(data) { 24 | parse(data); 25 | parse_categories(); 26 | }); 27 | 28 | function parse(data) { 29 | const json = JSON.parse(data); 30 | 31 | var string = 'public let emojiList: [String: String] = [\n' 32 | 33 | json.forEach(function(item){ 34 | if (typeof item.aliases === "undefined" 35 | || typeof item.emoji === "undefined" 36 | || item.emoji == "undefined") { 37 | return; 38 | } 39 | 40 | const itemString = ' "' + item.aliases[0] + '": "' + item.emoji + '",\n' 41 | string = string + itemString 42 | 43 | if (!categories[item.category]) { 44 | categories[item.category] = [] 45 | } 46 | categories[item.category].push(item.emoji); 47 | }) 48 | 49 | string = string + ']' 50 | 51 | fs.writeFileSync('../Sources/Emoji.swift', string); 52 | }; 53 | 54 | 55 | function parse_categories() { 56 | var string = 'public let emojiCategories: [String: [String]] = [\n' 57 | Object.keys(categories).forEach(function(category) { 58 | const emojis = categories[category].map(function(emoji) { 59 | return '"' + emoji + '"'; 60 | }).join(","); 61 | 62 | const itemString = ' "' + category + '": [' + emojis + '],\n' 63 | string = string + itemString 64 | }); 65 | 66 | string = string + ']' 67 | 68 | fs.writeFileSync('../Sources/Categories.swift', string); 69 | }; 70 | -------------------------------------------------------------------------------- /Smile.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "Smile" 3 | s.summary = "Emoji in Swift" 4 | s.version = "2.1.1" 5 | s.homepage = "https://github.com/onmyway133/Smile" 6 | s.license = 'MIT' 7 | s.author = { "Khoa Pham" => "onmyway133@gmail.com" } 8 | s.source = { 9 | :git => "https://github.com/onmyway133/Smile.git", 10 | :tag => s.version.to_s 11 | } 12 | s.social_media_url = 'https://twitter.com/onmyway133' 13 | 14 | s.ios.deployment_target = '8.0' 15 | s.osx.deployment_target = '10.9' 16 | s.tvos.deployment_target = '9.2' 17 | 18 | s.requires_arc = true 19 | s.source_files = 'Sources/**/*' 20 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '5.0' } 21 | end 22 | -------------------------------------------------------------------------------- /Smile.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D20AFE9C1E5FA5CA00AFB7E9 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20AFE9B1E5FA5CA00AFB7E9 /* Sequence.swift */; }; 11 | D20AFE9D1E5FA5CA00AFB7E9 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20AFE9B1E5FA5CA00AFB7E9 /* Sequence.swift */; }; 12 | D23991E41D10AA3600CA2E5D /* Categories.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23991E31D10AA3600CA2E5D /* Categories.swift */; }; 13 | D23991E51D10B1FC00CA2E5D /* Categories.swift in Sources */ = {isa = PBXBuildFile; fileRef = D23991E31D10AA3600CA2E5D /* Categories.swift */; }; 14 | D2DBF1E41D04C6ED00166F7B /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1E31D04C6ED00166F7B /* Tests.swift */; }; 15 | D2DBF1E51D04C6ED00166F7B /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1E31D04C6ED00166F7B /* Tests.swift */; }; 16 | D2DBF1E81D04C71300166F7B /* Smile.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1E71D04C71300166F7B /* Smile.swift */; }; 17 | D2DBF1E91D04C71300166F7B /* Smile.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1E71D04C71300166F7B /* Smile.swift */; }; 18 | D2DBF1EB1D04D1EB00166F7B /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1EA1D04D1EB00166F7B /* Emoji.swift */; }; 19 | D2DBF1EC1D04D1EB00166F7B /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1EA1D04D1EB00166F7B /* Emoji.swift */; }; 20 | D2DBF1EE1D04D54300166F7B /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1ED1D04D54300166F7B /* Utils.swift */; }; 21 | D2DBF1EF1D04D54300166F7B /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DBF1ED1D04D54300166F7B /* Utils.swift */; }; 22 | D5B2E8AA1C3A780C00C0327D /* Smile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5B2E89F1C3A780C00C0327D /* Smile.framework */; }; 23 | D5C6294A1C3A7FAA007F7B7C /* Smile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5C629401C3A7FAA007F7B7C /* Smile.framework */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | D5B2E8AB1C3A780C00C0327D /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = D5B2E89E1C3A780C00C0327D; 32 | remoteInfo = Smile; 33 | }; 34 | D5C6294B1C3A7FAA007F7B7C /* PBXContainerItemProxy */ = { 35 | isa = PBXContainerItemProxy; 36 | containerPortal = D5B2E8961C3A780C00C0327D /* Project object */; 37 | proxyType = 1; 38 | remoteGlobalIDString = D5C6293F1C3A7FAA007F7B7C; 39 | remoteInfo = "Smile-Mac"; 40 | }; 41 | /* End PBXContainerItemProxy section */ 42 | 43 | /* Begin PBXFileReference section */ 44 | D20AFE9B1E5FA5CA00AFB7E9 /* Sequence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sequence.swift; sourceTree = ""; }; 45 | D23991E31D10AA3600CA2E5D /* Categories.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Categories.swift; sourceTree = ""; }; 46 | D2DBF1E31D04C6ED00166F7B /* Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 47 | D2DBF1E71D04C71300166F7B /* Smile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Smile.swift; sourceTree = ""; }; 48 | D2DBF1EA1D04D1EB00166F7B /* Emoji.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = ""; }; 49 | D2DBF1ED1D04D54300166F7B /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 50 | D5B2E89F1C3A780C00C0327D /* Smile.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Smile.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | D5B2E8A91C3A780C00C0327D /* Smile-iOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Smile-iOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | D5C629401C3A7FAA007F7B7C /* Smile.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Smile.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | D5C629491C3A7FAA007F7B7C /* Smile-Mac-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Smile-Mac-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | D5C6298B1C3A8BBD007F7B7C /* Info-iOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; 55 | D5C6298C1C3A8BBD007F7B7C /* Info-Mac.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Mac.plist"; sourceTree = ""; }; 56 | D5C629901C3A8BDA007F7B7C /* Info-iOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; 57 | D5C629911C3A8BDA007F7B7C /* Info-Mac.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Mac.plist"; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | D5B2E89B1C3A780C00C0327D /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | D5B2E8A61C3A780C00C0327D /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | D5B2E8AA1C3A780C00C0327D /* Smile.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | D5C6293C1C3A7FAA007F7B7C /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | D5C629461C3A7FAA007F7B7C /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | D5C6294A1C3A7FAA007F7B7C /* Smile.framework in Frameworks */, 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | /* End PBXFrameworksBuildPhase section */ 92 | 93 | /* Begin PBXGroup section */ 94 | D2DBF1E61D04C70A00166F7B /* Sources */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | D23991E31D10AA3600CA2E5D /* Categories.swift */, 98 | D2DBF1EA1D04D1EB00166F7B /* Emoji.swift */, 99 | D2DBF1E71D04C71300166F7B /* Smile.swift */, 100 | D2DBF1ED1D04D54300166F7B /* Utils.swift */, 101 | D20AFE9B1E5FA5CA00AFB7E9 /* Sequence.swift */, 102 | ); 103 | name = Sources; 104 | sourceTree = ""; 105 | }; 106 | D5B2E8951C3A780C00C0327D = { 107 | isa = PBXGroup; 108 | children = ( 109 | D5C629691C3A809D007F7B7C /* Sources */, 110 | D5C6295C1C3A800E007F7B7C /* Smile */, 111 | D5C6298F1C3A8BDA007F7B7C /* SmileTests */, 112 | D5B2E8A01C3A780C00C0327D /* Products */, 113 | ); 114 | indentWidth = 2; 115 | sourceTree = ""; 116 | tabWidth = 2; 117 | }; 118 | D5B2E8A01C3A780C00C0327D /* Products */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | D5B2E89F1C3A780C00C0327D /* Smile.framework */, 122 | D5B2E8A91C3A780C00C0327D /* Smile-iOS-Tests.xctest */, 123 | D5C629401C3A7FAA007F7B7C /* Smile.framework */, 124 | D5C629491C3A7FAA007F7B7C /* Smile-Mac-Tests.xctest */, 125 | ); 126 | name = Products; 127 | sourceTree = ""; 128 | }; 129 | D5C6295C1C3A800E007F7B7C /* Smile */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | D5C6298B1C3A8BBD007F7B7C /* Info-iOS.plist */, 133 | D5C6298C1C3A8BBD007F7B7C /* Info-Mac.plist */, 134 | ); 135 | path = Smile; 136 | sourceTree = ""; 137 | }; 138 | D5C629691C3A809D007F7B7C /* Sources */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | D2DBF1E61D04C70A00166F7B /* Sources */, 142 | ); 143 | path = Sources; 144 | sourceTree = ""; 145 | }; 146 | D5C6298F1C3A8BDA007F7B7C /* SmileTests */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | D5C629901C3A8BDA007F7B7C /* Info-iOS.plist */, 150 | D5C629911C3A8BDA007F7B7C /* Info-Mac.plist */, 151 | D2DBF1E31D04C6ED00166F7B /* Tests.swift */, 152 | ); 153 | path = SmileTests; 154 | sourceTree = ""; 155 | }; 156 | /* End PBXGroup section */ 157 | 158 | /* Begin PBXHeadersBuildPhase section */ 159 | D5B2E89C1C3A780C00C0327D /* Headers */ = { 160 | isa = PBXHeadersBuildPhase; 161 | buildActionMask = 2147483647; 162 | files = ( 163 | ); 164 | runOnlyForDeploymentPostprocessing = 0; 165 | }; 166 | D5C6293D1C3A7FAA007F7B7C /* Headers */ = { 167 | isa = PBXHeadersBuildPhase; 168 | buildActionMask = 2147483647; 169 | files = ( 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXHeadersBuildPhase section */ 174 | 175 | /* Begin PBXNativeTarget section */ 176 | D5B2E89E1C3A780C00C0327D /* Smile-iOS */ = { 177 | isa = PBXNativeTarget; 178 | buildConfigurationList = D5B2E8B31C3A780C00C0327D /* Build configuration list for PBXNativeTarget "Smile-iOS" */; 179 | buildPhases = ( 180 | D5B2E89A1C3A780C00C0327D /* Sources */, 181 | D5B2E89B1C3A780C00C0327D /* Frameworks */, 182 | D5B2E89C1C3A780C00C0327D /* Headers */, 183 | D5B2E89D1C3A780C00C0327D /* Resources */, 184 | ); 185 | buildRules = ( 186 | ); 187 | dependencies = ( 188 | ); 189 | name = "Smile-iOS"; 190 | productName = Smile; 191 | productReference = D5B2E89F1C3A780C00C0327D /* Smile.framework */; 192 | productType = "com.apple.product-type.framework"; 193 | }; 194 | D5B2E8A81C3A780C00C0327D /* Smile-iOS-Tests */ = { 195 | isa = PBXNativeTarget; 196 | buildConfigurationList = D5B2E8B61C3A780C00C0327D /* Build configuration list for PBXNativeTarget "Smile-iOS-Tests" */; 197 | buildPhases = ( 198 | D5B2E8A51C3A780C00C0327D /* Sources */, 199 | D5B2E8A61C3A780C00C0327D /* Frameworks */, 200 | D5B2E8A71C3A780C00C0327D /* Resources */, 201 | ); 202 | buildRules = ( 203 | ); 204 | dependencies = ( 205 | D5B2E8AC1C3A780C00C0327D /* PBXTargetDependency */, 206 | ); 207 | name = "Smile-iOS-Tests"; 208 | productName = SmileTests; 209 | productReference = D5B2E8A91C3A780C00C0327D /* Smile-iOS-Tests.xctest */; 210 | productType = "com.apple.product-type.bundle.unit-test"; 211 | }; 212 | D5C6293F1C3A7FAA007F7B7C /* Smile-Mac */ = { 213 | isa = PBXNativeTarget; 214 | buildConfigurationList = D5C629511C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "Smile-Mac" */; 215 | buildPhases = ( 216 | D5C6293B1C3A7FAA007F7B7C /* Sources */, 217 | D5C6293C1C3A7FAA007F7B7C /* Frameworks */, 218 | D5C6293D1C3A7FAA007F7B7C /* Headers */, 219 | D5C6293E1C3A7FAA007F7B7C /* Resources */, 220 | ); 221 | buildRules = ( 222 | ); 223 | dependencies = ( 224 | ); 225 | name = "Smile-Mac"; 226 | productName = "Smile-Mac"; 227 | productReference = D5C629401C3A7FAA007F7B7C /* Smile.framework */; 228 | productType = "com.apple.product-type.framework"; 229 | }; 230 | D5C629481C3A7FAA007F7B7C /* Smile-Mac-Tests */ = { 231 | isa = PBXNativeTarget; 232 | buildConfigurationList = D5C629541C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "Smile-Mac-Tests" */; 233 | buildPhases = ( 234 | D5C629451C3A7FAA007F7B7C /* Sources */, 235 | D5C629461C3A7FAA007F7B7C /* Frameworks */, 236 | D5C629471C3A7FAA007F7B7C /* Resources */, 237 | ); 238 | buildRules = ( 239 | ); 240 | dependencies = ( 241 | D5C6294C1C3A7FAA007F7B7C /* PBXTargetDependency */, 242 | ); 243 | name = "Smile-Mac-Tests"; 244 | productName = "Smile-MacTests"; 245 | productReference = D5C629491C3A7FAA007F7B7C /* Smile-Mac-Tests.xctest */; 246 | productType = "com.apple.product-type.bundle.unit-test"; 247 | }; 248 | /* End PBXNativeTarget section */ 249 | 250 | /* Begin PBXProject section */ 251 | D5B2E8961C3A780C00C0327D /* Project object */ = { 252 | isa = PBXProject; 253 | attributes = { 254 | LastSwiftUpdateCheck = 0730; 255 | LastUpgradeCheck = 1140; 256 | ORGANIZATIONNAME = Fantageek; 257 | TargetAttributes = { 258 | D5B2E89E1C3A780C00C0327D = { 259 | CreatedOnToolsVersion = 7.2; 260 | LastSwiftMigration = 1020; 261 | }; 262 | D5B2E8A81C3A780C00C0327D = { 263 | CreatedOnToolsVersion = 7.2; 264 | LastSwiftMigration = 1020; 265 | }; 266 | D5C6293F1C3A7FAA007F7B7C = { 267 | CreatedOnToolsVersion = 7.2; 268 | }; 269 | D5C629481C3A7FAA007F7B7C = { 270 | CreatedOnToolsVersion = 7.2; 271 | }; 272 | }; 273 | }; 274 | buildConfigurationList = D5B2E8991C3A780C00C0327D /* Build configuration list for PBXProject "Smile" */; 275 | compatibilityVersion = "Xcode 3.2"; 276 | developmentRegion = en; 277 | hasScannedForEncodings = 0; 278 | knownRegions = ( 279 | en, 280 | Base, 281 | ); 282 | mainGroup = D5B2E8951C3A780C00C0327D; 283 | productRefGroup = D5B2E8A01C3A780C00C0327D /* Products */; 284 | projectDirPath = ""; 285 | projectRoot = ""; 286 | targets = ( 287 | D5B2E89E1C3A780C00C0327D /* Smile-iOS */, 288 | D5C6293F1C3A7FAA007F7B7C /* Smile-Mac */, 289 | D5B2E8A81C3A780C00C0327D /* Smile-iOS-Tests */, 290 | D5C629481C3A7FAA007F7B7C /* Smile-Mac-Tests */, 291 | ); 292 | }; 293 | /* End PBXProject section */ 294 | 295 | /* Begin PBXResourcesBuildPhase section */ 296 | D5B2E89D1C3A780C00C0327D /* Resources */ = { 297 | isa = PBXResourcesBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | D5B2E8A71C3A780C00C0327D /* Resources */ = { 304 | isa = PBXResourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | D5C6293E1C3A7FAA007F7B7C /* Resources */ = { 311 | isa = PBXResourcesBuildPhase; 312 | buildActionMask = 2147483647; 313 | files = ( 314 | ); 315 | runOnlyForDeploymentPostprocessing = 0; 316 | }; 317 | D5C629471C3A7FAA007F7B7C /* Resources */ = { 318 | isa = PBXResourcesBuildPhase; 319 | buildActionMask = 2147483647; 320 | files = ( 321 | ); 322 | runOnlyForDeploymentPostprocessing = 0; 323 | }; 324 | /* End PBXResourcesBuildPhase section */ 325 | 326 | /* Begin PBXSourcesBuildPhase section */ 327 | D5B2E89A1C3A780C00C0327D /* Sources */ = { 328 | isa = PBXSourcesBuildPhase; 329 | buildActionMask = 2147483647; 330 | files = ( 331 | D20AFE9C1E5FA5CA00AFB7E9 /* Sequence.swift in Sources */, 332 | D2DBF1EB1D04D1EB00166F7B /* Emoji.swift in Sources */, 333 | D23991E41D10AA3600CA2E5D /* Categories.swift in Sources */, 334 | D2DBF1E81D04C71300166F7B /* Smile.swift in Sources */, 335 | D2DBF1EE1D04D54300166F7B /* Utils.swift in Sources */, 336 | ); 337 | runOnlyForDeploymentPostprocessing = 0; 338 | }; 339 | D5B2E8A51C3A780C00C0327D /* Sources */ = { 340 | isa = PBXSourcesBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | D2DBF1E41D04C6ED00166F7B /* Tests.swift in Sources */, 344 | ); 345 | runOnlyForDeploymentPostprocessing = 0; 346 | }; 347 | D5C6293B1C3A7FAA007F7B7C /* Sources */ = { 348 | isa = PBXSourcesBuildPhase; 349 | buildActionMask = 2147483647; 350 | files = ( 351 | D20AFE9D1E5FA5CA00AFB7E9 /* Sequence.swift in Sources */, 352 | D2DBF1EC1D04D1EB00166F7B /* Emoji.swift in Sources */, 353 | D23991E51D10B1FC00CA2E5D /* Categories.swift in Sources */, 354 | D2DBF1E91D04C71300166F7B /* Smile.swift in Sources */, 355 | D2DBF1EF1D04D54300166F7B /* Utils.swift in Sources */, 356 | ); 357 | runOnlyForDeploymentPostprocessing = 0; 358 | }; 359 | D5C629451C3A7FAA007F7B7C /* Sources */ = { 360 | isa = PBXSourcesBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | D2DBF1E51D04C6ED00166F7B /* Tests.swift in Sources */, 364 | ); 365 | runOnlyForDeploymentPostprocessing = 0; 366 | }; 367 | /* End PBXSourcesBuildPhase section */ 368 | 369 | /* Begin PBXTargetDependency section */ 370 | D5B2E8AC1C3A780C00C0327D /* PBXTargetDependency */ = { 371 | isa = PBXTargetDependency; 372 | target = D5B2E89E1C3A780C00C0327D /* Smile-iOS */; 373 | targetProxy = D5B2E8AB1C3A780C00C0327D /* PBXContainerItemProxy */; 374 | }; 375 | D5C6294C1C3A7FAA007F7B7C /* PBXTargetDependency */ = { 376 | isa = PBXTargetDependency; 377 | target = D5C6293F1C3A7FAA007F7B7C /* Smile-Mac */; 378 | targetProxy = D5C6294B1C3A7FAA007F7B7C /* PBXContainerItemProxy */; 379 | }; 380 | /* End PBXTargetDependency section */ 381 | 382 | /* Begin XCBuildConfiguration section */ 383 | D5B2E8B11C3A780C00C0327D /* Debug */ = { 384 | isa = XCBuildConfiguration; 385 | buildSettings = { 386 | ALWAYS_SEARCH_USER_PATHS = NO; 387 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 388 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 389 | CLANG_CXX_LIBRARY = "libc++"; 390 | CLANG_ENABLE_MODULES = YES; 391 | CLANG_ENABLE_OBJC_ARC = YES; 392 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 393 | CLANG_WARN_BOOL_CONVERSION = YES; 394 | CLANG_WARN_COMMA = YES; 395 | CLANG_WARN_CONSTANT_CONVERSION = YES; 396 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 397 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 398 | CLANG_WARN_EMPTY_BODY = YES; 399 | CLANG_WARN_ENUM_CONVERSION = YES; 400 | CLANG_WARN_INFINITE_RECURSION = YES; 401 | CLANG_WARN_INT_CONVERSION = YES; 402 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 403 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 404 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 405 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 406 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 407 | CLANG_WARN_STRICT_PROTOTYPES = YES; 408 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 409 | CLANG_WARN_UNREACHABLE_CODE = YES; 410 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 411 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 412 | COPY_PHASE_STRIP = NO; 413 | CURRENT_PROJECT_VERSION = 1; 414 | DEBUG_INFORMATION_FORMAT = dwarf; 415 | ENABLE_STRICT_OBJC_MSGSEND = YES; 416 | ENABLE_TESTABILITY = YES; 417 | GCC_C_LANGUAGE_STANDARD = gnu99; 418 | GCC_DYNAMIC_NO_PIC = NO; 419 | GCC_NO_COMMON_BLOCKS = YES; 420 | GCC_OPTIMIZATION_LEVEL = 0; 421 | GCC_PREPROCESSOR_DEFINITIONS = ( 422 | "DEBUG=1", 423 | "$(inherited)", 424 | ); 425 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 426 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 427 | GCC_WARN_UNDECLARED_SELECTOR = YES; 428 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 429 | GCC_WARN_UNUSED_FUNCTION = YES; 430 | GCC_WARN_UNUSED_VARIABLE = YES; 431 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 432 | MTL_ENABLE_DEBUG_INFO = YES; 433 | ONLY_ACTIVE_ARCH = YES; 434 | SDKROOT = iphoneos; 435 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 436 | SWIFT_VERSION = 5.0; 437 | TARGETED_DEVICE_FAMILY = "1,2"; 438 | VERSIONING_SYSTEM = "apple-generic"; 439 | VERSION_INFO_PREFIX = ""; 440 | }; 441 | name = Debug; 442 | }; 443 | D5B2E8B21C3A780C00C0327D /* Release */ = { 444 | isa = XCBuildConfiguration; 445 | buildSettings = { 446 | ALWAYS_SEARCH_USER_PATHS = NO; 447 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 448 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 449 | CLANG_CXX_LIBRARY = "libc++"; 450 | CLANG_ENABLE_MODULES = YES; 451 | CLANG_ENABLE_OBJC_ARC = YES; 452 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 453 | CLANG_WARN_BOOL_CONVERSION = YES; 454 | CLANG_WARN_COMMA = YES; 455 | CLANG_WARN_CONSTANT_CONVERSION = YES; 456 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 457 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 458 | CLANG_WARN_EMPTY_BODY = YES; 459 | CLANG_WARN_ENUM_CONVERSION = YES; 460 | CLANG_WARN_INFINITE_RECURSION = YES; 461 | CLANG_WARN_INT_CONVERSION = YES; 462 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 463 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 464 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 465 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 466 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 467 | CLANG_WARN_STRICT_PROTOTYPES = YES; 468 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 469 | CLANG_WARN_UNREACHABLE_CODE = YES; 470 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 471 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 472 | COPY_PHASE_STRIP = NO; 473 | CURRENT_PROJECT_VERSION = 1; 474 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 475 | ENABLE_NS_ASSERTIONS = NO; 476 | ENABLE_STRICT_OBJC_MSGSEND = YES; 477 | GCC_C_LANGUAGE_STANDARD = gnu99; 478 | GCC_NO_COMMON_BLOCKS = YES; 479 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 480 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 481 | GCC_WARN_UNDECLARED_SELECTOR = YES; 482 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 483 | GCC_WARN_UNUSED_FUNCTION = YES; 484 | GCC_WARN_UNUSED_VARIABLE = YES; 485 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 486 | MTL_ENABLE_DEBUG_INFO = NO; 487 | SDKROOT = iphoneos; 488 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 489 | SWIFT_VERSION = 5.0; 490 | TARGETED_DEVICE_FAMILY = "1,2"; 491 | VALIDATE_PRODUCT = YES; 492 | VERSIONING_SYSTEM = "apple-generic"; 493 | VERSION_INFO_PREFIX = ""; 494 | }; 495 | name = Release; 496 | }; 497 | D5B2E8B41C3A780C00C0327D /* Debug */ = { 498 | isa = XCBuildConfiguration; 499 | buildSettings = { 500 | CLANG_ENABLE_MODULES = YES; 501 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 502 | DEFINES_MODULE = YES; 503 | DYLIB_COMPATIBILITY_VERSION = 1; 504 | DYLIB_CURRENT_VERSION = 1; 505 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 506 | INFOPLIST_FILE = "$(SRCROOT)/Smile/Info-iOS.plist"; 507 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 508 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 509 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 510 | PRODUCT_BUNDLE_IDENTIFIER = "com.fantageek.Smile.Smile-iOS"; 511 | PRODUCT_NAME = Smile; 512 | SKIP_INSTALL = YES; 513 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 514 | SWIFT_VERSION = 5.0; 515 | }; 516 | name = Debug; 517 | }; 518 | D5B2E8B51C3A780C00C0327D /* Release */ = { 519 | isa = XCBuildConfiguration; 520 | buildSettings = { 521 | CLANG_ENABLE_MODULES = YES; 522 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 523 | DEFINES_MODULE = YES; 524 | DYLIB_COMPATIBILITY_VERSION = 1; 525 | DYLIB_CURRENT_VERSION = 1; 526 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 527 | INFOPLIST_FILE = "$(SRCROOT)/Smile/Info-iOS.plist"; 528 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 529 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 530 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 531 | PRODUCT_BUNDLE_IDENTIFIER = "com.fantageek.Smile.Smile-iOS"; 532 | PRODUCT_NAME = Smile; 533 | SKIP_INSTALL = YES; 534 | SWIFT_VERSION = 5.0; 535 | }; 536 | name = Release; 537 | }; 538 | D5B2E8B71C3A780C00C0327D /* Debug */ = { 539 | isa = XCBuildConfiguration; 540 | buildSettings = { 541 | CLANG_ENABLE_MODULES = YES; 542 | DEVELOPMENT_TEAM = ""; 543 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 544 | INFOPLIST_FILE = "$(SRCROOT)/SmileTests/Info-iOS.plist"; 545 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 546 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.SmileTests; 547 | PRODUCT_NAME = "$(TARGET_NAME)"; 548 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 549 | SWIFT_VERSION = 5.0; 550 | }; 551 | name = Debug; 552 | }; 553 | D5B2E8B81C3A780C00C0327D /* Release */ = { 554 | isa = XCBuildConfiguration; 555 | buildSettings = { 556 | CLANG_ENABLE_MODULES = YES; 557 | DEVELOPMENT_TEAM = ""; 558 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 559 | INFOPLIST_FILE = "$(SRCROOT)/SmileTests/Info-iOS.plist"; 560 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 561 | PRODUCT_BUNDLE_IDENTIFIER = no.hyper.SmileTests; 562 | PRODUCT_NAME = "$(TARGET_NAME)"; 563 | SWIFT_VERSION = 5.0; 564 | }; 565 | name = Release; 566 | }; 567 | D5C629521C3A7FAA007F7B7C /* Debug */ = { 568 | isa = XCBuildConfiguration; 569 | buildSettings = { 570 | CLANG_ENABLE_MODULES = YES; 571 | CODE_SIGN_IDENTITY = "-"; 572 | COMBINE_HIDPI_IMAGES = YES; 573 | DEFINES_MODULE = YES; 574 | DYLIB_COMPATIBILITY_VERSION = 1; 575 | DYLIB_CURRENT_VERSION = 1; 576 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 577 | FRAMEWORK_VERSION = A; 578 | INFOPLIST_FILE = "$(SRCROOT)/Smile/Info-Mac.plist"; 579 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 580 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 581 | MACOSX_DEPLOYMENT_TARGET = 10.9; 582 | PRODUCT_BUNDLE_IDENTIFIER = "com.fantageek.Smile.Smile-Mac"; 583 | PRODUCT_NAME = Smile; 584 | SDKROOT = macosx; 585 | SKIP_INSTALL = YES; 586 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 587 | }; 588 | name = Debug; 589 | }; 590 | D5C629531C3A7FAA007F7B7C /* Release */ = { 591 | isa = XCBuildConfiguration; 592 | buildSettings = { 593 | CLANG_ENABLE_MODULES = YES; 594 | CODE_SIGN_IDENTITY = "-"; 595 | COMBINE_HIDPI_IMAGES = YES; 596 | DEFINES_MODULE = YES; 597 | DYLIB_COMPATIBILITY_VERSION = 1; 598 | DYLIB_CURRENT_VERSION = 1; 599 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 600 | FRAMEWORK_VERSION = A; 601 | INFOPLIST_FILE = "$(SRCROOT)/Smile/Info-Mac.plist"; 602 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 603 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 604 | MACOSX_DEPLOYMENT_TARGET = 10.9; 605 | PRODUCT_BUNDLE_IDENTIFIER = "com.fantageek.Smile.Smile-Mac"; 606 | PRODUCT_NAME = Smile; 607 | SDKROOT = macosx; 608 | SKIP_INSTALL = YES; 609 | }; 610 | name = Release; 611 | }; 612 | D5C629551C3A7FAA007F7B7C /* Debug */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | CLANG_ENABLE_MODULES = YES; 616 | CODE_SIGN_IDENTITY = "-"; 617 | COMBINE_HIDPI_IMAGES = YES; 618 | FRAMEWORK_SEARCH_PATHS = ( 619 | "$(inherited)", 620 | "$(PROJECT_DIR)/Carthage/Build/Mac", 621 | ); 622 | INFOPLIST_FILE = "$(SRCROOT)/SmileTests/Info-Mac.plist"; 623 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 624 | MACOSX_DEPLOYMENT_TARGET = 10.11; 625 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.Smile-MacTests"; 626 | PRODUCT_NAME = "$(TARGET_NAME)"; 627 | SDKROOT = macosx; 628 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 629 | }; 630 | name = Debug; 631 | }; 632 | D5C629561C3A7FAA007F7B7C /* Release */ = { 633 | isa = XCBuildConfiguration; 634 | buildSettings = { 635 | CLANG_ENABLE_MODULES = YES; 636 | CODE_SIGN_IDENTITY = "-"; 637 | COMBINE_HIDPI_IMAGES = YES; 638 | FRAMEWORK_SEARCH_PATHS = ( 639 | "$(inherited)", 640 | "$(PROJECT_DIR)/Carthage/Build/Mac", 641 | ); 642 | INFOPLIST_FILE = "$(SRCROOT)/SmileTests/Info-Mac.plist"; 643 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 644 | MACOSX_DEPLOYMENT_TARGET = 10.11; 645 | PRODUCT_BUNDLE_IDENTIFIER = "no.hyper.Smile-MacTests"; 646 | PRODUCT_NAME = "$(TARGET_NAME)"; 647 | SDKROOT = macosx; 648 | }; 649 | name = Release; 650 | }; 651 | /* End XCBuildConfiguration section */ 652 | 653 | /* Begin XCConfigurationList section */ 654 | D5B2E8991C3A780C00C0327D /* Build configuration list for PBXProject "Smile" */ = { 655 | isa = XCConfigurationList; 656 | buildConfigurations = ( 657 | D5B2E8B11C3A780C00C0327D /* Debug */, 658 | D5B2E8B21C3A780C00C0327D /* Release */, 659 | ); 660 | defaultConfigurationIsVisible = 0; 661 | defaultConfigurationName = Release; 662 | }; 663 | D5B2E8B31C3A780C00C0327D /* Build configuration list for PBXNativeTarget "Smile-iOS" */ = { 664 | isa = XCConfigurationList; 665 | buildConfigurations = ( 666 | D5B2E8B41C3A780C00C0327D /* Debug */, 667 | D5B2E8B51C3A780C00C0327D /* Release */, 668 | ); 669 | defaultConfigurationIsVisible = 0; 670 | defaultConfigurationName = Release; 671 | }; 672 | D5B2E8B61C3A780C00C0327D /* Build configuration list for PBXNativeTarget "Smile-iOS-Tests" */ = { 673 | isa = XCConfigurationList; 674 | buildConfigurations = ( 675 | D5B2E8B71C3A780C00C0327D /* Debug */, 676 | D5B2E8B81C3A780C00C0327D /* Release */, 677 | ); 678 | defaultConfigurationIsVisible = 0; 679 | defaultConfigurationName = Release; 680 | }; 681 | D5C629511C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "Smile-Mac" */ = { 682 | isa = XCConfigurationList; 683 | buildConfigurations = ( 684 | D5C629521C3A7FAA007F7B7C /* Debug */, 685 | D5C629531C3A7FAA007F7B7C /* Release */, 686 | ); 687 | defaultConfigurationIsVisible = 0; 688 | defaultConfigurationName = Release; 689 | }; 690 | D5C629541C3A7FAA007F7B7C /* Build configuration list for PBXNativeTarget "Smile-Mac-Tests" */ = { 691 | isa = XCConfigurationList; 692 | buildConfigurations = ( 693 | D5C629551C3A7FAA007F7B7C /* Debug */, 694 | D5C629561C3A7FAA007F7B7C /* Release */, 695 | ); 696 | defaultConfigurationIsVisible = 0; 697 | defaultConfigurationName = Release; 698 | }; 699 | /* End XCConfigurationList section */ 700 | }; 701 | rootObject = D5B2E8961C3A780C00C0327D /* Project object */; 702 | } 703 | -------------------------------------------------------------------------------- /Smile.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Smile.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Smile.xcodeproj/xcshareddata/xcschemes/Smile-Mac.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 51 | 52 | 62 | 63 | 69 | 70 | 71 | 72 | 78 | 79 | 85 | 86 | 87 | 88 | 90 | 91 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /Smile.xcodeproj/xcshareddata/xcschemes/Smile-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 51 | 52 | 62 | 63 | 69 | 70 | 71 | 72 | 78 | 79 | 85 | 86 | 87 | 88 | 90 | 91 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /Smile/Info-Mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2016 Hyper Interaktiv AS. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Smile/Info-iOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SmileTests/Info-Mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SmileTests/Info-iOS.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SmileTests/Tests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tests.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 05/06/16. 6 | // Copyright © 2016 Fantageek. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Smile 11 | 12 | class Tests: XCTestCase { 13 | 14 | func testName() { 15 | XCTAssertEqual(Smile.name(emoji: "🇳🇴"), ["REGIONAL INDICATOR SYMBOL LETTER N", "REGIONAL INDICATOR SYMBOL LETTER O"]) 16 | } 17 | 18 | func testKeywords() { 19 | XCTAssertEqual(Smile.emojis(keywords: ["GRINNING"]), ["😁", "😸"]) 20 | } 21 | 22 | func testEmoji() { 23 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x23F0]), "⏰") 24 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x2600, 0xFE0F]), "☀️") 25 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x1F47B]), "👻") 26 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x1F517]), "🔗") 27 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x0001F468, 0x200D, 0x2708]), "👨‍✈") 28 | } 29 | 30 | func testVisibleLength() { 31 | XCTAssertEqual("👨🏾‍🎓".unicodeScalars.count, 4) 32 | XCTAssertEqual("👨🏾‍🎓".count, 1) 33 | } 34 | 35 | func testUnmodify() { 36 | XCTAssertEqual(Smile.unmodify(emoji: "👨🏿"), "👨") 37 | XCTAssertEqual(Smile.unmodify(emoji: "👨🏾‍🎓"), "👨") 38 | } 39 | 40 | func testIsEmoji() { 41 | XCTAssertEqual(Smile.isEmoji(character: "🎉"), true) 42 | XCTAssertEqual(Smile.isEmoji(character: "👨‍✈️"), true) 43 | XCTAssertEqual(Smile.isEmoji(character: "☀️"), true) 44 | XCTAssertEqual(Smile.isEmoji(character: "a"), false) 45 | XCTAssertEqual(Smile.isEmoji(character: "1"), false) 46 | } 47 | 48 | func testContainsEmoji() { 49 | XCTAssertEqual(Smile.containsEmoji(string: "🎈 and 🎁"), true) 50 | XCTAssertEqual(Smile.containsEmoji(string: "👨‍✈️"), true) 51 | XCTAssertEqual(Smile.containsEmoji(string: "☀️"), true) 52 | XCTAssertEqual(Smile.containsEmoji(string: "just plain text"), false) 53 | XCTAssertEqual(Smile.containsEmoji(string: "1 2 3"), false) 54 | } 55 | 56 | func testList() { 57 | XCTAssertTrue(Smile.list().count > 0) 58 | } 59 | 60 | func testFlag() { 61 | XCTAssertEqual(Smile.emoji(countryCode: "no"), "🇳🇴") 62 | } 63 | 64 | func testCategory() { 65 | XCTAssertEqual(Smile.category(emoji: "😁"), "Smileys & Emotion") 66 | } 67 | 68 | func testAlias() { 69 | XCTAssertEqual(Smile.emoji(alias: "japanese_castle"), "🏯") 70 | XCTAssertEqual(Smile.alias(emoji: "🏯"), "japanese_castle") 71 | XCTAssertEqual(Smile.alias(emoji: "👨‍✈️"), "man_pilot") 72 | } 73 | 74 | func testReplaceAlias() { 75 | XCTAssertEqual(Smile.replaceAlias(string: ":construction_worker_man: is coming to :european_castle:"), "👷‍♂️ is coming to 🏰") 76 | XCTAssertEqual(Smile.replaceAlias(string: "Let's sing together: In the :circus_tent:, there are :dog:, :cat: and :super_unicorn:"), "Let's sing together: In the 🎪, there are 🐶, 🐱 and :super_unicorn:") 77 | } 78 | 79 | func testExtractEmoji() { 80 | XCTAssertEqual(Smile.extractEmojis(string: "Find 🔑and🔎"), "🔑🔎") 81 | XCTAssertEqual(Smile.extractEmojis(string: "Find ☀️and⚙️"), "☀️⚙️") 82 | XCTAssertEqual(Smile.extractEmojis(string: "Find the solos ⌨️ and ⭐️"), "⌨️⭐️") 83 | XCTAssertEqual(Smile.extractEmojis(string: "Find the 👨‍✈️👨‍🏫💂 and 👨‍💻"), "👨‍✈️👨‍🏫💂👨‍💻") 84 | XCTAssertEqual(Smile.extractEmojis(string: "⌚️"), "⌚️") 85 | XCTAssertEqual(Smile.extractEmojis(string: "Hello ⏰⌛️💳 and 🆙."), "⏰⌛️💳🆙") 86 | } 87 | 88 | func testRemoveEmoji() { 89 | XCTAssertEqual(Smile.removeEmojis(string: "Find 🔑and🔎"), "Find and") 90 | XCTAssertEqual(Smile.removeEmojis(string: "Remove the 👨‍🏫"), "Remove the ") 91 | XCTAssertEqual(Smile.removeEmojis(string: "🥑🦈🛴🤡🦋🥚🦐🦑👰🇬🇧🎅🤑👍🏿☔️☂️☃️☀️❗️💀☠️⚔️⚖️☁️"), "") 92 | XCTAssertEqual(Smile.removeEmojis(string: "⏰⌛️💳🆙"), "") 93 | 94 | // Variation selectors 95 | XCTAssertEqual(Smile.removeEmojis(string: "👨‍✈️⚔️"), "") 96 | } 97 | 98 | func testAssemble() { 99 | XCTAssertEqual(Smile.assemble(emojis: ["👍", Smile.Sequence.SkinTone.dark]), "👍🏿") 100 | XCTAssertEqual(Smile.assemble(emojis: ["👨", "🏫"]), "👨‍🏫") 101 | XCTAssertEqual(Smile.assemble(emojis: ["👨", "✈"]), "👨‍✈️") 102 | XCTAssertEqual(Smile.assemble(emojis: ["👨", "👩", "👧", "👦"]), "👨‍👩‍👧‍👦") 103 | } 104 | 105 | func testDisassemble() { 106 | XCTAssertEqual(Smile.disassemble(emoji: "👍🏿"), ["👍"]) 107 | XCTAssertEqual(Smile.disassemble(emoji: "👨‍🏫"), ["👨", "🏫"]) 108 | XCTAssertEqual(Smile.disassemble(emoji: "👨‍✈"), ["👨"]) 109 | } 110 | 111 | func testVariationSelectors() { 112 | // emojis from iOS, macOS, Chrome has different variation selectors 113 | XCTAssertNotEqual("👨‍✈️", "👨‍✈") 114 | XCTAssertNotEqual("⚔", "⚔️") 115 | } 116 | 117 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 118 | func testContainsEmojiNew(){ 119 | XCTAssertEqual(Smile.containsEmoji("🎈 and 🎁"), true) 120 | XCTAssertEqual(Smile.containsEmoji("👨‍✈️"), true) 121 | XCTAssertEqual(Smile.containsEmoji("☀️"), true) 122 | XCTAssertEqual(Smile.containsEmoji("just plain text"), false) 123 | XCTAssertEqual(Smile.containsEmoji("1 2 3"), false) 124 | XCTAssertEqual(Smile.containsEmoji("*"), false) 125 | } 126 | 127 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 128 | func testCountEmoji(){ 129 | XCTAssertEqual(Smile.countEmoji("🎈 and 🎁"), 2) 130 | XCTAssertEqual(Smile.countEmoji("👨‍✈️"), 1) 131 | XCTAssertEqual(Smile.countEmoji("☀️*"), 1) 132 | XCTAssertEqual(Smile.countEmoji("just plain text"), 0) 133 | XCTAssertEqual(Smile.countEmoji("1 2 3"), 0) 134 | } 135 | 136 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 137 | func testIsEmojiOnly(){ 138 | XCTAssertEqual(Smile.isEmojiOnly("🎈 and 🎁"), false) 139 | XCTAssertEqual(Smile.isEmojiOnly("👨‍✈️"), true) 140 | XCTAssertEqual(Smile.isEmojiOnly("☀️"), true) 141 | XCTAssertEqual(Smile.isEmojiOnly("☀️*"), false) 142 | XCTAssertEqual(Smile.isEmojiOnly("👩🏽‍🎓🧑‍💻"), true) 143 | XCTAssertEqual(Smile.isEmojiOnly("just plain text"), false) 144 | XCTAssertEqual(Smile.isEmojiOnly("1 2 3"), false) 145 | XCTAssertEqual(Smile.isEmojiOnly("*"), false) 146 | } 147 | 148 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 149 | func testIsSingleEmoji(){ 150 | XCTAssertEqual(Smile.isSingleEmoji("🎈 and 🎁"), false) 151 | XCTAssertEqual(Smile.isSingleEmoji("👨‍✈️"), true) 152 | XCTAssertEqual(Smile.isSingleEmoji("☀️"), true) 153 | XCTAssertEqual(Smile.isSingleEmoji("☀️*"), false) 154 | XCTAssertEqual(Smile.isSingleEmoji("👩🏽‍🎓🧑‍💻"), false) 155 | XCTAssertEqual(Smile.isSingleEmoji("just plain text"), false) 156 | XCTAssertEqual(Smile.isSingleEmoji("1 2 3"), false) 157 | XCTAssertEqual(Smile.isSingleEmoji("*"), false) 158 | } 159 | 160 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 161 | func testCountNonEmoji(){ 162 | XCTAssertEqual(Smile.countNonEmoji("🎈 and 🎁"), 5) 163 | XCTAssertEqual(Smile.countNonEmoji("👨‍✈️"), 0) 164 | XCTAssertEqual(Smile.countNonEmoji("☀️"), 0) 165 | XCTAssertEqual(Smile.countNonEmoji("☀️*"), 1) 166 | XCTAssertEqual(Smile.countNonEmoji("👩🏽‍🎓🧑‍💻"), 0) 167 | XCTAssertEqual(Smile.countNonEmoji("just plain text"), 15) 168 | XCTAssertEqual(Smile.countNonEmoji("1 2 3"), 5) 169 | XCTAssertEqual(Smile.countNonEmoji("*"), 1) 170 | } 171 | 172 | 173 | } 174 | -------------------------------------------------------------------------------- /Sources/Categories.swift: -------------------------------------------------------------------------------- 1 | public let emojiCategories: [String: [String]] = [ 2 | "Smileys & Emotion": ["😀","😃","😄","😁","😆","😅","🤣","😂","🙂","🙃","😉","😊","😇","🥰","😍","🤩","😘","😗","☺️","😚","😙","🥲","😋","😛","😜","🤪","😝","🤑","🤗","🤭","🤫","🤔","🤐","🤨","😐","😑","😶","😏","😒","🙄","😬","🤥","😌","😔","😪","🤤","😴","😷","🤒","🤕","🤢","🤮","🤧","🥵","🥶","🥴","😵","🤯","🤠","🥳","🥸","😎","🤓","🧐","😕","😟","🙁","☹️","😮","😯","😲","😳","🥺","😦","😧","😨","😰","😥","😢","😭","😱","😖","😣","😞","😓","😩","😫","🥱","😤","😡","😠","🤬","😈","👿","💀","☠️","💩","🤡","👹","👺","👻","👽","👾","🤖","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🙈","🙉","🙊","💋","💌","💘","💝","💖","💗","💓","💞","💕","💟","❣️","💔","❤️","🧡","💛","💚","💙","💜","🤎","🖤","🤍","💯","💢","💥","💫","💦","💨","🕳️","💣","💬","👁️‍🗨️","🗨️","🗯️","💭","💤"], 3 | "People & Body": ["👋","🤚","🖐️","✋","🖖","👌","🤌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","🖕","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","✍️","💅","🤳","💪","🦾","🦿","🦵","🦶","👂","🦻","👃","🧠","🫀","🫁","🦷","🦴","👀","👁️","👅","👄","👶","🧒","👦","👧","🧑","👱","👨","🧔","👨‍🦰","👨‍🦱","👨‍🦳","👨‍🦲","👩","👩‍🦰","🧑‍🦰","👩‍🦱","🧑‍🦱","👩‍🦳","🧑‍🦳","👩‍🦲","🧑‍🦲","👱‍♀️","👱‍♂️","🧓","👴","👵","🙍","🙍‍♂️","🙍‍♀️","🙎","🙎‍♂️","🙎‍♀️","🙅","🙅‍♂️","🙅‍♀️","🙆","🙆‍♂️","🙆‍♀️","💁","💁‍♂️","💁‍♀️","🙋","🙋‍♂️","🙋‍♀️","🧏","🧏‍♂️","🧏‍♀️","🙇","🙇‍♂️","🙇‍♀️","🤦","🤦‍♂️","🤦‍♀️","🤷","🤷‍♂️","🤷‍♀️","🧑‍⚕️","👨‍⚕️","👩‍⚕️","🧑‍🎓","👨‍🎓","👩‍🎓","🧑‍🏫","👨‍🏫","👩‍🏫","🧑‍⚖️","👨‍⚖️","👩‍⚖️","🧑‍🌾","👨‍🌾","👩‍🌾","🧑‍🍳","👨‍🍳","👩‍🍳","🧑‍🔧","👨‍🔧","👩‍🔧","🧑‍🏭","👨‍🏭","👩‍🏭","🧑‍💼","👨‍💼","👩‍💼","🧑‍🔬","👨‍🔬","👩‍🔬","🧑‍💻","👨‍💻","👩‍💻","🧑‍🎤","👨‍🎤","👩‍🎤","🧑‍🎨","👨‍🎨","👩‍🎨","🧑‍✈️","👨‍✈️","👩‍✈️","🧑‍🚀","👨‍🚀","👩‍🚀","🧑‍🚒","👨‍🚒","👩‍🚒","👮","👮‍♂️","👮‍♀️","🕵️","🕵️‍♂️","🕵️‍♀️","💂","💂‍♂️","💂‍♀️","🥷","👷","👷‍♂️","👷‍♀️","🤴","👸","👳","👳‍♂️","👳‍♀️","👲","🧕","🤵","🤵‍♂️","🤵‍♀️","👰","👰‍♂️","👰‍♀️","🤰","🤱","👩‍🍼","👨‍🍼","🧑‍🍼","👼","🎅","🤶","🧑‍🎄","🦸","🦸‍♂️","🦸‍♀️","🦹","🦹‍♂️","🦹‍♀️","🧙","🧙‍♂️","🧙‍♀️","🧚","🧚‍♂️","🧚‍♀️","🧛","🧛‍♂️","🧛‍♀️","🧜","🧜‍♂️","🧜‍♀️","🧝","🧝‍♂️","🧝‍♀️","🧞","🧞‍♂️","🧞‍♀️","🧟","🧟‍♂️","🧟‍♀️","💆","💆‍♂️","💆‍♀️","💇","💇‍♂️","💇‍♀️","🚶","🚶‍♂️","🚶‍♀️","🧍","🧍‍♂️","🧍‍♀️","🧎","🧎‍♂️","🧎‍♀️","🧑‍🦯","👨‍🦯","👩‍🦯","🧑‍🦼","👨‍🦼","👩‍🦼","🧑‍🦽","👨‍🦽","👩‍🦽","🏃","🏃‍♂️","🏃‍♀️","💃","🕺","🕴️","👯","👯‍♂️","👯‍♀️","🧖","🧖‍♂️","🧖‍♀️","🧗","🧗‍♂️","🧗‍♀️","🤺","🏇","⛷️","🏂","🏌️","🏌️‍♂️","🏌️‍♀️","🏄","🏄‍♂️","🏄‍♀️","🚣","🚣‍♂️","🚣‍♀️","🏊","🏊‍♂️","🏊‍♀️","⛹️","⛹️‍♂️","⛹️‍♀️","🏋️","🏋️‍♂️","🏋️‍♀️","🚴","🚴‍♂️","🚴‍♀️","🚵","🚵‍♂️","🚵‍♀️","🤸","🤸‍♂️","🤸‍♀️","🤼","🤼‍♂️","🤼‍♀️","🤽","🤽‍♂️","🤽‍♀️","🤾","🤾‍♂️","🤾‍♀️","🤹","🤹‍♂️","🤹‍♀️","🧘","🧘‍♂️","🧘‍♀️","🛀","🛌","🧑‍🤝‍🧑","👭","👫","👬","💏","👩‍❤️‍💋‍👨","👨‍❤️‍💋‍👨","👩‍❤️‍💋‍👩","💑","👩‍❤️‍👨","👨‍❤️‍👨","👩‍❤️‍👩","👪","👨‍👩‍👦","👨‍👩‍👧","👨‍👩‍👧‍👦","👨‍👩‍👦‍👦","👨‍👩‍👧‍👧","👨‍👨‍👦","👨‍👨‍👧","👨‍👨‍👧‍👦","👨‍👨‍👦‍👦","👨‍👨‍👧‍👧","👩‍👩‍👦","👩‍👩‍👧","👩‍👩‍👧‍👦","👩‍👩‍👦‍👦","👩‍👩‍👧‍👧","👨‍👦","👨‍👦‍👦","👨‍👧","👨‍👧‍👦","👨‍👧‍👧","👩‍👦","👩‍👦‍👦","👩‍👧","👩‍👧‍👦","👩‍👧‍👧","🗣️","👤","👥","🫂","👣"], 4 | "Animals & Nature": ["🐵","🐒","🦍","🦧","🐶","🐕","🦮","🐕‍🦺","🐩","🐺","🦊","🦝","🐱","🐈","🐈‍⬛","🦁","🐯","🐅","🐆","🐴","🐎","🦄","🦓","🦌","🦬","🐮","🐂","🐃","🐄","🐷","🐖","🐗","🐽","🐏","🐑","🐐","🐪","🐫","🦙","🦒","🐘","🦣","🦏","🦛","🐭","🐁","🐀","🐹","🐰","🐇","🐿️","🦫","🦔","🦇","🐻","🐻‍❄️","🐨","🐼","🦥","🦦","🦨","🦘","🦡","🐾","🦃","🐔","🐓","🐣","🐤","🐥","🐦","🐧","🕊️","🦅","🦆","🦢","🦉","🦤","🪶","🦩","🦚","🦜","🐸","🐊","🐢","🦎","🐍","🐲","🐉","🦕","🦖","🐳","🐋","🐬","🦭","🐟","🐠","🐡","🦈","🐙","🐚","🐌","🦋","🐛","🐜","🐝","🪲","🐞","🦗","🪳","🕷️","🕸️","🦂","🦟","🪰","🪱","🦠","💐","🌸","💮","🏵️","🌹","🥀","🌺","🌻","🌼","🌷","🌱","🪴","🌲","🌳","🌴","🌵","🌾","🌿","☘️","🍀","🍁","🍂","🍃"], 5 | "Food & Drink": ["🍇","🍈","🍉","🍊","🍋","🍌","🍍","🥭","🍎","🍏","🍐","🍑","🍒","🍓","🫐","🥝","🍅","🫒","🥥","🥑","🍆","🥔","🥕","🌽","🌶️","🫑","🥒","🥬","🥦","🧄","🧅","🍄","🥜","🌰","🍞","🥐","🥖","🫓","🥨","🥯","🥞","🧇","🧀","🍖","🍗","🥩","🥓","🍔","🍟","🍕","🌭","🥪","🌮","🌯","🫔","🥙","🧆","🥚","🍳","🥘","🍲","🫕","🥣","🥗","🍿","🧈","🧂","🥫","🍱","🍘","🍙","🍚","🍛","🍜","🍝","🍠","🍢","🍣","🍤","🍥","🥮","🍡","🥟","🥠","🥡","🦀","🦞","🦐","🦑","🦪","🍦","🍧","🍨","🍩","🍪","🎂","🍰","🧁","🥧","🍫","🍬","🍭","🍮","🍯","🍼","🥛","☕","🫖","🍵","🍶","🍾","🍷","🍸","🍹","🍺","🍻","🥂","🥃","🥤","🧋","🧃","🧉","🧊","🥢","🍽️","🍴","🥄","🔪","🏺"], 6 | "Travel & Places": ["🌍","🌎","🌏","🌐","🗺️","🗾","🧭","🏔️","⛰️","🌋","🗻","🏕️","🏖️","🏜️","🏝️","🏞️","🏟️","🏛️","🏗️","🧱","🪨","🪵","🛖","🏘️","🏚️","🏠","🏡","🏢","🏣","🏤","🏥","🏦","🏨","🏩","🏪","🏫","🏬","🏭","🏯","🏰","💒","🗼","🗽","⛪","🕌","🛕","🕍","⛩️","🕋","⛲","⛺","🌁","🌃","🏙️","🌄","🌅","🌆","🌇","🌉","♨️","🎠","🎡","🎢","💈","🎪","🚂","🚃","🚄","🚅","🚆","🚇","🚈","🚉","🚊","🚝","🚞","🚋","🚌","🚍","🚎","🚐","🚑","🚒","🚓","🚔","🚕","🚖","🚗","🚘","🚙","🛻","🚚","🚛","🚜","🏎️","🏍️","🛵","🦽","🦼","🛺","🚲","🛴","🛹","🛼","🚏","🛣️","🛤️","🛢️","⛽","🚨","🚥","🚦","🛑","🚧","⚓","⛵","🛶","🚤","🛳️","⛴️","🛥️","🚢","✈️","🛩️","🛫","🛬","🪂","💺","🚁","🚟","🚠","🚡","🛰️","🚀","🛸","🛎️","🧳","⌛","⏳","⌚","⏰","⏱️","⏲️","🕰️","🕛","🕧","🕐","🕜","🕑","🕝","🕒","🕞","🕓","🕟","🕔","🕠","🕕","🕡","🕖","🕢","🕗","🕣","🕘","🕤","🕙","🕥","🕚","🕦","🌑","🌒","🌓","🌔","🌕","🌖","🌗","🌘","🌙","🌚","🌛","🌜","🌡️","☀️","🌝","🌞","🪐","⭐","🌟","🌠","🌌","☁️","⛅","⛈️","🌤️","🌥️","🌦️","🌧️","🌨️","🌩️","🌪️","🌫️","🌬️","🌀","🌈","🌂","☂️","☔","⛱️","⚡","❄️","☃️","⛄","☄️","🔥","💧","🌊"], 7 | "Activities": ["🎃","🎄","🎆","🎇","🧨","✨","🎈","🎉","🎊","🎋","🎍","🎎","🎏","🎐","🎑","🧧","🎀","🎁","🎗️","🎟️","🎫","🎖️","🏆","🏅","🥇","🥈","🥉","⚽","⚾","🥎","🏀","🏐","🏈","🏉","🎾","🥏","🎳","🏏","🏑","🏒","🥍","🏓","🏸","🥊","🥋","🥅","⛳","⛸️","🎣","🤿","🎽","🎿","🛷","🥌","🎯","🪀","🪁","🎱","🔮","🪄","🧿","🎮","🕹️","🎰","🎲","🧩","🧸","🪅","🪆","♠️","♥️","♦️","♣️","♟️","🃏","🀄","🎴","🎭","🖼️","🎨","🧵","🪡","🧶","🪢"], 8 | "Objects": ["👓","🕶️","🥽","🥼","🦺","👔","👕","👖","🧣","🧤","🧥","🧦","👗","👘","🥻","🩱","🩲","🩳","👙","👚","👛","👜","👝","🛍️","🎒","🩴","👞","👟","🥾","🥿","👠","👡","🩰","👢","👑","👒","🎩","🎓","🧢","🪖","⛑️","📿","💄","💍","💎","🔇","🔈","🔉","🔊","📢","📣","📯","🔔","🔕","🎼","🎵","🎶","🎙️","🎚️","🎛️","🎤","🎧","📻","🎷","🪗","🎸","🎹","🎺","🎻","🪕","🥁","🪘","📱","📲","☎️","📞","📟","📠","🔋","🔌","💻","🖥️","🖨️","⌨️","🖱️","🖲️","💽","💾","💿","📀","🧮","🎥","🎞️","📽️","🎬","📺","📷","📸","📹","📼","🔍","🔎","🕯️","💡","🔦","🏮","🪔","📔","📕","📖","📗","📘","📙","📚","📓","📒","📃","📜","📄","📰","🗞️","📑","🔖","🏷️","💰","🪙","💴","💵","💶","💷","💸","💳","🧾","💹","✉️","📧","📨","📩","📤","📥","📦","📫","📪","📬","📭","📮","🗳️","✏️","✒️","🖋️","🖊️","🖌️","🖍️","📝","💼","📁","📂","🗂️","📅","📆","🗒️","🗓️","📇","📈","📉","📊","📋","📌","📍","📎","🖇️","📏","📐","✂️","🗃️","🗄️","🗑️","🔒","🔓","🔏","🔐","🔑","🗝️","🔨","🪓","⛏️","⚒️","🛠️","🗡️","⚔️","🔫","🪃","🏹","🛡️","🪚","🔧","🪛","🔩","⚙️","🗜️","⚖️","🦯","🔗","⛓️","🪝","🧰","🧲","🪜","⚗️","🧪","🧫","🧬","🔬","🔭","📡","💉","🩸","💊","🩹","🩺","🚪","🛗","🪞","🪟","🛏️","🛋️","🪑","🚽","🪠","🚿","🛁","🪤","🪒","🧴","🧷","🧹","🧺","🧻","🪣","🧼","🪥","🧽","🧯","🛒","🚬","⚰️","🪦","⚱️","🗿","🪧"], 9 | "Symbols": ["🏧","🚮","🚰","♿","🚹","🚺","🚻","🚼","🚾","🛂","🛃","🛄","🛅","⚠️","🚸","⛔","🚫","🚳","🚭","🚯","🚱","🚷","📵","🔞","☢️","☣️","⬆️","↗️","➡️","↘️","⬇️","↙️","⬅️","↖️","↕️","↔️","↩️","↪️","⤴️","⤵️","🔃","🔄","🔙","🔚","🔛","🔜","🔝","🛐","⚛️","🕉️","✡️","☸️","☯️","✝️","☦️","☪️","☮️","🕎","🔯","♈","♉","♊","♋","♌","♍","♎","♏","♐","♑","♒","♓","⛎","🔀","🔁","🔂","▶️","⏩","⏭️","⏯️","◀️","⏪","⏮️","🔼","⏫","🔽","⏬","⏸️","⏹️","⏺️","⏏️","🎦","🔅","🔆","📶","📳","📴","♀️","♂️","⚧️","✖️","➕","➖","➗","♾️","‼️","⁉️","❓","❔","❕","❗","〰️","💱","💲","⚕️","♻️","⚜️","🔱","📛","🔰","⭕","✅","☑️","✔️","❌","❎","➰","➿","〽️","✳️","✴️","❇️","©️","®️","™️","#️⃣","*️⃣","0️⃣","1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣","8️⃣","9️⃣","🔟","🔠","🔡","🔢","🔣","🔤","🅰️","🆎","🅱️","🆑","🆒","🆓","ℹ️","🆔","Ⓜ️","🆕","🆖","🅾️","🆗","🅿️","🆘","🆙","🆚","🈁","🈂️","🈷️","🈶","🈯","🉐","🈹","🈚","🈲","🉑","🈸","🈴","🈳","㊗️","㊙️","🈺","🈵","🔴","🟠","🟡","🟢","🔵","🟣","🟤","⚫","⚪","🟥","🟧","🟨","🟩","🟦","🟪","🟫","⬛","⬜","◼️","◻️","◾","◽","▪️","▫️","🔶","🔷","🔸","🔹","🔺","🔻","💠","🔘","🔳","🔲"], 10 | "Flags": ["🏁","🚩","🎌","🏴","🏳️","🏳️‍🌈","🏳️‍⚧️","🏴‍☠️","🇦🇨","🇦🇩","🇦🇪","🇦🇫","🇦🇬","🇦🇮","🇦🇱","🇦🇲","🇦🇴","🇦🇶","🇦🇷","🇦🇸","🇦🇹","🇦🇺","🇦🇼","🇦🇽","🇦🇿","🇧🇦","🇧🇧","🇧🇩","🇧🇪","🇧🇫","🇧🇬","🇧🇭","🇧🇮","🇧🇯","🇧🇱","🇧🇲","🇧🇳","🇧🇴","🇧🇶","🇧🇷","🇧🇸","🇧🇹","🇧🇻","🇧🇼","🇧🇾","🇧🇿","🇨🇦","🇨🇨","🇨🇩","🇨🇫","🇨🇬","🇨🇭","🇨🇮","🇨🇰","🇨🇱","🇨🇲","🇨🇳","🇨🇴","🇨🇵","🇨🇷","🇨🇺","🇨🇻","🇨🇼","🇨🇽","🇨🇾","🇨🇿","🇩🇪","🇩🇬","🇩🇯","🇩🇰","🇩🇲","🇩🇴","🇩🇿","🇪🇦","🇪🇨","🇪🇪","🇪🇬","🇪🇭","🇪🇷","🇪🇸","🇪🇹","🇪🇺","🇫🇮","🇫🇯","🇫🇰","🇫🇲","🇫🇴","🇫🇷","🇬🇦","🇬🇧","🇬🇩","🇬🇪","🇬🇫","🇬🇬","🇬🇭","🇬🇮","🇬🇱","🇬🇲","🇬🇳","🇬🇵","🇬🇶","🇬🇷","🇬🇸","🇬🇹","🇬🇺","🇬🇼","🇬🇾","🇭🇰","🇭🇲","🇭🇳","🇭🇷","🇭🇹","🇭🇺","🇮🇨","🇮🇩","🇮🇪","🇮🇱","🇮🇲","🇮🇳","🇮🇴","🇮🇶","🇮🇷","🇮🇸","🇮🇹","🇯🇪","🇯🇲","🇯🇴","🇯🇵","🇰🇪","🇰🇬","🇰🇭","🇰🇮","🇰🇲","🇰🇳","🇰🇵","🇰🇷","🇰🇼","🇰🇾","🇰🇿","🇱🇦","🇱🇧","🇱🇨","🇱🇮","🇱🇰","🇱🇷","🇱🇸","🇱🇹","🇱🇺","🇱🇻","🇱🇾","🇲🇦","🇲🇨","🇲🇩","🇲🇪","🇲🇫","🇲🇬","🇲🇭","🇲🇰","🇲🇱","🇲🇲","🇲🇳","🇲🇴","🇲🇵","🇲🇶","🇲🇷","🇲🇸","🇲🇹","🇲🇺","🇲🇻","🇲🇼","🇲🇽","🇲🇾","🇲🇿","🇳🇦","🇳🇨","🇳🇪","🇳🇫","🇳🇬","🇳🇮","🇳🇱","🇳🇴","🇳🇵","🇳🇷","🇳🇺","🇳🇿","🇴🇲","🇵🇦","🇵🇪","🇵🇫","🇵🇬","🇵🇭","🇵🇰","🇵🇱","🇵🇲","🇵🇳","🇵🇷","🇵🇸","🇵🇹","🇵🇼","🇵🇾","🇶🇦","🇷🇪","🇷🇴","🇷🇸","🇷🇺","🇷🇼","🇸🇦","🇸🇧","🇸🇨","🇸🇩","🇸🇪","🇸🇬","🇸🇭","🇸🇮","🇸🇯","🇸🇰","🇸🇱","🇸🇲","🇸🇳","🇸🇴","🇸🇷","🇸🇸","🇸🇹","🇸🇻","🇸🇽","🇸🇾","🇸🇿","🇹🇦","🇹🇨","🇹🇩","🇹🇫","🇹🇬","🇹🇭","🇹🇯","🇹🇰","🇹🇱","🇹🇲","🇹🇳","🇹🇴","🇹🇷","🇹🇹","🇹🇻","🇹🇼","🇹🇿","🇺🇦","🇺🇬","🇺🇲","🇺🇳","🇺🇸","🇺🇾","🇺🇿","🇻🇦","🇻🇨","🇻🇪","🇻🇬","🇻🇮","🇻🇳","🇻🇺","🇼🇫","🇼🇸","🇽🇰","🇾🇪","🇾🇹","🇿🇦","🇿🇲","🇿🇼","🏴󠁧󠁢󠁥󠁮󠁧󠁿","🏴󠁧󠁢󠁳󠁣󠁴󠁿","🏴󠁧󠁢󠁷󠁬󠁳󠁿"], 11 | ] -------------------------------------------------------------------------------- /Sources/Emoji.swift: -------------------------------------------------------------------------------- 1 | public let emojiList: [String: String] = [ 2 | "grinning": "😀", 3 | "smiley": "😃", 4 | "smile": "😄", 5 | "grin": "😁", 6 | "laughing": "😆", 7 | "sweat_smile": "😅", 8 | "rofl": "🤣", 9 | "joy": "😂", 10 | "slightly_smiling_face": "🙂", 11 | "upside_down_face": "🙃", 12 | "wink": "😉", 13 | "blush": "😊", 14 | "innocent": "😇", 15 | "smiling_face_with_three_hearts": "🥰", 16 | "heart_eyes": "😍", 17 | "star_struck": "🤩", 18 | "kissing_heart": "😘", 19 | "kissing": "😗", 20 | "relaxed": "☺️", 21 | "kissing_closed_eyes": "😚", 22 | "kissing_smiling_eyes": "😙", 23 | "smiling_face_with_tear": "🥲", 24 | "yum": "😋", 25 | "stuck_out_tongue": "😛", 26 | "stuck_out_tongue_winking_eye": "😜", 27 | "zany_face": "🤪", 28 | "stuck_out_tongue_closed_eyes": "😝", 29 | "money_mouth_face": "🤑", 30 | "hugs": "🤗", 31 | "hand_over_mouth": "🤭", 32 | "shushing_face": "🤫", 33 | "thinking": "🤔", 34 | "zipper_mouth_face": "🤐", 35 | "raised_eyebrow": "🤨", 36 | "neutral_face": "😐", 37 | "expressionless": "😑", 38 | "no_mouth": "😶", 39 | "smirk": "😏", 40 | "unamused": "😒", 41 | "roll_eyes": "🙄", 42 | "grimacing": "😬", 43 | "lying_face": "🤥", 44 | "relieved": "😌", 45 | "pensive": "😔", 46 | "sleepy": "😪", 47 | "drooling_face": "🤤", 48 | "sleeping": "😴", 49 | "mask": "😷", 50 | "face_with_thermometer": "🤒", 51 | "face_with_head_bandage": "🤕", 52 | "nauseated_face": "🤢", 53 | "vomiting_face": "🤮", 54 | "sneezing_face": "🤧", 55 | "hot_face": "🥵", 56 | "cold_face": "🥶", 57 | "woozy_face": "🥴", 58 | "dizzy_face": "😵", 59 | "exploding_head": "🤯", 60 | "cowboy_hat_face": "🤠", 61 | "partying_face": "🥳", 62 | "disguised_face": "🥸", 63 | "sunglasses": "😎", 64 | "nerd_face": "🤓", 65 | "monocle_face": "🧐", 66 | "confused": "😕", 67 | "worried": "😟", 68 | "slightly_frowning_face": "🙁", 69 | "frowning_face": "☹️", 70 | "open_mouth": "😮", 71 | "hushed": "😯", 72 | "astonished": "😲", 73 | "flushed": "😳", 74 | "pleading_face": "🥺", 75 | "frowning": "😦", 76 | "anguished": "😧", 77 | "fearful": "😨", 78 | "cold_sweat": "😰", 79 | "disappointed_relieved": "😥", 80 | "cry": "😢", 81 | "sob": "😭", 82 | "scream": "😱", 83 | "confounded": "😖", 84 | "persevere": "😣", 85 | "disappointed": "😞", 86 | "sweat": "😓", 87 | "weary": "😩", 88 | "tired_face": "😫", 89 | "yawning_face": "🥱", 90 | "triumph": "😤", 91 | "rage": "😡", 92 | "angry": "😠", 93 | "cursing_face": "🤬", 94 | "smiling_imp": "😈", 95 | "imp": "👿", 96 | "skull": "💀", 97 | "skull_and_crossbones": "☠️", 98 | "hankey": "💩", 99 | "clown_face": "🤡", 100 | "japanese_ogre": "👹", 101 | "japanese_goblin": "👺", 102 | "ghost": "👻", 103 | "alien": "👽", 104 | "space_invader": "👾", 105 | "robot": "🤖", 106 | "smiley_cat": "😺", 107 | "smile_cat": "😸", 108 | "joy_cat": "😹", 109 | "heart_eyes_cat": "😻", 110 | "smirk_cat": "😼", 111 | "kissing_cat": "😽", 112 | "scream_cat": "🙀", 113 | "crying_cat_face": "😿", 114 | "pouting_cat": "😾", 115 | "see_no_evil": "🙈", 116 | "hear_no_evil": "🙉", 117 | "speak_no_evil": "🙊", 118 | "kiss": "💋", 119 | "love_letter": "💌", 120 | "cupid": "💘", 121 | "gift_heart": "💝", 122 | "sparkling_heart": "💖", 123 | "heartpulse": "💗", 124 | "heartbeat": "💓", 125 | "revolving_hearts": "💞", 126 | "two_hearts": "💕", 127 | "heart_decoration": "💟", 128 | "heavy_heart_exclamation": "❣️", 129 | "broken_heart": "💔", 130 | "heart": "❤️", 131 | "orange_heart": "🧡", 132 | "yellow_heart": "💛", 133 | "green_heart": "💚", 134 | "blue_heart": "💙", 135 | "purple_heart": "💜", 136 | "brown_heart": "🤎", 137 | "black_heart": "🖤", 138 | "white_heart": "🤍", 139 | "100": "💯", 140 | "anger": "💢", 141 | "boom": "💥", 142 | "dizzy": "💫", 143 | "sweat_drops": "💦", 144 | "dash": "💨", 145 | "hole": "🕳️", 146 | "bomb": "💣", 147 | "speech_balloon": "💬", 148 | "eye_speech_bubble": "👁️‍🗨️", 149 | "left_speech_bubble": "🗨️", 150 | "right_anger_bubble": "🗯️", 151 | "thought_balloon": "💭", 152 | "zzz": "💤", 153 | "wave": "👋", 154 | "raised_back_of_hand": "🤚", 155 | "raised_hand_with_fingers_splayed": "🖐️", 156 | "hand": "✋", 157 | "vulcan_salute": "🖖", 158 | "ok_hand": "👌", 159 | "pinched_fingers": "🤌", 160 | "pinching_hand": "🤏", 161 | "v": "✌️", 162 | "crossed_fingers": "🤞", 163 | "love_you_gesture": "🤟", 164 | "metal": "🤘", 165 | "call_me_hand": "🤙", 166 | "point_left": "👈", 167 | "point_right": "👉", 168 | "point_up_2": "👆", 169 | "middle_finger": "🖕", 170 | "point_down": "👇", 171 | "point_up": "☝️", 172 | "+1": "👍", 173 | "-1": "👎", 174 | "fist_raised": "✊", 175 | "fist_oncoming": "👊", 176 | "fist_left": "🤛", 177 | "fist_right": "🤜", 178 | "clap": "👏", 179 | "raised_hands": "🙌", 180 | "open_hands": "👐", 181 | "palms_up_together": "🤲", 182 | "handshake": "🤝", 183 | "pray": "🙏", 184 | "writing_hand": "✍️", 185 | "nail_care": "💅", 186 | "selfie": "🤳", 187 | "muscle": "💪", 188 | "mechanical_arm": "🦾", 189 | "mechanical_leg": "🦿", 190 | "leg": "🦵", 191 | "foot": "🦶", 192 | "ear": "👂", 193 | "ear_with_hearing_aid": "🦻", 194 | "nose": "👃", 195 | "brain": "🧠", 196 | "anatomical_heart": "🫀", 197 | "lungs": "🫁", 198 | "tooth": "🦷", 199 | "bone": "🦴", 200 | "eyes": "👀", 201 | "eye": "👁️", 202 | "tongue": "👅", 203 | "lips": "👄", 204 | "baby": "👶", 205 | "child": "🧒", 206 | "boy": "👦", 207 | "girl": "👧", 208 | "adult": "🧑", 209 | "blond_haired_person": "👱", 210 | "man": "👨", 211 | "bearded_person": "🧔", 212 | "red_haired_man": "👨‍🦰", 213 | "curly_haired_man": "👨‍🦱", 214 | "white_haired_man": "👨‍🦳", 215 | "bald_man": "👨‍🦲", 216 | "woman": "👩", 217 | "red_haired_woman": "👩‍🦰", 218 | "person_red_hair": "🧑‍🦰", 219 | "curly_haired_woman": "👩‍🦱", 220 | "person_curly_hair": "🧑‍🦱", 221 | "white_haired_woman": "👩‍🦳", 222 | "person_white_hair": "🧑‍🦳", 223 | "bald_woman": "👩‍🦲", 224 | "person_bald": "🧑‍🦲", 225 | "blond_haired_woman": "👱‍♀️", 226 | "blond_haired_man": "👱‍♂️", 227 | "older_adult": "🧓", 228 | "older_man": "👴", 229 | "older_woman": "👵", 230 | "frowning_person": "🙍", 231 | "frowning_man": "🙍‍♂️", 232 | "frowning_woman": "🙍‍♀️", 233 | "pouting_face": "🙎", 234 | "pouting_man": "🙎‍♂️", 235 | "pouting_woman": "🙎‍♀️", 236 | "no_good": "🙅", 237 | "no_good_man": "🙅‍♂️", 238 | "no_good_woman": "🙅‍♀️", 239 | "ok_person": "🙆", 240 | "ok_man": "🙆‍♂️", 241 | "ok_woman": "🙆‍♀️", 242 | "tipping_hand_person": "💁", 243 | "tipping_hand_man": "💁‍♂️", 244 | "tipping_hand_woman": "💁‍♀️", 245 | "raising_hand": "🙋", 246 | "raising_hand_man": "🙋‍♂️", 247 | "raising_hand_woman": "🙋‍♀️", 248 | "deaf_person": "🧏", 249 | "deaf_man": "🧏‍♂️", 250 | "deaf_woman": "🧏‍♀️", 251 | "bow": "🙇", 252 | "bowing_man": "🙇‍♂️", 253 | "bowing_woman": "🙇‍♀️", 254 | "facepalm": "🤦", 255 | "man_facepalming": "🤦‍♂️", 256 | "woman_facepalming": "🤦‍♀️", 257 | "shrug": "🤷", 258 | "man_shrugging": "🤷‍♂️", 259 | "woman_shrugging": "🤷‍♀️", 260 | "health_worker": "🧑‍⚕️", 261 | "man_health_worker": "👨‍⚕️", 262 | "woman_health_worker": "👩‍⚕️", 263 | "student": "🧑‍🎓", 264 | "man_student": "👨‍🎓", 265 | "woman_student": "👩‍🎓", 266 | "teacher": "🧑‍🏫", 267 | "man_teacher": "👨‍🏫", 268 | "woman_teacher": "👩‍🏫", 269 | "judge": "🧑‍⚖️", 270 | "man_judge": "👨‍⚖️", 271 | "woman_judge": "👩‍⚖️", 272 | "farmer": "🧑‍🌾", 273 | "man_farmer": "👨‍🌾", 274 | "woman_farmer": "👩‍🌾", 275 | "cook": "🧑‍🍳", 276 | "man_cook": "👨‍🍳", 277 | "woman_cook": "👩‍🍳", 278 | "mechanic": "🧑‍🔧", 279 | "man_mechanic": "👨‍🔧", 280 | "woman_mechanic": "👩‍🔧", 281 | "factory_worker": "🧑‍🏭", 282 | "man_factory_worker": "👨‍🏭", 283 | "woman_factory_worker": "👩‍🏭", 284 | "office_worker": "🧑‍💼", 285 | "man_office_worker": "👨‍💼", 286 | "woman_office_worker": "👩‍💼", 287 | "scientist": "🧑‍🔬", 288 | "man_scientist": "👨‍🔬", 289 | "woman_scientist": "👩‍🔬", 290 | "technologist": "🧑‍💻", 291 | "man_technologist": "👨‍💻", 292 | "woman_technologist": "👩‍💻", 293 | "singer": "🧑‍🎤", 294 | "man_singer": "👨‍🎤", 295 | "woman_singer": "👩‍🎤", 296 | "artist": "🧑‍🎨", 297 | "man_artist": "👨‍🎨", 298 | "woman_artist": "👩‍🎨", 299 | "pilot": "🧑‍✈️", 300 | "man_pilot": "👨‍✈️", 301 | "woman_pilot": "👩‍✈️", 302 | "astronaut": "🧑‍🚀", 303 | "man_astronaut": "👨‍🚀", 304 | "woman_astronaut": "👩‍🚀", 305 | "firefighter": "🧑‍🚒", 306 | "man_firefighter": "👨‍🚒", 307 | "woman_firefighter": "👩‍🚒", 308 | "police_officer": "👮", 309 | "policeman": "👮‍♂️", 310 | "policewoman": "👮‍♀️", 311 | "detective": "🕵️", 312 | "male_detective": "🕵️‍♂️", 313 | "female_detective": "🕵️‍♀️", 314 | "guard": "💂", 315 | "guardsman": "💂‍♂️", 316 | "guardswoman": "💂‍♀️", 317 | "ninja": "🥷", 318 | "construction_worker": "👷", 319 | "construction_worker_man": "👷‍♂️", 320 | "construction_worker_woman": "👷‍♀️", 321 | "prince": "🤴", 322 | "princess": "👸", 323 | "person_with_turban": "👳", 324 | "man_with_turban": "👳‍♂️", 325 | "woman_with_turban": "👳‍♀️", 326 | "man_with_gua_pi_mao": "👲", 327 | "woman_with_headscarf": "🧕", 328 | "person_in_tuxedo": "🤵", 329 | "man_in_tuxedo": "🤵‍♂️", 330 | "woman_in_tuxedo": "🤵‍♀️", 331 | "person_with_veil": "👰", 332 | "man_with_veil": "👰‍♂️", 333 | "woman_with_veil": "👰‍♀️", 334 | "pregnant_woman": "🤰", 335 | "breast_feeding": "🤱", 336 | "woman_feeding_baby": "👩‍🍼", 337 | "man_feeding_baby": "👨‍🍼", 338 | "person_feeding_baby": "🧑‍🍼", 339 | "angel": "👼", 340 | "santa": "🎅", 341 | "mrs_claus": "🤶", 342 | "mx_claus": "🧑‍🎄", 343 | "superhero": "🦸", 344 | "superhero_man": "🦸‍♂️", 345 | "superhero_woman": "🦸‍♀️", 346 | "supervillain": "🦹", 347 | "supervillain_man": "🦹‍♂️", 348 | "supervillain_woman": "🦹‍♀️", 349 | "mage": "🧙", 350 | "mage_man": "🧙‍♂️", 351 | "mage_woman": "🧙‍♀️", 352 | "fairy": "🧚", 353 | "fairy_man": "🧚‍♂️", 354 | "fairy_woman": "🧚‍♀️", 355 | "vampire": "🧛", 356 | "vampire_man": "🧛‍♂️", 357 | "vampire_woman": "🧛‍♀️", 358 | "merperson": "🧜", 359 | "merman": "🧜‍♂️", 360 | "mermaid": "🧜‍♀️", 361 | "elf": "🧝", 362 | "elf_man": "🧝‍♂️", 363 | "elf_woman": "🧝‍♀️", 364 | "genie": "🧞", 365 | "genie_man": "🧞‍♂️", 366 | "genie_woman": "🧞‍♀️", 367 | "zombie": "🧟", 368 | "zombie_man": "🧟‍♂️", 369 | "zombie_woman": "🧟‍♀️", 370 | "massage": "💆", 371 | "massage_man": "💆‍♂️", 372 | "massage_woman": "💆‍♀️", 373 | "haircut": "💇", 374 | "haircut_man": "💇‍♂️", 375 | "haircut_woman": "💇‍♀️", 376 | "walking": "🚶", 377 | "walking_man": "🚶‍♂️", 378 | "walking_woman": "🚶‍♀️", 379 | "standing_person": "🧍", 380 | "standing_man": "🧍‍♂️", 381 | "standing_woman": "🧍‍♀️", 382 | "kneeling_person": "🧎", 383 | "kneeling_man": "🧎‍♂️", 384 | "kneeling_woman": "🧎‍♀️", 385 | "person_with_probing_cane": "🧑‍🦯", 386 | "man_with_probing_cane": "👨‍🦯", 387 | "woman_with_probing_cane": "👩‍🦯", 388 | "person_in_motorized_wheelchair": "🧑‍🦼", 389 | "man_in_motorized_wheelchair": "👨‍🦼", 390 | "woman_in_motorized_wheelchair": "👩‍🦼", 391 | "person_in_manual_wheelchair": "🧑‍🦽", 392 | "man_in_manual_wheelchair": "👨‍🦽", 393 | "woman_in_manual_wheelchair": "👩‍🦽", 394 | "runner": "🏃", 395 | "running_man": "🏃‍♂️", 396 | "running_woman": "🏃‍♀️", 397 | "woman_dancing": "💃", 398 | "man_dancing": "🕺", 399 | "business_suit_levitating": "🕴️", 400 | "dancers": "👯", 401 | "dancing_men": "👯‍♂️", 402 | "dancing_women": "👯‍♀️", 403 | "sauna_person": "🧖", 404 | "sauna_man": "🧖‍♂️", 405 | "sauna_woman": "🧖‍♀️", 406 | "climbing": "🧗", 407 | "climbing_man": "🧗‍♂️", 408 | "climbing_woman": "🧗‍♀️", 409 | "person_fencing": "🤺", 410 | "horse_racing": "🏇", 411 | "skier": "⛷️", 412 | "snowboarder": "🏂", 413 | "golfing": "🏌️", 414 | "golfing_man": "🏌️‍♂️", 415 | "golfing_woman": "🏌️‍♀️", 416 | "surfer": "🏄", 417 | "surfing_man": "🏄‍♂️", 418 | "surfing_woman": "🏄‍♀️", 419 | "rowboat": "🚣", 420 | "rowing_man": "🚣‍♂️", 421 | "rowing_woman": "🚣‍♀️", 422 | "swimmer": "🏊", 423 | "swimming_man": "🏊‍♂️", 424 | "swimming_woman": "🏊‍♀️", 425 | "bouncing_ball_person": "⛹️", 426 | "bouncing_ball_man": "⛹️‍♂️", 427 | "bouncing_ball_woman": "⛹️‍♀️", 428 | "weight_lifting": "🏋️", 429 | "weight_lifting_man": "🏋️‍♂️", 430 | "weight_lifting_woman": "🏋️‍♀️", 431 | "bicyclist": "🚴", 432 | "biking_man": "🚴‍♂️", 433 | "biking_woman": "🚴‍♀️", 434 | "mountain_bicyclist": "🚵", 435 | "mountain_biking_man": "🚵‍♂️", 436 | "mountain_biking_woman": "🚵‍♀️", 437 | "cartwheeling": "🤸", 438 | "man_cartwheeling": "🤸‍♂️", 439 | "woman_cartwheeling": "🤸‍♀️", 440 | "wrestling": "🤼", 441 | "men_wrestling": "🤼‍♂️", 442 | "women_wrestling": "🤼‍♀️", 443 | "water_polo": "🤽", 444 | "man_playing_water_polo": "🤽‍♂️", 445 | "woman_playing_water_polo": "🤽‍♀️", 446 | "handball_person": "🤾", 447 | "man_playing_handball": "🤾‍♂️", 448 | "woman_playing_handball": "🤾‍♀️", 449 | "juggling_person": "🤹", 450 | "man_juggling": "🤹‍♂️", 451 | "woman_juggling": "🤹‍♀️", 452 | "lotus_position": "🧘", 453 | "lotus_position_man": "🧘‍♂️", 454 | "lotus_position_woman": "🧘‍♀️", 455 | "bath": "🛀", 456 | "sleeping_bed": "🛌", 457 | "people_holding_hands": "🧑‍🤝‍🧑", 458 | "two_women_holding_hands": "👭", 459 | "couple": "👫", 460 | "two_men_holding_hands": "👬", 461 | "couplekiss": "💏", 462 | "couplekiss_man_woman": "👩‍❤️‍💋‍👨", 463 | "couplekiss_man_man": "👨‍❤️‍💋‍👨", 464 | "couplekiss_woman_woman": "👩‍❤️‍💋‍👩", 465 | "couple_with_heart": "💑", 466 | "couple_with_heart_woman_man": "👩‍❤️‍👨", 467 | "couple_with_heart_man_man": "👨‍❤️‍👨", 468 | "couple_with_heart_woman_woman": "👩‍❤️‍👩", 469 | "family": "👪", 470 | "family_man_woman_boy": "👨‍👩‍👦", 471 | "family_man_woman_girl": "👨‍👩‍👧", 472 | "family_man_woman_girl_boy": "👨‍👩‍👧‍👦", 473 | "family_man_woman_boy_boy": "👨‍👩‍👦‍👦", 474 | "family_man_woman_girl_girl": "👨‍👩‍👧‍👧", 475 | "family_man_man_boy": "👨‍👨‍👦", 476 | "family_man_man_girl": "👨‍👨‍👧", 477 | "family_man_man_girl_boy": "👨‍👨‍👧‍👦", 478 | "family_man_man_boy_boy": "👨‍👨‍👦‍👦", 479 | "family_man_man_girl_girl": "👨‍👨‍👧‍👧", 480 | "family_woman_woman_boy": "👩‍👩‍👦", 481 | "family_woman_woman_girl": "👩‍👩‍👧", 482 | "family_woman_woman_girl_boy": "👩‍👩‍👧‍👦", 483 | "family_woman_woman_boy_boy": "👩‍👩‍👦‍👦", 484 | "family_woman_woman_girl_girl": "👩‍👩‍👧‍👧", 485 | "family_man_boy": "👨‍👦", 486 | "family_man_boy_boy": "👨‍👦‍👦", 487 | "family_man_girl": "👨‍👧", 488 | "family_man_girl_boy": "👨‍👧‍👦", 489 | "family_man_girl_girl": "👨‍👧‍👧", 490 | "family_woman_boy": "👩‍👦", 491 | "family_woman_boy_boy": "👩‍👦‍👦", 492 | "family_woman_girl": "👩‍👧", 493 | "family_woman_girl_boy": "👩‍👧‍👦", 494 | "family_woman_girl_girl": "👩‍👧‍👧", 495 | "speaking_head": "🗣️", 496 | "bust_in_silhouette": "👤", 497 | "busts_in_silhouette": "👥", 498 | "people_hugging": "🫂", 499 | "footprints": "👣", 500 | "monkey_face": "🐵", 501 | "monkey": "🐒", 502 | "gorilla": "🦍", 503 | "orangutan": "🦧", 504 | "dog": "🐶", 505 | "dog2": "🐕", 506 | "guide_dog": "🦮", 507 | "service_dog": "🐕‍🦺", 508 | "poodle": "🐩", 509 | "wolf": "🐺", 510 | "fox_face": "🦊", 511 | "raccoon": "🦝", 512 | "cat": "🐱", 513 | "cat2": "🐈", 514 | "black_cat": "🐈‍⬛", 515 | "lion": "🦁", 516 | "tiger": "🐯", 517 | "tiger2": "🐅", 518 | "leopard": "🐆", 519 | "horse": "🐴", 520 | "racehorse": "🐎", 521 | "unicorn": "🦄", 522 | "zebra": "🦓", 523 | "deer": "🦌", 524 | "bison": "🦬", 525 | "cow": "🐮", 526 | "ox": "🐂", 527 | "water_buffalo": "🐃", 528 | "cow2": "🐄", 529 | "pig": "🐷", 530 | "pig2": "🐖", 531 | "boar": "🐗", 532 | "pig_nose": "🐽", 533 | "ram": "🐏", 534 | "sheep": "🐑", 535 | "goat": "🐐", 536 | "dromedary_camel": "🐪", 537 | "camel": "🐫", 538 | "llama": "🦙", 539 | "giraffe": "🦒", 540 | "elephant": "🐘", 541 | "mammoth": "🦣", 542 | "rhinoceros": "🦏", 543 | "hippopotamus": "🦛", 544 | "mouse": "🐭", 545 | "mouse2": "🐁", 546 | "rat": "🐀", 547 | "hamster": "🐹", 548 | "rabbit": "🐰", 549 | "rabbit2": "🐇", 550 | "chipmunk": "🐿️", 551 | "beaver": "🦫", 552 | "hedgehog": "🦔", 553 | "bat": "🦇", 554 | "bear": "🐻", 555 | "polar_bear": "🐻‍❄️", 556 | "koala": "🐨", 557 | "panda_face": "🐼", 558 | "sloth": "🦥", 559 | "otter": "🦦", 560 | "skunk": "🦨", 561 | "kangaroo": "🦘", 562 | "badger": "🦡", 563 | "feet": "🐾", 564 | "turkey": "🦃", 565 | "chicken": "🐔", 566 | "rooster": "🐓", 567 | "hatching_chick": "🐣", 568 | "baby_chick": "🐤", 569 | "hatched_chick": "🐥", 570 | "bird": "🐦", 571 | "penguin": "🐧", 572 | "dove": "🕊️", 573 | "eagle": "🦅", 574 | "duck": "🦆", 575 | "swan": "🦢", 576 | "owl": "🦉", 577 | "dodo": "🦤", 578 | "feather": "🪶", 579 | "flamingo": "🦩", 580 | "peacock": "🦚", 581 | "parrot": "🦜", 582 | "frog": "🐸", 583 | "crocodile": "🐊", 584 | "turtle": "🐢", 585 | "lizard": "🦎", 586 | "snake": "🐍", 587 | "dragon_face": "🐲", 588 | "dragon": "🐉", 589 | "sauropod": "🦕", 590 | "t-rex": "🦖", 591 | "whale": "🐳", 592 | "whale2": "🐋", 593 | "dolphin": "🐬", 594 | "seal": "🦭", 595 | "fish": "🐟", 596 | "tropical_fish": "🐠", 597 | "blowfish": "🐡", 598 | "shark": "🦈", 599 | "octopus": "🐙", 600 | "shell": "🐚", 601 | "snail": "🐌", 602 | "butterfly": "🦋", 603 | "bug": "🐛", 604 | "ant": "🐜", 605 | "bee": "🐝", 606 | "beetle": "🪲", 607 | "lady_beetle": "🐞", 608 | "cricket": "🦗", 609 | "cockroach": "🪳", 610 | "spider": "🕷️", 611 | "spider_web": "🕸️", 612 | "scorpion": "🦂", 613 | "mosquito": "🦟", 614 | "fly": "🪰", 615 | "worm": "🪱", 616 | "microbe": "🦠", 617 | "bouquet": "💐", 618 | "cherry_blossom": "🌸", 619 | "white_flower": "💮", 620 | "rosette": "🏵️", 621 | "rose": "🌹", 622 | "wilted_flower": "🥀", 623 | "hibiscus": "🌺", 624 | "sunflower": "🌻", 625 | "blossom": "🌼", 626 | "tulip": "🌷", 627 | "seedling": "🌱", 628 | "potted_plant": "🪴", 629 | "evergreen_tree": "🌲", 630 | "deciduous_tree": "🌳", 631 | "palm_tree": "🌴", 632 | "cactus": "🌵", 633 | "ear_of_rice": "🌾", 634 | "herb": "🌿", 635 | "shamrock": "☘️", 636 | "four_leaf_clover": "🍀", 637 | "maple_leaf": "🍁", 638 | "fallen_leaf": "🍂", 639 | "leaves": "🍃", 640 | "grapes": "🍇", 641 | "melon": "🍈", 642 | "watermelon": "🍉", 643 | "tangerine": "🍊", 644 | "lemon": "🍋", 645 | "banana": "🍌", 646 | "pineapple": "🍍", 647 | "mango": "🥭", 648 | "apple": "🍎", 649 | "green_apple": "🍏", 650 | "pear": "🍐", 651 | "peach": "🍑", 652 | "cherries": "🍒", 653 | "strawberry": "🍓", 654 | "blueberries": "🫐", 655 | "kiwi_fruit": "🥝", 656 | "tomato": "🍅", 657 | "olive": "🫒", 658 | "coconut": "🥥", 659 | "avocado": "🥑", 660 | "eggplant": "🍆", 661 | "potato": "🥔", 662 | "carrot": "🥕", 663 | "corn": "🌽", 664 | "hot_pepper": "🌶️", 665 | "bell_pepper": "🫑", 666 | "cucumber": "🥒", 667 | "leafy_green": "🥬", 668 | "broccoli": "🥦", 669 | "garlic": "🧄", 670 | "onion": "🧅", 671 | "mushroom": "🍄", 672 | "peanuts": "🥜", 673 | "chestnut": "🌰", 674 | "bread": "🍞", 675 | "croissant": "🥐", 676 | "baguette_bread": "🥖", 677 | "flatbread": "🫓", 678 | "pretzel": "🥨", 679 | "bagel": "🥯", 680 | "pancakes": "🥞", 681 | "waffle": "🧇", 682 | "cheese": "🧀", 683 | "meat_on_bone": "🍖", 684 | "poultry_leg": "🍗", 685 | "cut_of_meat": "🥩", 686 | "bacon": "🥓", 687 | "hamburger": "🍔", 688 | "fries": "🍟", 689 | "pizza": "🍕", 690 | "hotdog": "🌭", 691 | "sandwich": "🥪", 692 | "taco": "🌮", 693 | "burrito": "🌯", 694 | "tamale": "🫔", 695 | "stuffed_flatbread": "🥙", 696 | "falafel": "🧆", 697 | "egg": "🥚", 698 | "fried_egg": "🍳", 699 | "shallow_pan_of_food": "🥘", 700 | "stew": "🍲", 701 | "fondue": "🫕", 702 | "bowl_with_spoon": "🥣", 703 | "green_salad": "🥗", 704 | "popcorn": "🍿", 705 | "butter": "🧈", 706 | "salt": "🧂", 707 | "canned_food": "🥫", 708 | "bento": "🍱", 709 | "rice_cracker": "🍘", 710 | "rice_ball": "🍙", 711 | "rice": "🍚", 712 | "curry": "🍛", 713 | "ramen": "🍜", 714 | "spaghetti": "🍝", 715 | "sweet_potato": "🍠", 716 | "oden": "🍢", 717 | "sushi": "🍣", 718 | "fried_shrimp": "🍤", 719 | "fish_cake": "🍥", 720 | "moon_cake": "🥮", 721 | "dango": "🍡", 722 | "dumpling": "🥟", 723 | "fortune_cookie": "🥠", 724 | "takeout_box": "🥡", 725 | "crab": "🦀", 726 | "lobster": "🦞", 727 | "shrimp": "🦐", 728 | "squid": "🦑", 729 | "oyster": "🦪", 730 | "icecream": "🍦", 731 | "shaved_ice": "🍧", 732 | "ice_cream": "🍨", 733 | "doughnut": "🍩", 734 | "cookie": "🍪", 735 | "birthday": "🎂", 736 | "cake": "🍰", 737 | "cupcake": "🧁", 738 | "pie": "🥧", 739 | "chocolate_bar": "🍫", 740 | "candy": "🍬", 741 | "lollipop": "🍭", 742 | "custard": "🍮", 743 | "honey_pot": "🍯", 744 | "baby_bottle": "🍼", 745 | "milk_glass": "🥛", 746 | "coffee": "☕", 747 | "teapot": "🫖", 748 | "tea": "🍵", 749 | "sake": "🍶", 750 | "champagne": "🍾", 751 | "wine_glass": "🍷", 752 | "cocktail": "🍸", 753 | "tropical_drink": "🍹", 754 | "beer": "🍺", 755 | "beers": "🍻", 756 | "clinking_glasses": "🥂", 757 | "tumbler_glass": "🥃", 758 | "cup_with_straw": "🥤", 759 | "bubble_tea": "🧋", 760 | "beverage_box": "🧃", 761 | "mate": "🧉", 762 | "ice_cube": "🧊", 763 | "chopsticks": "🥢", 764 | "plate_with_cutlery": "🍽️", 765 | "fork_and_knife": "🍴", 766 | "spoon": "🥄", 767 | "hocho": "🔪", 768 | "amphora": "🏺", 769 | "earth_africa": "🌍", 770 | "earth_americas": "🌎", 771 | "earth_asia": "🌏", 772 | "globe_with_meridians": "🌐", 773 | "world_map": "🗺️", 774 | "japan": "🗾", 775 | "compass": "🧭", 776 | "mountain_snow": "🏔️", 777 | "mountain": "⛰️", 778 | "volcano": "🌋", 779 | "mount_fuji": "🗻", 780 | "camping": "🏕️", 781 | "beach_umbrella": "🏖️", 782 | "desert": "🏜️", 783 | "desert_island": "🏝️", 784 | "national_park": "🏞️", 785 | "stadium": "🏟️", 786 | "classical_building": "🏛️", 787 | "building_construction": "🏗️", 788 | "bricks": "🧱", 789 | "rock": "🪨", 790 | "wood": "🪵", 791 | "hut": "🛖", 792 | "houses": "🏘️", 793 | "derelict_house": "🏚️", 794 | "house": "🏠", 795 | "house_with_garden": "🏡", 796 | "office": "🏢", 797 | "post_office": "🏣", 798 | "european_post_office": "🏤", 799 | "hospital": "🏥", 800 | "bank": "🏦", 801 | "hotel": "🏨", 802 | "love_hotel": "🏩", 803 | "convenience_store": "🏪", 804 | "school": "🏫", 805 | "department_store": "🏬", 806 | "factory": "🏭", 807 | "japanese_castle": "🏯", 808 | "european_castle": "🏰", 809 | "wedding": "💒", 810 | "tokyo_tower": "🗼", 811 | "statue_of_liberty": "🗽", 812 | "church": "⛪", 813 | "mosque": "🕌", 814 | "hindu_temple": "🛕", 815 | "synagogue": "🕍", 816 | "shinto_shrine": "⛩️", 817 | "kaaba": "🕋", 818 | "fountain": "⛲", 819 | "tent": "⛺", 820 | "foggy": "🌁", 821 | "night_with_stars": "🌃", 822 | "cityscape": "🏙️", 823 | "sunrise_over_mountains": "🌄", 824 | "sunrise": "🌅", 825 | "city_sunset": "🌆", 826 | "city_sunrise": "🌇", 827 | "bridge_at_night": "🌉", 828 | "hotsprings": "♨️", 829 | "carousel_horse": "🎠", 830 | "ferris_wheel": "🎡", 831 | "roller_coaster": "🎢", 832 | "barber": "💈", 833 | "circus_tent": "🎪", 834 | "steam_locomotive": "🚂", 835 | "railway_car": "🚃", 836 | "bullettrain_side": "🚄", 837 | "bullettrain_front": "🚅", 838 | "train2": "🚆", 839 | "metro": "🚇", 840 | "light_rail": "🚈", 841 | "station": "🚉", 842 | "tram": "🚊", 843 | "monorail": "🚝", 844 | "mountain_railway": "🚞", 845 | "train": "🚋", 846 | "bus": "🚌", 847 | "oncoming_bus": "🚍", 848 | "trolleybus": "🚎", 849 | "minibus": "🚐", 850 | "ambulance": "🚑", 851 | "fire_engine": "🚒", 852 | "police_car": "🚓", 853 | "oncoming_police_car": "🚔", 854 | "taxi": "🚕", 855 | "oncoming_taxi": "🚖", 856 | "car": "🚗", 857 | "oncoming_automobile": "🚘", 858 | "blue_car": "🚙", 859 | "pickup_truck": "🛻", 860 | "truck": "🚚", 861 | "articulated_lorry": "🚛", 862 | "tractor": "🚜", 863 | "racing_car": "🏎️", 864 | "motorcycle": "🏍️", 865 | "motor_scooter": "🛵", 866 | "manual_wheelchair": "🦽", 867 | "motorized_wheelchair": "🦼", 868 | "auto_rickshaw": "🛺", 869 | "bike": "🚲", 870 | "kick_scooter": "🛴", 871 | "skateboard": "🛹", 872 | "roller_skate": "🛼", 873 | "busstop": "🚏", 874 | "motorway": "🛣️", 875 | "railway_track": "🛤️", 876 | "oil_drum": "🛢️", 877 | "fuelpump": "⛽", 878 | "rotating_light": "🚨", 879 | "traffic_light": "🚥", 880 | "vertical_traffic_light": "🚦", 881 | "stop_sign": "🛑", 882 | "construction": "🚧", 883 | "anchor": "⚓", 884 | "boat": "⛵", 885 | "canoe": "🛶", 886 | "speedboat": "🚤", 887 | "passenger_ship": "🛳️", 888 | "ferry": "⛴️", 889 | "motor_boat": "🛥️", 890 | "ship": "🚢", 891 | "airplane": "✈️", 892 | "small_airplane": "🛩️", 893 | "flight_departure": "🛫", 894 | "flight_arrival": "🛬", 895 | "parachute": "🪂", 896 | "seat": "💺", 897 | "helicopter": "🚁", 898 | "suspension_railway": "🚟", 899 | "mountain_cableway": "🚠", 900 | "aerial_tramway": "🚡", 901 | "artificial_satellite": "🛰️", 902 | "rocket": "🚀", 903 | "flying_saucer": "🛸", 904 | "bellhop_bell": "🛎️", 905 | "luggage": "🧳", 906 | "hourglass": "⌛", 907 | "hourglass_flowing_sand": "⏳", 908 | "watch": "⌚", 909 | "alarm_clock": "⏰", 910 | "stopwatch": "⏱️", 911 | "timer_clock": "⏲️", 912 | "mantelpiece_clock": "🕰️", 913 | "clock12": "🕛", 914 | "clock1230": "🕧", 915 | "clock1": "🕐", 916 | "clock130": "🕜", 917 | "clock2": "🕑", 918 | "clock230": "🕝", 919 | "clock3": "🕒", 920 | "clock330": "🕞", 921 | "clock4": "🕓", 922 | "clock430": "🕟", 923 | "clock5": "🕔", 924 | "clock530": "🕠", 925 | "clock6": "🕕", 926 | "clock630": "🕡", 927 | "clock7": "🕖", 928 | "clock730": "🕢", 929 | "clock8": "🕗", 930 | "clock830": "🕣", 931 | "clock9": "🕘", 932 | "clock930": "🕤", 933 | "clock10": "🕙", 934 | "clock1030": "🕥", 935 | "clock11": "🕚", 936 | "clock1130": "🕦", 937 | "new_moon": "🌑", 938 | "waxing_crescent_moon": "🌒", 939 | "first_quarter_moon": "🌓", 940 | "moon": "🌔", 941 | "full_moon": "🌕", 942 | "waning_gibbous_moon": "🌖", 943 | "last_quarter_moon": "🌗", 944 | "waning_crescent_moon": "🌘", 945 | "crescent_moon": "🌙", 946 | "new_moon_with_face": "🌚", 947 | "first_quarter_moon_with_face": "🌛", 948 | "last_quarter_moon_with_face": "🌜", 949 | "thermometer": "🌡️", 950 | "sunny": "☀️", 951 | "full_moon_with_face": "🌝", 952 | "sun_with_face": "🌞", 953 | "ringed_planet": "🪐", 954 | "star": "⭐", 955 | "star2": "🌟", 956 | "stars": "🌠", 957 | "milky_way": "🌌", 958 | "cloud": "☁️", 959 | "partly_sunny": "⛅", 960 | "cloud_with_lightning_and_rain": "⛈️", 961 | "sun_behind_small_cloud": "🌤️", 962 | "sun_behind_large_cloud": "🌥️", 963 | "sun_behind_rain_cloud": "🌦️", 964 | "cloud_with_rain": "🌧️", 965 | "cloud_with_snow": "🌨️", 966 | "cloud_with_lightning": "🌩️", 967 | "tornado": "🌪️", 968 | "fog": "🌫️", 969 | "wind_face": "🌬️", 970 | "cyclone": "🌀", 971 | "rainbow": "🌈", 972 | "closed_umbrella": "🌂", 973 | "open_umbrella": "☂️", 974 | "umbrella": "☔", 975 | "parasol_on_ground": "⛱️", 976 | "zap": "⚡", 977 | "snowflake": "❄️", 978 | "snowman_with_snow": "☃️", 979 | "snowman": "⛄", 980 | "comet": "☄️", 981 | "fire": "🔥", 982 | "droplet": "💧", 983 | "ocean": "🌊", 984 | "jack_o_lantern": "🎃", 985 | "christmas_tree": "🎄", 986 | "fireworks": "🎆", 987 | "sparkler": "🎇", 988 | "firecracker": "🧨", 989 | "sparkles": "✨", 990 | "balloon": "🎈", 991 | "tada": "🎉", 992 | "confetti_ball": "🎊", 993 | "tanabata_tree": "🎋", 994 | "bamboo": "🎍", 995 | "dolls": "🎎", 996 | "flags": "🎏", 997 | "wind_chime": "🎐", 998 | "rice_scene": "🎑", 999 | "red_envelope": "🧧", 1000 | "ribbon": "🎀", 1001 | "gift": "🎁", 1002 | "reminder_ribbon": "🎗️", 1003 | "tickets": "🎟️", 1004 | "ticket": "🎫", 1005 | "medal_military": "🎖️", 1006 | "trophy": "🏆", 1007 | "medal_sports": "🏅", 1008 | "1st_place_medal": "🥇", 1009 | "2nd_place_medal": "🥈", 1010 | "3rd_place_medal": "🥉", 1011 | "soccer": "⚽", 1012 | "baseball": "⚾", 1013 | "softball": "🥎", 1014 | "basketball": "🏀", 1015 | "volleyball": "🏐", 1016 | "football": "🏈", 1017 | "rugby_football": "🏉", 1018 | "tennis": "🎾", 1019 | "flying_disc": "🥏", 1020 | "bowling": "🎳", 1021 | "cricket_game": "🏏", 1022 | "field_hockey": "🏑", 1023 | "ice_hockey": "🏒", 1024 | "lacrosse": "🥍", 1025 | "ping_pong": "🏓", 1026 | "badminton": "🏸", 1027 | "boxing_glove": "🥊", 1028 | "martial_arts_uniform": "🥋", 1029 | "goal_net": "🥅", 1030 | "golf": "⛳", 1031 | "ice_skate": "⛸️", 1032 | "fishing_pole_and_fish": "🎣", 1033 | "diving_mask": "🤿", 1034 | "running_shirt_with_sash": "🎽", 1035 | "ski": "🎿", 1036 | "sled": "🛷", 1037 | "curling_stone": "🥌", 1038 | "dart": "🎯", 1039 | "yo_yo": "🪀", 1040 | "kite": "🪁", 1041 | "8ball": "🎱", 1042 | "crystal_ball": "🔮", 1043 | "magic_wand": "🪄", 1044 | "nazar_amulet": "🧿", 1045 | "video_game": "🎮", 1046 | "joystick": "🕹️", 1047 | "slot_machine": "🎰", 1048 | "game_die": "🎲", 1049 | "jigsaw": "🧩", 1050 | "teddy_bear": "🧸", 1051 | "pi_ata": "🪅", 1052 | "nesting_dolls": "🪆", 1053 | "spades": "♠️", 1054 | "hearts": "♥️", 1055 | "diamonds": "♦️", 1056 | "clubs": "♣️", 1057 | "chess_pawn": "♟️", 1058 | "black_joker": "🃏", 1059 | "mahjong": "🀄", 1060 | "flower_playing_cards": "🎴", 1061 | "performing_arts": "🎭", 1062 | "framed_picture": "🖼️", 1063 | "art": "🎨", 1064 | "thread": "🧵", 1065 | "sewing_needle": "🪡", 1066 | "yarn": "🧶", 1067 | "knot": "🪢", 1068 | "eyeglasses": "👓", 1069 | "dark_sunglasses": "🕶️", 1070 | "goggles": "🥽", 1071 | "lab_coat": "🥼", 1072 | "safety_vest": "🦺", 1073 | "necktie": "👔", 1074 | "shirt": "👕", 1075 | "jeans": "👖", 1076 | "scarf": "🧣", 1077 | "gloves": "🧤", 1078 | "coat": "🧥", 1079 | "socks": "🧦", 1080 | "dress": "👗", 1081 | "kimono": "👘", 1082 | "sari": "🥻", 1083 | "one_piece_swimsuit": "🩱", 1084 | "swim_brief": "🩲", 1085 | "shorts": "🩳", 1086 | "bikini": "👙", 1087 | "womans_clothes": "👚", 1088 | "purse": "👛", 1089 | "handbag": "👜", 1090 | "pouch": "👝", 1091 | "shopping": "🛍️", 1092 | "school_satchel": "🎒", 1093 | "thong_sandal": "🩴", 1094 | "mans_shoe": "👞", 1095 | "athletic_shoe": "👟", 1096 | "hiking_boot": "🥾", 1097 | "flat_shoe": "🥿", 1098 | "high_heel": "👠", 1099 | "sandal": "👡", 1100 | "ballet_shoes": "🩰", 1101 | "boot": "👢", 1102 | "crown": "👑", 1103 | "womans_hat": "👒", 1104 | "tophat": "🎩", 1105 | "mortar_board": "🎓", 1106 | "billed_cap": "🧢", 1107 | "military_helmet": "🪖", 1108 | "rescue_worker_helmet": "⛑️", 1109 | "prayer_beads": "📿", 1110 | "lipstick": "💄", 1111 | "ring": "💍", 1112 | "gem": "💎", 1113 | "mute": "🔇", 1114 | "speaker": "🔈", 1115 | "sound": "🔉", 1116 | "loud_sound": "🔊", 1117 | "loudspeaker": "📢", 1118 | "mega": "📣", 1119 | "postal_horn": "📯", 1120 | "bell": "🔔", 1121 | "no_bell": "🔕", 1122 | "musical_score": "🎼", 1123 | "musical_note": "🎵", 1124 | "notes": "🎶", 1125 | "studio_microphone": "🎙️", 1126 | "level_slider": "🎚️", 1127 | "control_knobs": "🎛️", 1128 | "microphone": "🎤", 1129 | "headphones": "🎧", 1130 | "radio": "📻", 1131 | "saxophone": "🎷", 1132 | "accordion": "🪗", 1133 | "guitar": "🎸", 1134 | "musical_keyboard": "🎹", 1135 | "trumpet": "🎺", 1136 | "violin": "🎻", 1137 | "banjo": "🪕", 1138 | "drum": "🥁", 1139 | "long_drum": "🪘", 1140 | "iphone": "📱", 1141 | "calling": "📲", 1142 | "phone": "☎️", 1143 | "telephone_receiver": "📞", 1144 | "pager": "📟", 1145 | "fax": "📠", 1146 | "battery": "🔋", 1147 | "electric_plug": "🔌", 1148 | "computer": "💻", 1149 | "desktop_computer": "🖥️", 1150 | "printer": "🖨️", 1151 | "keyboard": "⌨️", 1152 | "computer_mouse": "🖱️", 1153 | "trackball": "🖲️", 1154 | "minidisc": "💽", 1155 | "floppy_disk": "💾", 1156 | "cd": "💿", 1157 | "dvd": "📀", 1158 | "abacus": "🧮", 1159 | "movie_camera": "🎥", 1160 | "film_strip": "🎞️", 1161 | "film_projector": "📽️", 1162 | "clapper": "🎬", 1163 | "tv": "📺", 1164 | "camera": "📷", 1165 | "camera_flash": "📸", 1166 | "video_camera": "📹", 1167 | "vhs": "📼", 1168 | "mag": "🔍", 1169 | "mag_right": "🔎", 1170 | "candle": "🕯️", 1171 | "bulb": "💡", 1172 | "flashlight": "🔦", 1173 | "izakaya_lantern": "🏮", 1174 | "diya_lamp": "🪔", 1175 | "notebook_with_decorative_cover": "📔", 1176 | "closed_book": "📕", 1177 | "book": "📖", 1178 | "green_book": "📗", 1179 | "blue_book": "📘", 1180 | "orange_book": "📙", 1181 | "books": "📚", 1182 | "notebook": "📓", 1183 | "ledger": "📒", 1184 | "page_with_curl": "📃", 1185 | "scroll": "📜", 1186 | "page_facing_up": "📄", 1187 | "newspaper": "📰", 1188 | "newspaper_roll": "🗞️", 1189 | "bookmark_tabs": "📑", 1190 | "bookmark": "🔖", 1191 | "label": "🏷️", 1192 | "moneybag": "💰", 1193 | "coin": "🪙", 1194 | "yen": "💴", 1195 | "dollar": "💵", 1196 | "euro": "💶", 1197 | "pound": "💷", 1198 | "money_with_wings": "💸", 1199 | "credit_card": "💳", 1200 | "receipt": "🧾", 1201 | "chart": "💹", 1202 | "email": "✉️", 1203 | "e-mail": "📧", 1204 | "incoming_envelope": "📨", 1205 | "envelope_with_arrow": "📩", 1206 | "outbox_tray": "📤", 1207 | "inbox_tray": "📥", 1208 | "package": "📦", 1209 | "mailbox": "📫", 1210 | "mailbox_closed": "📪", 1211 | "mailbox_with_mail": "📬", 1212 | "mailbox_with_no_mail": "📭", 1213 | "postbox": "📮", 1214 | "ballot_box": "🗳️", 1215 | "pencil2": "✏️", 1216 | "black_nib": "✒️", 1217 | "fountain_pen": "🖋️", 1218 | "pen": "🖊️", 1219 | "paintbrush": "🖌️", 1220 | "crayon": "🖍️", 1221 | "memo": "📝", 1222 | "briefcase": "💼", 1223 | "file_folder": "📁", 1224 | "open_file_folder": "📂", 1225 | "card_index_dividers": "🗂️", 1226 | "date": "📅", 1227 | "calendar": "📆", 1228 | "spiral_notepad": "🗒️", 1229 | "spiral_calendar": "🗓️", 1230 | "card_index": "📇", 1231 | "chart_with_upwards_trend": "📈", 1232 | "chart_with_downwards_trend": "📉", 1233 | "bar_chart": "📊", 1234 | "clipboard": "📋", 1235 | "pushpin": "📌", 1236 | "round_pushpin": "📍", 1237 | "paperclip": "📎", 1238 | "paperclips": "🖇️", 1239 | "straight_ruler": "📏", 1240 | "triangular_ruler": "📐", 1241 | "scissors": "✂️", 1242 | "card_file_box": "🗃️", 1243 | "file_cabinet": "🗄️", 1244 | "wastebasket": "🗑️", 1245 | "lock": "🔒", 1246 | "unlock": "🔓", 1247 | "lock_with_ink_pen": "🔏", 1248 | "closed_lock_with_key": "🔐", 1249 | "key": "🔑", 1250 | "old_key": "🗝️", 1251 | "hammer": "🔨", 1252 | "axe": "🪓", 1253 | "pick": "⛏️", 1254 | "hammer_and_pick": "⚒️", 1255 | "hammer_and_wrench": "🛠️", 1256 | "dagger": "🗡️", 1257 | "crossed_swords": "⚔️", 1258 | "gun": "🔫", 1259 | "boomerang": "🪃", 1260 | "bow_and_arrow": "🏹", 1261 | "shield": "🛡️", 1262 | "carpentry_saw": "🪚", 1263 | "wrench": "🔧", 1264 | "screwdriver": "🪛", 1265 | "nut_and_bolt": "🔩", 1266 | "gear": "⚙️", 1267 | "clamp": "🗜️", 1268 | "balance_scale": "⚖️", 1269 | "probing_cane": "🦯", 1270 | "link": "🔗", 1271 | "chains": "⛓️", 1272 | "hook": "🪝", 1273 | "toolbox": "🧰", 1274 | "magnet": "🧲", 1275 | "ladder": "🪜", 1276 | "alembic": "⚗️", 1277 | "test_tube": "🧪", 1278 | "petri_dish": "🧫", 1279 | "dna": "🧬", 1280 | "microscope": "🔬", 1281 | "telescope": "🔭", 1282 | "satellite": "📡", 1283 | "syringe": "💉", 1284 | "drop_of_blood": "🩸", 1285 | "pill": "💊", 1286 | "adhesive_bandage": "🩹", 1287 | "stethoscope": "🩺", 1288 | "door": "🚪", 1289 | "elevator": "🛗", 1290 | "mirror": "🪞", 1291 | "window": "🪟", 1292 | "bed": "🛏️", 1293 | "couch_and_lamp": "🛋️", 1294 | "chair": "🪑", 1295 | "toilet": "🚽", 1296 | "plunger": "🪠", 1297 | "shower": "🚿", 1298 | "bathtub": "🛁", 1299 | "mouse_trap": "🪤", 1300 | "razor": "🪒", 1301 | "lotion_bottle": "🧴", 1302 | "safety_pin": "🧷", 1303 | "broom": "🧹", 1304 | "basket": "🧺", 1305 | "roll_of_paper": "🧻", 1306 | "bucket": "🪣", 1307 | "soap": "🧼", 1308 | "toothbrush": "🪥", 1309 | "sponge": "🧽", 1310 | "fire_extinguisher": "🧯", 1311 | "shopping_cart": "🛒", 1312 | "smoking": "🚬", 1313 | "coffin": "⚰️", 1314 | "headstone": "🪦", 1315 | "funeral_urn": "⚱️", 1316 | "moyai": "🗿", 1317 | "placard": "🪧", 1318 | "atm": "🏧", 1319 | "put_litter_in_its_place": "🚮", 1320 | "potable_water": "🚰", 1321 | "wheelchair": "♿", 1322 | "mens": "🚹", 1323 | "womens": "🚺", 1324 | "restroom": "🚻", 1325 | "baby_symbol": "🚼", 1326 | "wc": "🚾", 1327 | "passport_control": "🛂", 1328 | "customs": "🛃", 1329 | "baggage_claim": "🛄", 1330 | "left_luggage": "🛅", 1331 | "warning": "⚠️", 1332 | "children_crossing": "🚸", 1333 | "no_entry": "⛔", 1334 | "no_entry_sign": "🚫", 1335 | "no_bicycles": "🚳", 1336 | "no_smoking": "🚭", 1337 | "do_not_litter": "🚯", 1338 | "non-potable_water": "🚱", 1339 | "no_pedestrians": "🚷", 1340 | "no_mobile_phones": "📵", 1341 | "underage": "🔞", 1342 | "radioactive": "☢️", 1343 | "biohazard": "☣️", 1344 | "arrow_up": "⬆️", 1345 | "arrow_upper_right": "↗️", 1346 | "arrow_right": "➡️", 1347 | "arrow_lower_right": "↘️", 1348 | "arrow_down": "⬇️", 1349 | "arrow_lower_left": "↙️", 1350 | "arrow_left": "⬅️", 1351 | "arrow_upper_left": "↖️", 1352 | "arrow_up_down": "↕️", 1353 | "left_right_arrow": "↔️", 1354 | "leftwards_arrow_with_hook": "↩️", 1355 | "arrow_right_hook": "↪️", 1356 | "arrow_heading_up": "⤴️", 1357 | "arrow_heading_down": "⤵️", 1358 | "arrows_clockwise": "🔃", 1359 | "arrows_counterclockwise": "🔄", 1360 | "back": "🔙", 1361 | "end": "🔚", 1362 | "on": "🔛", 1363 | "soon": "🔜", 1364 | "top": "🔝", 1365 | "place_of_worship": "🛐", 1366 | "atom_symbol": "⚛️", 1367 | "om": "🕉️", 1368 | "star_of_david": "✡️", 1369 | "wheel_of_dharma": "☸️", 1370 | "yin_yang": "☯️", 1371 | "latin_cross": "✝️", 1372 | "orthodox_cross": "☦️", 1373 | "star_and_crescent": "☪️", 1374 | "peace_symbol": "☮️", 1375 | "menorah": "🕎", 1376 | "six_pointed_star": "🔯", 1377 | "aries": "♈", 1378 | "taurus": "♉", 1379 | "gemini": "♊", 1380 | "cancer": "♋", 1381 | "leo": "♌", 1382 | "virgo": "♍", 1383 | "libra": "♎", 1384 | "scorpius": "♏", 1385 | "sagittarius": "♐", 1386 | "capricorn": "♑", 1387 | "aquarius": "♒", 1388 | "pisces": "♓", 1389 | "ophiuchus": "⛎", 1390 | "twisted_rightwards_arrows": "🔀", 1391 | "repeat": "🔁", 1392 | "repeat_one": "🔂", 1393 | "arrow_forward": "▶️", 1394 | "fast_forward": "⏩", 1395 | "next_track_button": "⏭️", 1396 | "play_or_pause_button": "⏯️", 1397 | "arrow_backward": "◀️", 1398 | "rewind": "⏪", 1399 | "previous_track_button": "⏮️", 1400 | "arrow_up_small": "🔼", 1401 | "arrow_double_up": "⏫", 1402 | "arrow_down_small": "🔽", 1403 | "arrow_double_down": "⏬", 1404 | "pause_button": "⏸️", 1405 | "stop_button": "⏹️", 1406 | "record_button": "⏺️", 1407 | "eject_button": "⏏️", 1408 | "cinema": "🎦", 1409 | "low_brightness": "🔅", 1410 | "high_brightness": "🔆", 1411 | "signal_strength": "📶", 1412 | "vibration_mode": "📳", 1413 | "mobile_phone_off": "📴", 1414 | "female_sign": "♀️", 1415 | "male_sign": "♂️", 1416 | "transgender_symbol": "⚧️", 1417 | "heavy_multiplication_x": "✖️", 1418 | "heavy_plus_sign": "➕", 1419 | "heavy_minus_sign": "➖", 1420 | "heavy_division_sign": "➗", 1421 | "infinity": "♾️", 1422 | "bangbang": "‼️", 1423 | "interrobang": "⁉️", 1424 | "question": "❓", 1425 | "grey_question": "❔", 1426 | "grey_exclamation": "❕", 1427 | "exclamation": "❗", 1428 | "wavy_dash": "〰️", 1429 | "currency_exchange": "💱", 1430 | "heavy_dollar_sign": "💲", 1431 | "medical_symbol": "⚕️", 1432 | "recycle": "♻️", 1433 | "fleur_de_lis": "⚜️", 1434 | "trident": "🔱", 1435 | "name_badge": "📛", 1436 | "beginner": "🔰", 1437 | "o": "⭕", 1438 | "white_check_mark": "✅", 1439 | "ballot_box_with_check": "☑️", 1440 | "heavy_check_mark": "✔️", 1441 | "x": "❌", 1442 | "negative_squared_cross_mark": "❎", 1443 | "curly_loop": "➰", 1444 | "loop": "➿", 1445 | "part_alternation_mark": "〽️", 1446 | "eight_spoked_asterisk": "✳️", 1447 | "eight_pointed_black_star": "✴️", 1448 | "sparkle": "❇️", 1449 | "copyright": "©️", 1450 | "registered": "®️", 1451 | "tm": "™️", 1452 | "hash": "#️⃣", 1453 | "asterisk": "*️⃣", 1454 | "zero": "0️⃣", 1455 | "one": "1️⃣", 1456 | "two": "2️⃣", 1457 | "three": "3️⃣", 1458 | "four": "4️⃣", 1459 | "five": "5️⃣", 1460 | "six": "6️⃣", 1461 | "seven": "7️⃣", 1462 | "eight": "8️⃣", 1463 | "nine": "9️⃣", 1464 | "keycap_ten": "🔟", 1465 | "capital_abcd": "🔠", 1466 | "abcd": "🔡", 1467 | "1234": "🔢", 1468 | "symbols": "🔣", 1469 | "abc": "🔤", 1470 | "a": "🅰️", 1471 | "ab": "🆎", 1472 | "b": "🅱️", 1473 | "cl": "🆑", 1474 | "cool": "🆒", 1475 | "free": "🆓", 1476 | "information_source": "ℹ️", 1477 | "id": "🆔", 1478 | "m": "Ⓜ️", 1479 | "new": "🆕", 1480 | "ng": "🆖", 1481 | "o2": "🅾️", 1482 | "ok": "🆗", 1483 | "parking": "🅿️", 1484 | "sos": "🆘", 1485 | "up": "🆙", 1486 | "vs": "🆚", 1487 | "koko": "🈁", 1488 | "sa": "🈂️", 1489 | "u6708": "🈷️", 1490 | "u6709": "🈶", 1491 | "u6307": "🈯", 1492 | "ideograph_advantage": "🉐", 1493 | "u5272": "🈹", 1494 | "u7121": "🈚", 1495 | "u7981": "🈲", 1496 | "accept": "🉑", 1497 | "u7533": "🈸", 1498 | "u5408": "🈴", 1499 | "u7a7a": "🈳", 1500 | "congratulations": "㊗️", 1501 | "secret": "㊙️", 1502 | "u55b6": "🈺", 1503 | "u6e80": "🈵", 1504 | "red_circle": "🔴", 1505 | "orange_circle": "🟠", 1506 | "yellow_circle": "🟡", 1507 | "green_circle": "🟢", 1508 | "large_blue_circle": "🔵", 1509 | "purple_circle": "🟣", 1510 | "brown_circle": "🟤", 1511 | "black_circle": "⚫", 1512 | "white_circle": "⚪", 1513 | "red_square": "🟥", 1514 | "orange_square": "🟧", 1515 | "yellow_square": "🟨", 1516 | "green_square": "🟩", 1517 | "blue_square": "🟦", 1518 | "purple_square": "🟪", 1519 | "brown_square": "🟫", 1520 | "black_large_square": "⬛", 1521 | "white_large_square": "⬜", 1522 | "black_medium_square": "◼️", 1523 | "white_medium_square": "◻️", 1524 | "black_medium_small_square": "◾", 1525 | "white_medium_small_square": "◽", 1526 | "black_small_square": "▪️", 1527 | "white_small_square": "▫️", 1528 | "large_orange_diamond": "🔶", 1529 | "large_blue_diamond": "🔷", 1530 | "small_orange_diamond": "🔸", 1531 | "small_blue_diamond": "🔹", 1532 | "small_red_triangle": "🔺", 1533 | "small_red_triangle_down": "🔻", 1534 | "diamond_shape_with_a_dot_inside": "💠", 1535 | "radio_button": "🔘", 1536 | "white_square_button": "🔳", 1537 | "black_square_button": "🔲", 1538 | "checkered_flag": "🏁", 1539 | "triangular_flag_on_post": "🚩", 1540 | "crossed_flags": "🎌", 1541 | "black_flag": "🏴", 1542 | "white_flag": "🏳️", 1543 | "rainbow_flag": "🏳️‍🌈", 1544 | "transgender_flag": "🏳️‍⚧️", 1545 | "pirate_flag": "🏴‍☠️", 1546 | "ascension_island": "🇦🇨", 1547 | "andorra": "🇦🇩", 1548 | "united_arab_emirates": "🇦🇪", 1549 | "afghanistan": "🇦🇫", 1550 | "antigua_barbuda": "🇦🇬", 1551 | "anguilla": "🇦🇮", 1552 | "albania": "🇦🇱", 1553 | "armenia": "🇦🇲", 1554 | "angola": "🇦🇴", 1555 | "antarctica": "🇦🇶", 1556 | "argentina": "🇦🇷", 1557 | "american_samoa": "🇦🇸", 1558 | "austria": "🇦🇹", 1559 | "australia": "🇦🇺", 1560 | "aruba": "🇦🇼", 1561 | "aland_islands": "🇦🇽", 1562 | "azerbaijan": "🇦🇿", 1563 | "bosnia_herzegovina": "🇧🇦", 1564 | "barbados": "🇧🇧", 1565 | "bangladesh": "🇧🇩", 1566 | "belgium": "🇧🇪", 1567 | "burkina_faso": "🇧🇫", 1568 | "bulgaria": "🇧🇬", 1569 | "bahrain": "🇧🇭", 1570 | "burundi": "🇧🇮", 1571 | "benin": "🇧🇯", 1572 | "st_barthelemy": "🇧🇱", 1573 | "bermuda": "🇧🇲", 1574 | "brunei": "🇧🇳", 1575 | "bolivia": "🇧🇴", 1576 | "caribbean_netherlands": "🇧🇶", 1577 | "brazil": "🇧🇷", 1578 | "bahamas": "🇧🇸", 1579 | "bhutan": "🇧🇹", 1580 | "bouvet_island": "🇧🇻", 1581 | "botswana": "🇧🇼", 1582 | "belarus": "🇧🇾", 1583 | "belize": "🇧🇿", 1584 | "canada": "🇨🇦", 1585 | "cocos_islands": "🇨🇨", 1586 | "congo_kinshasa": "🇨🇩", 1587 | "central_african_republic": "🇨🇫", 1588 | "congo_brazzaville": "🇨🇬", 1589 | "switzerland": "🇨🇭", 1590 | "cote_divoire": "🇨🇮", 1591 | "cook_islands": "🇨🇰", 1592 | "chile": "🇨🇱", 1593 | "cameroon": "🇨🇲", 1594 | "cn": "🇨🇳", 1595 | "colombia": "🇨🇴", 1596 | "clipperton_island": "🇨🇵", 1597 | "costa_rica": "🇨🇷", 1598 | "cuba": "🇨🇺", 1599 | "cape_verde": "🇨🇻", 1600 | "curacao": "🇨🇼", 1601 | "christmas_island": "🇨🇽", 1602 | "cyprus": "🇨🇾", 1603 | "czech_republic": "🇨🇿", 1604 | "de": "🇩🇪", 1605 | "diego_garcia": "🇩🇬", 1606 | "djibouti": "🇩🇯", 1607 | "denmark": "🇩🇰", 1608 | "dominica": "🇩🇲", 1609 | "dominican_republic": "🇩🇴", 1610 | "algeria": "🇩🇿", 1611 | "ceuta_melilla": "🇪🇦", 1612 | "ecuador": "🇪🇨", 1613 | "estonia": "🇪🇪", 1614 | "egypt": "🇪🇬", 1615 | "western_sahara": "🇪🇭", 1616 | "eritrea": "🇪🇷", 1617 | "es": "🇪🇸", 1618 | "ethiopia": "🇪🇹", 1619 | "eu": "🇪🇺", 1620 | "finland": "🇫🇮", 1621 | "fiji": "🇫🇯", 1622 | "falkland_islands": "🇫🇰", 1623 | "micronesia": "🇫🇲", 1624 | "faroe_islands": "🇫🇴", 1625 | "fr": "🇫🇷", 1626 | "gabon": "🇬🇦", 1627 | "gb": "🇬🇧", 1628 | "grenada": "🇬🇩", 1629 | "georgia": "🇬🇪", 1630 | "french_guiana": "🇬🇫", 1631 | "guernsey": "🇬🇬", 1632 | "ghana": "🇬🇭", 1633 | "gibraltar": "🇬🇮", 1634 | "greenland": "🇬🇱", 1635 | "gambia": "🇬🇲", 1636 | "guinea": "🇬🇳", 1637 | "guadeloupe": "🇬🇵", 1638 | "equatorial_guinea": "🇬🇶", 1639 | "greece": "🇬🇷", 1640 | "south_georgia_south_sandwich_islands": "🇬🇸", 1641 | "guatemala": "🇬🇹", 1642 | "guam": "🇬🇺", 1643 | "guinea_bissau": "🇬🇼", 1644 | "guyana": "🇬🇾", 1645 | "hong_kong": "🇭🇰", 1646 | "heard_mcdonald_islands": "🇭🇲", 1647 | "honduras": "🇭🇳", 1648 | "croatia": "🇭🇷", 1649 | "haiti": "🇭🇹", 1650 | "hungary": "🇭🇺", 1651 | "canary_islands": "🇮🇨", 1652 | "indonesia": "🇮🇩", 1653 | "ireland": "🇮🇪", 1654 | "israel": "🇮🇱", 1655 | "isle_of_man": "🇮🇲", 1656 | "india": "🇮🇳", 1657 | "british_indian_ocean_territory": "🇮🇴", 1658 | "iraq": "🇮🇶", 1659 | "iran": "🇮🇷", 1660 | "iceland": "🇮🇸", 1661 | "it": "🇮🇹", 1662 | "jersey": "🇯🇪", 1663 | "jamaica": "🇯🇲", 1664 | "jordan": "🇯🇴", 1665 | "jp": "🇯🇵", 1666 | "kenya": "🇰🇪", 1667 | "kyrgyzstan": "🇰🇬", 1668 | "cambodia": "🇰🇭", 1669 | "kiribati": "🇰🇮", 1670 | "comoros": "🇰🇲", 1671 | "st_kitts_nevis": "🇰🇳", 1672 | "north_korea": "🇰🇵", 1673 | "kr": "🇰🇷", 1674 | "kuwait": "🇰🇼", 1675 | "cayman_islands": "🇰🇾", 1676 | "kazakhstan": "🇰🇿", 1677 | "laos": "🇱🇦", 1678 | "lebanon": "🇱🇧", 1679 | "st_lucia": "🇱🇨", 1680 | "liechtenstein": "🇱🇮", 1681 | "sri_lanka": "🇱🇰", 1682 | "liberia": "🇱🇷", 1683 | "lesotho": "🇱🇸", 1684 | "lithuania": "🇱🇹", 1685 | "luxembourg": "🇱🇺", 1686 | "latvia": "🇱🇻", 1687 | "libya": "🇱🇾", 1688 | "morocco": "🇲🇦", 1689 | "monaco": "🇲🇨", 1690 | "moldova": "🇲🇩", 1691 | "montenegro": "🇲🇪", 1692 | "st_martin": "🇲🇫", 1693 | "madagascar": "🇲🇬", 1694 | "marshall_islands": "🇲🇭", 1695 | "macedonia": "🇲🇰", 1696 | "mali": "🇲🇱", 1697 | "myanmar": "🇲🇲", 1698 | "mongolia": "🇲🇳", 1699 | "macau": "🇲🇴", 1700 | "northern_mariana_islands": "🇲🇵", 1701 | "martinique": "🇲🇶", 1702 | "mauritania": "🇲🇷", 1703 | "montserrat": "🇲🇸", 1704 | "malta": "🇲🇹", 1705 | "mauritius": "🇲🇺", 1706 | "maldives": "🇲🇻", 1707 | "malawi": "🇲🇼", 1708 | "mexico": "🇲🇽", 1709 | "malaysia": "🇲🇾", 1710 | "mozambique": "🇲🇿", 1711 | "namibia": "🇳🇦", 1712 | "new_caledonia": "🇳🇨", 1713 | "niger": "🇳🇪", 1714 | "norfolk_island": "🇳🇫", 1715 | "nigeria": "🇳🇬", 1716 | "nicaragua": "🇳🇮", 1717 | "netherlands": "🇳🇱", 1718 | "norway": "🇳🇴", 1719 | "nepal": "🇳🇵", 1720 | "nauru": "🇳🇷", 1721 | "niue": "🇳🇺", 1722 | "new_zealand": "🇳🇿", 1723 | "oman": "🇴🇲", 1724 | "panama": "🇵🇦", 1725 | "peru": "🇵🇪", 1726 | "french_polynesia": "🇵🇫", 1727 | "papua_new_guinea": "🇵🇬", 1728 | "philippines": "🇵🇭", 1729 | "pakistan": "🇵🇰", 1730 | "poland": "🇵🇱", 1731 | "st_pierre_miquelon": "🇵🇲", 1732 | "pitcairn_islands": "🇵🇳", 1733 | "puerto_rico": "🇵🇷", 1734 | "palestinian_territories": "🇵🇸", 1735 | "portugal": "🇵🇹", 1736 | "palau": "🇵🇼", 1737 | "paraguay": "🇵🇾", 1738 | "qatar": "🇶🇦", 1739 | "reunion": "🇷🇪", 1740 | "romania": "🇷🇴", 1741 | "serbia": "🇷🇸", 1742 | "ru": "🇷🇺", 1743 | "rwanda": "🇷🇼", 1744 | "saudi_arabia": "🇸🇦", 1745 | "solomon_islands": "🇸🇧", 1746 | "seychelles": "🇸🇨", 1747 | "sudan": "🇸🇩", 1748 | "sweden": "🇸🇪", 1749 | "singapore": "🇸🇬", 1750 | "st_helena": "🇸🇭", 1751 | "slovenia": "🇸🇮", 1752 | "svalbard_jan_mayen": "🇸🇯", 1753 | "slovakia": "🇸🇰", 1754 | "sierra_leone": "🇸🇱", 1755 | "san_marino": "🇸🇲", 1756 | "senegal": "🇸🇳", 1757 | "somalia": "🇸🇴", 1758 | "suriname": "🇸🇷", 1759 | "south_sudan": "🇸🇸", 1760 | "sao_tome_principe": "🇸🇹", 1761 | "el_salvador": "🇸🇻", 1762 | "sint_maarten": "🇸🇽", 1763 | "syria": "🇸🇾", 1764 | "swaziland": "🇸🇿", 1765 | "tristan_da_cunha": "🇹🇦", 1766 | "turks_caicos_islands": "🇹🇨", 1767 | "chad": "🇹🇩", 1768 | "french_southern_territories": "🇹🇫", 1769 | "togo": "🇹🇬", 1770 | "thailand": "🇹🇭", 1771 | "tajikistan": "🇹🇯", 1772 | "tokelau": "🇹🇰", 1773 | "timor_leste": "🇹🇱", 1774 | "turkmenistan": "🇹🇲", 1775 | "tunisia": "🇹🇳", 1776 | "tonga": "🇹🇴", 1777 | "tr": "🇹🇷", 1778 | "trinidad_tobago": "🇹🇹", 1779 | "tuvalu": "🇹🇻", 1780 | "taiwan": "🇹🇼", 1781 | "tanzania": "🇹🇿", 1782 | "ukraine": "🇺🇦", 1783 | "uganda": "🇺🇬", 1784 | "us_outlying_islands": "🇺🇲", 1785 | "united_nations": "🇺🇳", 1786 | "us": "🇺🇸", 1787 | "uruguay": "🇺🇾", 1788 | "uzbekistan": "🇺🇿", 1789 | "vatican_city": "🇻🇦", 1790 | "st_vincent_grenadines": "🇻🇨", 1791 | "venezuela": "🇻🇪", 1792 | "british_virgin_islands": "🇻🇬", 1793 | "us_virgin_islands": "🇻🇮", 1794 | "vietnam": "🇻🇳", 1795 | "vanuatu": "🇻🇺", 1796 | "wallis_futuna": "🇼🇫", 1797 | "samoa": "🇼🇸", 1798 | "kosovo": "🇽🇰", 1799 | "yemen": "🇾🇪", 1800 | "mayotte": "🇾🇹", 1801 | "south_africa": "🇿🇦", 1802 | "zambia": "🇿🇲", 1803 | "zimbabwe": "🇿🇼", 1804 | "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", 1805 | "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", 1806 | "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", 1807 | ] -------------------------------------------------------------------------------- /Sources/Sequence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Sequence.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 24/02/2017. 6 | // Copyright © 2017 Fantageek. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct Sequence { 12 | 13 | public struct Mark { 14 | public static let zeroWidthJoiner: String = emoji(unicodeValues: [0x200D]) 15 | public static let presentationSelector: String = emoji(unicodeValues: [0xFE0F]) 16 | public static let enclosingKeyCap: String = emoji(unicodeValues: [0x20E3]) 17 | } 18 | 19 | public struct SkinTone { 20 | public static let light: String = "🏻" 21 | public static let mediumLight: String = "🏼" 22 | public static let medium: String = "🏽" 23 | public static let mediumDark: String = "🏾" 24 | public static let dark: String = "🏿" 25 | } 26 | 27 | public struct Gender { 28 | public static let male: String = emoji(unicodeValues: [0x2642]) 29 | public static let female: String = emoji(unicodeValues: [0x2640]) 30 | } 31 | 32 | public struct VariationSelector { 33 | public static let start: String = emoji(unicodeValues: [0xFE00]) 34 | public static let end: String = emoji(unicodeValues: [0xFE0F]) 35 | 36 | public static var all: [String] = 37 | Array(start.unicodeScalars.first!.value...end.unicodeScalars.first!.value) 38 | .map({ emoji(unicodeValues: [Int($0)]) }) 39 | } 40 | 41 | public static let all: [String] = [ 42 | Mark.zeroWidthJoiner, 43 | Mark.presentationSelector, 44 | Mark.enclosingKeyCap, 45 | SkinTone.light, SkinTone.mediumLight, SkinTone.mediumLight, SkinTone.mediumDark, SkinTone.dark 46 | ] + VariationSelector.all 47 | } 48 | -------------------------------------------------------------------------------- /Sources/Smile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Smile.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 05/06/16. 6 | // Copyright © 2016 Fantageek. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - List 12 | 13 | /// List all emojis 14 | public func list() -> [String] { 15 | let ranges = [ 16 | 0x1F601...0x1F64F, 17 | 0x2600...0x27B0, 18 | 0x23F0...0x23FA, 19 | 0x1F680...0x1F6C0, 20 | 0x1F170...0x1F251 21 | ] 22 | 23 | var all = ranges.joined().map { 24 | return String(Character(UnicodeScalar($0)!)) 25 | } 26 | 27 | //⌚️⌨️⭐️ 28 | let solos = [0x231A, 0x231B, 0x2328, 0x2B50] 29 | all.append(contentsOf: solos.map({ String(Character(UnicodeScalar($0)!))})) 30 | 31 | return all 32 | } 33 | 34 | // MARK: - Emoji 35 | 36 | /// Check if a character is emoji 37 | public func isEmoji(character: String) -> Bool { 38 | return emojiList.values.contains(character) 39 | } 40 | 41 | /// Check if a string contains any emojis 42 | @available(iOS, deprecated: 10.2, renamed: "containsEmoji(_string:)") 43 | public func containsEmoji(string: String) -> Bool { 44 | let set = CharacterSet(charactersIn: emojiList.values.joined()) 45 | let range = string 46 | .smile_removingDigits 47 | .rangeOfCharacter(from: set) 48 | 49 | return range != nil 50 | } 51 | 52 | /// Get emoji from unicode value 53 | public func emoji(unicodeValues: [Int]) -> String { 54 | return unicodeValues.compactMap({ 55 | guard let scalar = UnicodeScalar($0) else { 56 | return nil 57 | } 58 | 59 | return String(scalar) 60 | }).joined() 61 | } 62 | 63 | /// Unmodify an emoji 64 | public func unmodify(emoji: String) -> String { 65 | guard let first = emoji.unicodeScalars.first?.value else { 66 | return emoji 67 | } 68 | 69 | return Smile.emoji(unicodeValues: [Int(first)]) 70 | } 71 | 72 | /// Check if String is a simple emoji 73 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 74 | public func isSimpleEmoji(_ string: String) -> Bool{ 75 | guard let firstScalar = string.unicodeScalars.first else { return false } 76 | return firstScalar.properties.isEmoji && firstScalar.value > 0x238C 77 | } 78 | 79 | /// Check if multiple scalars will be merged into an emoji 80 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 81 | public func isCombinedIntoEmoji(_ string: String) -> Bool{ 82 | return string.unicodeScalars.count > 1 && string.unicodeScalars.first?.properties.isEmoji ?? false 83 | } 84 | 85 | /// Checks if string is emoji 86 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 87 | public func checkForEmoji(_ string: String) -> Bool{ 88 | return isSimpleEmoji(string) || isCombinedIntoEmoji(string) 89 | } 90 | 91 | /// Checks if string contains an emoji 92 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 93 | public func containsEmoji(_ string: String) -> Bool{ 94 | return countEmoji(string) > 0 95 | } 96 | 97 | /// Counts number of emoji characters found in string 98 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 99 | public func countEmoji(_ string: String) -> Int{ 100 | var count = 0 101 | for char in string{ 102 | if checkForEmoji("\(char)"){ 103 | count += 1 104 | } 105 | } 106 | return count 107 | } 108 | 109 | /// Counts number of non-emoji characters found in string 110 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 111 | public func countNonEmoji(_ string: String) -> Int{ 112 | var count = 0 113 | for char in string{ 114 | if !checkForEmoji("\(char)"){ 115 | count += 1 116 | } 117 | } 118 | return count 119 | } 120 | 121 | /// Checks if string contains only emoji characters 122 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 123 | public func isEmojiOnly(_ string: String) -> Bool{ 124 | return countEmoji(string) > 0 && countNonEmoji(string) == 0 125 | } 126 | 127 | /// Checks if string contains only one emoji 128 | @available(macOS 10.12.2, iOS 10.2, tvOS 10.1, watchOS 3.1.1, *) 129 | public func isSingleEmoji(_ string: String) -> Bool{ 130 | return string.count == 1 && containsEmoji(string) 131 | } 132 | 133 | // MARK: - Name 134 | 135 | /// Return standard name for a emoji 136 | public func name(emoji: String) -> [String] { 137 | let string = NSMutableString(string: String(emoji)) 138 | var range = CFRangeMake(0, CFStringGetLength(string)) 139 | CFStringTransform(string, &range, kCFStringTransformToUnicodeName, false) 140 | 141 | return Utils.dropPrefix(string: String(string), subString: "\\N") 142 | .components(separatedBy: "\\N") 143 | .map { 144 | return Utils.remove(string: $0, set: (Set(["{", "}"]))) 145 | } 146 | } 147 | 148 | // MARK: - Flag 149 | 150 | /// Return emoji for a flag 151 | public func emoji(countryCode: String) -> String { 152 | let base = UnicodeScalar("🇦").value - UnicodeScalar("A").value 153 | return Utils.flatten(string: countryCode.uppercased(), base: base).joined() 154 | } 155 | 156 | // MARK: - Keywords 157 | 158 | /// Search emoji by keywords 159 | public func emojis(keywords: [String]) -> [String] { 160 | var result: [String] = [] 161 | 162 | list().forEach { emoji in 163 | keywords.forEach { keyword in 164 | name(emoji: emoji).forEach { name in 165 | if name.range(of: keyword) != nil { 166 | result.append(emoji) 167 | } 168 | } 169 | } 170 | } 171 | 172 | return result 173 | } 174 | 175 | // MARK: - Alias 176 | 177 | /// Return emoji for an alias 178 | public func emoji(alias: String) -> String? { 179 | return emojiList[alias] 180 | } 181 | 182 | /// Find alias of emoji 183 | public func alias(emoji: String) -> String? { 184 | for (key, value) in emojiList { 185 | if value == emoji { 186 | return key 187 | } 188 | } 189 | 190 | return nil 191 | } 192 | 193 | /// Replace alias within a string by emoji 194 | public func replaceAlias(string: String) -> String { 195 | guard let regex = try? NSRegularExpression(pattern: ":\\w*?:", options: .caseInsensitive) else { 196 | return string 197 | } 198 | 199 | let range = NSMakeRange(0, string.count) 200 | var mutableString = string 201 | regex.enumerateMatches(in: string, options: [], range: range) { (result, flags, context) in 202 | guard let range = result?.range else { 203 | return 204 | } 205 | 206 | let start = string.index(string.startIndex, offsetBy: range.location) 207 | let end = string.index(start, offsetBy: range.length) 208 | 209 | let alias = string[start.. String? { 225 | for (category, list) in emojiCategories { 226 | if list.contains(emoji) { 227 | return category 228 | } 229 | } 230 | 231 | return nil 232 | } 233 | 234 | // MARK: - Manipulation 235 | 236 | /// Extract all emojis within a string 237 | public func extractEmojis(string: String) -> String { 238 | return Utils.flatten(string: string).filter({ character in 239 | return isRelatedToEmoji(character: character) 240 | }).joined() 241 | } 242 | 243 | /// Remove all emojis within a string 244 | public func removeEmojis(string: String) -> String { 245 | let first = Utils.flattenCharacters(string: string).filter({ character in 246 | return !isRelatedToEmoji(character: character) 247 | }).joined() 248 | 249 | let second = Utils.flatten(string: first).filter({ character in 250 | return !isRelatedToEmoji(character: character) 251 | }).joined() 252 | 253 | return second 254 | } 255 | 256 | /// Assemble many emojis into one 257 | public func assemble(emojis: [String]) -> String { 258 | let simple = Utils.flatten(string: emojis.joined()) 259 | let joiner = Utils.insert(element: Smile.Sequence.Mark.zeroWidthJoiner, betweenArray: simple) 260 | let selector = Utils.add(element: Smile.Sequence.Mark.presentationSelector, array: joiner) 261 | 262 | if isEmoji(character: simple.joined()) { 263 | return simple.joined() 264 | } 265 | 266 | if isEmoji(character: joiner.joined()) { 267 | return joiner.joined() 268 | } 269 | 270 | if isEmoji(character: selector.joined()) { 271 | return selector.joined() 272 | } 273 | 274 | return emojis.joined() 275 | } 276 | 277 | /// Disassemble an emoji into many 278 | public func disassemble(emoji: String) -> [String] { 279 | return Utils.flatten(string: emoji).filter({ character in 280 | return isEmoji(character: character) 281 | }) 282 | } 283 | 284 | // MARK: - Helper 285 | 286 | /// Check if a character is emoji, or emoji sequence marks 287 | fileprivate func isRelatedToEmoji(character: String) -> Bool { 288 | return isEmoji(character: character) 289 | || list().contains(character) 290 | || Smile.Sequence.all.contains(character) 291 | } 292 | 293 | fileprivate extension String { 294 | var smile_removingDigits: String { 295 | return components(separatedBy: .decimalDigits).joined() 296 | } 297 | } 298 | -------------------------------------------------------------------------------- /Sources/Utils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utils.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 05/06/16. 6 | // Copyright © 2016 Fantageek. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Utils { 12 | 13 | static func dropPrefix(string: String, subString: String) -> String { 14 | guard string.hasPrefix(subString), 15 | let range = string.range(of: subString) else { 16 | return string 17 | } 18 | 19 | return string.replacingCharacters(in: range, with: "") 20 | } 21 | 22 | static func remove(string: String, set: Set) -> String { 23 | var result = string 24 | set.forEach { 25 | result = result.replacingOccurrences(of: $0, with: "") 26 | } 27 | 28 | return result 29 | } 30 | 31 | static func flatten(string: String, base: UInt32 = 0) -> [String] { 32 | return string.unicodeScalars.compactMap { scalarView in 33 | if let scalar = UnicodeScalar(base + scalarView.value) { 34 | return String(scalar) 35 | } else { 36 | return nil 37 | } 38 | } 39 | } 40 | 41 | static func flattenCharacters(string: String) -> [String] { 42 | return string.map { character in 43 | return String(character) 44 | } 45 | } 46 | 47 | static func insert(element: String, betweenArray array: [String]) -> [String] { 48 | var result = [String]() 49 | array.forEach { 50 | result.append($0) 51 | result.append(element) 52 | } 53 | 54 | return Array(result.dropLast()) 55 | } 56 | 57 | static func add(element: T, array: [T]) -> [T] { 58 | var array = array 59 | array.append(element) 60 | 61 | return array 62 | } 63 | } 64 | 65 | --------------------------------------------------------------------------------