8个版本 (4个稳定版)

1.2.0 2024年7月29日
1.1.0 2024年6月29日
0.5.0 2024年6月6日
0.1.10 2024年3月31日

#323 in 解析器实现

Download history 313/week @ 2024-04-29 163/week @ 2024-05-06 3/week @ 2024-05-13 8/week @ 2024-05-20 311/week @ 2024-05-27 359/week @ 2024-06-03 41/week @ 2024-06-10 134/week @ 2024-06-24 31/week @ 2024-07-01 4/week @ 2024-07-08 140/week @ 2024-07-22 157/week @ 2024-07-29 4/week @ 2024-08-05 15/week @ 2024-08-12

每月316次下载
用于metatron

自定义许可

245KB
5K SLoC

Shiva

shiva

Shiva库:实现任何类型文档的解析器和生成器

功能

  • 适用于所有文档类型的通用文档模型(CDM)
  • 解析器生成CDM
  • 生成器消费CDM

通用文档模型

Common Document Model

支持的文档类型

文档类型 解析 生成
纯文本 + +
Markdown + +
HTML + +
PDF + +
JSON + +
XML + +
CSV + +
RTF + +
DOCX + +
XLS + -
XLSX + +
ODS + +
Typst - +

解析文档功能

文档类型 标题 段落 列表 表格 图片 超链接 页眉 页脚
纯文本 - + - - - - - -
Markdown + + + + + + - -
HTML + + + + + + - -
PDF - + + - - - - -
DOCX + + + + - + - -
RTF + + + + - + + +
JSON + + + + - + + +
XML + + + + + + + +
CSV - - - + - - - -
XLS - - - + - - - -
XLSX - - - + - - - -
ODS - - - + - - - -

生成文档功能

文档类型 标题 段落 列表 表格 图片 超链接 页眉 页脚
纯文本 + + + + - + + +
Markdown + + + + + + + +
HTML + + + + + + - -
PDF + + + + + + + +
DOCX + + + + + + - -
RTF + + + + + + - -
JSON + + + + - + + +
XML + + + + + + + +
CSV - - - + - - - -
XLSX - - - + - - - -
ODS - - - + - - - -
Typst + + + + + + + +

使用Shiva库

Cargo.toml

[dependencies]
shiva = {  version = "1.2.0", features = ["html", "markdown", "text", "pdf", "json", 
    "csv", "rtf", "docx", "xml", "xls", "xlsx", "ods", "typst"] }

main.rs

fn main() {
    let input_vec = std::fs::read("input.html").unwrap();
    let input_bytes = bytes::Bytes::from(input_vec);
    let document = shiva::html::Transformer::parse(&input_bytes).unwrap();
    let output_bytes = shiva::markdown::Transformer::generate(&document).unwrap();
    std::fs::write("out.md", output_bytes).unwrap();
}

Shiva CLI & 服务器

构建可执行的Shiva CLI和Shiva服务器

git clone https://github.com/igumnoff/shiva.git
cd shiva/cli
cargo build --release

运行可执行的Shiva CLI

cd ./target/release/
./shiva --input-format=markdown --output-format=html --input-file=README.md --output-file=README.html

运行Shiva服务器

cd ./target/release/
./shiva-server --port=8080 --host=127.0.0.1

谁使用Shiva

贡献

我非常欢迎社区的贡献。如果您遇到bug,请随时提出问题。如果您想实现新功能或修复bug,请按照以下步骤操作

  1. 阅读"贡献者许可协议(CLA)"
  2. 通过telegram @ievkz 或 discord @igumnovnsk与我联系
  3. 在仓库中确认电子邮件邀请
  4. 执行"git clone"(您不需要分支!)
  5. 创建包含您分配的问题的分支
  6. 向主分支创建拉取请求

对于贡献者

如果您想添加新的文档类型,您需要实现以下特性

必需:shiva::core::TransformerTrait

pub trait TransformerTrait {
    fn parse(document: &Bytes) -> anyhow::Result<Document>;
    fn generate(document: &Document) -> anyhow::Result<Bytes>;
}

可选:shiva::core::TransformerWithImageLoaderSaverTrait(如果图像存储在文档外部,例如HTML,Markdown)

pub trait TransformerWithImageLoaderSaverTrait {
    fn parse_with_loader<F>(document: &Bytes,  image_loader: F) -> anyhow::Result<Document>
        where F: Fn(&str) -> anyhow::Result<Bytes>;
    fn generate_with_saver<F>(document: &Document,  image_saver: F) -> anyhow::Result<Bytes>
        where F: Fn(&Bytes, &str) -> anyhow::Result<()>;
}

依赖

~2–26MB
~322K SLoC