hxt-binary-0.0.1: src/Text/XML/HXT/DOM/Binary.hs
{-# OPTIONS -fno-warn-orphans -fno-warn-unused-imports #-}
-- ------------------------------------------------------------
{- |
Module : Text.XML.HXT.DOM.Binary
Copyright : Copyright (C) 2008 Uwe Schmidt
License : MIT
Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
Stability : stable
Portability: portable
De-/Serialisation for XmlTrees
-}
-- ------------------------------------------------------------
module Text.XML.HXT.DOM.Binary
where
import Data.Binary
import Data.List
import Data.Maybe
import Data.Tree.NTree.Binary
import Text.XML.HXT.DOM.TypeDefs
import Text.XML.HXT.DOM.QualifiedName
-- -----------------------------------------------------------------------------
instance Binary XNode where
put (XText s) = put (0::Word8) >> put s
put (XCharRef i) = put (1::Word8) >> put i
put (XEntityRef n) = put (2::Word8) >> put n
put (XCmt c) = put (3::Word8) >> put c
put (XCdata s) = put (4::Word8) >> put s
put (XPi qn ts) = put (5::Word8) >> put qn >> put ts
put (XTag qn cs) = put (6::Word8) >> put qn >> put cs
put (XDTD de al) = put (7::Word8) >> put de >> put al
put (XAttr qn) = put (8::Word8) >> put qn
put (XError n e) = put (9::Word8) >> put n >> put e
get = do
tag <- getWord8
case tag of
0 -> get >>= return . XText
1 -> get >>= return . XCharRef
2 -> get >>= return . XEntityRef
3 -> get >>= return . XCmt
4 -> get >>= return . XCdata
5 -> do
qn <- get
get >>= return . XPi qn
6 -> do
qn <- get
get >>= return . XTag qn
7 -> do
de <- get
get >>= return . XDTD de
8 -> get >>= return . XAttr
9 -> do
n <- get
get >>= return . XError n
_ -> error "XNode.get: error while decoding XNode"
-- -----------------------------------------------------------------------------
dtdElems :: [DTDElem]
dtdElems = [ DOCTYPE
, ELEMENT
, CONTENT
, ATTLIST
, ENTITY
, PENTITY
, NOTATION
, CONDSECT
, NAME
, PEREF
]
instance Binary DTDElem where
-- put de = put ((toEnum . fromEnum $ de)::Word8) -- DTDElem is not yet instance of Enum
put de = let
i = fromJust . elemIndex de $ dtdElems
in
put ((toEnum i)::Word8)
get = do
tag <- getWord8
return $ dtdElems !! (fromEnum tag)
-- return . toEnum . fromEnum $ tag -- see above
-- -----------------------------------------------------------------------------
instance Binary QName where
put qn = let
px = namePrefix qn
lp = localPart qn
ns = namespaceUri qn
in
put px >> put lp >> put ns
get = do
px <- get
lp <- get
ns <- get
return $ mkQName px lp ns
-- -----------------------------------------------------------------------------