web-rep-0.14.1.0: src/Web/Rep/Server.hs
{-# LANGUAGE OverloadedLabels #-}
-- | Serve pages via 'ScottyM'
module Web.Rep.Server
( servePageWith,
)
where
import Control.Monad
import Control.Monad.Trans.Class
import Data.ByteString qualified as B
import Data.Text.Lazy (pack)
import MarkupParse
import Network.Wai.Middleware.Static (addBase, noDots, only, staticPolicy)
import Optics.Core hiding (only)
import Web.Rep.Page
import Web.Rep.Render
import Web.Scotty
-- | serve a Page via a ScottyM
servePageWith :: RoutePattern -> PageConfig -> Page -> ScottyM ()
servePageWith rp pc p =
sequence_ $ servedir <> [getpage]
where
getpage = case pc ^. #concerns of
Inline ->
get rp (html $ pack $ utf8ToStr $ markdown_ Compact Html $ renderPageHtmlWith pc p)
Separated ->
let (css, js, h) = renderPageWith pc p
in do
middleware $ staticPolicy $ only [(cssfp, cssfp), (jsfp, jsfp)]
get
rp
( do
lift $ writeFile' cssfp css
lift $ writeFile' jsfp js
html $ pack $ utf8ToStr $ markdown_ Compact Html h
)
cssfp = pc ^. #filenames % #cssConcern
jsfp = pc ^. #filenames % #jsConcern
writeFile' fp s = unless (s == mempty) (B.writeFile fp s)
servedir = (\x -> middleware $ staticPolicy (noDots <> addBase x)) <$> pc ^. #localdirs