on master help sign in
Add $title, $root and $url fields
2b5b27eJasper Van der Jeugt
src/Hakyll/Web/Page.hs+34−2
@@ -5,18 +5,34 @@
5{-# LANGUAGE DeriveDataTypeable #-}
5{-# LANGUAGE DeriveDataTypeable #-}
6module Hakyll.Web.Page
6module Hakyll.Web.Page
7 ( Page (..)
7 ( Page (..)
8+ , addField
8 , toMap
9 , toMap
9 , pageRead
10 , pageRead
11+ , addDefaultFields
10 ) where
12 ) where
11
13
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
16
22
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
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
20
36
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.
22--
38--
@@ -27,3 +43,19 @@ toMap (Page m b) = M.insert "body" b m
27--
43--
28pageRead :: Compiler a (Page String)
44pageRead :: Compiler a (Page String)
29pageRead = getResourceString >>^ readPage
45pageRead = 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)