{-# LANGUAGE TemplateHaskell #-}
--------------------------------------------------------------------------------
-- |
-- Module      :  Ipe.Literal
-- Copyright   :  (C) Frank Staals
-- License     :  see the LICENSE file
-- Maintainer  :  Frank Staals
--
-- Including xml literals
--
--------------------------------------------------------------------------------
module Ipe.Literal where


import Language.Haskell.TH
import Language.Haskell.TH.Quote
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as C
import Text.XML.Expat.Tree

-- | Include a literal expression
literally :: String -> Q Exp
literally :: String -> Q Exp
literally = Exp -> Q Exp
forall (m :: * -> *) a. Monad m => a -> m a
return (Exp -> Q Exp) -> (String -> Exp) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lit -> Exp
LitE (Lit -> Exp) -> (String -> Lit) -> String -> Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Lit
StringL

-- | Literal quoter.
lit :: QuasiQuoter
lit :: QuasiQuoter
lit = QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter { quoteExp :: String -> Q Exp
quoteExp = String -> Q Exp
literally
                  , quotePat :: String -> Q Pat
quotePat = String -> Q Pat
forall a. HasCallStack => a
undefined
                  , quoteType :: String -> Q Type
quoteType = String -> Q Type
forall a. HasCallStack => a
undefined
                  , quoteDec :: String -> Q [Dec]
quoteDec  = String -> Q [Dec]
forall a. HasCallStack => a
undefined
                  }

-- | Include a file as a literal.
litFile :: QuasiQuoter
litFile :: QuasiQuoter
litFile = QuasiQuoter -> QuasiQuoter
quoteFile QuasiQuoter
lit

-- | Parse a string into a Node.
xmlLiteral :: String -> Node T.Text T.Text
xmlLiteral :: String -> Node Text Text
xmlLiteral = (XMLParseError -> Node Text Text)
-> (Node Text Text -> Node Text Text)
-> Either XMLParseError (Node Text Text)
-> Node Text Text
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> String -> Node Text Text
forall a. HasCallStack => String -> a
error String
"xmlLiteral. error parsing xml: " (String -> Node Text Text)
-> (XMLParseError -> String) -> XMLParseError -> Node Text Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XMLParseError -> String
forall a. Show a => a -> String
show) Node Text Text -> Node Text Text
forall a. a -> a
id
           (Either XMLParseError (Node Text Text) -> Node Text Text)
-> (String -> Either XMLParseError (Node Text Text))
-> String
-> Node Text Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
.  ParseOptions Text Text
-> ByteString -> Either XMLParseError (Node Text Text)
forall tag text.
(GenericXMLString tag, GenericXMLString text) =>
ParseOptions tag text
-> ByteString -> Either XMLParseError (Node tag text)
parse' ParseOptions Text Text
forall tag text. ParseOptions tag text
defaultParseOptions (ByteString -> Either XMLParseError (Node Text Text))
-> (String -> ByteString)
-> String
-> Either XMLParseError (Node Text Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
C.pack