Poor man's here document
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
main = do
doc <- here "DATA" "Here.hs" [("variable","some"),("substitution","variables")]
putStrLn doc
html <- here "HTML" "Here.hs" [("code",doc)]
putStrLn html
here tag file env = do
txt <- readFile file
let (_,_:rest) = span (/="{- "++tag++" START") (lines txt)
(doc,_) = span (/=" "++tag++" END -}") rest
return $ unlines $ map subst doc
where
subst ('$':'(':cs) = case span (/=')') cs of
(var,')':cs) -> maybe ("$("++var++")") id (lookup var env) ++ subst cs
_ -> '$':'(':subst cs
subst (c:cs) = c:subst cs
subst "" = ""
{- DATA START
this is a poor man's here-document
with quotes ", and escapes \,
and line-breaks, and layout
without escaping \" \\ \n,
without concatenation.
oh, and with $(variable) $(substitution), $(too).
DATA END -}
{- HTML START
<html>
<head><title>very important page</title></head>
<body>
<verb>
$(code)
</verb>
</body>
</html>
HTML END -}
See Also