on master help sign in
Add partials to template system
commitd32307aa1cbf6718845eeeb2eb6ba3b1c7661bde authorJasper Van der Jeugt <m@jaspervdj.be> dateTue 7 May 2013, 09:28 (13 years ago) parentcf138a4
6 files changed+39−7
.ghci+1 hakyll.cabal+1−1 src/Hakyll/Core/Util/Parser.hs+1−1 src/Hakyll/Web/Template.hs+11−3 src/Hakyll/Web/Template/Internal.hs+4−1 src/Hakyll/Web/Template/Read.hs+21−1
.ghci+1
@@ -1 +1,2 @@
11:set -isrc -isrc-interval -itests -idist/build/autogen -DPREVIEW_SERVER
2+:set -optP-include -optPdist/build/autogen/cabal_macros.h
hakyll.cabal+1−1
@@ -1,5 +1,5 @@
11Name: hakyll
2−Version: 4.2.2.0
2+Version: 4.3.0.0
33
44Synopsis: A static website compiler library
55Description:
src/Hakyll/Core/Util/Parser.hs+1−1
@@ -22,4 +22,4 @@ metadataKey = do
2222
2323--------------------------------------------------------------------------------
2424reservedKeys :: [String]
25−reservedKeys = ["if", "else", "endif", "for", "sep", "endfor"]
25+reservedKeys = ["if", "else", "endif", "for", "sep", "endfor", "partial"]
src/Hakyll/Web/Template.hs+11−3
@@ -87,14 +87,18 @@ applyTemplate' tpl context x = go tpl
8787 context' = unContext (context `mappend` missingField)
8888 go = liftM concat . mapM applyElem . unTemplate
8989
90− applyElem (Chunk c) = return c
91− applyElem Escaped = return "$"
92− applyElem (Key k) = context' k x >>= getString k
90+ applyElem (Chunk c) = return c
91+
92+ applyElem Escaped = return "$"
93+
94+ applyElem (Key k) = context' k x >>= getString k
95+
9396 applyElem (If k t mf) = (context' k x >> go t) `catchError` handler
9497 where
9598 handler _ = case mf of
9699 Nothing -> return ""
97100 Just f -> go f
101+
98102 applyElem (For k b s) = context' k x >>= \cf -> case cf of
99103 StringField _ -> fail $
100104 "Hakyll.Web.Template.applyTemplateWith: expected ListField but " ++
@@ -104,6 +108,10 @@ applyTemplate' tpl context x = go tpl
104108 bs <- mapM (applyTemplate' b c) xs
105109 return $ intercalate sep bs
106110
111+ applyElem (Partial p) = do
112+ tpl' <- loadBody (fromFilePath p)
113+ applyTemplate' tpl' context x
114+
107115 getString _ (StringField s) = return s
108116 getString k (ListField _ _) = fail $
109117 "Hakyll.Web.Template.applyTemplateWith: expected StringField but " ++
src/Hakyll/Web/Template/Internal.hs+4−1
@@ -39,6 +39,7 @@ data TemplateElement
3939 | Escaped
4040 | If String Template (Maybe Template) -- key, then branch, else branch
4141 | For String Template (Maybe Template) -- key, body, separator
42+ | Partial String -- filename
4243 deriving (Show, Eq, Typeable)
4344
4445
@@ -49,12 +50,14 @@ instance Binary TemplateElement where
4950 put (Escaped) = putWord8 2
5051 put (If key t f) = putWord8 3 >> put key >> put t >> put f
5152 put (For key b s) = putWord8 4 >> put key >> put b >> put s
53+ put (Partial p) = putWord8 5 >> put p
5254
5355 get = getWord8 >>= \tag -> case tag of
5456 0 -> Chunk <$> get
5557 1 -> Key <$> get
5658 2 -> pure Escaped
57− 3 -> If <$> get <*> get <*> get
59+ 3 -> If <$> get <*> get <*> get
5860 4 -> For <$> get <*> get <*> get
61+ 5 -> Partial <$> get
5962 _ -> error $
6063 "Hakyll.Web.Template.Internal: Error reading cached template"
src/Hakyll/Web/Template/Read.hs+21−1
@@ -27,7 +27,7 @@ readTemplate input = case parse template "" input of
2727--------------------------------------------------------------------------------
2828template :: Parser Template
2929template = Template <$>
30− (many1 $ chunk <|> escaped <|> conditional <|> for <|> key)
30+ (many1 $ chunk <|> escaped <|> conditional <|> for <|> partial <|> key)
3131
3232
3333--------------------------------------------------------------------------------
@@ -64,6 +64,15 @@ for = try $ do
6464 return $ For i body sep
6565
6666
67+--------------------------------------------------------------------------------
68+partial :: Parser TemplateElement
69+partial = try $ do
70+ void $ string "$partial("
71+ i <- stringLiteral
72+ void $ string ")$"
73+ return $ Partial i
74+
75+
6776--------------------------------------------------------------------------------
6877key :: Parser TemplateElement
6978key = try $ do
@@ -71,3 +80,14 @@ key = try $ do
7180 k <- metadataKey
7281 void $ char '$'
7382 return $ Key k
83+
84+
85+--------------------------------------------------------------------------------
86+stringLiteral :: Parser String
87+stringLiteral = do
88+ void $ char '\"'
89+ str <- many $ do
90+ x <- noneOf "\""
91+ if x == '\\' then anyChar else return x
92+ void $ char '\"'
93+ return str