#syn #rsx #html #awsl

awsl-syn

AWSL解析器,用于Rust宏

1个不稳定版本

0.1.0 2022年3月21日

#2039 in 过程宏

MPL-2.0 许可证

36KB
634

syn-rsx

crates.io page docs.rs page codecov build license: MIT

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