< 返回版块

c5soft 发表于 2021-12-09 16:22

Tags:markdown,CommonMark

如果你需要一个高效的markdown到html转译组件,你到crates.io里搜markdown,拿到500+结果,太多了,排名第一的就叫markdown, 可惜,这个组件未完全实现markdown的规范解析。各位,应该用哪个crate呢?

我们去研读markdown有关文档,获得CommonMark这个关键词,再用CommonMark到crates.io搜,这次我们拿到100%实现CommonMark的组件了,有两个不错的选择,一个叫pulldown-cmark,另一个叫comrak,各位看官,有没有这方面实践的玩家,说说哪个最好用?

评论区

写评论
作者 c5soft 2021-12-10 08:04

大侠的点评很有参考价值

--
👇
苦瓜小仔: 首先,关于这两个 md 解析库,在 comrak 的介绍上已经有比较了:https://github.com/kivikakk/comrak#related-projects

其次,在没有明确需求之前,你无法定义什么叫做好用。 pulldown-cmark 简单而快速,你也可以看成简陋。 comrak 复杂而强大,你也可以看成累赘。从生态上看,pulldown-cmark 融入 cargo doc / mdbook 工具。而 comrak 不仅是一个 parser 还是一个 formatter,或许更适合转成复杂(功能更多)的 html(比如 markdown2html-converter)。

苦瓜小仔 2021-12-09 18:07

首先,关于这两个 md 解析库,在 comrak 的介绍上已经有比较了:https://github.com/kivikakk/comrak#related-projects

其次,在没有明确需求之前,你无法定义什么叫做好用。 pulldown-cmark 简单而快速,你也可以看成简陋。 comrak 复杂而强大,你也可以看成累赘。从生态上看,pulldown-cmark 融入 cargo doc / mdbook 工具。而 comrak 不仅是一个 parser 还是一个 formatter,或许更适合转成复杂(功能更多)的 html(比如 markdown2html-converter)。

作者 c5soft 2021-12-09 16:26

从Black Hat Rust里抄了一段如何使用pulldown_cmark的代码:

pub const HEADER: &str = r#"<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
"#;

pub fn render_body(body: &str) -> String {
    format!(
        r#"  <body>
    <nav>
        <a href="/">Home</a>
    </nav>
    <br />
    {}
  </body>"#,
        body
    )
}

pub const FOOTER: &str = r#"
</html>
"#;

pub fn md_to_html(md_file: &str, html_file: &str) -> Result<(), anyhow::Error> {
    use std::{fs, path::Path};
    let mut html = HEADER.to_owned();
    let markdown = fs::read_to_string(md_file)?;
    let parser = pulldown_cmark::Parser::new_ext(&markdown, pulldown_cmark::Options::all());
    let mut body = String::new();
    pulldown_cmark::html::push_html(&mut body, parser);
    html.push_str(render_body(&body).as_str());
    html.push_str(FOOTER);
    let folder = Path::new(html_file).parent().unwrap();
    let _ = fs::create_dir_all(folder);
    fs::write(html_file, html)?;
    Ok(())
}

1 共 3 条评论, 1 页