refactor tsf conversion

This commit is contained in:
mii443
2024-09-25 01:03:12 +09:00
parent ec07cb9490
commit c4f337f059

View File

@ -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<String> {
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::<String>();
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::<String>() + &converted);
self.clipboard_history.push(text.to_string());
return Ok(self.conversion_history.last().unwrap().clone());
}
fn convert_tsf(&mut self, text: &str) -> Result<String> {
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::<String>();
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::<String>();
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<String> { pub fn convert(&mut self, text: &str) -> Result<String> {
println!(); println!();
println!("History: {:?}, {:?}", self.conversion_history, self.clipboard_history); println!("History: {:?}, {:?}", self.conversion_history, self.clipboard_history);
@ -37,77 +111,17 @@ impl TsfConversion {
self.target_text = text.to_string(); self.target_text = text.to_string();
if !same_as_last_conversion && self.now_reconvertion { if !same_as_last_conversion && self.now_reconvertion {
self.now_reconvertion = false; self.reset_conversion_state();
self.reconversion_prefix = None;
self.reconversion_index = None;
self.reconversion_candidates = None;
} }
if !self.now_reconvertion && !same_as_last_conversion { if !self.now_reconvertion && !same_as_last_conversion {
println!("Convert using roman_to_kanji"); 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(); return self.convert_roman_to_kanji(text);
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::<String>();
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::<String>() + &converted);
self.clipboard_history.push(text.to_string());
return Ok(self.conversion_history.last().unwrap().clone());
} }
if same_as_last_conversion || self.now_reconvertion { if same_as_last_conversion || self.now_reconvertion {
println!("Convert using TSF"); println!("Convert using TSF");
self.now_reconvertion = true; return self.convert_tsf(text);
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::<String>();
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::<String>();
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());
} }
Err(anyhow::anyhow!("Failed to convert")) Err(anyhow::anyhow!("Failed to convert"))