#[derive(Debug, Clone, Copy)]
pub struct HiraKata {
pub base: &'static str,
pub voiced: Option<&'static str>,
pub semivoiced: Option<&'static str>,
}
#[derive(Debug, Clone, Copy)]
pub struct HiraKataEntry {
pub hiragana: HiraKata,
pub katakana: HiraKata,
pub halfwidth: Option<HiraKata>,
}
pub static HIRAGANA_KATAKANA_TABLE: &[HiraKataEntry] = &[
HiraKataEntry {
hiragana: HiraKata {
base: "あ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ア",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ア",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "い",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "イ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "イ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "う",
voiced: Some("ゔ"),
semivoiced: None,
},
katakana: HiraKata {
base: "ウ",
voiced: Some("ヴ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ウ",
voiced: Some("ヴ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "え",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "エ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "エ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "お",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "オ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "オ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "か",
voiced: Some("が"),
semivoiced: None,
},
katakana: HiraKata {
base: "カ",
voiced: Some("ガ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "カ",
voiced: Some("ガ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "き",
voiced: Some("ぎ"),
semivoiced: None,
},
katakana: HiraKata {
base: "キ",
voiced: Some("ギ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "キ",
voiced: Some("ギ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "く",
voiced: Some("ぐ"),
semivoiced: None,
},
katakana: HiraKata {
base: "ク",
voiced: Some("グ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ク",
voiced: Some("グ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "け",
voiced: Some("げ"),
semivoiced: None,
},
katakana: HiraKata {
base: "ケ",
voiced: Some("ゲ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ケ",
voiced: Some("ゲ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "こ",
voiced: Some("ご"),
semivoiced: None,
},
katakana: HiraKata {
base: "コ",
voiced: Some("ゴ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "コ",
voiced: Some("ゴ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "さ",
voiced: Some("ざ"),
semivoiced: None,
},
katakana: HiraKata {
base: "サ",
voiced: Some("ザ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "サ",
voiced: Some("ザ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "し",
voiced: Some("じ"),
semivoiced: None,
},
katakana: HiraKata {
base: "シ",
voiced: Some("ジ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "シ",
voiced: Some("ジ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "す",
voiced: Some("ず"),
semivoiced: None,
},
katakana: HiraKata {
base: "ス",
voiced: Some("ズ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ス",
voiced: Some("ズ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "せ",
voiced: Some("ぜ"),
semivoiced: None,
},
katakana: HiraKata {
base: "セ",
voiced: Some("ゼ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "セ",
voiced: Some("ゼ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "そ",
voiced: Some("ぞ"),
semivoiced: None,
},
katakana: HiraKata {
base: "ソ",
voiced: Some("ゾ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ソ",
voiced: Some("ゾ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "た",
voiced: Some("だ"),
semivoiced: None,
},
katakana: HiraKata {
base: "タ",
voiced: Some("ダ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "タ",
voiced: Some("ダ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ち",
voiced: Some("ぢ"),
semivoiced: None,
},
katakana: HiraKata {
base: "チ",
voiced: Some("ヂ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "チ",
voiced: Some("ヂ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "つ",
voiced: Some("づ"),
semivoiced: None,
},
katakana: HiraKata {
base: "ツ",
voiced: Some("ヅ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ツ",
voiced: Some("ヅ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "て",
voiced: Some("で"),
semivoiced: None,
},
katakana: HiraKata {
base: "テ",
voiced: Some("デ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "テ",
voiced: Some("デ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "と",
voiced: Some("ど"),
semivoiced: None,
},
katakana: HiraKata {
base: "ト",
voiced: Some("ド"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ト",
voiced: Some("ド"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "な",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ナ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ナ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "に",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ニ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ニ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ぬ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ヌ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ヌ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ね",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ネ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ネ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "の",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ノ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ノ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "は",
voiced: Some("ば"),
semivoiced: Some("ぱ"),
},
katakana: HiraKata {
base: "ハ",
voiced: Some("バ"),
semivoiced: Some("パ"),
},
halfwidth: Some(HiraKata {
base: "ハ",
voiced: Some("バ"),
semivoiced: Some("パ"),
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ひ",
voiced: Some("び"),
semivoiced: Some("ぴ"),
},
katakana: HiraKata {
base: "ヒ",
voiced: Some("ビ"),
semivoiced: Some("ピ"),
},
halfwidth: Some(HiraKata {
base: "ヒ",
voiced: Some("ビ"),
semivoiced: Some("ピ"),
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ふ",
voiced: Some("ぶ"),
semivoiced: Some("ぷ"),
},
katakana: HiraKata {
base: "フ",
voiced: Some("ブ"),
semivoiced: Some("プ"),
},
halfwidth: Some(HiraKata {
base: "フ",
voiced: Some("ブ"),
semivoiced: Some("プ"),
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "へ",
voiced: Some("べ"),
semivoiced: Some("ぺ"),
},
katakana: HiraKata {
base: "ヘ",
voiced: Some("ベ"),
semivoiced: Some("ペ"),
},
halfwidth: Some(HiraKata {
base: "ヘ",
voiced: Some("ベ"),
semivoiced: Some("ペ"),
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ほ",
voiced: Some("ぼ"),
semivoiced: Some("ぽ"),
},
katakana: HiraKata {
base: "ホ",
voiced: Some("ボ"),
semivoiced: Some("ポ"),
},
halfwidth: Some(HiraKata {
base: "ホ",
voiced: Some("ボ"),
semivoiced: Some("ポ"),
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ま",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "マ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "マ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "み",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ミ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ミ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "む",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ム",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ム",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "め",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "メ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "メ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "も",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "モ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "モ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "や",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ヤ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ヤ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ゆ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ユ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ユ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "よ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ヨ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ヨ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ら",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ラ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ラ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "り",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "リ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "リ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "る",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ル",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ル",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "れ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "レ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "レ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ろ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ロ",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ロ",
voiced: None,
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "わ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ワ",
voiced: Some("ヷ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ワ",
voiced: Some("ヷ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ゐ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ヰ",
voiced: Some("ヸ"),
semivoiced: None,
},
halfwidth: None,
},
HiraKataEntry {
hiragana: HiraKata {
base: "ゑ",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ヱ",
voiced: Some("ヹ"),
semivoiced: None,
},
halfwidth: None,
},
HiraKataEntry {
hiragana: HiraKata {
base: "を",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ヲ",
voiced: Some("ヺ"),
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ヲ",
voiced: Some("ヺ"),
semivoiced: None,
}),
},
HiraKataEntry {
hiragana: HiraKata {
base: "ん",
voiced: None,
semivoiced: None,
},
katakana: HiraKata {
base: "ン",
voiced: None,
semivoiced: None,
},
halfwidth: Some(HiraKata {
base: "ン",
voiced: None,
semivoiced: None,
}),
},
];
#[derive(Debug, Clone, Copy)]
pub struct SmallKanaEntry {
pub hiragana: &'static str,
pub katakana: &'static str,
pub halfwidth: Option<&'static str>,
}
pub static HIRAGANA_KATAKANA_SMALL_TABLE: &[SmallKanaEntry] = &[
SmallKanaEntry {
hiragana: "ぁ",
katakana: "ァ",
halfwidth: Some("ァ"),
},
SmallKanaEntry {
hiragana: "ぃ",
katakana: "ィ",
halfwidth: Some("ィ"),
},
SmallKanaEntry {
hiragana: "ぅ",
katakana: "ゥ",
halfwidth: Some("ゥ"),
},
SmallKanaEntry {
hiragana: "ぇ",
katakana: "ェ",
halfwidth: Some("ェ"),
},
SmallKanaEntry {
hiragana: "ぉ",
katakana: "ォ",
halfwidth: Some("ォ"),
},
SmallKanaEntry {
hiragana: "っ",
katakana: "ッ",
halfwidth: Some("ッ"),
},
SmallKanaEntry {
hiragana: "ゃ",
katakana: "ャ",
halfwidth: Some("ャ"),
},
SmallKanaEntry {
hiragana: "ゅ",
katakana: "ュ",
halfwidth: Some("ュ"),
},
SmallKanaEntry {
hiragana: "ょ",
katakana: "ョ",
halfwidth: Some("ョ"),
},
SmallKanaEntry {
hiragana: "ゎ",
katakana: "ヮ",
halfwidth: None,
},
SmallKanaEntry {
hiragana: "ゕ",
katakana: "ヵ",
halfwidth: None,
},
SmallKanaEntry {
hiragana: "ゖ",
katakana: "ヶ",
halfwidth: None,
},
];
pub fn generate_voiced_characters() -> Vec<(&'static str, &'static str)> {
let mut result = Vec::new();
for entry in HIRAGANA_KATAKANA_TABLE {
if let Some(voiced) = entry.hiragana.voiced {
result.push((entry.hiragana.base, voiced));
}
if let Some(voiced) = entry.katakana.voiced {
result.push((entry.katakana.base, voiced));
}
}
result.push(("ゝ", "ゞ"));
result.push(("ヽ", "ヾ"));
result.push(("〱", "〲")); result.push(("〳", "〴"));
result
}
pub fn generate_semi_voiced_characters() -> Vec<(&'static str, &'static str)> {
let mut result = Vec::new();
for entry in HIRAGANA_KATAKANA_TABLE {
if let Some(semivoiced) = entry.hiragana.semivoiced {
result.push((entry.hiragana.base, semivoiced));
}
if let Some(semivoiced) = entry.katakana.semivoiced {
result.push((entry.katakana.base, semivoiced));
}
}
result
}