use proc_macro2::TokenStream;
use quote::quote;
use quote::quote_spanned;
use rstml::Parser;
use rstml::ParserConfig;
use rstml::node::Node;
use rstml::node::NodeName;
use std::collections::HashSet;
use syn::spanned::Spanned;
pub fn self_closing_elements() -> HashSet<&'static str> {
[
"area", "base", "br", "col", "embed", "hr", "img", "input", "link",
"meta", "param", "source", "track", "wbr",
]
.into_iter()
.collect()
}
pub fn tokens_to_rstml(tokens: TokenStream) -> (Vec<Node>, Vec<TokenStream>) {
let empty_elements = self_closing_elements();
let config = ParserConfig::new()
.recover_block(true)
.always_self_closed_elements(empty_elements)
.raw_text_elements(["script", "style"].into_iter().collect())
.macro_call_pattern(quote!(rsx! {%%}));
let parser = Parser::new(config);
let (nodes, errors) = parser.parse_recoverable(tokens).split_vec();
let errors = errors
.into_iter()
.map(|e| e.emit_as_expr_tokens())
.collect();
(nodes, errors)
}
pub fn _generate_tags_docs(
elements: &[NodeName],
) -> Vec<proc_macro2::TokenStream> {
let elements_as_type: HashSet<&'static str> =
vec!["html", "head", "meta", "link", "body"]
.into_iter()
.collect();
elements
.into_iter()
.map(|e| {
if elements_as_type.contains(&*e.to_string()) {
let element = quote_spanned!(e.span() => enum);
quote!({#element X{}})
} else {
let element = quote_spanned!(e.span() => element);
quote!(let _ = crate::docs::#element)
}
})
.collect()
}