@@ -97,29 +97,39 @@ tagOpen =
97 tryStartTag = do
97 tryStartTag = do
98 c <- peekChar'
98 c <- peekChar'
99 guard $ isAsciiUpper c || isAsciiLower c
99 guard $ isAsciiUpper c || isAsciiLower c
100− tagName
100+ tagNameOpen
102 other = do
102 other = do
103 return $ ContentChar '<'
103 return $ ContentChar '<'
105-- | /§8.2.4.9/: End tag open state
105-- | /§8.2.4.9/: End tag open state
106−-- TODO: This isn't right
107endTagOpen :: Parser Token
106endTagOpen :: Parser Token
108endTagOpen = do
107endTagOpen = do
109− name <- takeWhile $ notInClass "\x09\x0a\x0c />"
108+ tryEndTag
111− return $ TagClose name
110+ tryEndTag = do
112+ guard $ isAsciiUpper c || isAsciiLower c
113−-- | /§8.2.4.10/: Tag name state
115+-- | /§8.2.4.10/: Tag name state: the open case
115-- deviation: no lower-casing
117-- deviation: no lower-casing
116−tagName :: Parser Token
118+tagNameOpen :: Parser Token
117−tagName = do
119+tagNameOpen = do
118 tag <- takeWhile $ notInClass "\x09\x0a\x0c />"
120 tag <- takeWhile $ notInClass "\x09\x0a\x0c />"
119 id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag [])
121 id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag [])
120 <|> (char '/' >> selfClosingStartTag tag [])
122 <|> (char '/' >> selfClosingStartTag tag [])
121 <|> (char '>' >> return (TagOpen tag []))
123 <|> (char '>' >> return (TagOpen tag []))
125+-- | /§8.2.4.10/: Tag name state: close case
127+-- deviation: no lower-casing
128+tagNameClose :: Parser Token
130+ tag <- takeWhile $ notInClass "\x09\x0a\x0c />"
131+ char '>' >> return (TagClose tag)
123-- | /§8.2.4.43/: Self-closing start tag state
133-- | /§8.2.4.43/: Self-closing start tag state
124selfClosingStartTag :: TagName -> [Attr] -> Parser Token
134selfClosingStartTag :: TagName -> [Attr] -> Parser Token
125selfClosingStartTag tag attrs = do
135selfClosingStartTag tag attrs = do