diff --git a/src/args.rs b/src/args.rs index 9e9dfa0..72fbfea 100644 --- a/src/args.rs +++ b/src/args.rs @@ -587,6 +587,9 @@ pub struct Arg { #[arg(long, global = true)] /// Do not add quote to translated text when exporting to m3t files. pub m3t_no_quote: bool, + #[arg(long, global = true)] + /// Use original text as translated text if translated text and llm text are all empty. + pub m3t_use_original_text: bool, #[cfg(feature = "kirikiri-arc")] #[arg(long, global = true)] /// Disable adler32 checksum for Kirikiri XP3 archive when creating. @@ -938,6 +941,7 @@ pub fn load_kirikiri_chat_json( crate::output_scripts::m3t::M3tParser::new( &data, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ) .parse_as_vec()? } else { diff --git a/src/main.rs b/src/main.rs index 4d7c0a4..a6d735b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1644,6 +1644,7 @@ pub fn import_script( let mut parser = output_scripts::m3t::M3tParser::new( &s, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ); match parser.parse() { Ok(mes) => mes, @@ -1946,6 +1947,7 @@ pub fn import_script( let mut parser = output_scripts::m3t::M3tParser::new( &s, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ); match parser.parse() { Ok(mes) => mes, @@ -2271,6 +2273,7 @@ pub fn import_script( let mut parser = output_scripts::m3t::M3tParser::new( &s, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ); parser.parse()? } @@ -2375,6 +2378,7 @@ pub fn import_script( let mut parser = output_scripts::m3t::M3tParser::new( &s, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ); parser.parse()? } @@ -2928,6 +2932,7 @@ pub fn parse_output_script_as_extend( let mut parser = output_scripts::m3t::M3tParser::new( &s, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ); let mes = parser.parse_as_extend()?; Ok(mes) @@ -2965,6 +2970,7 @@ pub fn parse_output_script( let mut parser = output_scripts::m3t::M3tParser::new( &s, arg.llm_trans_mark.as_ref().map(|s| s.as_str()), + arg.m3t_use_original_text, ); let mes = parser.parse()?; Ok(mes) diff --git a/src/output_scripts/m3t.rs b/src/output_scripts/m3t.rs index 4fbb486..b9fd748 100644 --- a/src/output_scripts/m3t.rs +++ b/src/output_scripts/m3t.rs @@ -16,15 +16,17 @@ pub struct M3tParser<'a> { str: &'a str, line: usize, llm_mark: Option<&'a str>, + use_original_text: bool, } impl<'a> M3tParser<'a> { /// Creates a new M3tParser with the given string. - pub fn new(str: &'a str, llm_mark: Option<&'a str>) -> Self { + pub fn new(str: &'a str, llm_mark: Option<&'a str>, use_original_text: bool) -> Self { M3tParser { str, line: 1, llm_mark, + use_original_text, } } @@ -124,6 +126,7 @@ impl<'a> M3tParser<'a> { let mut messages = Vec::new(); let mut name = None; let mut llm = None; + let mut ori = None; while let Some(line) = self.next_line() { if line.is_empty() { continue; @@ -134,6 +137,8 @@ impl<'a> M3tParser<'a> { let line = line[3..].trim(); if line.starts_with("NAME:") { name = Some(line[5..].trim().to_string()); + } else { + ori = Some(line.to_string()); } } else if line.starts_with("△") { let line = line[3..].trim(); @@ -154,10 +159,17 @@ impl<'a> M3tParser<'a> { s }) .unwrap_or_else(|| { - String::from(if message.starts_with("「") { - "「」" + let m = if self.use_original_text { + ori.clone() } else { - "" + None + }; + m.unwrap_or_else(|| { + String::from(if message.starts_with("「") { + "「」" + } else { + "" + }) }) }) .replace("\\n", "\n") @@ -273,9 +285,9 @@ impl M3tDumper { #[test] fn test_zero_width_space() { let input = "○ NAME: Example\n\n○ Original message\n\u{200b}● 「」\n\n"; - let mut parser = M3tParser::new(input, None); + let mut parser = M3tParser::new(input, None, false); let messages = parser.parse().unwrap(); assert_eq!(messages.len(), 1); - let map = M3tParser::new(input, None).parse_as_vec().unwrap(); + let map = M3tParser::new(input, None, false).parse_as_vec().unwrap(); assert_eq!(map.len(), 1); }