module Text.Julius
( Julius
, Javascript (..)
, ToJavascript (..)
, renderJulius
, julius
, juliusFile
, juliusFileDebug
) 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.Romeo
renderJavascript :: Javascript -> TL.Text
renderJavascript (Javascript b) = toLazyText b
renderJulius :: (url -> [(TS.Text, TS.Text)] -> TS.Text) -> Julius url -> TL.Text
renderJulius r s = renderJavascript $ s r
newtype Javascript = Javascript { unJavascript :: Builder }
deriving Monoid
type Julius 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 RomeoSettings
settings = do
toJExp <- [|toJavascript|]
wrapExp <- [|Javascript|]
unWrapExp <- [|unJavascript|]
return $ defaultRomeoSettings { toBuilder = toJExp
, wrap = wrapExp
, unwrap = unWrapExp
}
julius :: QuasiQuoter
julius = QuasiQuoter { quoteExp = \s -> do
rs <- settings
quoteExp (romeo rs) s
}
juliusFile :: FilePath -> Q Exp
juliusFile fp = do
rs <- settings
romeoFile rs fp
juliusFileDebug :: FilePath -> Q Exp
juliusFileDebug fp = do
rs <- settings
romeoFileDebug rs fp