@@ -1,4 +1,5 @@
1−{-# LANGUAGE OverloadedStrings, TypeSynonymInstances, FlexibleInstances #-}
1+{-# LANGUAGE OverloadedStrings, TypeSynonymInstances, FlexibleInstances, CPP #-}
2+{-# OPTIONS_GHC -fno-warn-orphans #-} -- IsString for XML
23
34-- | Overcome XML insanity, node by node.
45--
@@ -16,7 +17,11 @@
1617module Text.XML.Writer
1718 (
1819 -- * Documents
19− document, soap
20+ document
21+ , documentA
22+ , documentD
23+ , documentAD
24+ , soap
2025 , pprint
2126 -- * Elements
2227 , XML
@@ -36,15 +41,19 @@ module Text.XML.Writer
3641
3742import Text.XML
3843import Control.Monad.Writer.Strict
44+import Data.Default ()
3945import qualified Data.DList as DL
4046import qualified Data.Map as M
4147
42−import Data.Default ()
4348import Data.Text (Text)
4449import qualified Data.Text as T
4550import qualified Data.Text.Lazy.IO as TL
4651import Data.String (IsString(..))
4752
53+#if MIN_VERSION_mtl(2,3,0)
54+import Control.Monad
55+#endif
56+
4857-- | Node container to be rendered as children nodes.
4958type XML = Writer (DL.DList Node) ()
5059
@@ -57,6 +66,38 @@ document name children = Document { documentPrologue = Prologue def def def
5766 , documentEpilogue = def
5867 }
5968
69+
70+-- | Create a simple Document starting with a root element with attributes.
71+documentA :: Name -- ^ Root node name
72+ -> [(Name, Text)] -- ^ Attributes
73+ -> XML -- ^ Contents
74+ -> Document
75+documentA name attrs children = Document { documentPrologue = Prologue def def def
76+ , documentRoot = Element name (M.fromList attrs) (render children)
77+ , documentEpilogue = def
78+ }
79+
80+-- | Create a simple Document starting with a root element with a doctype.
81+documentD :: Name -- ^ Root node name
82+ -> Maybe Doctype -- ^ DOCTYPE
83+ -> XML -- ^ Contents
84+ -> Document
85+documentD name dt children = Document { documentPrologue = Prologue def dt def
86+ , documentRoot = Element name def (render children)
87+ , documentEpilogue = def
88+ }
89+
90+-- | Create a simple Document starting with a root element with attributes and doctype.
91+documentAD :: Name -- ^ Root node name
92+ -> [(Name, Text)] -- ^ Attributes
93+ -> Maybe Doctype -- ^ DOCTYPE
94+ -> XML -- ^ Contents
95+ -> Document
96+documentAD name attrs dt children = Document { documentPrologue = Prologue def dt def
97+ , documentRoot = Element name (M.fromList attrs) (render children)
98+ , documentEpilogue = def
99+ }
100+
60101-- | Render document using xml-conduit's pretty-printer.
61102pprint :: Document -> IO ()
62103pprint = TL.putStrLn . renderText def { rsPretty = True }
@@ -98,11 +139,11 @@ content :: Text -> XML
98139content = node . NodeContent
99140
100141-- | Mass-convert to nodes.
101−--
142+--
102143-- > let array = element "container" $ many "wrapper" [1..3]
103−--
144+--
104145-- Which gives:
105−--
146+--
106147-- > <container>
107148-- > <wrapper>1</wrapper>
108149-- > <wrapper>2</wrapper>