#common-mark #markdown #bindings #parser #node #cmark #rendering

nightly bin+lib rcmark

为解析和渲染 CommonMark 绑定到 cmark

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2015 年 6 月 2 日

#7#cmark

Apache-2.0/MIT

27KB
602

rcmark

cmark 的 Rust 绑定。

构建

首先需要安装 CMakepkg-config,除非你已经在某处安装了 libcmark。然后,只需运行

$ cargo build

lib.rs:

libcmark 的 Rust 绑定

此库包含对 libcmark C 库的绑定,这是 CommonMark 标准的 C 参考实现。此绑定不执行底层库之外的任何额外的解析工作,因此应该很准确。

节点

Node 是 rcmark 的核心抽象。节点可以通过程序或通过解析 CommonMark 源来构建。所有节点都有一个类型,并且可能有父、子和兄弟节点。根据节点类型,有多种属性可用。如果某个属性不适用于给定的节点类型,则尝试访问它将引发 panic。

 use rcmark::{Node, NodeType, ListType};

 let mut root = Node::new(NodeType::Document);

 let mut heading = Node::new(NodeType::Header);
 heading.set_header_level(1);

 let mut heading_text = Node::new(NodeType::Text);
 heading_text.set_literal("Hello, World!");

 heading.prepend_child(&mut heading_text);
 root.prepend_child(&mut heading);

解析文档

可以通过 Parser 实例或单个 parse_document 函数来完成解析。

 use rcmark::{Parser, parse_document, DEFAULT, NORMALIZE};

 let doc = parse_document("**Hello**, `World!`", DEFAULT);
 assert_eq!(doc.start_line(), 1);

 let mut parser = Parser::new(NORMALIZE);
 parser.feed("# Hello, World!");
 let doc2 = parser.finish();

渲染文档

可以手动进行渲染,但 libcmark 也提供了渲染到 XML、HTML、man 页面和 CommonMark 的函数。

 let doc = rcmark::parse_document("# Hello", rcmark::DEFAULT);

 assert_eq!(rcmark::render_xml(&doc, rcmark::DEFAULT),
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
             <!DOCTYPE CommonMark SYSTEM \"CommonMark.dtd\">\n\
             <document>\n  \
               <header level=\"1\">\n    \
                 <text>Hello</text>\n  \
               </header>\n\
             </document>\n");
 assert_eq!(rcmark::render_html(&doc, rcmark::DEFAULT),
            "<h1>Hello</h1>\n");
 assert_eq!(rcmark::render_man(&doc, rcmark::DEFAULT),
            ".SH\nHello\n");
 assert_eq!(rcmark::render_commonmark(&doc, rcmark::DEFAULT, 2),
            "# Hello\n");

依赖项

~185KB