Poor man's here document

From HaskellWiki
Revision as of 10:20, 17 April 2007 by Tphyahoo (talk | contribs)
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.
-- Poor man's heredoc / here document
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