{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE CPP #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE RankNTypes #-} module Main where ------------------------------------------------------------------------------ import Control.Category import Control.Monad import Control.Exception (SomeException, try) import Data.ByteString (ByteString) import Data.Maybe import Prelude hiding ((.)) import Snap import qualified Data.Configurator as CF import qualified Data.Configurator.Types as CF import Snap.Core import Snap.Http.Server import Snap.Snaplet.Heist import Snap.Snaplet.Config import Snap.Util.FileServe import System.IO import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy as LBS import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Text.XmlHtml as X import Heist import qualified Heist.Interpreted as I import Control.Lens import Text.XmlHtml hiding (render) import Snap.Snaplet.I18N import Snap.Loader.Static ------------------------------------------------------------------------------ data App = App { _heist :: Snaplet (Heist App) , _i18n :: Snaplet I18N } makeLenses ''App instance HasHeist App where heistLens = subSnaplet heist instance HasI18N App where i18nLens = i18n type AppHandler = Handler App App ------------------------------------------------------------------------------ decodedParam :: MonadSnap m => ByteString -> m ByteString decodedParam p = fromMaybe "" <$> getParam p ------------------------------------------------------------------------------ testSplice :: I.Splice AppHandler testSplice = do locale <- liftIO $ getDefaultLocale --liftIO $ print locale I.textSplice $ T.pack "test" index :: AppHandler () index = do heistLocal (I.bindSplice "testSplice" testSplice) $ render "index" -- | wrap to element span -- ------------------------------------------------------------------------------ -- | The application's routes. routes :: [(ByteString, Handler App App ())] routes = [ ("/", index) , ("", with heist heistServe) ] -- | The application initializer. app :: SnapletInit App App app = makeSnaplet "app" "An snaplet example application." Nothing $ do h <- nestSnaplet "heist" heist $ heistInit "templates" locale <- liftIO $ getDefaultLocale i <- nestSnaplet "i18n" i18n $ initI18N (Just "zh_CN") addRoutes routes return $ App h i getDefaultLocale :: IO (Maybe String) --getDefaultLocale = return $ Just "zh_CN" getDefaultLocale = liftM getLocale getConf ------------------------------------------------------------------------------ main :: IO () main = do (conf, site, cleanup) <- $(loadSnapTH [| getConf |] 'getActions ["heist/templates"]) _ <- try $ httpServe conf $ site :: IO (Either SomeException ()) cleanup getConf :: IO (Config Snap AppConfig) getConf = commandLineAppConfig defaultConfig getActions :: Config Snap AppConfig -> IO (Snap (), IO ()) getActions conf = do (msgs, site, cleanup) <- runSnaplet (appEnvironment =<< getOther conf) app hPutStrLn stderr $ T.unpack msgs return (site, cleanup)