diff options
author | Jasper Van der Jeugt <jaspervdj@gmail.com> | 2010-12-30 21:19:19 +0100 |
---|---|---|
committer | Jasper Van der Jeugt <jaspervdj@gmail.com> | 2010-12-30 21:19:19 +0100 |
commit | 686de03ebf1daafc244ce6d8823be37675843e6d (patch) | |
tree | 759d38d641640728fab20f43d47fdec0653c172f /src/Hakyll/Web/Template.hs | |
parent | e49cd3b4b071c2e0cb3e553fe8272e7cd2843349 (diff) | |
download | hakyll-686de03ebf1daafc244ce6d8823be37675843e6d.tar.gz |
Add Template module
Diffstat (limited to 'src/Hakyll/Web/Template.hs')
-rw-r--r-- | src/Hakyll/Web/Template.hs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Hakyll/Web/Template.hs b/src/Hakyll/Web/Template.hs new file mode 100644 index 0000000..586d0b6 --- /dev/null +++ b/src/Hakyll/Web/Template.hs @@ -0,0 +1,49 @@ +module Hakyll.Web.Template + ( Template + , readTemplate + , applyTemplate + , applySelf + ) where + +import Data.List (isPrefixOf) +import Data.Char (isAlphaNum) +import Data.Maybe (fromMaybe) +import qualified Data.Map as M + +import Hakyll.Web.Template.Internal +import Hakyll.Web.Page + +-- | Construct a @Template@ from a string. +-- +readTemplate :: String -> Template +readTemplate = Template . readTemplate' + where + readTemplate' [] = [] + readTemplate' string + | "$$" `isPrefixOf` string = + EscapeCharacter : (readTemplate' $ drop 2 string) + | "$" `isPrefixOf` string = + let (key, rest) = span isAlphaNum $ drop 1 string + in Identifier key : readTemplate' rest + | otherwise = + let (chunk, rest) = break (== '$') string + in Chunk chunk : readTemplate' rest + +-- | Substitutes @$identifiers@ in the given @Template@ by values from the given +-- "Page". When a key is not found, it is left as it is. You can specify +-- the characters used to replace escaped dollars (@$$@) here. +-- +applyTemplate :: Template -> Page String -> Page String +applyTemplate template page = + fmap (const $ substitute =<< unTemplate template) page + where + substitute (Chunk chunk) = chunk + substitute (Identifier key) = + fromMaybe ('$' : key) $ M.lookup key $ toMap page + substitute (EscapeCharacter) = "$" + +-- | Apply a page as it's own template. This is often very useful to fill in +-- certain keys like @$root@ and @$url@. +-- +applySelf :: Page String -> Page String +applySelf page = applyTemplate (readTemplate $ pageBody page) page |