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}