-- | This module provides means for reading and applying 'Template's.---- Templates are tools to convert items into a string. They are perfectly suited-- for laying out your site.---- Let's look at an example template:---- > <html>-- > <head>-- > <title>My crazy homepage - $title$</title>-- > </head>-- > <body>-- > <div id="header">-- > <h1>My crazy homepage - $title$</h1>-- > </div>-- > <div id="content">-- > $body$-- > </div>-- > <div id="footer">-- > By reading this you agree that I now own your soul-- > </div>-- > </body>-- > </html>---- As you can see, the format is very simple -- @$key$@ is used to render the-- @$key$@ field from the page, everything else is literally copied. If you want-- to literally insert @\"$key$\"@ into your page (for example, when you're-- writing a Hakyll tutorial) you can use---- > <p>-- > A literal $$key$$.-- > </p>---- Because of it's simplicity, these templates can be used for more than HTML:-- you could make, for example, CSS or JS templates as well.moduleHakyll.Web.Template(Template,templateCompiler,applyTemplate,loadAndApplyTemplate,applyAsTemplate,applyTemplateWith)where--------------------------------------------------------------------------------importControl.Monad(forM,liftM)importData.Monoid(mappend)importPreludehiding(id)--------------------------------------------------------------------------------importHakyll.Core.CompilerimportHakyll.Core.IdentifierimportHakyll.Core.ItemimportHakyll.Web.Template.ContextimportHakyll.Web.Template.InternalimportHakyll.Web.Template.Read---------------------------------------------------------------------------------- | Read a template.templateCompiler::Compiler(ItemTemplate)templateCompiler=cached"Hakyll.Web.Template.templateCompiler"$doitem<-getResourceStringreturn$fmapreadTemplateitem--------------------------------------------------------------------------------applyTemplate::Template-- ^ Template->Contexta-- ^ Context->Itema-- ^ Page->Compiler(ItemString)-- ^ Resulting itemapplyTemplatetplcontextitem=do-- Appending missingField gives better error messagesletcontext'kx=unContext(context`mappend`missingField)kxbody<-applyTemplateWithcontext'tplitemreturn$itemSetBodybodyitem---------------------------------------------------------------------------------- | The following pattern is so common:---- > tpl <- loadBody "templates/foo.html"-- > someCompiler-- > >>= applyTemplate tpl context---- That we have a single function which does this:---- > someCompiler-- > >>= loadAndApplyTemplate "templates/foo.html" contextloadAndApplyTemplate::Identifier-- ^ Template identifier->Contexta-- ^ Context->Itema-- ^ Page->Compiler(ItemString)-- ^ Resulting itemloadAndApplyTemplateidentifiercontextitem=dotpl<-loadBodyidentifierapplyTemplatetplcontextitem---------------------------------------------------------------------------------- | It is also possible that you want to substitute @$key$@s within the body of-- an item. This function does that by interpreting the item body as a template,-- and then applying it to itself.applyAsTemplate::ContextString-- ^ Context->ItemString-- ^ Item and template->Compiler(ItemString)-- ^ Resulting itemapplyAsTemplatecontextitem=lettpl=readTemplate$itemBodyiteminapplyTemplatetplcontextitem---------------------------------------------------------------------------------- | Overloaded apply template function to work in an arbitrary Monad.applyTemplateWith::Monadm=>(String->a->mString)->Template->a->mStringapplyTemplateWithcontexttplx=liftMconcat$forM(unTemplatetpl)$\e->caseeofChunkc->returncEscaped->return"$"Keyk->contextkx