@@ -109,13 +109,21 @@ tagOpen =
109109endTagOpen :: Parser Token
110110endTagOpen = tagNameClose
111111
112+-- | Equivalent to @inClass "\x09\x0a\x0c "@
113+isWhitespace :: Char -> Bool
114+isWhitespace '\x09' = True
115+isWhitespace '\x0a' = True
116+isWhitespace '\x0c' = True
117+isWhitespace ' ' = True
118+isWhitespace _ = False
119+
112120-- | /§8.2.4.8/: Tag name state: the open case
113121--
114122-- deviation: no lower-casing, don't handle NULL characters
115123tagNameOpen :: Parser Token
116124tagNameOpen = do
117125 tag <- tagName'
118− id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag [])
126+ id $ (satisfy isWhitespace >> beforeAttrName tag [])
119127 <|> (char '/' >> selfClosingStartTag tag [])
120128 <|> (char '>' >> return (TagOpen tag []))
121129
@@ -146,7 +154,7 @@ selfClosingStartTag tag attrs = do
146154-- deviation: no lower-casing
147155beforeAttrName :: TagName -> [Attr] -> Parser Token
148156beforeAttrName tag attrs = do
149− skipWhile $ inClass "\x09\x0a\x0c "
157+ skipWhile isWhitespace
150158 id $ (char '/' >> selfClosingStartTag tag attrs)
151159 <|> (char '>' >> return (TagOpen tag attrs))
152160 -- <|> (char '\x00' >> attrName tag attrs) -- TODO: NULL
@@ -167,7 +175,7 @@ attrName tag attrs = do
167175-- | /§8.2.4.34/: After attribute name state
168176afterAttrName :: TagName -> [Attr] -> AttrName -> Parser Token
169177afterAttrName tag attrs name = do
170− skipWhile $ inClass "\x09\x0a\x0c "
178+ skipWhile isWhitespace
171179 id $ (char '/' >> selfClosingStartTag tag attrs)
172180 <|> (char '=' >> beforeAttrValue tag attrs name)
173181 <|> (char '>' >> return (TagOpen tag (Attr name T.empty : attrs)))
@@ -177,7 +185,7 @@ afterAttrName tag attrs name = do
177185-- | /§8.2.4.35/: Before attribute value state
178186beforeAttrValue :: TagName -> [Attr] -> AttrName -> Parser Token
179187beforeAttrValue tag attrs name = do
180− skipWhile $ inClass "\x09\x0a\x0c "
188+ skipWhile isWhitespace
181189 id $ (char '"' >> attrValueDQuoted tag attrs name)
182190 <|> (char '\'' >> attrValueSQuoted tag attrs name)
183191 <|> (char '>' >> return (TagOpen tag (Attr name T.empty : attrs)))
@@ -201,14 +209,14 @@ attrValueSQuoted tag attrs name = do
201209attrValueUnquoted :: TagName -> [Attr] -> AttrName -> Parser Token
202210attrValueUnquoted tag attrs name = do
203211 value <- takeTill (inClass "\x09\x0a\x0c >")
204− id $ (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag attrs) -- unsure: don't emit?
212+ id $ (satisfy isWhitespace >> beforeAttrName tag attrs) -- unsure: don't emit?
205213 <|> (char '>' >> return (TagOpen tag (Attr name value : attrs)))
206214 <|> (endOfInput >> return endOfFileToken)
207215
208216-- | /§8.2.4.39/: After attribute value (quoted) state
209217afterAttrValueQuoted :: TagName -> [Attr] -> AttrName -> AttrValue -> Parser Token
210218afterAttrValueQuoted tag attrs name value =
211− (satisfy (inClass "\x09\x0a\x0c ") >> beforeAttrName tag attrs')
219+ (satisfy isWhitespace >> beforeAttrName tag attrs')
212220 <|> (char '/' >> selfClosingStartTag tag attrs')
213221 <|> (char '>' >> return (TagOpen tag attrs'))
214222 <|> (endOfInput >> return endOfFileToken)