on master help sign in
Add partials to template system
d32307aJasper Van der Jeugt
@@ -1 +1,2 @@
1:set -isrc -isrc-interval -itests -idist/build/autogen -DPREVIEW_SERVER
1: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 @@
1Name: hakyll
1Name: hakyll
2−Version: 4.2.2.0
2+Version: 4.3.0.0
3
3
4Synopsis: A static website compiler library
4Synopsis: A static website compiler library
5Description:
5Description:
src/Hakyll/Core/Util/Parser.hs+1−1
@@ -22,4 +22,4 @@ metadataKey = do
22
22
23--------------------------------------------------------------------------------
23--------------------------------------------------------------------------------
24reservedKeys :: [String]
24reservedKeys :: [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
87 context' = unContext (context `mappend` missingField)
87 context' = unContext (context `mappend` missingField)
88 go = liftM concat . mapM applyElem . unTemplate
88 go = liftM concat . mapM applyElem . unTemplate
89
89
90− applyElem (Chunk c) = return c
90+ applyElem (Chunk c) = return c
91+
91− applyElem Escaped = return "$"
92+ applyElem Escaped = return "$"
93+
92− applyElem (Key k) = context' k x >>= getString k
94+ applyElem (Key k) = context' k x >>= getString k
95+
93 applyElem (If k t mf) = (context' k x >> go t) `catchError` handler
96 applyElem (If k t mf) = (context' k x >> go t) `catchError` handler
94 where
97 where
95 handler _ = case mf of
98 handler _ = case mf of
96 Nothing -> return ""
99 Nothing -> return ""
97 Just f -> go f
100 Just f -> go f
101+
98 applyElem (For k b s) = context' k x >>= \cf -> case cf of
102 applyElem (For k b s) = context' k x >>= \cf -> case cf of
99 StringField _ -> fail $
103 StringField _ -> fail $
100 "Hakyll.Web.Template.applyTemplateWith: expected ListField but " ++
104 "Hakyll.Web.Template.applyTemplateWith: expected ListField but " ++
@@ -104,6 +108,10 @@ applyTemplate' tpl context x = go tpl
104 bs <- mapM (applyTemplate' b c) xs
108 bs <- mapM (applyTemplate' b c) xs
105 return $ intercalate sep bs
109 return $ intercalate sep bs
106
110
111+ applyElem (Partial p) = do
112+ tpl' <- loadBody (fromFilePath p)
113+ applyTemplate' tpl' context x
114+
107 getString _ (StringField s) = return s
115 getString _ (StringField s) = return s
108 getString k (ListField _ _) = fail $
116 getString k (ListField _ _) = fail $
109 "Hakyll.Web.Template.applyTemplateWith: expected StringField but " ++
117 "Hakyll.Web.Template.applyTemplateWith: expected StringField but " ++
src/Hakyll/Web/Template/Internal.hs+4−1
@@ -39,6 +39,7 @@ data TemplateElement
39 | Escaped
39 | Escaped
40 | If String Template (Maybe Template) -- key, then branch, else branch
40 | If String Template (Maybe Template) -- key, then branch, else branch
41 | For String Template (Maybe Template) -- key, body, separator
41 | For String Template (Maybe Template) -- key, body, separator
42+ | Partial String -- filename
42 deriving (Show, Eq, Typeable)
43 deriving (Show, Eq, Typeable)
43
44
44
45
@@ -49,12 +50,14 @@ instance Binary TemplateElement where
49 put (Escaped) = putWord8 2
50 put (Escaped) = putWord8 2
50 put (If key t f) = putWord8 3 >> put key >> put t >> put f
51 put (If key t f) = putWord8 3 >> put key >> put t >> put f
51 put (For key b s) = putWord8 4 >> put key >> put b >> put s
52 put (For key b s) = putWord8 4 >> put key >> put b >> put s
53+ put (Partial p) = putWord8 5 >> put p
52
54
53 get = getWord8 >>= \tag -> case tag of
55 get = getWord8 >>= \tag -> case tag of
54 0 -> Chunk <$> get
56 0 -> Chunk <$> get
55 1 -> Key <$> get
57 1 -> Key <$> get
56 2 -> pure Escaped
58 2 -> pure Escaped
57− 3 -> If <$> get <*> get <*> get
59+ 3 -> If <$> get <*> get <*> get
58 4 -> For <$> get <*> get <*> get
60 4 -> For <$> get <*> get <*> get
61+ 5 -> Partial <$> get
59 _ -> error $
62 _ -> error $
60 "Hakyll.Web.Template.Internal: Error reading cached template"
63 "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
27--------------------------------------------------------------------------------
27--------------------------------------------------------------------------------
28template :: Parser Template
28template :: Parser Template
29template = Template <$>
29template = Template <$>
30− (many1 $ chunk <|> escaped <|> conditional <|> for <|> key)
30+ (many1 $ chunk <|> escaped <|> conditional <|> for <|> partial <|> key)
31
31
32
32
33--------------------------------------------------------------------------------
33--------------------------------------------------------------------------------
@@ -64,6 +64,15 @@ for = try $ do
64 return $ For i body sep
64 return $ For i body sep
65
65
66
66
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+
67--------------------------------------------------------------------------------
76--------------------------------------------------------------------------------
68key :: Parser TemplateElement
77key :: Parser TemplateElement
69key = try $ do
78key = try $ do
@@ -71,3 +80,14 @@ key = try $ do
71 k <- metadataKey
80 k <- metadataKey
72 void $ char '$'
81 void $ char '$'
73 return $ Key k
82 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