xml-enumerator 0.4.0 → 0.4.1
raw patch · 3 files changed
+29/−10 lines, 3 files
Files
- Text/XML/Stream/Render.hs +11/−9
- test/main.hs +17/−0
- xml-enumerator.cabal +1/−1
Text/XML/Stream/Render.hs view
@@ -9,6 +9,7 @@ , RenderSettings , def , rsPretty+ , prettify ) where import Data.XML.Types (Event (..), Content (..), Name (..))@@ -33,7 +34,7 @@ -- changes the meaning of some documents, by inserting/modifying whitespace. prettyBuilder :: Monad m => E.Enumeratee Event Builder m b prettyBuilder step0 =- E.joinI $ prettify 0 [] $$ loop [] step0+ E.joinI $ prettify $$ loop [] step0 where loop stack = E.checkDone $ step stack step stack k = do@@ -192,8 +193,13 @@ | x `elem` xs = findUnused (x `T.snoc` '_') xs | otherwise = x -prettify :: Monad m => Int -> [Name] -> E.Enumeratee Event Event m a-prettify level names (Continue k) = do+-- | Convert a stream of 'Event's into a prettified one, adding extra+-- whitespace. Note that this can change the meaning of your XML.+prettify :: Monad m => E.Enumeratee Event Event m a+prettify = prettify' 0 []++prettify' :: Monad m => Int -> [Name] -> E.Enumeratee Event Event m a+prettify' level names (Continue k) = do mx <- eventHead case mx of Nothing -> return $ Continue k@@ -216,22 +222,18 @@ let newLevel = level - 1 return ([before newLevel, EventEndElement $ head names, after], newLevel, tail names) (Right EventBeginDocument, _) -> do- _ <- takeContents id return ([EventBeginDocument], level, names) (Right EventEndDocument, _) -> do- _ <- takeContents id return ([EventEndDocument, after], level, names) (Right (EventComment t), _) -> do- _ <- takeContents id return ([before level, EventComment $ T.map normalSpace t, after], level, names) (Right e, _) -> do- _ <- takeContents id return ([before level, e, after], level, names)- k (E.Chunks chunks) >>== prettify level' names'+ k (E.Chunks chunks) >>== prettify' level' names' where before l = EventContent $ ContentText $ T.replicate l " " after = EventContent $ ContentText "\n"-prettify _ _ step = return step+prettify' _ _ step = return step eventHead :: Monad m => Iteratee Event m (Maybe (Either [Content] Event)) eventHead = do
test/main.hs view
@@ -29,6 +29,7 @@ , it "has working choose function" testChoose , it "has working many function" testMany , it "has working orE" testOrE+ , it "is idempotent to parse and pretty render a document" documentParsePrettyRender ] , describe "XML Cursors" [ it "has correct parent" cursorParent@@ -84,6 +85,22 @@ "<foo><?instr this is a processing instruction?></foo>" , D.parseLBS_ def "<foo><!-- this is a comment --></foo>"+ ]++documentParsePrettyRender :: IO ()+documentParsePrettyRender =+ L.unpack (D.renderLBS def { D.rsPretty = True } (D.parseLBS_ def $ doc True)) @?= L.unpack (doc False)+ where+ doc x = L.unlines+ [ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ , "<foo>"+ , " <?bar bar?>"+ , if x+ then " text"+ else " text "+ , " <?bin bin?>"+ , "</foo>"+ , "" ] combinators :: Assertion
xml-enumerator.cabal view
@@ -1,5 +1,5 @@ name: xml-enumerator-version: 0.4.0+version: 0.4.1 license: BSD3 license-file: LICENSE author: Michael Snoyman <michaels@suite-sol.com>, Aristid Breitkreuz <aristidb@googlemail.com>