From bad49d49c0b754b6a8cede71e93376507978acc5 Mon Sep 17 00:00:00 2001
From: msifeed <msifeed@derpy.ru>
Date: Mon, 18 Jul 2016 13:07:58 +0300
Subject: [PATCH] Add namespace support for element and attribute names

---
 maud_macros/src/parse.rs   | 10 ++++++++++
 maud_macros/tests/tests.rs |  7 +++++++
 2 files changed, 17 insertions(+)

diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs
index 4027c5e..d67d281 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))
 }
@@ -548,6 +551,13 @@ impl<'cx, 'a, 'i> Parser<'cx, 'a, 'i> {
     /// Parses a HTML element or attribute name.
     fn name(&mut self) -> PResult<String> {
         let mut s = match *self.input {
+            [ident!(_, namespace), colon!(), ident!(_, name), ..] => {
+                self.shift(3);
+                let mut r = String::from(&namespace.name.as_str() as &str);
+                r.push(':');
+                r.push_str(&name.name.as_str() as &str);
+                r
+            },
             [ident!(_, name), ..] => {
                 self.shift(1);
                 String::from(&name.name.as_str() as &str)
diff --git a/maud_macros/tests/tests.rs b/maud_macros/tests/tests.rs
index f5f202c..dc5e9a5 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#"<div readonly><input type="checkbox" checked></div>"#);
     }
+
+    #[test]
+    fn namespaces() {
+        let mut s = String::new();
+        html!(s, pon:controls a on:click="yay()" "Yay!").unwrap();
+        assert_eq!(s, r#"<pon:controls><a on:click="yay()">Yay!</a></pon:controls>"#);
+    }
 }
 
 mod splices {