Add support use original text when import text

This commit is contained in:
2026-03-03 13:51:57 +08:00
parent 1e50132e34
commit 59a82a5363
3 changed files with 28 additions and 6 deletions

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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);
}