simple 0.10.1 → 0.11.0
raw patch · 3 files changed
+72/−42 lines, 3 filesdep −simple
Dependencies removed: simple
Files
- CHANGELOG.md +6/−0
- simple.cabal +2/−2
- src/Web/Simple/Templates.hs +64/−40
+ CHANGELOG.md view
@@ -0,0 +1,6 @@+# Version 0.11.0.0 (2015-11-23)++* Minimize methods in `HasTemplates` and extract everything else into functions++* Add `layoutObject` method that allows customizing the value passed to the+ layout
simple.cabal view
@@ -1,5 +1,5 @@ name: simple-version: 0.10.1+version: 0.11.0 synopsis: A minimalist web framework for the WAI server interface description: @@ -33,6 +33,7 @@ category: Web build-type: Simple cabal-version: >=1.10+extra-source-files: LICENSE CHANGELOG.md data-files: template/*.tmpl @@ -104,7 +105,6 @@ , HUnit , monad-control < 0.4 , mtl- , simple , transformers , wai
src/Web/Simple/Templates.hs view
@@ -2,8 +2,8 @@ {-# LANGUAGE OverloadedStrings, MultiParamTypeClasses #-} {-# LANGUAGE DefaultSignatures #-} module Web.Simple.Templates- ( HasTemplates(..)- , defaultGetTemplate, defaultRender, defaultFunctionMap+ ( HasTemplates(..), render, renderPlain, renderLayout, renderLayoutTmpl+ , defaultGetTemplate, defaultFunctionMap, defaultLayoutObject , H.fromList , Function(..), ToFunction(..), FunctionMap ) where@@ -54,40 +54,72 @@ default getTemplate :: MonadIO m => FilePath -> ControllerT hs m Template getTemplate = defaultGetTemplate - -- | Renders a view template with the default layout and a global used to- -- evaluate variables in the template.- render :: ToJSON a => FilePath -> a -> ControllerT hs m ()- render = defaultRender+ -- | The `Value` passed to a layout given the rendered view template and the+ -- value originally passed to the view template. By default, produces an+ -- `Object` with "yield", containing the rendered view, and "page", containing+ -- the value originally passed to the view.+ layoutObject :: (ToJSON pageContent, ToJSON pageVal)+ => pageContent -> pageVal -> ControllerT hs m Value+ layoutObject = defaultLayoutObject - -- | Same as 'render' but without a template.- renderPlain :: ToJSON a => FilePath -> a -> ControllerT hs m ()- renderPlain fp val = do- fm <- functionMap- dir <- viewDirectory- tmpl <- getTemplate (dir </> fp)- let pageContent =- L.fromChunks . (:[]) . encodeUtf8 $- renderTemplate tmpl fm $ toJSON val- let mime = defaultMimeLookup $ T.pack $ takeFileName fp- respond $ ok mime pageContent+defaultLayoutObject :: (HasTemplates m hs, ToJSON pageContent, ToJSON pageVal)+ => pageContent -> pageVal -> ControllerT hs m Value+defaultLayoutObject pageContent pageVal = return $+ object ["yield" .= pageContent, "page" .= pageVal] - -- | Render a view using the layout named by the first argument.- renderLayout :: ToJSON a => FilePath -> FilePath -> a -> ControllerT hs m ()- renderLayout lfp fp val = do- layout <- getTemplate lfp- renderLayout' layout fp val+-- | Render a view using the layout named by the first argument.+renderLayout :: (HasTemplates m hs, ToJSON a)+ => FilePath -> FilePath -> a -> ControllerT hs m ()+renderLayout lfp fp val = do+ layout <- getTemplate lfp+ viewDir <- viewDirectory+ view <- getTemplate (viewDir </> fp)+ let mime = defaultMimeLookup $ T.pack $ takeFileName fp+ renderLayoutTmpl layout view val mime - -- | Same as 'renderLayout' but uses an already compiled layout.- renderLayout' :: ToJSON a => Template -> FilePath -> a -> ControllerT hs m ()- renderLayout' layout fp val = do- fm <- functionMap- dir <- viewDirectory- tmpl <- getTemplate (dir </> fp)- let pageContent = renderTemplate tmpl fm $ toJSON val- let mime = defaultMimeLookup $ T.pack $ takeFileName fp- respond $ ok mime $ L.fromChunks . (:[]) . encodeUtf8 $- renderTemplate layout fm $ object ["yield" .= pageContent, "page" .= val] +-- | Same as 'renderLayout' but uses already compiled layouts.+renderLayoutTmpl :: (HasTemplates m hs, ToJSON a)+ => Template -> Template -> a+ -> S.ByteString -> ControllerT hs m ()+renderLayoutTmpl layout view val mime = do+ fm <- functionMap+ let pageContent = renderTemplate view fm $ toJSON val+ value <- layoutObject pageContent val+ let result = renderTemplate layout fm value+ respond $ ok mime $ L.fromChunks . (:[]) . encodeUtf8 $ result++-- | Renders a view template with the default layout and a global used to+-- evaluate variables in the template.+render :: (HasTemplates m hs , Monad m, ToJSON a)+ => FilePath -- ^ Template to render+ -> a -- ^ Aeson `Value` to pass to the template+ -> ControllerT hs m ()+render fp val = do+ mlayout <- defaultLayout+ case mlayout of+ Nothing -> renderPlain fp val+ Just layout -> do+ viewDir <- viewDirectory+ view <- getTemplate (viewDir </> fp)+ let mime = defaultMimeLookup $ T.pack $ takeFileName fp+ renderLayoutTmpl layout view val mime++-- | Same as 'render' but without a template.+renderPlain :: (HasTemplates m hs, ToJSON a)+ => FilePath -- ^ Template to render+ -> a -- ^ Aeson `Value` to pass to the template+ -> ControllerT hs m ()+renderPlain fp val = do+ fm <- functionMap+ dir <- viewDirectory+ tmpl <- getTemplate (dir </> fp)+ let pageContent =+ L.fromChunks . (:[]) . encodeUtf8 $+ renderTemplate tmpl fm $ toJSON val+ let mime = defaultMimeLookup $ T.pack $ takeFileName fp+ respond $ ok mime pageContent+ defaultGetTemplate :: (HasTemplates m hs, MonadIO m) => FilePath -> ControllerT hs m Template defaultGetTemplate fp = do@@ -95,14 +127,6 @@ case compileTemplate . decodeUtf8 $ contents of Left str -> fail str Right tmpl -> return tmpl--defaultRender :: (HasTemplates m hs , Monad m, ToJSON a)- => FilePath -> a -> ControllerT hs m ()-defaultRender fp val = do- mlayout <- defaultLayout- case mlayout of- Nothing -> renderPlain fp val- Just layout -> renderLayout' layout fp val defaultFunctionMap :: FunctionMap defaultFunctionMap = H.fromList