module Text.Julius
( JavascriptUrl
, Javascript (..)
, ToJavascript (..)
, renderJavascript
, renderJavascriptUrl
, js
, julius
, juliusFile
, jsFile
, juliusFileDebug
, jsFileDebug
) where
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Language.Haskell.TH.Syntax
import Data.Text.Lazy.Builder (Builder, fromText, toLazyText, fromLazyText)
import Data.Monoid
import qualified Data.Text as TS
import qualified Data.Text.Lazy as TL
import Text.Shakespeare
renderJavascript :: Javascript -> TL.Text
renderJavascript (Javascript b) = toLazyText b
renderJavascriptUrl :: (url -> [(TS.Text, TS.Text)] -> TS.Text) -> JavascriptUrl url -> TL.Text
renderJavascriptUrl r s = renderJavascript $ s r
newtype Javascript = Javascript { unJavascript :: Builder }
deriving Monoid
type JavascriptUrl url = (url -> [(TS.Text, TS.Text)] -> TS.Text) -> Javascript
class ToJavascript a where
toJavascript :: a -> Builder
instance ToJavascript [Char] where toJavascript = fromLazyText . TL.pack
instance ToJavascript TS.Text where toJavascript = fromText
instance ToJavascript TL.Text where toJavascript = fromLazyText
settings :: Q ShakespeareSettings
settings = do
toJExp <- [|toJavascript|]
wrapExp <- [|Javascript|]
unWrapExp <- [|unJavascript|]
return $ defaultShakespeareSettings { toBuilder = toJExp
, wrap = wrapExp
, unwrap = unWrapExp
}
js, julius :: QuasiQuoter
js = QuasiQuoter { quoteExp = \s -> do
rs <- settings
quoteExp (shakespeare rs) s
}
julius = js
jsFile, juliusFile :: FilePath -> Q Exp
jsFile fp = do
rs <- settings
shakespeareFile rs fp
juliusFile = jsFile
jsFileDebug, juliusFileDebug :: FilePath -> Q Exp
jsFileDebug fp = do
rs <- settings
shakespeareFileDebug rs fp
juliusFileDebug = jsFileDebug