packages feed

wraxml-0.3: src/Text/XML/WraXML/Document.hs

module Text.XML.WraXML.Document where

import qualified Text.XML.WraXML.Tree    as XmlTree
import qualified Text.XML.WraXML.String  as XmlString
import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.Format as ShowXML



data T i name str = Cons {
   xmlDeclaration :: Maybe [Attr.T name str],
   docType :: Maybe String,
   content :: [XmlTree.T i name str]}
     deriving Show

instance
   (Name.Tag name, Name.Attribute name, Ord name) =>
      Functor (T i name) where
   fmap f = lift f (map (fmap f))

lift ::
   (Name.Tag name, Name.Attribute name, Ord name) =>
   (str0 -> str1) ->
   ([XmlTree.T i name str0] -> [XmlTree.T i name str1]) ->
   T i name str0 -> T i name str1
lift g f (Cons xml dtd trees) =
   Cons (fmap (map (fmap g)) xml) dtd $ f trees


showXMLDeclaration ::
   (Name.Tag name, Name.Attribute name, Ord name) =>
   [Attr.T name XmlString.T] -> ShowS
showXMLDeclaration attrs =
   showString "<?xml" . Attr.formatListBlankHead attrs . showString "?>" .
   ShowXML.nl

showDocType :: String -> ShowS
showDocType dtdStr =
   showString "<!DOCTYPE " . showString dtdStr . showString ">" .
   ShowXML.nl

show ::
   (Name.Tag name, Name.Attribute name, Ord name) =>
   T i name XmlString.T -> String
show (Cons xml dtd trees) =
   maybe id showXMLDeclaration xml .
   maybe id showDocType dtd .
   XmlTree.showsMany trees $
   ""