1个不稳定版本
0.1.0 | 2022年3月21日 |
---|
#2039 in 过程宏
36KB
634 行
syn-rsx
syn-驱动的解析器,用于类似JSX的TokenStreams,即RSX。解析结果是嵌套的Node
结构,类似于浏览器DOM,节点名称和值是syn表达式,以支持构建过程宏。
use quote::quote;
use syn_rsx::parse2;
let tokens = quote! { <hello world>"hi"</hello> };
let nodes = parse2(tokens).unwrap();
assert_eq!(nodes[0].name_as_string().unwrap(), "hello");
assert_eq!(nodes[0].attributes[0].name_as_string().unwrap(), "world");
assert_eq!(nodes[0].children[0].value_as_string().unwrap(), "hi");
功能
-
无偏见
每个标签或属性名称都是有效的
<hello world />
-
文本节点
<div>"String literal"</div>
计划支持未引用的文本
-
节点名称由短横线、冒号或双冒号分隔
<tag-name attribute-key="value" /> <tag:name attribute:key="value" /> <tag::name attribute::key="value" />
-
支持保留关键字作为节点名称
<input type="submit" />
-
属性值可以是任何有效的syn表达式,无需大括号
<div key=some::value() />
-
文档类型、注释和片段
<!DOCTYPE html> <!-- "comment" --> <></>
-
大括号块被解析为任意Rust代码
<{ let block = "in node name position"; } /> <div>{ let block = "in node position"; }</div> <div { let block = "in attribute position"; } /> <div key={ let block = "in attribute value position"; } />
-
开箱即用的有用错误报告
error: open tag has no corresponding close tag and is not self-closing --> examples/html-to-string-macro/tests/lib.rs:5:24 | 5 | html_to_string! { <div> }; | ^^^
-
自定义
有
ParserConfig
来定制解析行为,因此如果您对解析有略微不同的要求并且尚不可定制,请随时提出问题或拉取请求以扩展配置。关于自定义的一个亮点是
transform_block
配置,它接收一个闭包,该闭包接收原始块内容作为ParseStream
,并允许您选择性地将其转换为TokenStream
。这使得在块中具有自定义语法成为可能。更多详细信息请参阅#9
依赖项
~1.5MB
~35K SLoC