diff options
Diffstat (limited to 'src/Text/Hakyll/Context.hs')
-rw-r--r-- | src/Text/Hakyll/Context.hs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/Text/Hakyll/Context.hs b/src/Text/Hakyll/Context.hs new file mode 100644 index 0000000..e3069b5 --- /dev/null +++ b/src/Text/Hakyll/Context.hs @@ -0,0 +1,47 @@ +-- | Module containing various functions to manipulate contexts. +module Text.Hakyll.Context + ( ContextManipulation + , renderValue + , renderDate + ) where + +import qualified Data.Map as M +import qualified Data.ByteString.Lazy.Char8 as B + +import System.Locale (defaultTimeLocale) +import System.FilePath (takeFileName) +import Text.Regex (subRegex, mkRegex) +import Text.Template (Context) +import Data.Time.Format (parseTime, formatTime) +import Data.Time.Clock (UTCTime) +import Data.Maybe (fromMaybe) + +-- | Type for context manipulating functions. +type ContextManipulation = Context -> Context + +-- | Do something with a value of a context. +renderValue :: String -- ^ Key of which the value should be copied. + -> String -- ^ Key the value should be copied to. + -> (B.ByteString -> B.ByteString) -- ^ Function to apply on the value. + -> ContextManipulation +renderValue src dst f context = case M.lookup (B.pack src) context of + Nothing -> context + (Just value) -> M.insert (B.pack dst) (f value) context + +-- | When the context has a key called `path` in a `yyyy-mm-dd-title.extension` +-- format (default for pages), this function can render the date. +renderDate :: String -- ^ Key in which the rendered date should be placed. + -> String -- ^ Format to use on the date. + -> String -- ^ Default value when the date cannot be parsed. + -> ContextManipulation +renderDate key format defaultValue context = + M.insert (B.pack key) (B.pack value) context + where value = fromMaybe defaultValue pretty + pretty = do filePath <- M.lookup (B.pack "path") context + let dateString = subRegex (mkRegex "^([0-9]*-[0-9]*-[0-9]*).*") + (takeFileName $ B.unpack filePath) + "\\1" + time <- parseTime defaultTimeLocale + "%Y-%m-%d" + dateString :: Maybe UTCTime + return $ formatTime defaultTimeLocale format time |