diff options
| author | Fuwn <[email protected]> | 2023-03-31 17:49:21 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-03-31 17:49:21 -0700 |
| commit | 397ce63b0c28fbbe95b4019dd22a4a360e8a083f (patch) | |
| tree | 55aedcbfa0bef25168d8eae5f9c6f8f03f1379d5 /src/modules/router/translate | |
| parent | refactor(src): use response macros (diff) | |
| download | locus-397ce63b0c28fbbe95b4019dd22a4a360e8a083f.tar.xz locus-397ce63b0c28fbbe95b4019dd22a4a360e8a083f.zip | |
feat(translate): character set detection
Diffstat (limited to 'src/modules/router/translate')
| -rw-r--r-- | src/modules/router/translate/deepl.rs | 14 | ||||
| -rw-r--r-- | src/modules/router/translate/module.rs | 133 |
2 files changed, 85 insertions, 62 deletions
diff --git a/src/modules/router/translate/deepl.rs b/src/modules/router/translate/deepl.rs index 00e7538..b1767e8 100644 --- a/src/modules/router/translate/deepl.rs +++ b/src/modules/router/translate/deepl.rs @@ -35,8 +35,11 @@ struct Translation { pub detected_source_language: String, } -pub fn translate(text: &str, language: &str) -> DeepL { - let deepl_response: DeepL = serde_json::from_str( +pub fn translate( + text: &str, + language: &str, +) -> Result<DeepL, serde_json::Error> { + let deepl_response: DeepL = serde_json::from_str({ &reqwest::blocking::Client::new() .post("https://api-free.deepl.com/v2/translate") .header( @@ -47,11 +50,10 @@ pub fn translate(text: &str, language: &str) -> DeepL { .send() .unwrap() .text() - .unwrap(), - ) - .unwrap(); + .unwrap() + })?; - deepl_response + Ok(deepl_response) } pub fn language_code_to_language_name(language_code: &str) -> String { diff --git a/src/modules/router/translate/module.rs b/src/modules/router/translate/module.rs index 8c3b162..0c997d3 100644 --- a/src/modules/router/translate/module.rs +++ b/src/modules/router/translate/module.rs @@ -19,69 +19,90 @@ use super::deepl::translate; use crate::modules::router::translate::deepl::language_code_to_language_name; -pub fn module( +pub fn module<S>( cc: &windmark::returnable::CallbackContext<'_>, - content: &mut String, -) { - if let Some(language) = - windmark::utilities::queries_from_url(cc.url).get("translate") - { - let lines = content - .lines() - .map(ToString::to_string) - .collect::<Vec<String>>(); - let mut preformatted = false; - let mut saved_lines = std::collections::HashMap::new(); - let mut fully_translated = Vec::new(); + response: &mut windmark::Response, + language: S, +) -> Result<(), serde_json::Error> +where + S: Into<String> + AsRef<str>, +{ + let lines = response + .content + .lines() + .map(ToString::to_string) + .collect::<Vec<String>>(); + let mut preformatted = false; + let mut saved_lines = std::collections::HashMap::new(); + let mut fully_translated = Vec::new(); - for (i, line) in &mut lines.iter().enumerate() { - if line == "```" { - preformatted = !preformatted; - } + for (i, line) in &mut lines.iter().enumerate() { + if line == "```" { + preformatted = !preformatted; + } - if line.starts_with("=>") { - if let Some(germ::ast::Node::Link { - to, - text, - }) = germ::ast::Ast::from_string(line).inner().get(0) - { - saved_lines.insert( - i, - format!( - "=> {to}?translate={language}{}", - text.clone().map_or_else( - || "".to_string(), - |text| { format!(" {}", translate(&text, language).text()) } - ) - ), - ); - } - } else if preformatted { - saved_lines.insert(i, line.to_string()); + if line.starts_with("=>") { + if let Some(germ::ast::Node::Link { + to, + text, + }) = germ::ast::Ast::from_string(line).inner().get(0) + { + saved_lines.insert( + i, + format!( + "=> {to}?translate={}{}", + language.as_ref(), + text.clone().map_or_else( + || "".to_string(), + |text| { + format!( + " {}", + if let Ok(text) = translate(&text, language.as_ref()) { + text.text() + } else { + text + } + ) + } + ) + ), + ); } + } else if preformatted { + saved_lines.insert(i, line.to_string()); } + } - let translated = translate(content, language); + let translated = translate(&response.content, language.as_ref())?; - for (i, line) in translated.text().lines().enumerate() { - if saved_lines.contains_key(&i) { - fully_translated.push(saved_lines.get(&i).unwrap().to_string()); - } else { - fully_translated.push(line.to_string()); - } + for (i, line) in translated.text().lines().enumerate() { + if saved_lines.contains_key(&i) { + fully_translated.push(saved_lines.get(&i).unwrap().to_string()); + } else { + fully_translated.push(line.to_string()); } - - *content = format!( - "This content has been translated from {} to {}.\n\n=> {} View \ - Original\n\n{}", - language_code_to_language_name( - &translated.detected_source_language().to_lowercase() - ), - language_code_to_language_name(&language.to_string().to_lowercase()), - cc.url - .to_string() - .replace(&format!("translate={language}"), ""), - fully_translated.join("\n") - ); } + + response.content = format!( + "This content has been translated from {} to {}.\n\n=> {} View \ + Original\n\n{}", + language_code_to_language_name( + &translated.detected_source_language().to_lowercase() + ), + language_code_to_language_name(&language.as_ref().to_lowercase()), + cc.url + .to_string() + .replace(&format!("translate={}", language.as_ref()), ""), + fully_translated.join("\n") + ); + response.language = Some(language.into()); + response.character_set = Some({ + let mut encoding_detector = chardetng::EncodingDetector::new(); + + encoding_detector.feed(response.content.as_bytes(), true); + + encoding_detector.guess(None, true).name().to_string() + }); + + Ok(()) } |