html-conduit 1.2.0 → 1.2.1
raw patch · 4 files changed
+40/−8 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Text.HTML.DOM: eventConduitText :: Monad m => Conduit Text m Event
+ Text.HTML.DOM: parseLT :: Text -> Document
+ Text.HTML.DOM: parseSTChunks :: [Text] -> Document
+ Text.HTML.DOM: sinkDocText :: MonadThrow m => Sink Text m Document
Files
- ChangeLog.md +4/−0
- Text/HTML/DOM.hs +29/−7
- html-conduit.cabal +1/−1
- test/main.hs +6/−0
ChangeLog.md view
@@ -1,3 +1,7 @@+## 1.2.1++* Add strict and lazy text parsing [#66](https://github.com/snoyberg/xml/pull/66)+ ## 1.2.0 * Drop system-filepath
Text/HTML/DOM.hs view
@@ -5,6 +5,10 @@ , readFile , parseLBS , parseBSChunks+ , eventConduitText+ , sinkDocText+ , parseLT+ , parseSTChunks ) where import Control.Monad.Trans.Resource@@ -15,10 +19,10 @@ import qualified Data.XML.Types as XT import Data.Conduit import Data.Conduit.Text (decodeUtf8Lenient)-import Data.Text (Text) import qualified Data.Text as T+import qualified Data.Text.Lazy as TL import qualified Data.Conduit.List as CL-import Control.Arrow ((***), second)+import Control.Arrow ((***)) import qualified Data.Set as Set import qualified Text.XML as X import Text.XML.Stream.Parse (decodeHtmlEntities)@@ -33,8 +37,14 @@ -- Note that there may be multiple (or not) root elements. @sinkDoc@ addresses -- that case. eventConduit :: Monad m => Conduit S.ByteString m XT.Event-eventConduit =- decodeUtf8Lenient =$= TS.tokenStream =$= go []+eventConduit = decodeUtf8Lenient =$= eventConduit' ++eventConduitText :: Monad m => Conduit T.Text m XT.Event+eventConduitText = eventConduit'++eventConduit' :: Monad m => Conduit T.Text m XT.Event+eventConduit' = + TS.tokenStream =$= go [] where go stack = do mx <- await@@ -92,8 +102,14 @@ ] sinkDoc :: MonadThrow m => Sink S.ByteString m X.Document-sinkDoc =- fmap stripDummy $ mapOutput ((,) Nothing) eventConduit =$ addDummyWrapper =$ X.fromEvents+sinkDoc = sinkDoc' eventConduit ++sinkDocText :: MonadThrow m => Sink T.Text m X.Document+sinkDocText = sinkDoc' eventConduitText++sinkDoc' :: (Monad m, MonadThrow m) => Conduit a m XT.Event -> Sink a m X.Document+sinkDoc' f = + fmap stripDummy $ mapOutput ((,) Nothing) f =$ addDummyWrapper =$ X.fromEvents where addDummyWrapper = do yield (Nothing, XT.EventBeginElement "html" [])@@ -115,5 +131,11 @@ parseLBS = parseBSChunks . L.toChunks parseBSChunks :: [S.ByteString] -> X.Document-parseBSChunks bss = runIdentity $ runExceptionT_ $ CL.sourceList bss $$ sinkDoc+parseBSChunks tss = runIdentity $ runExceptionT_ $ CL.sourceList tss $$ sinkDoc++parseLT :: TL.Text -> X.Document+parseLT = parseSTChunks . TL.toChunks++parseSTChunks :: [T.Text] -> X.Document+parseSTChunks tss = runIdentity $ runExceptionT_ $ CL.sourceList tss $$ sinkDocText
html-conduit.cabal view
@@ -1,5 +1,5 @@ Name: html-conduit-Version: 1.2.0+Version: 1.2.1 Synopsis: Parse HTML documents using xml-conduit datatypes. Description: This package uses tagstream-conduit for its parser. It automatically balances mismatched tags, so that there shouldn't be any parse failures. It does not handle a full HTML document rendering, such as adding missing html and head tags. Homepage: https://github.com/snoyberg/xml
test/main.hs view
@@ -42,6 +42,12 @@ it "split code-points" $ X.parseLBS_ X.def "<foo> </foo>" @=? H.parseBSChunks ["<foo>\xc2", "\xa0</foo>"]+ it "latin1 codes" $+ X.parseText_ X.def "<foo>\232</foo>" @=?+ H.parseSTChunks ["<foo>\232</foo>"]+ it "latin1 codes strict vs lazy" $+ H.parseLT "<foo>\232</foo>" @=?+ H.parseSTChunks ["<foo>\232</foo>"] describe "HTML parsing" $ do it "XHTML" $ let html = "<html><head><title>foo</title></head><body><p>Hello World</p></body></html>"