gdritter repos profile-site / master Templates.hs
master

Tree @master (Download .tar.gz)

Templates.hs @masterraw · history · blame

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Templates where

import           Control.Monad (forM_)
import           Data.Char (toLower)
import           Data.Monoid ((<>))
import           Data.Text (Text, pack)
import qualified Data.Text as T
import           Lucid
import qualified Storage as S

footer :: Html ()
footer = "copyright 2015 Empress Cortana"

page :: Html () -> Html () -> Html ()
page name contents = html_ $ do
  head_ $ do
    title_ name
    link_ [rel_ "stylesheet", type_ "text/css", href_ "/css"]
  body_ $ do
    div_ [id_ "header"] $ h1_ name
    div_ [id_ "main"] $ contents
    div_ [id_ "footer"] $ footer

title :: Text -> Html ()
title t = toHtml ("empress cortana // " <> T.map toLower t)

projectList :: [S.Project] -> Html ()
projectList = page (title "portfolio") . mapM_ shortProj

project :: S.Project -> Html ()
project p = page (title (S.projectName p)) (fullProj p)

loginPage :: Html ()
loginPage = page (title "login") $ do
  form_ [name_ "login", action_ "/login"] $ do
    input_ [type_ "password", name_ "password"]
    input_ [type_ "submit", value_ "login"]

imgUrl :: String -> Text
imgUrl s = pack ("/imgs/" <> s)

projUrl :: Text -> Text
projUrl s = "/project/" <> s

shortProj :: S.Project -> Html ()
shortProj (S.Project { .. }) = div_ [class_ "project"] $ do
  div_ [id_ "name"] $ a_ [href_ (projUrl projectSlug)] $ toHtml projectName
  case projectImgs of
    (img:_) -> div_ [id_ "tile"] $ img_ [src_ (imgUrl img)]
    []      -> return ()

fullProj :: S.Project -> Html ()
fullProj (S.Project { .. }) = div_ [class_ "project"] $ do
  div_ [id_ "descr"] $ toHtml projectDescr
  forM_ projectImgs $ \img ->
    div_ [id_ "tile"] $ img_ [src_ (imgUrl img)]