git.iko.soy/typeable/html-parse
on master help sign in
Track self-closing tags
56f94ecBen Gamari
Text/HTML/Parser.hs+3−1
@@ -53,6 +53,8 @@ type AttrValue = Text
53data Token
53data Token
54 -- | An opening tag. Attribute ordering is arbitrary.
54 -- | An opening tag. Attribute ordering is arbitrary.
55 = TagOpen !TagName [Attr]
55 = TagOpen !TagName [Attr]
56+ -- | A self-closing tag.
57+ | TagSelfClose !TagName [Attr]
56 -- | A closing tag.
58 -- | A closing tag.
57 | TagClose !TagName
59 | TagClose !TagName
58 -- | The content between tags.
60 -- | The content between tags.
@@ -129,7 +131,7 @@ tagName' = do
129-- | /§8.2.4.43/: Self-closing start tag state
131-- | /§8.2.4.43/: Self-closing start tag state
130selfClosingStartTag :: TagName -> [Attr] -> Parser Token
132selfClosingStartTag :: TagName -> [Attr] -> Parser Token
131selfClosingStartTag tag attrs = do
133selfClosingStartTag tag attrs = do
132− (char '>' >> return (TagOpen tag attrs))
134+ (char '>' >> return (TagSelfClose tag attrs))
133 <|> beforeAttrName tag attrs
135 <|> beforeAttrName tag attrs
134
136
135-- | /§8.2.4.34/: Before attribute name state
137-- | /§8.2.4.34/: Before attribute name state
tests/Text/HTML/ParserSpec.hs+7−6
@@ -24,12 +24,13 @@ import Text.HTML.Parser
24instance Arbitrary Token where
24instance Arbitrary Token where
25 arbitrary = oneof [validOpen, validClose, validFlat]
25 arbitrary = oneof [validOpen, validClose, validFlat]
26
26
27− shrink (TagOpen n as) = TagOpen n <$> shrink as
27+ shrink (TagOpen n as) = TagOpen n <$> shrink as
28+ shrink (TagSelfClose n as) = TagSelfClose n <$> shrink as
28− shrink (TagClose _) = []
29+ shrink (TagClose _) = []
29− shrink (ContentText _) = []
30+ shrink (ContentText _) = []
30− shrink (ContentChar _) = []
31+ shrink (ContentChar _) = []
31− shrink (Comment b) = Comment . B.fromText <$> (shrink . TL.toStrict . B.toLazyText $ b)
32+ shrink (Comment b) = Comment . B.fromText <$> (shrink . TL.toStrict . B.toLazyText $ b)
32− shrink (Doctype t) = Doctype <$> shrink t
33+ shrink (Doctype t) = Doctype <$> shrink t
33
34
34instance Arbitrary Attr where
35instance Arbitrary Attr where
35 arbitrary = Attr <$> validXmlAttrName <*> validXmlAttrValue
36 arbitrary = Attr <$> validXmlAttrName <*> validXmlAttrValue