xml-conduit 1.9.1.2 → 1.9.1.3
raw patch · 3 files changed
+37/−6 lines, 3 files
Files
- src/Text/XML/Stream/Parse.hs +13/−2
- test/unit.hs +23/−3
- xml-conduit.cabal +1/−1
src/Text/XML/Stream/Parse.hs view
@@ -82,6 +82,7 @@ , psDecodeIllegalCharacters , psRetainNamespaces , psEntityExpansionSizeLimit+ , psIgnoreInternalEntityDeclarations -- *** Entity decoding , decodeXmlEntities , decodeHtmlEntities@@ -465,6 +466,10 @@ -- Default: @8192@ -- -- Since 1.9.1+ , psIgnoreInternalEntityDeclarations :: Bool+ -- ^ Whether to resolve any but the predefined entities.+ --+ -- Default: @False@ } instance Default ParseSettings where@@ -473,6 +478,7 @@ , psRetainNamespaces = False , psDecodeIllegalCharacters = const Nothing , psEntityExpansionSizeLimit = 8192+ , psIgnoreInternalEntityDeclarations = False } conduitToken :: MonadThrow m => ParseSettings -> ConduitT T.Text (PositionRange, Token) m ()@@ -536,7 +542,10 @@ do char' '[' ents <- parseDeclarations id skipSpace- return ents+ if psIgnoreInternalEntityDeclarations settings then+ return []+ else+ return ents _ -> return [] char' '>' newline <|> return ()@@ -626,13 +635,15 @@ valid '/' = False valid ';' = False valid '#' = False+ valid '[' = False+ valid ']' = False valid c = not $ isXMLSpace c parseContent :: ParseSettings -> Bool -- break on double quote -> Bool -- break on single quote -> Parser Content-parseContent (ParseSettings decodeEntities _ decodeIllegalCharacters _) breakDouble breakSingle = parseReference <|> (parseTextContent <?> "text content") where+parseContent (ParseSettings decodeEntities _ decodeIllegalCharacters _ _) breakDouble breakSingle = parseReference <|> (parseTextContent <?> "text content") where parseReference = do char' '&' t <- parseEntityRef <|> parseHexCharRef <|> parseDecCharRef
test/unit.hs view
@@ -88,6 +88,7 @@ it "identifies unresolved entities" resolvedIdentifies it "decodeHtmlEntities" testHtmlEntities it "works for resolvable entities" resolvedAllGood+ it "ignores custom entities when psResolveEntities is False" dontResolveEntities it "merges adjacent content nodes" resolvedMergeContent it "understands inline entity declarations" resolvedInline it "understands complex inline with markup" resolvedInlineComplex@@ -671,8 +672,8 @@ cursorAnyElement, cursorElement, cursorLaxElement, cursorContent, cursorAttribute, cursorLaxAttribute, cursorHasAttribute, cursorAttributeIs, cursorDeep, cursorForce, cursorForceM,- resolvedIdentifies, resolvedAllGood, resolvedMergeContent,- testHtmlEntities+ resolvedIdentifies, resolvedAllGood, dontResolveEntities,+ resolvedMergeContent, testHtmlEntities :: Assertion cursorParent = name (Cu.parent bar2) @?= ["foo"] cursorAncestor = name (Cu.ancestor baz2) @?= ["bar2", "foo"]@@ -749,6 +750,25 @@ where xml = "<foo><bar/><baz/></foo>" +dontResolveEntities =+ D.parseLBS_ settings xml @=? expectedDocument+ where+ settings = def { P.psIgnoreInternalEntityDeclarations = True }+ xml = mconcat+ [ "<!DOCTYPE mydt [ <!ENTITY foo \"fooby\" > ]>"+ , "<root>>&foo;&bar;</root>"+ ]++ expectedDocument =+ Document+ (Prologue [] (Just (Doctype "mydt" Nothing)) [])+ (Element "root" mempty+ [ NodeContent (ContentText ">")+ , NodeContent (ContentEntity "foo")+ , NodeContent (ContentEntity "bar")+ ])+ []+ resolvedMergeContent = Res.documentRoot (Res.parseLBS_ def xml) @=? Res.Element "foo" Map.empty [Res.NodeContent "bar&baz"]@@ -778,7 +798,7 @@ resolvedInline :: Assertion resolvedInline = do- Res.Document _ root _ <- return $ Res.parseLBS_ Res.def "<!DOCTYPE foo [<!ENTITY bar \"baz\">]><foo>&bar;</foo>"+ Res.Document _ root _ <- return $ Res.parseLBS_ Res.def "<!DOCTYPE foo[<!ENTITY bar \"baz\">]><foo>&bar;</foo>" root @?= Res.Element "foo" Map.empty [Res.NodeContent "baz"] Res.Document _ root2 _ <- return $ Res.parseLBS_ Res.def "<!DOCTYPE foo [<!ENTITY bar \"baz\">]><foo bar='&bar;'/>" root2 @?= Res.Element "foo" (Map.singleton "bar" "baz") []
xml-conduit.cabal view
@@ -1,7 +1,7 @@ cabal-version: 1.14 name: xml-conduit-version: 1.9.1.2+version: 1.9.1.3 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>, Aristid Breitkreuz <aristidb@googlemail.com>