packages feed

simple 0.10.1 → 0.11.0

raw patch · 3 files changed

+72/−42 lines, 3 filesdep −simple

Dependencies removed: simple

Files

+ 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