packages feed

xml-conduit 1.8.0.1 → 1.9.0.0

raw patch · 3 files changed

+121/−68 lines, 3 files

Files

ChangeLog.md view
@@ -1,3 +1,10 @@+## 1.9.0++* Remove deprecated functions (`ignoreTag`, `ignoreAllTreesContent`, `takeAllTreesContent`)+* Rename `parseText'` into `parseText`+* `takeContent` and `ignoreContent` now cover entities+* Align behaviour of `take`* and `ignore`* functions+ ## 1.8.0.1  * Use doctest to validate code examples from documentation
Text/XML/Stream/Parse.hs view
@@ -17,7 +17,7 @@ -- As a simple example: -- -- >>> :set -XOverloadedStrings--- >>> import Data.Conduit (runConduit, (.|))+-- >>> import Conduit (runConduit, (.|)) -- >>> import Data.Text (Text, unpack) -- >>> import Data.XML.Types (Event) -- >>> data Person = Person Int Text Text deriving Show@@ -68,7 +68,6 @@     ( -- * Parsing XML files       parseBytes     , parseBytesPos-    , parseText'     , parseText     , parseTextPos     , detectUtf@@ -93,18 +92,16 @@     , content     , contentMaybe       -- * Ignoring tags/trees-    , ignoreTag     , ignoreEmptyTag     , ignoreTree+    , ignoreContent     , ignoreTreeContent     , ignoreAnyTreeContent-    , ignoreAllTreesContent       -- * Streaming events     , takeContent     , takeTree     , takeTreeContent     , takeAnyTreeContent-    , takeAllTreesContent       -- * Tag name matching     , NameMatcher(..)     , matching@@ -314,7 +311,7 @@ -- provided by libxml-enumerator. However, this has the advantage of not -- relying on any C libraries. ----- This relies on 'detectUtf' to determine character encoding, and 'parseText''+-- This relies on 'detectUtf' to determine character encoding, and 'parseText' -- to do the actual parsing. parseBytes :: MonadThrow m            => ParseSettings@@ -347,18 +344,11 @@ -- advantage of not relying on any C libraries. -- -- Since 1.2.4-parseText' :: MonadThrow m-           => ParseSettings-           -> ConduitT T.Text Event m ()-parseText' = mapOutput snd . parseTextPos+parseText :: MonadThrow m => ParseSettings -> ConduitT T.Text Event m ()+parseText = mapOutput snd . parseTextPos -{-# DEPRECATED parseText "Please use 'parseText'' or 'parseTextPos'." #-}-parseText :: MonadThrow m-          => ParseSettings-          -> ConduitT T.Text EventPos m ()-parseText = parseTextPos --- | Same as 'parseText'', but includes the position of each event.+-- | Same as 'parseText', but includes the position of each event. -- -- Since 1.2.4 parseTextPos :: MonadThrow m@@ -640,7 +630,7 @@ data ContentType = Ignore | IsContent Text | IsError String | NotContent  -- | Grabs the next piece of content if available. This function skips over any--- comments and instructions and concatenates all content until the next start+-- comments, instructions or entities, and concatenates all content until the next start -- or end tag. contentMaybe :: MonadThrow m => ConduitT Event o m (Maybe Text) contentMaybe = do@@ -789,46 +779,85 @@ ignoreEmptyTag nameMatcher = tagIgnoreAttrs nameMatcher (return ())  -{-# DEPRECATED ignoreTag "Please use 'ignoreEmptyTag'." #-}-ignoreTag :: MonadThrow m-          => NameMatcher a -- ^ Check if this is a correct tag name-          -> ConduitT Event o m (Maybe ())-ignoreTag = ignoreEmptyTag+ignored :: Monad m => ConduitT i o m ()+ignored = fix $ \recurse -> do+  event <- await+  case event of+    Just _ -> recurse+    _      -> return ()  --- | Ignore a tag, its attributes and its children subtrees recursively.---   Both content and text events are ignored.---   This function returns @Just ()@ if the tag matched.+-- | Same as `takeTree`, without yielding `Event`s. --+-- >>> :set -XOverloadedStrings+-- >>> import Conduit+--+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| (ignoreTree "a" ignoreAttrs >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "b", ...}) [],EventEndElement (Name {nameLocalName = "b", ...}),EventEndDocument]+--+-- >>> runConduit $ parseLBS def "<a>content</a>" .| (ignoreTree "b" ignoreAttrs >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "a", ...}) [],EventContent (ContentText "content"),EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+--+-- >>> runConduit $ parseLBS def "content<a></a>" .| (ignoreTree anyName ignoreAttrs >> sinkList)+-- [EventContent (ContentText "content"),EventBeginElement (Name {nameLocalName = "a", ...}) [],EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+--+-- Since 1.9.0+ignoreTree :: MonadThrow m => NameMatcher a -> AttrParser b -> ConduitT Event o m (Maybe ())+ignoreTree nameMatcher attrParser = fuseUpstream (takeTree nameMatcher attrParser) ignored++-- | Same as `takeContent`, without yielding `Event`s.+--+-- >>> :set -XOverloadedStrings+-- >>> import Conduit+--+-- >>> runConduit $ parseLBS def "<a>content</a>" .| (ignoreContent >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "a", ...}) [],EventContent (ContentText "content"),EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+--+-- >>> runConduit $ parseLBS def "content<a></a>" .| (ignoreContent >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "a", ...}) [],EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+--+-- >>> runConduit $ parseLBS def "content<a></a>" .| (ignoreContent >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "a", ...}) [],EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+--+-- Since 1.9.0+ignoreContent :: MonadThrow m => ConduitT Event o m (Maybe ())+ignoreContent = fuseUpstream takeContent ignored+++-- | Same as `takeTreeContent`, without yielding `Event`s.+--+-- >>> :set -XOverloadedStrings+-- >>> import Conduit+--+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| (ignoreTreeContent "a" ignoreAttrs >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "b", ...}) [],EventEndElement (Name {nameLocalName = "b", ...}),EventEndDocument]+--+-- >>> runConduit $ parseLBS def "<a>content</a>" .| (ignoreTreeContent "b" ignoreAttrs >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "a", ...}) [],EventContent (ContentText "content"),EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+--+-- >>> runConduit $ parseLBS def "content<a></a>" .| (ignoreTreeContent anyName ignoreAttrs >> sinkList)+-- [EventBeginElement (Name {nameLocalName = "a", ...}) [],EventEndElement (Name {nameLocalName = "a", ...}),EventEndDocument]+-- -- Since 1.5.0-ignoreTreeContent :: MonadThrow m-                  => NameMatcher a -- ^ Check if this is a correct tag name-                  -> ConduitT Event o m (Maybe ())-ignoreTreeContent namePred = tagIgnoreAttrs namePred (void $ many ignoreAnyTreeContent)+ignoreTreeContent :: MonadThrow m => NameMatcher a -> AttrParser b -> ConduitT Event o m (Maybe ())+ignoreTreeContent namePred attrParser = fuseUpstream (takeTreeContent namePred attrParser) ignored -{-# DEPRECATED ignoreTree "Please use 'ignoreTreeContent'." #-}-ignoreTree :: MonadThrow m-           => NameMatcher a -- ^ Check if this is a correct tag name-           -> ConduitT Event o m (Maybe ())-ignoreTree = ignoreTreeContent --- | Like 'ignoreTreeContent', but matches any name and also ignores content events.+-- | Same as `takeAnyTreeContent`, without yielding `Event`s. -- -- >>> :set -XOverloadedStrings--- >>> import Data.Conduit--- >>> import Data.Conduit.List (consume)+-- >>> import Conduit ----- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| (ignoreAnyTreeContent >> consume)+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| (ignoreAnyTreeContent >> sinkList) -- [EventBeginElement (Name {nameLocalName = "b", ...}) [],EventEndElement (Name {nameLocalName = "b", ...}),EventEndDocument] ----- >>> runConduit $ parseLBS def "text<b></b>" .| (ignoreAnyTreeContent >> consume)+-- >>> runConduit $ parseLBS def "text<b></b>" .| (ignoreAnyTreeContent >> sinkList) -- [EventBeginElement (Name {nameLocalName = "b", ...}) [],EventEndElement (Name {nameLocalName = "b", ...}),EventEndDocument]+--+-- Since 1.5.0 ignoreAnyTreeContent :: MonadThrow m => ConduitT Event o m (Maybe ())-ignoreAnyTreeContent = (void <$> contentMaybe) `orE` ignoreTreeContent anyName+ignoreAnyTreeContent = fuseUpstream takeAnyTreeContent ignored -{-# DEPRECATED ignoreAllTreesContent "Please use 'ignoreAnyTreeContent'." #-}-ignoreAllTreesContent :: MonadThrow m => ConduitT Event o m (Maybe ())-ignoreAllTreesContent = ignoreAnyTreeContent  -- | Get the value of the first parser which returns 'Just'. If no parsers -- succeed (i.e., return @Just@), this function returns 'Nothing'.@@ -1034,7 +1063,7 @@ many' :: MonadThrow m       => ConduitT Event o m (Maybe a)       -> ConduitT Event o m [a]-many' consumer = manyIgnore consumer ignoreAllTreesContent+many' consumer = manyIgnore consumer ignoreAnyTreeContent   -- | Like 'many', but uses 'yield' so the result list can be streamed@@ -1060,20 +1089,32 @@ manyYield' :: MonadThrow m            => ConduitT Event b m (Maybe b)            -> ConduitT Event b m ()-manyYield' consumer = manyIgnoreYield consumer ignoreAllTreesContent+manyYield' consumer = manyIgnoreYield consumer ignoreAnyTreeContent  --- | Stream a content 'Event'. If next event isn't a content, nothing is consumed.+-- | Stream a single content 'Event'. -- -- Returns @Just ()@ if a content 'Event' was consumed, @Nothing@ otherwise. --+-- >>> :set -XOverloadedStrings+-- >>> import Control.Monad (void)+-- >>> import Conduit+--+-- >>> runConduit $ parseLBS def "content<a></a>" .| void takeContent .| sinkList+-- [EventBeginDocument,EventContent (ContentText "content")]+--+-- If next event isn't a content, nothing is consumed.+--+-- >>> runConduit $ parseLBS def "<a>content</a>" .| void takeContent .| sinkList+-- [EventBeginDocument]+-- -- Since 1.5.0 takeContent :: MonadThrow m => ConduitT Event Event m (Maybe ()) takeContent = do   event <- await   case event of-    Just e@(EventContent ContentText{}) -> yield e >> return (Just ())-    Just e@EventCDATA{}                 -> yield e >> return (Just ())+    Just e@EventContent{} -> yield e >> return (Just ())+    Just e@EventCDATA{}   -> yield e >> return (Just ())     Just e -> if isWhitespace e then yield e >> takeContent else leftover e >> return Nothing     _ -> return Nothing @@ -1081,23 +1122,22 @@ -- -- >>> :set -XOverloadedStrings -- >>> import Control.Monad (void)--- >>> import Data.Conduit--- >>> import Data.Conduit.List (consume)+-- >>> import Conduit ----- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| void (takeTree "a" ignoreAttrs) .| consume+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| void (takeTree "a" ignoreAttrs) .| sinkList -- [EventBeginDocument,EventBeginElement (Name {nameLocalName = "a", ...}) [],EventContent (ContentText "content"),EventEndElement (Name {nameLocalName = "a", ...})] ----- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| void (takeTree "b" ignoreAttrs) .| consume+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| void (takeTree "b" ignoreAttrs) .| sinkList -- [EventBeginDocument] -- -- If next 'Event' isn't an element, nothing is consumed. ----- >>> runConduit $ parseLBS def "text<a></a>" .| void (takeTree "a" ignoreAttrs) .| consume+-- >>> runConduit $ parseLBS def "text<a></a>" .| void (takeTree "a" ignoreAttrs) .| sinkList -- [EventBeginDocument] -- -- If an opening-tag is consumed but no matching closing-tag is found, an 'XmlException' is thrown. ----- >>> runConduit $ parseLBS def "<a><b></b>" .| void (takeTree "a" ignoreAttrs) .| consume+-- >>> runConduit $ parseLBS def "<a><b></b>" .| void (takeTree "a" ignoreAttrs) .| sinkList -- *** Exception: InvalidEndElement (Name {nameLocalName = "a", nameNamespace = Nothing, namePrefix = Nothing}) Nothing -- -- This function automatically ignores comments, instructions and whitespace.@@ -1128,37 +1168,42 @@  -- | Like 'takeTree', but can also stream a content 'Event'. --+-- >>> :set -XOverloadedStrings+-- >>> import Control.Monad (void)+-- >>> import Conduit+--+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| void (takeTreeContent "a" ignoreAttrs) .| sinkList+-- [EventBeginDocument,EventBeginElement (Name {nameLocalName = "a", ...}) [],EventContent (ContentText "content"),EventEndElement (Name {nameLocalName = "a", ...})]+--+-- >>> runConduit $ parseLBS def "<a>content</a><b></b>" .| void (takeTreeContent "b" ignoreAttrs) .| sinkList+-- [EventBeginDocument]+--+-- >>> runConduit $ parseLBS def "content<a></a><b></b>" .| void (takeTreeContent "a" ignoreAttrs) .| sinkList+-- [EventBeginDocument,EventContent (ContentText "content")]+-- -- Since 1.5.0-takeTreeContent :: MonadThrow m-                => NameMatcher a-                -> AttrParser b-                -> ConduitT Event Event m (Maybe ())+takeTreeContent :: MonadThrow m => NameMatcher a -> AttrParser b -> ConduitT Event Event m (Maybe ()) takeTreeContent nameMatcher attrParser = runMaybeT $ MaybeT (takeTree nameMatcher attrParser) <|> MaybeT takeContent  -- | Like 'takeTreeContent', without checking for tag name or attributes. -- -- >>> :set -XOverloadedStrings -- >>> import Control.Monad (void)--- >>> import Data.Conduit ((.|), runConduit)--- >>> import Data.Conduit.List (consume)+-- >>> import Conduit ----- >>> runConduit $ parseLBS def "text<a></a>" .| void takeAnyTreeContent .| consume+-- >>> runConduit $ parseLBS def "text<a></a>" .| void takeAnyTreeContent .| sinkList -- [EventBeginDocument,EventContent (ContentText "text")] ----- >>> runConduit $ parseLBS def "</a><b></b>" .| void takeAnyTreeContent .| consume+-- >>> runConduit $ parseLBS def "</a><b></b>" .| void takeAnyTreeContent .| sinkList -- [EventBeginDocument] ----- >>> runConduit $ parseLBS def "<b><c></c></b></a>text" .| void takeAnyTreeContent .| consume+-- >>> runConduit $ parseLBS def "<b><c></c></b></a>text" .| void takeAnyTreeContent .| sinkList -- [EventBeginDocument,EventBeginElement (Name {nameLocalName = "b", ...}) [],EventBeginElement (Name {nameLocalName = "c", ...}) [],EventEndElement (Name {nameLocalName = "c", ...}),EventEndElement (Name {nameLocalName = "b", ...})] -- -- Since 1.5.0 takeAnyTreeContent :: MonadThrow m                 => ConduitT Event Event m (Maybe ()) takeAnyTreeContent = takeTreeContent anyName ignoreAttrs--{-# DEPRECATED takeAllTreesContent "Please use 'takeAnyTreeContent'." #-}-takeAllTreesContent :: MonadThrow m => ConduitT Event Event m (Maybe ())-takeAllTreesContent = takeAnyTreeContent   -- | Default implementation of 'DecodeEntities', which leaves the
xml-conduit.cabal view
@@ -1,5 +1,5 @@ name:            xml-conduit-version:         1.8.0.1+version:         1.9.0.0 license:         MIT license-file:    LICENSE author:          Michael Snoyman <michael@snoyman.com>, Aristid Breitkreuz <aristidb@googlemail.com>@@ -13,6 +13,7 @@ homepage:        http://github.com/snoyberg/xml extra-source-files: README.md                     ChangeLog.md+tested-with:     GHC >=8.0 && <8.8  library     build-depends:   base                      >= 4        && < 5