@@ -5,18 +5,34 @@
5{-# LANGUAGE DeriveDataTypeable #-}
5{-# LANGUAGE DeriveDataTypeable #-}
6module Hakyll.Web.Page
6module Hakyll.Web.Page
7 ( Page (..)
7 ( Page (..)
9 , pageRead
10 , pageRead
14+import Prelude hiding (id)
15+import Control.Category (id)
12−import Control.Arrow ((>>^))
16+import Control.Arrow ((>>^), (&&&), (>>>))
13−
17+import Control.Applicative ((<$>))
18+import System.FilePath (takeBaseName)
19+import Data.Maybe (fromMaybe)
14import Data.Map (Map)
20import Data.Map (Map)
15import qualified Data.Map as M
21import qualified Data.Map as M
23+import Hakyll.Core.Identifier
17import Hakyll.Core.Compiler
24import Hakyll.Core.Compiler
18import Hakyll.Web.Page.Internal
25import Hakyll.Web.Page.Internal
19import Hakyll.Web.Page.Read
26import Hakyll.Web.Page.Read
27+import Hakyll.Web.Util.String
29+-- | Add a metadata field. If the field already exists, it is not overwritten.
31+addField :: String -- ^ Key
33+ -> Page a -- ^ Page to add it to
34+ -> Page a -- ^ Resulting page
35+addField k v (Page m b) = Page (M.insertWith (flip const) k v m) b
21-- | Convert a page to a map. The body will be placed in the @body@ key.
37-- | Convert a page to a map. The body will be placed in the @body@ key.
@@ -27,3 +43,19 @@ toMap (Page m b) = M.insert "body" b m
28pageRead :: Compiler a (Page String)
44pageRead :: Compiler a (Page String)
29pageRead = getResourceString >>^ readPage
45pageRead = getResourceString >>^ readPage
47+-- | Add a number of default metadata fields to a page. These fields include:
55+addDefaultFields :: Compiler (Page a) (Page a)
56+addDefaultFields = (getRoute &&& id >>^ uncurry addRoute)
57+ >>> (getIdentifier &&& id >>^ uncurry addTitle)
59+ addRoute r = addField "url" (fromMaybe "?" r)
60+ . addField "root" (fromMaybe "/" $ toSiteRoot <$> r)
61+ addTitle i = addField "title" (takeBaseName $ toFilePath i)