{-# 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