ferrous_opencc/lib.rs
1//! # 纯 Rust 实现的 OpenCC
2//!
3//! 为繁体中文和简体中文之间提供高性能的转换。
4//!
5//! ## 示例
6//!
7//! ```no_run
8//! use ferrous_opencc::OpenCC;
9//!
10//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
11//! // 创建 OpenCC 实例
12//! let opencc = OpenCC::new("path/to/your/s2t.json")?;
13//!
14//! // 转换文本
15//! let text = "“开放中文转换”是完全由 Rust 实现的。";
16//! let converted = opencc.convert(text);
17//!
18//! assert_eq!(converted, "「開放中文轉換」是完全由 Rust 實現的。");
19//! # Ok(())
20//! # }
21//! ```
22
23pub mod compiler;
24pub mod config;
25pub mod conversion;
26pub mod dictionary;
27pub mod error;
28pub mod segmentation;
29
30use config::Config;
31use conversion::ConversionChain;
32use error::Result;
33use segmentation::{Segmentation, SegmentationType};
34use std::path::Path;
35
36/// 核心的 OpenCC 转换器
37pub struct OpenCC {
38 /// 配置名称
39 name: String,
40 /// 分词器
41 segmentation: Box<dyn Segmentation>,
42 /// 用于执行转换的词典链
43 conversion_chain: ConversionChain,
44}
45
46impl OpenCC {
47 /// 从配置文件创建一个新的 `OpenCC` 实例。
48 /// 解析 JSON 配置文件,加载所有必需的词典,并构建转换流程。
49 ///
50 /// # 参数
51 ///
52 /// * `config_path`: 指向主 JSON 配置文件(例如 `s2t.json`)的路径
53 ///
54 /// # 返回
55 ///
56 /// 一个 `Result`,其中包含新的 `OpenCC` 实例,或者在加载失败时返回错误
57 pub fn new<P: AsRef<Path>>(config_path: P) -> Result<Self> {
58 // 1. 解析配置文件
59 let config = Config::from_file(config_path)?;
60 let config_dir = config.get_config_directory();
61
62 // 2. 初始化分词器
63 let segmentation = SegmentationType::from_config(&config.segmentation, config_dir)?;
64
65 // 3. 初始化转换链
66 let conversion_chain = ConversionChain::from_config(&config.conversion_chain, config_dir)?;
67
68 Ok(Self {
69 name: config.name,
70 segmentation: segmentation.into_segmenter(),
71 conversion_chain,
72 })
73 }
74
75 /// 根据加载的配置转换字符串
76 ///
77 /// # 参数
78 ///
79 /// * `input`: 需要转换的字符串
80 ///
81 /// # 返回
82 ///
83 /// 转换后的字符串
84 pub fn convert(&self, input: &str) -> String {
85 // 1. 使用分词器进行分词
86 let segments = self.segmentation.segment(input);
87 // 2. 使用转换链进行转换
88 self.conversion_chain.convert(&segments)
89 }
90
91 /// 返回当前加载的配置名称
92 pub fn name(&self) -> &str {
93 &self.name
94 }
95}