diff --git a/src-tauri/src/tsf_conversion.rs b/src-tauri/src/tsf_conversion.rs index d0647c3..b54a21b 100644 --- a/src-tauri/src/tsf_conversion.rs +++ b/src-tauri/src/tsf_conversion.rs @@ -28,6 +28,80 @@ impl TsfConversion { } } + fn reset_conversion_state(&mut self) { + self.now_reconvertion = false; + self.reconversion_prefix = None; + self.reconversion_index = None; + self.reconversion_candidates = None; + } + + fn convert_roman_to_kanji(&mut self, text: &str) -> Result { + let o_minus_1 = self.conversion_history.get(if self.conversion_history.len() > 0 { self.conversion_history.len() - 1 } else { 0 }).unwrap_or(&("".to_string())).clone(); + let mut first_diff_position = o_minus_1.chars().zip(text.chars()).position(|(a, b)| a != b); + + if o_minus_1 != text && first_diff_position.is_none() { + first_diff_position = Some(o_minus_1.chars().count()); + } + let diff = text.chars().skip(first_diff_position.unwrap_or(0)).collect::(); + + let roman_to_kanji_converter = RomanToKanjiConverter; + let converted = roman_to_kanji_converter.convert(&diff)?; + self.conversion_history.push(o_minus_1.chars().zip(text.chars()).take_while(|(a, b)| a == b).map(|(a, _)| a).collect::() + &converted); + self.clipboard_history.push(text.to_string()); + return Ok(self.conversion_history.last().unwrap().clone()); + } + + fn convert_tsf(&mut self, text: &str) -> Result { + self.now_reconvertion = true; + let mut diff_hiragana = String::new(); + if self.reconversion_prefix.is_none() { + let o_minus_2 = self.conversion_history.get(if self.conversion_history.len() > 1 { self.conversion_history.len() - 2 } else { 0 }).unwrap_or(&("".to_string())).clone(); + let i_minus_1 = self.clipboard_history.get(if self.clipboard_history.len() > 0 { self.clipboard_history.len() - 1 } else { 0 }).unwrap_or(&("".to_string())).clone(); + println!("o,i: {}, {}", o_minus_2, i_minus_1); + let mut first_diff_position = i_minus_1.chars().zip(o_minus_2.chars()).position(|(a, b)| a != b); + println!("diff_pos: {:?}", first_diff_position); + if o_minus_2 != i_minus_1 && first_diff_position.is_none() { + first_diff_position = Some(o_minus_2.chars().count()); + } + let diff = i_minus_1.chars().skip(first_diff_position.unwrap_or(0)).collect::(); + println!("diff: {}", diff); + diff_hiragana = HiraganaConverter.convert(&diff)?; + let prefix = i_minus_1.chars().zip(o_minus_2.chars()).take_while(|(a, b)| a == b).map(|(a, _)| a).collect::(); + self.reconversion_prefix = Some(prefix.clone()); + } + println!("diff_hiragana: {}", diff_hiragana); + + let candidates = self.reconversion_candidates.get_or_insert_with(|| { + self.search_candidate_provider.get_candidates(&diff_hiragana, 10).unwrap_or_default() + }); + + let index = self.reconversion_index.get_or_insert(0); + + if *index == 0 && self.reconversion_prefix.as_ref().unwrap().to_owned() + &candidates[*index] == text { + *index += 1; + } else if *index + 1 < candidates.len() { + *index += 1; + } else { + *index = 0; + } + + if self.reconversion_candidates.is_some() { + println!("Candidates: {:?}", self.reconversion_candidates.as_ref().unwrap()); + } + + self.conversion_history.push(self.reconversion_prefix.clone().unwrap() + &self.reconversion_candidates.as_ref().unwrap()[self.reconversion_index.unwrap()].clone()); + self.clipboard_history.push(text.to_string()); + + while self.conversion_history.len() > 3 { + self.conversion_history.remove(0); + } + while self.clipboard_history.len() > 3 { + self.clipboard_history.remove(0); + } + + return Ok(self.conversion_history.last().unwrap().clone()); + } + pub fn convert(&mut self, text: &str) -> Result { println!(); println!("History: {:?}, {:?}", self.conversion_history, self.clipboard_history); @@ -37,77 +111,17 @@ impl TsfConversion { self.target_text = text.to_string(); if !same_as_last_conversion && self.now_reconvertion { - self.now_reconvertion = false; - self.reconversion_prefix = None; - self.reconversion_index = None; - self.reconversion_candidates = None; + self.reset_conversion_state(); } if !self.now_reconvertion && !same_as_last_conversion { println!("Convert using roman_to_kanji"); - let o_minus_1 = self.conversion_history.get(if self.conversion_history.len() > 0 { self.conversion_history.len() - 1 } else { 0 }).unwrap_or(&("".to_string())).clone(); - let mut first_diff_position = o_minus_1.chars().zip(text.chars()).position(|(a, b)| a != b); - - if o_minus_1 != text && first_diff_position.is_none() { - first_diff_position = Some(o_minus_1.chars().count()); - } - let diff = text.chars().skip(first_diff_position.unwrap_or(0)).collect::(); - - let roman_to_kanji_converter = RomanToKanjiConverter; - let converted = roman_to_kanji_converter.convert(&diff)?; - self.conversion_history.push(o_minus_1.chars().zip(text.chars()).take_while(|(a, b)| a == b).map(|(a, _)| a).collect::() + &converted); - self.clipboard_history.push(text.to_string()); - return Ok(self.conversion_history.last().unwrap().clone()); + return self.convert_roman_to_kanji(text); } if same_as_last_conversion || self.now_reconvertion { println!("Convert using TSF"); - self.now_reconvertion = true; - let mut diff_hiragana = String::new(); - if self.reconversion_prefix.is_none() { - let o_minus_2 = self.conversion_history.get(if self.conversion_history.len() > 1 { self.conversion_history.len() - 2 } else { 0 }).unwrap_or(&("".to_string())).clone(); - let i_minus_1 = self.clipboard_history.get(if self.clipboard_history.len() > 0 { self.clipboard_history.len() - 1 } else { 0 }).unwrap_or(&("".to_string())).clone(); - println!("o,i: {}, {}", o_minus_2, i_minus_1); - let mut first_diff_position = i_minus_1.chars().zip(o_minus_2.chars()).position(|(a, b)| a != b); - println!("diff_pos: {:?}", first_diff_position); - if o_minus_2 != i_minus_1 && first_diff_position.is_none() { - first_diff_position = Some(o_minus_2.chars().count()); - } - let diff = i_minus_1.chars().skip(first_diff_position.unwrap_or(0)).collect::(); - println!("diff: {}", diff); - diff_hiragana = HiraganaConverter.convert(&diff)?; - let prefix = i_minus_1.chars().zip(o_minus_2.chars()).take_while(|(a, b)| a == b).map(|(a, _)| a).collect::(); - self.reconversion_prefix = Some(prefix.clone()); - } - println!("diff_hiragana: {}", diff_hiragana); - - if self.reconversion_index.is_none() { - self.reconversion_candidates = Some(self.search_candidate_provider.get_candidates(&diff_hiragana, 10)?); - self.reconversion_index = Some(0); - if self.reconversion_prefix.clone().unwrap() + &self.reconversion_candidates.as_ref().unwrap()[self.reconversion_index.unwrap()].clone() == text { - self.reconversion_index = Some(self.reconversion_index.unwrap() + 1); - } - } else if self.reconversion_index.unwrap() + 1 < self.reconversion_candidates.as_ref().unwrap().len() { - self.reconversion_index = Some(self.reconversion_index.unwrap() + 1); - } else { - self.reconversion_index = Some(0); - } - - if self.reconversion_candidates.is_some() { - println!("Candidates: {:?}", self.reconversion_candidates.as_ref().unwrap()); - } - - self.conversion_history.push(self.reconversion_prefix.clone().unwrap() + &self.reconversion_candidates.as_ref().unwrap()[self.reconversion_index.unwrap()].clone()); - self.clipboard_history.push(text.to_string()); - - while self.conversion_history.len() > 3 { - self.conversion_history.remove(0); - } - while self.clipboard_history.len() > 3 { - self.clipboard_history.remove(0); - } - - return Ok(self.conversion_history.last().unwrap().clone()); + return self.convert_tsf(text); } Err(anyhow::anyhow!("Failed to convert"))