Files
AzooKeyKanaKanjiConverter/Sources/KanaKanjiConverterModule/Roman2Kana.swift
2024-08-23 00:07:33 +09:00

309 lines
7.7 KiB
Swift

//
// Roman2Kana.swift
// Keyboard
//
// Created by ensan on 2020/09/24.
// Copyright © 2020 ensan. All rights reserved.
//
import Foundation
enum Roman2Kana {
static let katakanaChanges: [String: String] = Dictionary(uniqueKeysWithValues: hiraganaChanges.map { (String($0.key), String($0.value)) })
static let hiraganaChanges: [[Character]: [Character]] = Dictionary(uniqueKeysWithValues: [
"a": "",
"xa": "",
"la": "",
"i": "",
"xi": "",
"li": "",
"u": "",
"wu": "",
"vu": "",
"xu": "",
"lu": "",
"e": "",
"xe": "",
"le": "",
"o": "",
"xo": "",
"lo": "",
"ka": "",
"ca": "",
"ga": "",
"xka": "",
"lka": "",
"ki": "",
"gi": "",
"ku": "",
"cu": "",
"gu": "",
"ke": "",
"ge": "",
"xke": "",
"lke": "",
"ko": "",
"co": "",
"go": "",
"sa": "",
"za": "",
"si": "",
"ci": "",
"shi": "",
"zi": "",
"ji": "",
"su": "",
"zu": "",
"se": "",
"ce": "",
"ze": "",
"so": "",
"zo": "",
"ta": "",
"da": "",
"ti": "",
"chi": "",
"di": "",
"tu": "",
"tsu": "",
"xtu": "",
"ltu": "",
"xtsu": "",
"ltsu": "",
"du": "",
"te": "",
"de": "",
"to": "",
"do": "",
"na": "",
"ni": "",
"nu": "",
"ne": "",
"no": "",
"ha": "",
"ba": "",
"pa": "",
"hi": "",
"bi": "",
"pi": "",
"hu": "",
"fu": "",
"bu": "",
"pu": "",
"he": "",
"be": "",
"pe": "",
"ho": "",
"bo": "",
"po": "",
"ma": "",
"mi": "",
"mu": "",
"me": "",
"mo": "",
"ya": "",
"xya": "",
"lya": "",
"yu": "",
"xyu": "",
"lyu": "",
"yo": "",
"xyo": "",
"lyo": "",
"ra": "",
"ri": "",
"ru": "",
"re": "",
"ro": "",
"wa": "",
"xwa": "",
"lwa": "",
"wyi": "",
"wye": "",
"wo": "",
"nn": "",
"ye": "いぇ",
"va": "ゔぁ",
"vi": "ゔぃ",
"ve": "ゔぇ",
"vo": "ゔぉ",
"kya": "きゃ",
"kyu": "きゅ",
"kye": "きぇ",
"kyo": "きょ",
"gya": "ぎゃ",
"gyu": "ぎゅ",
"gye": "ぎぇ",
"gyo": "ぎょ",
"qa": "くぁ",
"kwa": "くぁ",
"qwa": "くぁ",
"qi": "くぃ",
"kwi": "くぃ",
"qwi": "くぃ",
"qu": "くぅ",
"kwu": "くぅ",
"qwu": "くぅ",
"qe": "くぇ",
"kwe": "くぇ",
"qwe": "くぇ",
"qo": "くぉ",
"kwo": "くぉ",
"qwo": "くぉ",
"gwa": "ぐぁ",
"gwi": "ぐぃ",
"gwu": "ぐぅ",
"gwe": "ぐぇ",
"gwo": "ぐぉ",
"sha": "しゃ",
"sya": "しゃ",
"shu": "しゅ",
"syu": "しゅ",
"she": "しぇ",
"sye": "しぇ",
"sho": "しょ",
"syo": "しょ",
"ja": "じゃ",
"zya": "じゃ",
"jya": "じゃ",
"jyi": "じぃ",
"ju": "じゅ",
"zyu": "じゅ",
"jyu": "じゅ",
"je": "じぇ",
"zye": "じぇ",
"jye": "じぇ",
"jo": "じょ",
"zyo": "じょ",
"jyo": "じょ",
"swa": "すぁ",
"swi": "すぃ",
"swu": "すぅ",
"swe": "すぇ",
"swo": "すぉ",
"cha": "ちゃ",
"cya": "ちゃ",
"tya": "ちゃ",
"tyi": "ちぃ",
"cyi": "ちぃ",
"chu": "ちゅ",
"cyu": "ちゅ",
"tyu": "ちゅ",
"che": "ちぇ",
"cye": "ちぇ",
"tye": "ちぇ",
"cho": "ちょ",
"cyo": "ちょ",
"tyo": "ちょ",
"tsa": "つぁ",
"tsi": "つぃ",
"tse": "つぇ",
"tso": "つぉ",
"tha": "てゃ",
"thi": "てぃ",
"thu": "てゅ",
"the": "てぇ",
"tho": "てょ",
"twa": "とぁ",
"twi": "とぃ",
"twu": "とぅ",
"twe": "とぇ",
"two": "とぉ",
"dya": "ぢゃ",
"dyi": "ぢぃ",
"dyu": "ぢゅ",
"dye": "ぢぇ",
"dyo": "ぢょ",
"dha": "でゃ",
"dhi": "でぃ",
"dhu": "でゅ",
"dhe": "でぇ",
"dho": "でょ",
"dwa": "どぁ",
"dwi": "どぃ",
"dwu": "どぅ",
"dwe": "どぇ",
"dwo": "どぉ",
"nya": "にゃ",
"nyi": "にぃ",
"nyu": "にゅ",
"nye": "にぇ",
"nyo": "にょ",
"hya": "ひゃ",
"hyi": "ひぃ",
"hyu": "ひゅ",
"hye": "ひぇ",
"hyo": "ひょ",
"bya": "びゃ",
"byi": "びぃ",
"byu": "びゅ",
"bye": "びぇ",
"byo": "びょ",
"pya": "ぴゃ",
"pyi": "ぴぃ",
"pyu": "ぴゅ",
"pye": "ぴぇ",
"pyo": "ぴょ",
"fa": "ふぁ",
"hwa": "ふぁ",
"fwa": "ふぁ",
"fi": "ふぃ",
"hwi": "ふぃ",
"fwi": "ふぃ",
"fwu": "ふぅ",
"fe": "ふぇ",
"hwe": "ふぇ",
"fwe": "ふぇ",
"fo": "ふぉ",
"hwo": "ふぉ",
"fwo": "ふぉ",
"mya": "みゃ",
"myi": "みぃ",
"myu": "みゅ",
"mye": "みぇ",
"myo": "みょ",
"rya": "りゃ",
"ryi": "りぃ",
"ryu": "りゅ",
"rye": "りぇ",
"ryo": "りょ",
"wi": "うぃ",
"we": "うぇ",
"wha": "うぁ",
"whi": "うぃ",
"whu": "",
"whe": "うぇ",
"who": "うぉ",
"xn": "",
"zh": "",
"zj": "",
"zk": "",
"zl": ""
].map {(Array($0.key), Array($0.value))})
static func toHiragana(currentText: [Character], added: Character) -> [Character] {
let last_3 = currentText.suffix(3)
if let kana = Roman2Kana.hiraganaChanges[last_3 + [added]] {
return currentText.prefix(currentText.count - last_3.count) + kana
}
let last_2 = currentText.suffix(2)
if let kana = Roman2Kana.hiraganaChanges[last_2 + [added]] {
return currentText.prefix(currentText.count - last_2.count) + kana
}
let last_1 = currentText.suffix(1)
if let kana = Roman2Kana.hiraganaChanges[last_1 + [added]] {
return currentText.prefix(currentText.count - last_1.count) + kana
}
if last_1 == [added] && String(added).onlyRomanAlphabet {
return currentText.prefix(currentText.count - last_1.count) + ["", added]
}
if last_1 == ["n"] && added != "y"{
return currentText.prefix(currentText.count - last_1.count) + ["", added]
}
if let kana = Roman2Kana.hiraganaChanges[[added]] {
return currentText + kana
}
return currentText + [added]
}
}