@@ -21,14 +21,18 @@ readTemplate = Template . readTemplate'
21 readTemplate' [] = []
21 readTemplate' [] = []
22 readTemplate' string
22 readTemplate' string
23 | "$$" `isPrefixOf` string =
23 | "$$" `isPrefixOf` string =
24− EscapeCharacter : (readTemplate' $ drop 2 string)
24+ let (key, rest) = readIdentifier $ drop 2 string
25+ in Escaped key : readTemplate' rest
25 | "$" `isPrefixOf` string =
26 | "$" `isPrefixOf` string =
26− let (key, rest) = span isAlphaNum $ drop 1 string
27+ let (key, rest) = readIdentifier $ drop 1 string
27 in Identifier key : readTemplate' rest
28 in Identifier key : readTemplate' rest
28 | otherwise =
29 | otherwise =
29 let (chunk, rest) = break (== '$') string
30 let (chunk, rest) = break (== '$') string
30 in Chunk chunk : readTemplate' rest
31 in Chunk chunk : readTemplate' rest
33+ -- Parse an identifier into (identifier, rest)
34+ readIdentifier = span isAlphaNum
32-- | Substitutes @$identifiers@ in the given @Template@ by values from the given
36-- | Substitutes @$identifiers@ in the given @Template@ by values from the given
33-- "Page". When a key is not found, it is left as it is. You can specify
37-- "Page". When a key is not found, it is left as it is. You can specify
34-- the characters used to replace escaped dollars (@$$@) here.
38-- the characters used to replace escaped dollars (@$$@) here.
@@ -40,7 +44,7 @@ applyTemplate template page =
40 substitute (Chunk chunk) = chunk
44 substitute (Chunk chunk) = chunk
41 substitute (Identifier key) =
45 substitute (Identifier key) =
42 fromMaybe ('$' : key) $ M.lookup key $ toMap page
46 fromMaybe ('$' : key) $ M.lookup key $ toMap page
43− substitute (EscapeCharacter) = "$"
47+ substitute (Escaped key) = '$' : key
45-- | Apply a page as it's own template. This is often very useful to fill in
49-- | Apply a page as it's own template. This is often very useful to fill in
46-- certain keys like @$root@ and @$url@.
50-- certain keys like @$root@ and @$url@.