monolith_integration/
monolith_integration.rs1use html_translation_lib::{TranslationConfig, translate_before_merge, TranslationResult};
6use html5ever::parse_document;
7use html5ever::tendril::TendrilSink;
8use markup5ever_rcdom::RcDom;
9
10#[tokio::main]
11async fn main() -> TranslationResult<()> {
12 tracing_subscriber::fmt::init();
13
14 println!("HTML翻译库 - Monolith集成示例");
15 println!("{}", "=".repeat(50));
16
17 let html_content = format!(r##"
19 <!DOCTYPE html>
20 <html lang="en">
21 <head>
22 <meta charset="UTF-8">
23 <title>Product Documentation</title>
24 <link rel="stylesheet" href="styles.css">
25 </head>
26 <body>
27 <header>
28 <h1>Product Documentation</h1>
29 <p>Comprehensive guide for our product</p>
30 </header>
31
32 <nav>
33 <ul>
34 <li><a href="{}getting-started">Getting Started</a></li>
35 <li><a href="{}features">Features</a></li>
36 <li><a href="{}api-reference">API Reference</a></li>
37 <li><a href="{}troubleshooting">Troubleshooting</a></li>
38 </ul>
39 </nav>
40
41 <main>
42 <section id="getting-started">
43 <h2>Getting Started</h2>
44 <p>Follow these simple steps to begin using our product:</p>
45 <ol>
46 <li>Download the latest version from our website</li>
47 <li>Install the software on your system</li>
48 <li>Run the initial configuration wizard</li>
49 <li>Start exploring the features</li>
50 </ol>
51 </section>
52
53 <section id="features">
54 <h2>Key Features</h2>
55 <div class="feature-grid">
56 <div class="feature-card">
57 <h3>Easy to Use</h3>
58 <p>Intuitive interface designed for users of all skill levels.</p>
59 </div>
60 <div class="feature-card">
61 <h3>High Performance</h3>
62 <p>Optimized algorithms ensure fast processing times.</p>
63 </div>
64 <div class="feature-card">
65 <h3>Extensible</h3>
66 <p>Plugin architecture allows for custom functionality.</p>
67 </div>
68 </div>
69 </section>
70
71 <section id="api-reference">
72 <h2>API Reference</h2>
73 <p>Complete documentation of all available functions and methods.</p>
74 <code>
75 function processData(input) {{
76 // Example function
77 return input.map(item => item * 2);
78 }}
79 </code>
80 </section>
81 </main>
82
83 <footer>
84 <p>© 2024 Company Name. All rights reserved.</p>
85 </footer>
86
87 <script src="script.js"></script>
88 </body>
89 </html>
90 "##, "#", "#", "#", "#");
91
92 println!("📄 原始HTML内容长度: {} 字符", html_content.len());
93
94 println!("\n🔍 步骤1: 解析HTML为DOM...");
96 let dom = parse_document(RcDom::default(), Default::default())
97 .from_utf8()
98 .read_from(&mut html_content.as_bytes())?;
99
100 println!("✅ HTML解析完成");
101
102 println!("\n⚙️ 步骤2: 配置翻译参数...");
104 let translation_config = TranslationConfig::new()
105 .target_language("zh")
106 .api_url("http://localhost:1188/translate")
107 .enable_cache(true)
108 .batch_size(15)
109 .max_retries(3);
110
111 println!("✅ 翻译配置完成");
112
113 println!("\n🔄 步骤3: 翻译DOM内容...");
115 let start_time = std::time::Instant::now();
116
117 let translated_dom = translate_before_merge(dom, translation_config).await?;
118
119 let translation_time = start_time.elapsed();
120 println!("✅ 翻译完成!耗时: {:?}", translation_time);
121
122 println!("\n📝 步骤4: 序列化翻译后的DOM...");
124 let translated_html = serialize_dom(&translated_dom)?;
125
126 println!("✅ DOM序列化完成");
127
128 println!("\n💾 步骤5: 保存翻译结果...");
130 std::fs::write("translated_monolith_input.html", &translated_html)?;
131 println!("✅ 翻译后的HTML已保存到: translated_monolith_input.html");
132
133 println!("\n🔧 集成说明:");
135 println!(" 1. 翻译后的HTML文件: translated_monolith_input.html");
136 println!(" 2. 现在可以使用Monolith处理此文件:");
137 println!(" monolith translated_monolith_input.html > final_output.html");
138 println!(" 3. 最终输出将是翻译好的单文件HTML");
139
140 println!("\n📊 处理统计:");
142 println!(" - 原始内容长度: {} 字符", html_content.len());
143 println!(" - 翻译后长度: {} 字符", translated_html.len());
144 println!(" - 翻译用时: {:?}", translation_time);
145 println!(" - 长度变化: {:.1}%",
146 (translated_html.len() as f32 / html_content.len() as f32 - 1.0) * 100.0);
147
148 let preview_length = 800;
150 let preview = if translated_html.len() > preview_length {
151 format!("{}...", &translated_html[..preview_length])
152 } else {
153 translated_html.clone()
154 };
155
156 println!("\n📝 翻译结果预览:");
157 println!("{}", "=".repeat(60));
158 println!("{}", preview);
159 println!("{}", "=".repeat(60));
160
161 println!("\n🎉 Monolith集成示例完成!");
162 println!(" 翻译后的文件现在可以用作Monolith的输入。");
163
164 Ok(())
165}
166
167fn serialize_dom(dom: &RcDom) -> TranslationResult<String> {
169 use html5ever::serialize::{serialize, SerializeOpts};
170 use markup5ever_rcdom::SerializableHandle;
171 use std::io::Cursor;
172
173 let mut buffer = Vec::new();
174 let cursor = Cursor::new(&mut buffer);
175
176 serialize(
177 cursor,
178 &SerializableHandle::from(dom.document.clone()),
179 SerializeOpts::default()
180 ).map_err(|e| html_translation_lib::TranslationError::ParseError(
181 format!("HTML序列化失败: {:?}", e)
182 ))?;
183
184 String::from_utf8(buffer).map_err(|e|
185 html_translation_lib::TranslationError::ParseError(
186 format!("UTF-8转换失败: {}", e)
187 )
188 )
189}