{-# language UndecidableInstances, OverlappingInstances, IncoherentInstances, FlexibleInstances, ScopedTypeVariables, OverloadedStrings #-}
module TPDB.Xml
( XmlContent (..), mkel, rmkel
, content, (&|)
, escape, nospaceString
)
where
import Data.Typeable
import Control.Monad
import Control.Applicative
import Text.XML
import Text.XML.Cursor
import Data.String
import qualified Data.Text as T
class XmlContent a where
toContents :: a -> [ Node ]
parseContents :: Cursor -> [a]
instance XmlContent Int where
toContents :: Int -> [Node]
toContents = Node -> [Node]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> [Node]) -> (Int -> Node) -> Int -> [Node]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Node
nospaceString (Text -> Node) -> (Int -> Text) -> Int -> Node
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
forall a. IsString a => String -> a
fromString (String -> Text) -> (Int -> String) -> Int -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show
instance XmlContent Integer where
toContents :: Integer -> [Node]
toContents = Node -> [Node]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> [Node]) -> (Integer -> Node) -> Integer -> [Node]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Node
nospaceString (Text -> Node) -> (Integer -> Text) -> Integer -> Node
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
forall a. IsString a => String -> a
fromString (String -> Text) -> (Integer -> String) -> Integer -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> String
forall a. Show a => a -> String
show
instance XmlContent Bool where
toContents :: Bool -> [Node]
toContents Bool
False = Node -> [Node]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> [Node]) -> Node -> [Node]
forall a b. (a -> b) -> a -> b
$ Text -> Node
nospaceString Text
"false"
toContents Bool
True = Node -> [Node]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> [Node]) -> Node -> [Node]
forall a b. (a -> b) -> a -> b
$ Text -> Node
nospaceString Text
"true"
mkel :: Name -> [Node] -> Node
mkel Name
name [Node]
cs = Element -> Node
NodeElement (Element -> Node) -> Element -> Node
forall a b. (a -> b) -> a -> b
$ Name -> Map Name Text -> [Node] -> Element
Element Name
name Map Name Text
forall a. Monoid a => a
mempty [Node]
cs
rmkel :: Name -> [Node] -> m Node
rmkel Name
name [Node]
cs = Node -> m Node
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node -> m Node) -> Node -> m Node
forall a b. (a -> b) -> a -> b
$ Name -> [Node] -> Node
mkel Name
name [Node]
cs
nospaceString :: T.Text -> Node
nospaceString :: Text -> Node
nospaceString = Text -> Node
NodeContent
escape :: String -> String
escape [] = []
escape ( Char
c : String
cs ) = case Char
c of
Char
'<' -> String
"<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
escape String
cs
Char
'>' -> String
">" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
escape String
cs
Char
_ -> Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
escape String
cs