2012-06-14 08:43:04 +00:00
{- # LANGUAGE DeriveDataTypeable # -}
2012-04-19 06:32:10 +00:00
module Main where
2012-06-14 08:43:04 +00:00
import Data.Either ( lefts , rights )
import Data.List ( intersect , intercalate )
import Data.Maybe ( fromMaybe )
2012-10-03 07:17:09 +00:00
import Data.Version ( showVersion )
2012-06-14 08:43:04 +00:00
import System.Console.CmdArgs
2013-03-14 08:04:51 +00:00
import System.Exit
2012-11-25 22:08:10 +00:00
import System.FilePath
2012-06-14 08:43:04 +00:00
import Text.Blaze.Html.Renderer.String ( renderHtml )
2012-09-11 09:53:45 +00:00
import qualified Text.Jasmine as JS
import qualified Data.ByteString.Lazy.Char8 as BS
2012-06-14 08:43:04 +00:00
import Ast
import Initialize
2012-05-29 18:25:43 +00:00
import CompileToJS
import GenerateHtml
2012-06-14 08:43:04 +00:00
import Paths_Elm
data ELM =
ELM { make :: Bool
, files :: [ FilePath ]
, runtime :: Maybe FilePath
2012-06-14 10:02:33 +00:00
, separate_js :: Bool
, only_js :: Bool
2012-06-28 08:52:47 +00:00
, import_js :: [ FilePath ]
2012-06-29 21:19:19 +00:00
, generate_noscript :: Bool
2012-09-11 09:53:45 +00:00
, minify :: Bool
2012-11-25 15:17:40 +00:00
, output_directory :: Maybe FilePath
2012-06-14 08:43:04 +00:00
}
deriving ( Data , Typeable , Show , Eq )
elm = ELM { make = False &= help " automatically compile dependencies. "
, files = def &= args &= typ " FILES "
2012-06-28 08:52:47 +00:00
, runtime = Nothing &= typFile &=
2012-06-14 08:43:04 +00:00
help " Specify a custom location for Elm's runtime system. "
2012-06-14 10:02:33 +00:00
, separate_js = False &= help " Compile to separate HTML and JS files. "
, only_js = False &= help " Compile only to JavaScript. "
2012-06-28 08:52:47 +00:00
, import_js = [] &= typFile &= help " Include a JavaScript file before the body of the Elm program. Can be used many times. Files will be included in the given order. "
2012-08-11 22:02:49 +00:00
, generate_noscript = True &= help " Add generated <noscript> tag to HTML output. "
2012-09-11 09:53:45 +00:00
, minify = False &= help " Minify generated JavaScript "
2012-11-25 15:17:40 +00:00
, output_directory = Nothing &= typFile &= help " Output files to directory specified. Defaults to the location of original file. "
2012-06-14 08:43:04 +00:00
} &=
help " Compile Elm programs to HTML, CSS, and JavaScript. " &=
2012-10-03 07:17:09 +00:00
summary ( " The Elm Compiler " ++ showVersion version ++ " , (c) Evan Czaplicki " )
2012-04-19 06:32:10 +00:00
2012-06-14 08:43:04 +00:00
main = do
args <- cmdArgs elm
2013-03-12 07:48:11 +00:00
mini <- getDataFileName " elm-runtime.js "
2012-06-14 08:43:04 +00:00
compileArgs mini args
2012-11-25 15:17:40 +00:00
compileArgs mini ( ELM _ [] _ _ _ _ _ _ _ ) =
2012-06-14 08:43:04 +00:00
putStrLn " Usage: elm [OPTIONS] [FILES] \ n For more help: elm --help "
2012-11-25 15:17:40 +00:00
compileArgs mini ( ELM make files rtLoc split only js nscrpt isMini outputDir ) =
2013-02-08 09:33:21 +00:00
mapM_ ( fileTo isMini make what js nscrpt outputDir loc ) files
where loc = fromMaybe mini rtLoc
what | only = JS
| split = Split
| otherwise = HTML
2012-06-14 08:43:04 +00:00
2012-06-14 10:02:33 +00:00
data What = JS | HTML | Split
2013-02-08 09:33:21 +00:00
fileTo isMini make what jsFiles noscript outputDir rtLoc file = do
let jsStyle = if isMini then Minified else Readable
formatJS = if isMini then BS . unpack . JS . minify . BS . pack else id
2013-02-27 07:33:47 +00:00
ems <- if make then build file else do src <- readFile file
return ( fmap ( : [] ) ( buildFromSource src ) )
2012-06-28 08:52:47 +00:00
jss <- concat ` fmap ` mapM readFile jsFiles
2012-06-14 08:43:04 +00:00
case ems of
2013-03-14 08:04:51 +00:00
Left err -> do putStrLn $ " Error while compiling " ++ file ++ " : \ n " ++ err
exitFailure
2012-06-14 08:43:04 +00:00
Right ms ->
2012-11-25 22:08:10 +00:00
let path = fromMaybe " " outputDir </> file
js = replaceExtension path " .js "
html = replaceExtension path " .html "
2013-02-27 07:33:47 +00:00
txt = jss ++ concatMap jsModule ms
2012-11-29 06:16:08 +00:00
in case what of
2013-02-08 09:33:21 +00:00
JS -> writeFile js ( formatJS txt )
HTML -> writeFile html . renderHtml $
2013-02-27 07:33:47 +00:00
modulesToHtml jsStyle " " rtLoc jss noscript ms
2013-02-08 09:33:21 +00:00
Split ->
2013-02-27 07:33:47 +00:00
do writeFile html . renderHtml $ linkedHtml rtLoc js ms
2013-02-08 09:33:21 +00:00
writeFile js ( formatJS txt )