#if MIN_VERSION_blaze_markup(0,7,1)
#define PRE_BUILDER
#endif
module Text.BlazeT.Internal
(
MarkupT(..)
,MarkupI
,mapMarkupT
,MarkupM
,Markup
,Markup2
,runMarkupT
,runMarkup
,runWith
,execMarkupT
,execMarkup
,execWith
,wrapMarkupT
,wrapMarkupT2
,wrapMarkup
,wrapMarkup2
,
Text.Blaze.ChoiceString (..)
, Text.Blaze.StaticString (..)
, Text.Blaze.Tag
, Text.Blaze.Attribute
, Text.Blaze.AttributeValue
, customParent
, customLeaf
, Text.Blaze.attribute
, Text.Blaze.dataAttribute
, Text.Blaze.customAttribute
, text
, preEscapedText
, lazyText
, preEscapedLazyText
, textBuilder
, preEscapedTextBuilder
, string
, preEscapedString
, unsafeByteString
, unsafeLazyByteString
, Text.Blaze.textComment
, Text.Blaze.lazyTextComment
, Text.Blaze.stringComment
, Text.Blaze.unsafeByteStringComment
, Text.Blaze.unsafeLazyByteStringComment
, Text.Blaze.textTag
, Text.Blaze.stringTag
, Text.Blaze.textValue
, Text.Blaze.preEscapedTextValue
, Text.Blaze.lazyTextValue
, Text.Blaze.preEscapedLazyTextValue
, Text.Blaze.textBuilderValue
, Text.Blaze.preEscapedTextBuilderValue
, Text.Blaze.stringValue
, Text.Blaze.preEscapedStringValue
, Text.Blaze.unsafeByteStringValue
, Text.Blaze.unsafeLazyByteStringValue
, Text.Blaze.Attributable
, (Text.Blaze.!)
, (Text.Blaze.!?)
, contents
, external
, null
) where
import Control.Arrow
import Control.Monad.Identity
import Control.Monad.Trans.Class
import Control.Monad.Writer.Strict
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BL
import Data.String
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import qualified Data.Text.Lazy.Builder as LTB
import qualified Text.Blaze
import qualified Text.Blaze.Internal as Text.Blaze
newtype MarkupT m a= MarkupT { fromMarkupT :: WriterT Text.Blaze.Markup m a }
deriving (Functor
#if MIN_VERSION_base(4,8,0)
,Applicative
#endif
,Monad
,MonadWriter Text.Blaze.Markup
,MonadTrans
)
type MarkupI a = MarkupT Identity a
mapMarkupT :: (m (a,Text.Blaze.Markup) -> n (b,Text.Blaze.Markup)) -> MarkupT m a -> MarkupT n b
mapMarkupT f = MarkupT . mapWriterT f . fromMarkupT
type MarkupM a = forall m . Monad m => MarkupT m a
type Markup = MarkupM ()
type Markup2 = forall m . Monad m => MarkupT m () -> MarkupT m ()
runMarkupT :: MarkupT m a -> m (a,Text.Blaze.Markup)
runMarkupT = runWriterT . fromMarkupT
runWith :: Monad m => (MarkupI () -> c) -> MarkupT m a -> m (a, c)
runWith renderer = liftM (second $ renderer . wrapMarkup) . runMarkupT
execMarkupT :: Monad m => MarkupT m a -> m Text.Blaze.Markup
execMarkupT = liftM snd . runMarkupT
execWith :: Monad m => (MarkupI () -> c) -> MarkupT m a -> m c
execWith renderer = liftM snd . runWith renderer
runMarkup :: MarkupI a -> (a, Text.Blaze.Markup)
runMarkup = runIdentity . runMarkupT
execMarkup :: MarkupI a -> Text.Blaze.Markup
execMarkup = snd . runMarkup
wrapMarkupT :: Monad m => Text.Blaze.Markup -> MarkupT m ()
wrapMarkupT = tell
wrapMarkup :: Text.Blaze.Markup -> Markup
wrapMarkup = wrapMarkupT
wrapMarkupT2 :: Monad m => (Text.Blaze.Markup -> Text.Blaze.Markup)
-> MarkupT m a -> MarkupT m a
wrapMarkupT2 = censor
wrapMarkup2 :: (Text.Blaze.Markup -> Text.Blaze.Markup) -> Markup2
wrapMarkup2 = wrapMarkupT2
instance (Monad m,Monoid a) => Monoid (MarkupT m a) where
mempty = return mempty
a `mappend` b = do {a' <- a; b >>= return . (mappend a')}
instance Monad m => Text.Blaze.Attributable (MarkupT m a) where
h ! a = wrapMarkupT2 (Text.Blaze.! a) h
instance Monad m => Text.Blaze.Attributable (a -> MarkupT m b) where
h ! a = \x -> wrapMarkupT2 (Text.Blaze.! a) $ h x
instance Monad m => IsString (MarkupT m ()) where
fromString = wrapMarkup . fromString
unsafeByteString :: BS.ByteString -> Markup
unsafeByteString = wrapMarkup . Text.Blaze.unsafeByteString
unsafeLazyByteString :: BL.ByteString
-> Markup
unsafeLazyByteString = wrapMarkup . Text.Blaze.unsafeLazyByteString
external :: Monad m => MarkupT m a -> MarkupT m a
external = wrapMarkupT2 Text.Blaze.external
contents :: Monad m => MarkupT m a -> MarkupT m a
contents = wrapMarkupT2 Text.Blaze.contents
customParent ::Text.Blaze.Tag -> Markup2
customParent = wrapMarkup2 . Text.Blaze.customParent
customLeaf :: Text.Blaze.Tag -> Bool -> Markup
customLeaf = fmap wrapMarkup . Text.Blaze.customLeaf
preEscapedText :: T.Text -> Markup
preEscapedText = wrapMarkup . Text.Blaze.preEscapedText
preEscapedLazyText :: LT.Text -> Markup
preEscapedLazyText = wrapMarkup . Text.Blaze.preEscapedLazyText
preEscapedTextBuilder :: LTB.Builder -> Markup
textBuilder :: LTB.Builder -> Markup
#ifdef PRE_BUILDER
preEscapedTextBuilder = wrapMarkup . Text.Blaze.preEscapedTextBuilder
textBuilder = wrapMarkup . Text.Blaze.textBuilder
#else
preEscapedTextBuilder = error "This function needs blaze-markup 0.7.1.0"
textBuilder = error "This function needs blaze-markup 0.7.1.0"
#endif
preEscapedString :: String -> Markup
preEscapedString = wrapMarkup . Text.Blaze.preEscapedString
string :: String -> Markup
string = wrapMarkup . Text.Blaze.string
text :: T.Text -> Markup
text = wrapMarkup . Text.Blaze.text
lazyText :: LT.Text -> Markup
lazyText = wrapMarkup . Text.Blaze.lazyText