Files
EmojiKit/Sources/EmojiSourceKit/CLDRAnnotationsXMLHandler.swift

64 lines
2.0 KiB
Swift

//
// CLDRAnnotationsXMLHandler.swift
//
//
// Created by Terry Yiu on 6/2/24.
//
import Foundation
import EmojiKit
class CLDRAnnotationsXMLHandler: NSObject, XMLParserDelegate {
let locale: String
var currentElement = ""
var currentEmoji: Emoji?
var emojis = [Emoji]()
var currentEmojiValue = ""
init(locale: String) {
self.locale = locale
}
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
if elementName == "annotation" && attributeDict["type"] != "tts" {
if let cp = attributeDict["cp"] {
currentEmoji = Emoji(value: cp, localizedKeywords: [:])
currentEmojiValue = ""
}
}
currentElement = elementName
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
if currentElement == "annotation" {
currentEmojiValue += string.trim()
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "annotation" {
if let emoji = currentEmoji {
var localizedKeywords = [String: [String]]()
localizedKeywords[locale] = currentEmojiValue.split(separator: "|").map { $0.trim() }
emojis.append(Emoji(value: emoji.value, localizedKeywords: localizedKeywords))
}
}
currentElement = ""
currentEmojiValue = ""
currentEmoji = nil
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print("Parse error: \(parseError.localizedDescription)\n")
}
var emojisMap: [String: Emoji] {
emojis.reduce(into: [String: Emoji]()) { $0[$1.value] = $1 }
}
}
extension Character {
var isEmoji: Bool { unicodeScalars.contains(where: { $0.properties.isEmoji }) }
}