@@ -27,6 +27,7 @@ import Data.Word
2727import Data.Traversable hiding (mapM)
2828import System.IO
2929import System.Directory
30+import System.FilePath
3031
3132import qualified Data.Map.Strict as M
3233import qualified Data.Text as T
@@ -113,6 +114,10 @@ codegenJS_all target definitions includes libs filename outputType = do
113114 let js = concatMap (translateDecl info) bytecode
114115 let full = concatMap processFunction js
115116 let code = deadCodeElim full
117+ let ext = takeExtension filename
118+ let isHtml = target == JavaScript && ext == ".html"
119+ let htmlPrologue = T.pack "<!doctype html><html><head><script>\n"
120+ let htmlEpilogue = T.pack "\n</script></head><body></body></html>"
116121 let (cons, opt) = optimizeConstructors code
117122 let (header, rt) = case target of
118123 Node -> ("#!/usr/bin/env node\n", "-node")
@@ -132,12 +137,15 @@ codegenJS_all target definitions includes libs filename outputType = do
132137 ++ idrRuntime
133138 ++ tgtRuntime
134139 )
135− writeSourceText filename ( T.pack runtime
136− `T.append` T.concat (map compileJS opt)
137− `T.append` T.concat (map compileJS cons)
138− `T.append` main
139− `T.append` invokeMain
140− )
140+ let jsSource = T.pack runtime
141+ `T.append` T.concat (map compileJS opt)
142+ `T.append` T.concat (map compileJS cons)
143+ `T.append` main
144+ `T.append` invokeMain
145+ let source = if isHtml
146+ then htmlPrologue `T.append` jsSource `T.append` htmlEpilogue
147+ else jsSource
148+ writeSourceText filename source
141149 setPermissions filename (emptyPermissions { readable = True
142150 , executable = target == Node
143151 , writable = True