From e222f5385dd8ab4f4f77acd43b41ca053f04b6ca Mon Sep 17 00:00:00 2001
From: msifeed <msifeed@derpy.ru>
Date: Mon, 18 Jul 2016 14:40:45 +0300
Subject: [PATCH] Fixed minuses in namespaces

---
 maud_macros/src/parse.rs   | 35 ++++++++++++++++++++---------------
 maud_macros/tests/tests.rs |  4 ++--
 2 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs
index d67d281..eec3120 100644
--- a/maud_macros/src/parse.rs
+++ b/maud_macros/src/parse.rs
@@ -550,25 +550,30 @@ 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), ..] => {
+        macro_rules! ident_with_minuses {
+            ($name:ident) => ({
                 self.shift(1);
-                String::from(&name.name.as_str() as &str)
-            },
+                let mut s = String::from(&$name.name.as_str() as &str);
+                while let [minus!(), ident!(_, name), ..] = *self.input {
+                    self.shift(2);
+                    s.push('-');
+                    s.push_str(&name.name.as_str());
+                }
+                s
+            })
+        }
+
+        let mut s = match *self.input {
+            [ident!(_, name), ..] => ident_with_minuses!(name),
             _ => return Err(FatalError),
         };
-        while let [minus!(), ident!(_, name), ..] = *self.input {
-            self.shift(2);
-            s.push('-');
-            s.push_str(&name.name.as_str());
+
+        if let [colon!(), ident!(_, name), ..] = *self.input {
+            self.shift(1);
+            s.push(':');
+            s.push_str(ident_with_minuses!(name).as_str());
         }
+
         Ok(s)
     }
 
diff --git a/maud_macros/tests/tests.rs b/maud_macros/tests/tests.rs
index dc5e9a5..71cace1 100644
--- a/maud_macros/tests/tests.rs
+++ b/maud_macros/tests/tests.rs
@@ -91,8 +91,8 @@ mod elements {
     #[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>"#);
+        html!(s, pon-pon:controls-alpha a on:click="yay()" "Yay!").unwrap();
+        assert_eq!(s, r#"<pon-pon:controls-alpha><a on:click="yay()">Yay!</a></pon-pon:controls-alpha>"#);
     }
 }