@@ -5,18 +5,34 @@
55{-# LANGUAGE DeriveDataTypeable #-}
66module Hakyll.Web.Page
77 ( Page (..)
8+ , addField
89 , toMap
910 , pageRead
11+ , addDefaultFields
1012 ) where
1113
12−import Control.Arrow ((>>^))
13−
14+import Prelude hiding (id)
15+import Control.Category (id)
16+import Control.Arrow ((>>^), (&&&), (>>>))
17+import Control.Applicative ((<$>))
18+import System.FilePath (takeBaseName)
19+import Data.Maybe (fromMaybe)
1420import Data.Map (Map)
1521import qualified Data.Map as M
1622
23+import Hakyll.Core.Identifier
1724import Hakyll.Core.Compiler
1825import Hakyll.Web.Page.Internal
1926import Hakyll.Web.Page.Read
27+import Hakyll.Web.Util.String
28+
29+-- | Add a metadata field. If the field already exists, it is not overwritten.
30+--
31+addField :: String -- ^ Key
32+ -> String -- ^ Value
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
2036
2137-- | Convert a page to a map. The body will be placed in the @body@ key.
2238--
@@ -27,3 +43,19 @@ toMap (Page m b) = M.insert "body" b m
2743--
2844pageRead :: Compiler a (Page String)
2945pageRead = getResourceString >>^ readPage
46+
47+-- | Add a number of default metadata fields to a page. These fields include:
48+--
49+-- * @$url@
50+--
51+-- * @$root@
52+--
53+-- * @$title@
54+--
55+addDefaultFields :: Compiler (Page a) (Page a)
56+addDefaultFields = (getRoute &&& id >>^ uncurry addRoute)
57+ >>> (getIdentifier &&& id >>^ uncurry addTitle)
58+ where
59+ addRoute r = addField "url" (fromMaybe "?" r)
60+ . addField "root" (fromMaybe "/" $ toSiteRoot <$> r)
61+ addTitle i = addField "title" (takeBaseName $ toFilePath i)