use html_translation_lib::{TranslationConfig, translate_before_merge, TranslationResult};
use html5ever::parse_document;
use html5ever::tendril::TendrilSink;
use markup5ever_rcdom::RcDom;
#[tokio::main]
async fn main() -> TranslationResult<()> {
tracing_subscriber::fmt::init();
println!("HTML翻译库 - Monolith集成示例");
println!("{}", "=".repeat(50));
let html_content = format!(r##"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Product Documentation</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<h1>Product Documentation</h1>
<p>Comprehensive guide for our product</p>
</header>
<nav>
<ul>
<li><a href="{}getting-started">Getting Started</a></li>
<li><a href="{}features">Features</a></li>
<li><a href="{}api-reference">API Reference</a></li>
<li><a href="{}troubleshooting">Troubleshooting</a></li>
</ul>
</nav>
<main>
<section id="getting-started">
<h2>Getting Started</h2>
<p>Follow these simple steps to begin using our product:</p>
<ol>
<li>Download the latest version from our website</li>
<li>Install the software on your system</li>
<li>Run the initial configuration wizard</li>
<li>Start exploring the features</li>
</ol>
</section>
<section id="features">
<h2>Key Features</h2>
<div class="feature-grid">
<div class="feature-card">
<h3>Easy to Use</h3>
<p>Intuitive interface designed for users of all skill levels.</p>
</div>
<div class="feature-card">
<h3>High Performance</h3>
<p>Optimized algorithms ensure fast processing times.</p>
</div>
<div class="feature-card">
<h3>Extensible</h3>
<p>Plugin architecture allows for custom functionality.</p>
</div>
</div>
</section>
<section id="api-reference">
<h2>API Reference</h2>
<p>Complete documentation of all available functions and methods.</p>
<code>
function processData(input) {{
// Example function
return input.map(item => item * 2);
}}
</code>
</section>
</main>
<footer>
<p>© 2024 Company Name. All rights reserved.</p>
</footer>
<script src="script.js"></script>
</body>
</html>
"##, "#", "#", "#", "#");
println!("📄 原始HTML内容长度: {} 字符", html_content.len());
println!("\n🔍 步骤1: 解析HTML为DOM...");
let dom = parse_document(RcDom::default(), Default::default())
.from_utf8()
.read_from(&mut html_content.as_bytes())?;
println!("✅ HTML解析完成");
println!("\n⚙️ 步骤2: 配置翻译参数...");
let translation_config = TranslationConfig::new()
.target_language("zh")
.api_url("http://localhost:1188/translate")
.enable_cache(true)
.batch_size(15)
.max_retries(3);
println!("✅ 翻译配置完成");
println!("\n🔄 步骤3: 翻译DOM内容...");
let start_time = std::time::Instant::now();
let translated_dom = translate_before_merge(dom, translation_config).await?;
let translation_time = start_time.elapsed();
println!("✅ 翻译完成!耗时: {:?}", translation_time);
println!("\n📝 步骤4: 序列化翻译后的DOM...");
let translated_html = serialize_dom(&translated_dom)?;
println!("✅ DOM序列化完成");
println!("\n💾 步骤5: 保存翻译结果...");
std::fs::write("translated_monolith_input.html", &translated_html)?;
println!("✅ 翻译后的HTML已保存到: translated_monolith_input.html");
println!("\n🔧 集成说明:");
println!(" 1. 翻译后的HTML文件: translated_monolith_input.html");
println!(" 2. 现在可以使用Monolith处理此文件:");
println!(" monolith translated_monolith_input.html > final_output.html");
println!(" 3. 最终输出将是翻译好的单文件HTML");
println!("\n📊 处理统计:");
println!(" - 原始内容长度: {} 字符", html_content.len());
println!(" - 翻译后长度: {} 字符", translated_html.len());
println!(" - 翻译用时: {:?}", translation_time);
println!(" - 长度变化: {:.1}%",
(translated_html.len() as f32 / html_content.len() as f32 - 1.0) * 100.0);
let preview_length = 800;
let preview = if translated_html.len() > preview_length {
format!("{}...", &translated_html[..preview_length])
} else {
translated_html.clone()
};
println!("\n📝 翻译结果预览:");
println!("{}", "=".repeat(60));
println!("{}", preview);
println!("{}", "=".repeat(60));
println!("\n🎉 Monolith集成示例完成!");
println!(" 翻译后的文件现在可以用作Monolith的输入。");
Ok(())
}
fn serialize_dom(dom: &RcDom) -> TranslationResult<String> {
use html5ever::serialize::{serialize, SerializeOpts};
use markup5ever_rcdom::SerializableHandle;
use std::io::Cursor;
let mut buffer = Vec::new();
let cursor = Cursor::new(&mut buffer);
serialize(
cursor,
&SerializableHandle::from(dom.document.clone()),
SerializeOpts::default()
).map_err(|e| html_translation_lib::TranslationError::ParseError(
format!("HTML序列化失败: {:?}", e)
))?;
String::from_utf8(buffer).map_err(|e|
html_translation_lib::TranslationError::ParseError(
format!("UTF-8转换失败: {}", e)
)
)
}