1mod anki;
2mod cedict;
3mod dxdict;
4mod ecdict;
5mod html;
6mod mdx;
7mod sqlite_dict;
8mod traits;
9
10pub use anki::AnkiJsonlParser;
11pub use cedict::CedictParser;
12pub use dxdict::{
13 write_dxdict, BuiltinDxdictParser, DxdictMetadata, DxdictParser, BUILTIN_KD_DATA_SOURCE,
14 BUILTIN_NEW_CENTURY_SOURCE,
15};
16pub use ecdict::EcdictParser;
17pub use mdx::MdxParser;
18pub use sqlite_dict::SqliteDictParser;
19pub use traits::*;
20
21use dictx_core::{DictxError, Result};
22use std::path::Path;
23
24pub fn parser_for(format: &str) -> Result<Box<dyn DictParser>> {
25 match format {
26 "ecdict" | "csv" => Ok(Box::new(EcdictParser)),
27 "anki" | "anki-jsonl" | "jsonl" => Ok(Box::new(AnkiJsonlParser)),
28 "dxdict" | "dictx" | "dictx-pack" => Ok(Box::new(DxdictParser)),
29 "builtin-dxdict" | "builtin" => Ok(Box::new(BuiltinDxdictParser)),
30 "cedict" | "cc-cedict" => Ok(Box::new(CedictParser)),
31 "sqlite" | "kd" | "kd-db" => Ok(Box::new(SqliteDictParser::default())),
32 "mdx" | "mdict" => Ok(Box::new(MdxParser)),
33 other => Err(DictxError::UnsupportedSource(format!(
34 "未知词典格式: {other}"
35 ))),
36 }
37}
38
39pub fn parse_path(
40 format: &str,
41 path: &Path,
42) -> Result<Box<dyn Iterator<Item = Result<dictx_core::DictEntry>>>> {
43 parser_for(format)?.parse(path)
44}