#[doc(hidden)]
#[macro_export]
macro_rules! attributes_impl {
([$($acc:tt)*] $name:expr => $value:expr, $($rest:tt)*) => {
$crate::attributes_impl!(
[$($acc)* (String::from($name), String::from($value)),]
$($rest)*
)
};
([$($acc:tt)*] $name:expr => $value:expr) => {
$crate::attributes_impl!([$($acc)* (String::from($name), String::from($value)),])
};
([$($acc:tt)*]) => {
[$($acc)*]
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! html_impl {
(($arena:expr) [$($acc:tt)*] (text $text:expr) $($rest:tt)*) => {{
let text = $arena.text($text);
$crate::html_impl!(
($arena)
[$($acc)* text,]
$($rest)*
)
}};
(($arena:expr) [$($acc:tt)*] (raw $text:expr) $($rest:tt)*) => {{
let text = $arena.raw_text($text);
$crate::html_impl!(
($arena)
[$($acc)* text,]
$($rest)*
)
}};
(($arena:expr) [$($acc:tt)*] (> $children:expr) $($rest:tt)*) => {{
let fragment = $arena.fragment($children);
$crate::html_impl!(
($arena)
[$($acc)* fragment,]
$($rest)*
)
}};
(($arena:expr) [$($acc:tt)*] ([$tagname:expr] [$($attributes:tt)*] $($children:tt)*) $($rest:tt)*) => {{
let attributes = $crate::attributes_impl!([] $($attributes)*);
let element = $arena.tag($tagname, attributes);
element.append($crate::html_impl!(
($arena)
[]
$($children)*
));
$crate::html_impl!(
($arena)
[$($acc)* element,]
$($rest)*
)
}};
(($arena:expr) [$($acc:tt)*] ($tagname:ident [$($attributes:tt)*] $($children:tt)*) $($rest:tt)*) => {{
let tagname = stringify!($tagname);
$crate::html_impl!(
($arena)
[$($acc)*]
([tagname] [$($attributes)*] $($children)*)
$($rest)*
)
}};
(($arena:expr) [$($acc:tt)*] ($tagname:ident $($children:tt)*) $($rest:tt)*) => {{
let tagname = stringify!($tagname);
$crate::html_impl!(
($arena)
[$($acc)*]
([tagname] [] $($children)*)
$($rest)*
)
}};
(($arena:expr) [$($acc:tt)*] ([$tagname:expr] $($children:tt)*) $($rest:tt)*) => {{
let element = $arena.tag($tagname, []);
$crate::html_impl!(
($arena)
[$($acc)*]
([$tagname] [] $($children)*)
$($rest)*
)
}};
(($arena:expr) [$($top:tt)*]) => {
$arena.fragment([$($top)*])
}
}
#[macro_export]
macro_rules! html {
($arena:expr) => {
$arena.fragment([])
};
($arena:expr, $($dsl:tt)*) => {
$crate::html_impl!(($arena) [] $($dsl)*)
};
}