57 lines
1.8 KiB
Swift
57 lines
1.8 KiB
Swift
//
|
|
// CLDRAnnotationsXMLHandler.swift
|
|
//
|
|
//
|
|
// Created by Terry Yiu on 6/2/24.
|
|
//
|
|
|
|
import Foundation
|
|
import EmojiKit
|
|
|
|
class CLDRAnnotationsXMLHandler: NSObject, XMLParserDelegate {
|
|
var currentElement = ""
|
|
var currentEmoji: Emoji?
|
|
var emojis = [Emoji]()
|
|
var currentEmojiValue = ""
|
|
|
|
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, keywords: [])
|
|
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 {
|
|
let values = currentEmojiValue.split(separator: "|").map { $0.trim() }
|
|
emojis.append(Emoji(value: emoji.value, keywords: values))
|
|
}
|
|
}
|
|
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 }) }
|
|
}
|