1 use crate::constants::{HIRAGANA_START, KATAKANA_START}; 2 use crate::utils::is_char_hiragana::*; 3 use crate::utils::is_char_long_dash::*; 4 use crate::utils::is_char_slash_dot::*; 5 use std; 6 7 /// Convert [Hiragana](https://en.wikipedia.org/wiki/Hiragana) to [Katakana](https://en.wikipedia.org/wiki/Katakana) 8 /// 9 /// Passes through any non-hiragana chars 10 /// 11 /// # Examples 12 /// 13 /// 14 /// hiragana_to_katakana('ひらがな') 15 /// 16 /// // => "ヒラガナ" 17 /// 18 /// hiragana_to_katakana('ひらがな is a type of kana') 19 /// 20 /// // => "ヒラガナ is a type of kana" 21 /// 22 hiragana_to_katakana(input: &str) -> String23pub fn hiragana_to_katakana(input: &str) -> String { 24 let mut kata = vec![]; 25 for char in input.chars() { 26 // Short circuit to avoid incorrect codeshift for 'ー' and '・' 27 if is_char_long_dash(char) || is_char_slash_dot(char) { 28 kata.push(char); 29 } else if is_char_hiragana(char) { 30 // Shift charcode. 31 let code = char as i32 + (KATAKANA_START as i32 - HIRAGANA_START as i32); 32 // let kata_char = String.from_char_code(code); 33 let kata_char = std::char::from_u32(code as u32).unwrap(); 34 kata.push(kata_char); 35 } else { 36 // Pass non-hiragana chars through 37 kata.push(char); 38 } 39 } 40 kata.into_iter().collect() 41 } 42