aboutsummaryrefslogtreecommitdiff
path: root/src/View/Html/Ad.hs
blob: d8a3bae152b5e0ef8c73e9c30939e9f68cd32bfc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{-# LANGUAGE OverloadedStrings #-}

module View.Html.Ad
  ( renderAds
  ) where

import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Lazy (toStrict)
import Data.Maybe (catMaybes)
import Data.List (intersperse)
import Data.Map (Map)
import qualified Data.Map as M

import Text.Blaze.Html
import Text.Blaze.Html5 (Html)
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
import Text.Blaze.Html.Renderer.Text (renderHtml)
import Text.Blaze.Internal (textValue)

import Model.Ad (Ad)
import qualified Model.Ad as Ad

import Model.Resume (Resume)
import qualified Model.Resume as Resume

import Model.Detail (Detail)
import qualified Model.Detail as Detail

import Model.URL
import Conf (Conf)
import qualified Conf

import View.Html.Design

renderAds :: Conf -> [Ad] -> Text
renderAds conf = toStrict . renderHtml . (adsHtml conf)

adsHtml :: Conf -> [Ad] -> Html
adsHtml conf ads = do mapM_ (adHtml conf) ads

adHtml :: Conf -> Ad -> Html
adHtml conf ad =
  let resume = Ad.resume ad
      detail = Ad.detail ad
  in  do
        resumeHtml resume
        detailHtml conf detail

resumeHtml :: Resume -> Html
resumeHtml resume = do
  H.h1 $ do
    (toHtml . Resume.name $ resume)
    case Resume.price resume of
      Just price ->
        H.span
          ! A.class_ "price"
          ! A.style (textValue . toStrict $ priceDesign)
          $ toHtml price
      Nothing ->
        H.span ""
  linkHtml (Resume.url resume)

detailHtml :: Conf -> Detail -> Html
detailHtml conf detail = do
  propertiesHtml (Conf.properties conf) (Detail.properties detail)
  case Detail.description detail of
    Just description ->
      descriptionHtml description
    Nothing ->
      H.div ""
  mapM_ imageLinkHtml (Detail.images detail)

propertiesHtml :: [Text] -> Map Text Text -> Html
propertiesHtml keys properties =
  H.dl
    ! A.style (textValue . toStrict $ dlDesign)
    $ sequence_ (catMaybes $ map (propertyHtml properties) keys)

propertyHtml :: Map Text Text -> Text -> Maybe Html
propertyHtml properties key =
  fmap
    (\value -> do
        H.dt $ (toHtml key)
        H.dd ! A.style (textValue . toStrict $ ddDesign) $ (toHtml value)
    )
    (M.lookup key properties)

descriptionHtml :: Text -> Html
descriptionHtml = H.p . sequence_ . intersperse H.br . fmap toHtml . T.lines

linkHtml :: URL -> Html
linkHtml url =
  H.a ! A.href (textValue url) $ (toHtml url)

imageLinkHtml :: URL -> Html
imageLinkHtml url =
  H.a ! A.href (textValue url) $
    H.img
      ! A.src (textValue url)
      ! A.alt (textValue url)