{-# LANGUAGE OverloadedStrings #-}

module Web.Hablog.Page where

import           Control.Arrow  ((&&&))
import qualified Data.Map as M
import qualified Data.Text.Lazy as T
import qualified Text.Blaze.Html5 as H

import Web.Hablog.Utils

data Page
    = Page
    { Page -> FilePath
getPageURL     :: FilePath
    , Page -> Text
getPageName    :: T.Text
    , Page -> Html
getPageContent :: H.Html
    }

toPage :: T.Text -> Maybe Page
toPage :: Text -> Maybe Page
toPage fileContent :: Text
fileContent =
  FilePath -> Text -> Html -> Page
Page (FilePath -> Text -> Html -> Page)
-> Maybe FilePath -> Maybe (Text -> Html -> Page)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> FilePath) -> Maybe Text -> Maybe FilePath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> FilePath
T.unpack (Text -> Map Text Text -> Maybe Text
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup "route" Map Text Text
header)
       Maybe (Text -> Html -> Page) -> Maybe Text -> Maybe (Html -> Page)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Map Text Text -> Maybe Text
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup "title" Map Text Text
header
       Maybe (Html -> Page) -> Maybe Html -> Maybe Page
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Html -> Maybe Html
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Html
createBody Text
content)
    where (header :: Map Text Text
header, content :: Text
content) = (Text -> Map Text Text
getHeader (Text -> Map Text Text)
-> (Text -> Text) -> Text -> (Map Text Text, Text)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Text -> Text
getContent) Text
fileContent


instance Show Page where
  show :: Page -> FilePath
show = Page -> FilePath
getPageURL

instance Eq Page where
  == :: Page -> Page -> Bool
(==) p1 :: Page
p1 p2 :: Page
p2 = Page -> FilePath
getPageURL Page
p1 FilePath -> FilePath -> Bool
forall a. Eq a => a -> a -> Bool
== Page -> FilePath
getPageURL Page
p2

instance Ord Page where
  compare :: Page -> Page -> Ordering
compare p1 :: Page
p1 p2 :: Page
p2
    | Page -> Text
getPageName Page
p1 Text -> Text -> Bool
forall a. Ord a => a -> a -> Bool
< Page -> Text
getPageName Page
p2 = Ordering
LT
    | Bool
otherwise = Ordering
GT