@@ -106,22 +106,25 @@ endTagOpen = tagNameClose
106106-- deviation: no lower-casing
107107tagNameOpen :: Parser Token
108108tagNameOpen = do
109− c <- peekChar'
110− guard $ isAsciiUpper c || isAsciiLower c
111− tag <- takeWhile $ notInClass "\x09\x0a\x0c />"
109+ tag <- tagName'
112110 id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag [])
113111 <|> (char '/' >> selfClosingStartTag tag [])
114112 <|> (char '>' >> return (TagOpen tag []))
115113
116114-- | /§8.2.4.10/: Tag name state: close case
117−--
118−-- deviation: no lower-casing
119115tagNameClose :: Parser Token
120116tagNameClose = do
117+ tag <- tagName'
118+ char '>' >> return (TagClose tag)
119+
120+-- | /§8.2.4.10/: Tag name state: common code
121+--
122+-- deviation: no lower-casing
123+tagName' :: Parser Text
124+tagName' = do
121125 c <- peekChar'
122126 guard $ isAsciiUpper c || isAsciiLower c
123− tag <- takeWhile $ notInClass "\x09\x0a\x0c />"
124− char '>' >> return (TagClose tag)
127+ takeWhile $ notInClass "\x09\x0a\x0c />"
125128
126129-- | /§8.2.4.43/: Self-closing start tag state
127130selfClosingStartTag :: TagName -> [Attr] -> Parser Token