diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs index 4027c5ed..7166b81b 100644 --- a/maud_macros/src/parse.rs +++ b/maud_macros/src/parse.rs @@ -49,6 +49,9 @@ macro_rules! question { macro_rules! semi { () => (TokenTree::Token(_, Token::Semi)) } +macro_rules! colon { + () => (TokenTree::Token(_, Token::Colon)) +} macro_rules! comma { () => (TokenTree::Token(_, Token::Comma)) } @@ -545,8 +548,8 @@ impl<'cx, 'a, 'i> Parser<'cx, 'a, 'i> { Ok(()) } - /// Parses a HTML element or attribute name. - fn name(&mut self) -> PResult { + /// Parses ident with minuses. + fn ident_with_minuses(&mut self) -> PResult { let mut s = match *self.input { [ident!(_, name), ..] => { self.shift(1); @@ -562,6 +565,20 @@ impl<'cx, 'a, 'i> Parser<'cx, 'a, 'i> { Ok(s) } + /// Parses a HTML element or attribute name. + fn name(&mut self) -> PResult { + let mut s = match self.ident_with_minuses() { + Ok(ident) => ident, + Err(e) => return Err(e), + }; + if let [colon!(), ident!(_, _), ..] = *self.input { + self.shift(1); + s.push(':'); + s.push_str(self.ident_with_minuses().unwrap().as_str()); + } + Ok(s) + } + /// Parses the given token tree, returning a vector of statements. fn block(&mut self, sp: Span, tts: &[TokenTree]) -> PResult> { let mut parse = Parser { diff --git a/maud_macros/tests/tests.rs b/maud_macros/tests/tests.rs index f5f202cb..71cace1e 100644 --- a/maud_macros/tests/tests.rs +++ b/maud_macros/tests/tests.rs @@ -87,6 +87,13 @@ mod elements { html!(s, div readonly? input type="checkbox" checked? /).unwrap(); assert_eq!(s, r#"
"#); } + + #[test] + fn namespaces() { + let mut s = String::new(); + html!(s, pon-pon:controls-alpha a on:click="yay()" "Yay!").unwrap(); + assert_eq!(s, r#"Yay!"#); + } } mod splices {