@@ -47,46 +47,49 @@ pub fn katakana_to_hiragana(input: &str) -> String {
47
47
pub ( crate ) fn katakana_to_hiragana_with_opt ( input : & str , is_destination_romaji : bool ) -> String {
48
48
let mut hira = Vec :: with_capacity ( input. chars ( ) . count ( ) ) ;
49
49
let mut previous_kana: Option < char > = None ;
50
- for ( index, char ) in input. chars ( ) . enumerate ( ) {
50
+ for ( index, input_char ) in input. chars ( ) . enumerate ( ) {
51
51
// Short circuit to avoid incorrect codeshift for 'ー' and '・'
52
- if is_char_slash_dot ( char )
53
- || is_char_initial_long_dash ( char , index)
54
- || is_kana_as_symbol ( char )
52
+ if is_char_slash_dot ( input_char )
53
+ || is_char_initial_long_dash ( input_char , index)
54
+ || is_kana_as_symbol ( input_char )
55
55
{
56
- hira. push ( char ) ;
56
+ hira. push ( input_char ) ;
57
57
// Transform long vowels: 'オー' to 'おう'
58
58
} else if let ( Some ( previous_kana) , true ) =
59
- ( previous_kana, is_char_inner_long_dash ( char , index) )
59
+ ( previous_kana, is_char_inner_long_dash ( input_char , index) )
60
60
{
61
61
// Transform previous_kana back to romaji, and slice off the vowel
62
62
let romaji = TO_ROMAJI_NODE_TREE
63
63
. find_transition_node ( previous_kana)
64
- . unwrap ( )
64
+ . unwrap_or_else ( || {
65
+ panic ! (
66
+ "Failed to find transition node for previous kana {}" ,
67
+ previous_kana
68
+ )
69
+ } )
65
70
. output ;
66
71
67
- let romaji = romaji. chars ( ) . last ( ) . unwrap_or_else ( || {
68
- panic ! ( "could not find kana {:?} in TO_ROMAJI map" , previous_kana)
69
- } ) ;
72
+ let romaji_opt = romaji. chars ( ) . last ( ) ;
70
73
// However, ensure 'オー' => 'おお' => 'oo' if this is a transform on the way to romaji
71
74
if let Some ( prev_char) = input. chars ( ) . nth ( index - 1 ) {
72
- if is_char_katakana ( prev_char) && romaji == 'o' && is_destination_romaji {
75
+ if is_char_katakana ( prev_char) && romaji_opt == Some ( 'o' ) && is_destination_romaji {
73
76
hira. push ( 'お' ) ;
74
77
continue ;
75
78
}
76
79
}
77
80
78
- if let Some ( hit) = LONG_VOWELS . get ( & romaji) {
81
+ if let Some ( hit) = romaji_opt . and_then ( |romaji| LONG_VOWELS . get ( & romaji) ) {
79
82
hira. push ( * hit) ;
80
83
}
81
- } else if !is_char_long_dash ( char ) && is_char_katakana ( char ) {
84
+ } else if !is_char_long_dash ( input_char ) && is_char_katakana ( input_char ) {
82
85
// Shift charcode.
83
- let code = char as i32 + ( HIRAGANA_START as i32 - KATAKANA_START as i32 ) ;
86
+ let code = input_char as i32 + ( HIRAGANA_START as i32 - KATAKANA_START as i32 ) ;
84
87
let hira_char = std:: char:: from_u32 ( code as u32 ) . unwrap ( ) ;
85
88
hira. push ( hira_char) ;
86
89
previous_kana = Some ( hira_char) ;
87
90
} else {
88
91
// Pass non katakana chars through
89
- hira. push ( char ) ;
92
+ hira. push ( input_char ) ;
90
93
previous_kana = None ;
91
94
}
92
95
}
0 commit comments