allow non-alpha passthrough
This commit is contained in:
parent
fa50107a04
commit
ba38b98624
3 changed files with 145 additions and 111 deletions
|
@ -18,7 +18,12 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_convert_to_hiragana() {
|
fn test_convert_to_hiragana_words() {
|
||||||
assert_eq!(convert_to_hiragana("assolutamente"), "あっそるためんて");
|
assert_eq!(convert_to_hiragana("assolutamente"), "あっそるためんて");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_convert_to_hiragana_symbols() {
|
||||||
|
assert_eq!(convert_to_hiragana("asso-lutamente no!1"), "あっそ-るためんて の!1");
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -42,6 +42,8 @@ fn match3(s: &str) -> Option<Syllable> {
|
||||||
"zie" => Some(Zye),
|
"zie" => Some(Zye),
|
||||||
"zio" => Some(Zyo),
|
"zio" => Some(Zyo),
|
||||||
"ziu" => Some(Zyu),
|
"ziu" => Some(Zyu),
|
||||||
|
"chu" => Some(Chu),
|
||||||
|
"cho" => Some(Cho),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -183,12 +185,16 @@ pub(crate) fn romanize(word: &str) -> Vec<Syllable> {
|
||||||
.to_lowercase()
|
.to_lowercase()
|
||||||
.chars()
|
.chars()
|
||||||
.map(remove_accents)
|
.map(remove_accents)
|
||||||
.filter(|c| c.is_alphabetic())
|
|
||||||
.collect();
|
.collect();
|
||||||
let mut remaining = lowercase.clone();
|
let mut remaining = lowercase.clone();
|
||||||
let mut syllables = Vec::new();
|
let mut syllables = Vec::new();
|
||||||
|
|
||||||
while remaining.len() > 0 {
|
while remaining.len() > 0 {
|
||||||
|
if !remaining.as_bytes()[0].is_ascii_alphabetic() {
|
||||||
|
syllables.push(NonAlpha(remaining.as_bytes()[0] as char));
|
||||||
|
remaining = remaining[1..].to_string();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// Check for double consonants
|
// Check for double consonants
|
||||||
if remaining.len() >= 3 && remaining.as_bytes()[0] == remaining.as_bytes()[1] {
|
if remaining.len() >= 3 && remaining.as_bytes()[0] == remaining.as_bytes()[1] {
|
||||||
syllables.push(LittleTsu);
|
syllables.push(LittleTsu);
|
||||||
|
@ -319,6 +325,26 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn symbols() {
|
||||||
|
let symbols = [
|
||||||
|
("x", vec![Ku, Su]),
|
||||||
|
("CIAO!", vec![Cha, O, NonAlpha('!')]),
|
||||||
|
("?", vec![NonAlpha('?')]),
|
||||||
|
("macciu-picchu", vec![Ma, LittleTsu, Chu, NonAlpha('-'), Pi, LittleTsu, Chu]),
|
||||||
|
("'", vec![NonAlpha('\'')]),
|
||||||
|
("adesso té la vedi con lui!!", vec![A, De, LittleTsu, So, NonAlpha(' '), Te, NonAlpha(' '), Ra, NonAlpha(' '), VuE, De, I, NonAlpha(' '), Ko, N, NonAlpha(' '), Ru, I, NonAlpha('!'), NonAlpha('!')]),
|
||||||
|
(".", vec![NonAlpha('.')]),
|
||||||
|
(",", vec![NonAlpha(',')]),
|
||||||
|
("(", vec![NonAlpha('(')]),
|
||||||
|
(")", vec![NonAlpha(')')]),
|
||||||
|
];
|
||||||
|
|
||||||
|
for (word, expected) in symbols {
|
||||||
|
assert_eq!(romanize(word)[..], expected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_dictionary() {
|
fn test_dictionary() {
|
||||||
// Read dictionary file
|
// Read dictionary file
|
||||||
|
|
221
src/syllable.rs
221
src/syllable.rs
|
@ -118,119 +118,122 @@ pub(crate) enum Syllable {
|
||||||
Zya,
|
Zya,
|
||||||
Zyu,
|
Zyu,
|
||||||
Zye,
|
Zye,
|
||||||
|
// Extras for sentence making
|
||||||
|
NonAlpha(char),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn to_hiragana(syllable: &Syllable) -> String {
|
pub(crate) fn to_hiragana(syllable: &Syllable) -> String {
|
||||||
match syllable {
|
match syllable {
|
||||||
A => "あ",
|
A => "あ".to_string(),
|
||||||
I => "い",
|
I => "い".to_string(),
|
||||||
U => "う",
|
U => "う".to_string(),
|
||||||
E => "え",
|
E => "え".to_string(),
|
||||||
O => "お",
|
O => "お".to_string(),
|
||||||
Ka => "か",
|
Ka => "か".to_string(),
|
||||||
Ki => "き",
|
Ki => "き".to_string(),
|
||||||
Ku => "く",
|
Ku => "く".to_string(),
|
||||||
Ke => "け",
|
Ke => "け".to_string(),
|
||||||
Ko => "こ",
|
Ko => "こ".to_string(),
|
||||||
Sa => "さ",
|
Sa => "さ".to_string(),
|
||||||
Shi => "し",
|
Shi => "し".to_string(),
|
||||||
Su => "す",
|
Su => "す".to_string(),
|
||||||
Se => "せ",
|
Se => "せ".to_string(),
|
||||||
So => "そ",
|
So => "そ".to_string(),
|
||||||
Ta => "た",
|
Ta => "た".to_string(),
|
||||||
Chi => "ち",
|
Chi => "ち".to_string(),
|
||||||
Tsu => "つ",
|
Tsu => "つ".to_string(),
|
||||||
Te => "て",
|
Te => "て".to_string(),
|
||||||
To => "と",
|
To => "と".to_string(),
|
||||||
Na => "な",
|
Na => "な".to_string(),
|
||||||
Ni => "に",
|
Ni => "に".to_string(),
|
||||||
Nu => "ぬ",
|
Nu => "ぬ".to_string(),
|
||||||
Ne => "ね",
|
Ne => "ね".to_string(),
|
||||||
No => "の",
|
No => "の".to_string(),
|
||||||
Ha => "は",
|
Ha => "は".to_string(),
|
||||||
Hi => "ひ",
|
Hi => "ひ".to_string(),
|
||||||
Fu => "ふ",
|
Fu => "ふ".to_string(),
|
||||||
He => "へ",
|
He => "へ".to_string(),
|
||||||
Ho => "ほ",
|
Ho => "ほ".to_string(),
|
||||||
Ma => "ま",
|
Ma => "ま".to_string(),
|
||||||
Mi => "み",
|
Mi => "み".to_string(),
|
||||||
Mu => "む",
|
Mu => "む".to_string(),
|
||||||
Me => "め",
|
Me => "め".to_string(),
|
||||||
Mo => "も",
|
Mo => "も".to_string(),
|
||||||
Ya => "や",
|
Ya => "や".to_string(),
|
||||||
Yu => "ゆ",
|
Yu => "ゆ".to_string(),
|
||||||
Yo => "よ",
|
Yo => "よ".to_string(),
|
||||||
Ra => "ら",
|
Ra => "ら".to_string(),
|
||||||
Ri => "り",
|
Ri => "り".to_string(),
|
||||||
Ru => "る",
|
Ru => "る".to_string(),
|
||||||
Re => "れ",
|
Re => "れ".to_string(),
|
||||||
Ro => "ろ",
|
Ro => "ろ".to_string(),
|
||||||
Wa => "わ",
|
Wa => "わ".to_string(),
|
||||||
N => "ん",
|
N => "ん".to_string(),
|
||||||
Ga => "が",
|
Ga => "が".to_string(),
|
||||||
Gi => "ぎ",
|
Gi => "ぎ".to_string(),
|
||||||
Gu => "ぐ",
|
Gu => "ぐ".to_string(),
|
||||||
Ge => "げ",
|
Ge => "げ".to_string(),
|
||||||
Go => "ご",
|
Go => "ご".to_string(),
|
||||||
Za => "ざ",
|
Za => "ざ".to_string(),
|
||||||
Ji => "じ",
|
Ji => "じ".to_string(),
|
||||||
Zu => "ず",
|
Zu => "ず".to_string(),
|
||||||
Ze => "ぜ",
|
Ze => "ぜ".to_string(),
|
||||||
Zo => "ぞ",
|
Zo => "ぞ".to_string(),
|
||||||
Da => "だ",
|
Da => "だ".to_string(),
|
||||||
De => "で",
|
De => "で".to_string(),
|
||||||
Do => "ど",
|
Do => "ど".to_string(),
|
||||||
Ba => "ば",
|
Ba => "ば".to_string(),
|
||||||
Bi => "び",
|
Bi => "び".to_string(),
|
||||||
Bu => "ぶ",
|
Bu => "ぶ".to_string(),
|
||||||
Be => "べ",
|
Be => "べ".to_string(),
|
||||||
Bo => "ぼ",
|
Bo => "ぼ".to_string(),
|
||||||
Pa => "ぱ",
|
Pa => "ぱ".to_string(),
|
||||||
Pi => "ぴ",
|
Pi => "ぴ".to_string(),
|
||||||
Pu => "ぷ",
|
Pu => "ぷ".to_string(),
|
||||||
Pe => "ぺ",
|
Pe => "ぺ".to_string(),
|
||||||
Po => "ぽ",
|
Po => "ぽ".to_string(),
|
||||||
Kya => "きゃ",
|
Kya => "きゃ".to_string(),
|
||||||
Kyu => "きゅ",
|
Kyu => "きゅ".to_string(),
|
||||||
Kyo => "きょ",
|
Kyo => "きょ".to_string(),
|
||||||
Sha => "しゃ",
|
Sha => "しゃ".to_string(),
|
||||||
Shu => "しゅ",
|
Shu => "しゅ".to_string(),
|
||||||
Sho => "しょ",
|
Sho => "しょ".to_string(),
|
||||||
Cha => "ちゃ",
|
Cha => "ちゃ".to_string(),
|
||||||
Chu => "ちゅ",
|
Chu => "ちゅ".to_string(),
|
||||||
Cho => "ちょ",
|
Cho => "ちょ".to_string(),
|
||||||
Rya => "りゃ",
|
Rya => "りゃ".to_string(),
|
||||||
Ryu => "りゅ",
|
Ryu => "りゅ".to_string(),
|
||||||
Ryo => "りょ",
|
Ryo => "りょ".to_string(),
|
||||||
LittleTsu => "っ",
|
LittleTsu => "っ".to_string(),
|
||||||
LongVowel => "ー",
|
LongVowel => "ー".to_string(),
|
||||||
ChiE => "ちぇ",
|
ChiE => "ちぇ".to_string(),
|
||||||
ToU => "とぅ",
|
ToU => "とぅ".to_string(),
|
||||||
TeI => "とぃ",
|
TeI => "とぃ".to_string(),
|
||||||
VuA => "ゔぁ",
|
VuA => "ゔぁ".to_string(),
|
||||||
VuI => "ゔぃ",
|
VuI => "ゔぃ".to_string(),
|
||||||
Vu => "ゔ",
|
Vu => "ゔ".to_string(),
|
||||||
VuE => "ゔぇ",
|
VuE => "ゔぇ".to_string(),
|
||||||
VuO => "ゔぉ",
|
VuO => "ゔぉ".to_string(),
|
||||||
Ja => "じゃ",
|
Ja => "じゃ".to_string(),
|
||||||
Ju => "じゅ",
|
Ju => "じゅ".to_string(),
|
||||||
Jo => "じょ",
|
Jo => "じょ".to_string(),
|
||||||
Je => "じぇ",
|
Je => "じぇ".to_string(),
|
||||||
Zi => "ずぃ",
|
Zi => "ずぃ".to_string(),
|
||||||
Gya => "ぎゃ",
|
Gya => "ぎゃ".to_string(),
|
||||||
Gyu => "ぎゅ",
|
Gyu => "ぎゅ".to_string(),
|
||||||
Gyo => "ぎょ",
|
Gyo => "ぎょ".to_string(),
|
||||||
Bya => "びゃ",
|
Bya => "びゃ".to_string(),
|
||||||
Byu => "びゅ",
|
Byu => "びゅ".to_string(),
|
||||||
Byo => "びょ",
|
Byo => "びょ".to_string(),
|
||||||
Pya => "ぴゃ",
|
Pya => "ぴゃ".to_string(),
|
||||||
Pyu => "ぴゅ",
|
Pyu => "ぴゅ".to_string(),
|
||||||
Pyo => "ぴょ",
|
Pyo => "ぴょ".to_string(),
|
||||||
Zyo => "ずょ",
|
Zyo => "ずょ".to_string(),
|
||||||
Zya => "ずゃ",
|
Zya => "ずゃ".to_string(),
|
||||||
Zyu => "ずゅ",
|
Zyu => "ずゅ".to_string(),
|
||||||
Zye => "ずぇ",
|
Zye => "ずぇ".to_string(),
|
||||||
}.to_string()
|
NonAlpha(char) => char.to_string()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for Syllable {
|
impl Display for Syllable {
|
||||||
|
|
Loading…
Reference in a new issue