module Text.Hakyll.Context
( Context
, ContextManipulation
, renderValue
, changeValue
, renderDate
, changeExtension
) where
import qualified Data.Map as M
import Data.Map (Map)
import System.Locale (defaultTimeLocale)
import System.FilePath (takeFileName, addExtension, dropExtension)
import Data.Time.Format (parseTime, formatTime)
import Data.Time.Clock (UTCTime)
import Data.Maybe (fromMaybe)
import Text.Hakyll.Regex (substituteRegex)
type Context = Map String String
type ContextManipulation = Context -> Context
renderValue :: String
-> String
-> (String -> String)
-> ContextManipulation
renderValue src dst f context = case M.lookup src context of
Nothing -> context
(Just value) -> M.insert dst (f value) context
changeValue :: String
-> (String -> String)
-> ContextManipulation
changeValue key = renderValue key key
renderDate :: String
-> String
-> String
-> ContextManipulation
renderDate key format defaultValue context = M.insert key value context
where
value = fromMaybe defaultValue pretty
pretty = do filePath <- M.lookup "path" context
let dateString = substituteRegex "^([0-9]*-[0-9]*-[0-9]*).*" "\\1"
(takeFileName filePath)
time <- parseTime defaultTimeLocale
"%Y-%m-%d"
dateString :: Maybe UTCTime
return $ formatTime defaultTimeLocale format time
changeExtension :: String
-> ContextManipulation
changeExtension extension = changeValue "url" changeExtension'
where
changeExtension' = flip addExtension extension . dropExtension