Expand description
syn
-powered parser for JSX-like TokenStream
s, aka RSX. The parsed result is a
nested Node
structure, similar to the browser DOM, where node name and
value are syn expressions to support building proc macros.
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");
§Features
-
Not opinionated
Every tag or attribute name is valid
<hello world />
-
Text nodes
<div>"String literal"</div>
Support for unquoted text is planned
-
Node names separated by dash, colon or double colon
<tag-name attribute-key="value" /> <tag:name attribute:key="value" /> <tag::name attribute::key="value" />
-
Node names with reserved keywords
<input type="submit" />
-
Attribute values can be any valid syn expression without requiring braces
<div key=some::value() />
-
Doctypes, Comments and Fragments
<!DOCTYPE html> <!-- "comment" --> <></>
-
Braced blocks are parsed as arbitrary Rust code
<{ 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"; } />
-
Helpful error reporting out of the box
ⓘ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> }; | ^^^
-
Customization
A
ParserConfig
to customize parsing behavior is available, so if you have slightly different requirements for parsing and it’s not yet customizable feel free to open an issue or pull request to extend the configuration.One highlight with regards to customization is the
transform_block
configuration, which takes a closure that receives raw block content asParseStream
and lets you optionally convert it to aTokenStream
. That makes it possible to have custom syntax in blocks. More details in #9
Modules§
- punctuation
- Custom syn punctuations
Structs§
- Node
- Node in the tree
- Parser
- RSX Parser
- Parser
Config - Configures the
Parser
behavior
Enums§
Functions§
- parse
- Parse the given
proc-macro::TokenStream
into aNode
tree - parse2
- Parse the given
proc-macro2::TokenStream
into aNode
tree - parse2_
with_ config - Parse the given
proc-macro2::TokenStream
into aNode
tree with customParserConfig
- parse_
with_ config - Parse the given
proc-macro::TokenStream
into aNode
tree with customParserConfig