diff --git a/CodeGen.hs b/CodeGen.hs index 632c2a7c..878159ad 100644 --- a/CodeGen.hs +++ b/CodeGen.hs @@ -1,7 +1,7 @@ {-# LANGUAGE TemplateHaskell #-} -- | A code generation template haskell. Everything is taken as literal text, -- with ~var~ variable interpolation. -module CodeGen (codegen) where +module CodeGen (codegen, codegenDir) where import Language.Haskell.TH.Syntax import Text.ParserCombinators.Parsec @@ -11,9 +11,9 @@ import qualified Data.Text.Lazy.Encoding as LT data Token = VarToken String | LitToken String | EmptyToken -codegen :: FilePath -> Q Exp -codegen fp = do - s' <- qRunIO $ L.readFile $ "scaffold/" ++ fp ++ ".cg" +codegenDir :: FilePath -> FilePath -> Q Exp +codegenDir dir fp = do + s' <- qRunIO $ L.readFile $ (dir ++ "/" ++ fp ++ ".cg") let s = init $ LT.unpack $ LT.decodeUtf8 s' case parse (many parseToken) s s of Left e -> error $ show e @@ -22,6 +22,9 @@ codegen fp = do concat' <- [|concat|] return $ concat' `AppE` ListE tokens'' +codegen :: FilePath -> Q Exp +codegen fp = codegenDir "scaffold" fp + toExp :: Token -> Exp toExp (LitToken s) = LitE $ StringL s toExp (VarToken s) = VarE $ mkName s diff --git a/scaffold/database.cg b/input/database.cg similarity index 100% rename from scaffold/database.cg rename to input/database.cg diff --git a/scaffold/dir-name.cg b/input/dir-name.cg similarity index 100% rename from scaffold/dir-name.cg rename to input/dir-name.cg diff --git a/scaffold/project-name.cg b/input/project-name.cg similarity index 100% rename from scaffold/project-name.cg rename to input/project-name.cg diff --git a/scaffold/site-arg.cg b/input/site-arg.cg similarity index 100% rename from scaffold/site-arg.cg rename to input/site-arg.cg diff --git a/scaffold/welcome.cg b/input/welcome.cg similarity index 100% rename from scaffold/welcome.cg rename to input/welcome.cg diff --git a/scaffold.hs b/scaffold.hs index fead50e9..42565b76 100644 --- a/scaffold.hs +++ b/scaffold.hs @@ -53,10 +53,10 @@ puts s = putStr s >> hFlush stdout scaffold :: IO () scaffold = do - puts $(codegen "welcome") + puts $(codegenDir "input" "welcome") name <- getLine - puts $(codegen "project-name") + puts $(codegenDir "input" "project-name") let validPN c | 'A' <= c && c <= 'Z' = True | 'a' <= c && c <= 'z' = True @@ -66,11 +66,11 @@ scaffold = do project <- prompt $ all validPN let dir = project - puts $(codegen "site-arg") + puts $(codegenDir "input" "site-arg") let isUpperAZ c = 'A' <= c && c <= 'Z' sitearg <- prompt $ \s -> not (null s) && all validPN s && isUpperAZ (head s) && s /= "Main" - puts $(codegen "database") + puts $(codegenDir "input" "database") backendS <- prompt $ flip elem ["s", "p", "m"] let pconn1 = $(codegen "pconn1") let (backendLower, upper, connstr, importDB) = @@ -100,38 +100,38 @@ scaffold = do mkDir "config" case backendS of - "s" -> writeFile' ("config/" ++ backendLower ++ ".yml") $(codegen ("sqlite_yml")) - "p" -> writeFile' ("config/" ++ backendLower ++ ".yml") $(codegen ("postgresql_yml")) + "s" -> writeFile' ("config/" ++ backendLower ++ ".yml") $(codegen ("config/sqlite.yml")) + "p" -> writeFile' ("config/" ++ backendLower ++ ".yml") $(codegen ("config/postgresql.yml")) "m" -> return () _ -> error $ "Invalid backend: " ++ backendS - writeFile' ("config/settings.yml") $(codegen "settings_yml") - writeFile' ("config/" ++ project ++ ".hs") $(codegen "test_hs") - writeFile' (project ++ ".cabal") $ if backendS == "m" then $(codegen "mini-cabal") else $(codegen "cabal") - writeFile' ".ghci" $(codegen "dotghci") + writeFile' ("config/settings.yml") $(codegen "config/settings.yml") + writeFile' ("config/" ++ project ++ ".hs") $(codegen "project.hs") + writeFile' (project ++ ".cabal") $ if backendS == "m" then $(codegen "mini/cabal") else $(codegen "cabal") + writeFile' ".ghci" $(codegen ".ghci") writeFile' "LICENSE" $(codegen "LICENSE") - writeFile' (sitearg ++ ".hs") $ if backendS == "m" then $(codegen "mini-sitearg_hs") else $(codegen "sitearg_hs") - writeFile' "Controller.hs" $ if backendS == "m" then $(codegen "mini-Controller_hs") else $(codegen "Controller_hs") - writeFile' "Handler/Root.hs" $ if backendS == "m" then $(codegen "mini-Root_hs") else $(codegen "Root_hs") - when (backendS /= "m") $ writeFile' "Model.hs" $(codegen "Model_hs") - writeFile' "config/Settings.hs" $ if backendS == "m" then $(codegen "mini-Settings_hs") else $(codegen "Settings_hs") - writeFile' "config/StaticFiles.hs" $(codegen "StaticFiles_hs") + writeFile' (sitearg ++ ".hs") $ if backendS == "m" then $(codegen "mini/sitearg.hs") else $(codegen "sitearg.hs") + writeFile' "Controller.hs" $ if backendS == "m" then $(codegen "mini/Controller.hs") else $(codegen "Controller.hs") + writeFile' "Handler/Root.hs" $ if backendS == "m" then $(codegen "mini/Handler/Root.hs") else $(codegen "Handler/Root.hs") + when (backendS /= "m") $ writeFile' "Model.hs" $(codegen "Model.hs") + writeFile' "config/Settings.hs" $ if backendS == "m" then $(codegen "mini/config/Settings.hs") else $(codegen "config/Settings.hs") + writeFile' "config/StaticFiles.hs" $(codegen "config/StaticFiles.hs") writeFile' "cassius/default-layout.cassius" - $(codegen "default-layout_cassius") + $(codegen "cassius/default-layout.cassius") writeFile' "hamlet/default-layout.hamlet" - $(codegen "default-layout_hamlet") + $(codegen "hamlet/default-layout.hamlet") writeFile' "hamlet/boilerplate-layout.hamlet" - $(codegen "boilerplate-layout_hamlet") + $(codegen "hamlet/boilerplate-layout.hamlet") writeFile' "static/css/html5boilerplate.css" - $(codegen "boilerplate_css") - writeFile' "hamlet/homepage.hamlet" $ if backendS == "m" then $(codegen "mini-homepage_hamlet") else $(codegen "homepage_hamlet") - writeFile' "config/routes" $ if backendS == "m" then $(codegen "mini-routes") else $(codegen "routes") - writeFile' "cassius/homepage.cassius" $(codegen "homepage_cassius") - writeFile' "julius/homepage.julius" $(codegen "homepage_julius") - unless (backendS == "m") $ writeFile' "config/models" $(codegen "entities") + $(codegen "static/css/html5boilerplate.css") + writeFile' "hamlet/homepage.hamlet" $ if backendS == "m" then $(codegen "mini/hamlet/homepage.hamlet") else $(codegen "hamlet/homepage.hamlet") + writeFile' "config/routes" $ if backendS == "m" then $(codegen "mini/config/routes") else $(codegen "config/routes") + writeFile' "cassius/homepage.cassius" $(codegen "cassius/homepage.cassius") + writeFile' "julius/homepage.julius" $(codegen "julius/homepage.julius") + unless (backendS == "m") $ writeFile' "config/models" $(codegen "config/models") S.writeFile (dir ++ "/config/favicon.ico") - $(runIO (S.readFile "scaffold/favicon_ico.cg") >>= \bs -> do + $(runIO (S.readFile "scaffold/config/favicon.ico.cg") >>= \bs -> do pack <- [|S.pack|] return $ pack `AppE` LitE (StringL $ S.unpack bs)) diff --git a/scaffold/dotghci.cg b/scaffold/.ghci.cg similarity index 100% rename from scaffold/dotghci.cg rename to scaffold/.ghci.cg diff --git a/scaffold/Controller_hs.cg b/scaffold/Controller.hs.cg similarity index 100% rename from scaffold/Controller_hs.cg rename to scaffold/Controller.hs.cg diff --git a/scaffold/Root_hs.cg b/scaffold/Handler/Root.hs.cg similarity index 100% rename from scaffold/Root_hs.cg rename to scaffold/Handler/Root.hs.cg diff --git a/scaffold/Model_hs.cg b/scaffold/Model.hs.cg similarity index 100% rename from scaffold/Model_hs.cg rename to scaffold/Model.hs.cg diff --git a/scaffold/default-layout_cassius.cg b/scaffold/cassius/default-layout.cassius.cg similarity index 100% rename from scaffold/default-layout_cassius.cg rename to scaffold/cassius/default-layout.cassius.cg diff --git a/scaffold/homepage_cassius.cg b/scaffold/cassius/homepage.cassius.cg similarity index 100% rename from scaffold/homepage_cassius.cg rename to scaffold/cassius/homepage.cassius.cg diff --git a/scaffold/Settings_hs.cg b/scaffold/config/Settings.hs.cg similarity index 100% rename from scaffold/Settings_hs.cg rename to scaffold/config/Settings.hs.cg diff --git a/scaffold/StaticFiles_hs.cg b/scaffold/config/StaticFiles.hs.cg similarity index 100% rename from scaffold/StaticFiles_hs.cg rename to scaffold/config/StaticFiles.hs.cg diff --git a/scaffold/favicon_ico.cg b/scaffold/config/favicon.ico.cg similarity index 100% rename from scaffold/favicon_ico.cg rename to scaffold/config/favicon.ico.cg diff --git a/scaffold/entities.cg b/scaffold/config/models.cg similarity index 100% rename from scaffold/entities.cg rename to scaffold/config/models.cg diff --git a/scaffold/postgresql_yml.cg b/scaffold/config/postgresql.yml.cg similarity index 100% rename from scaffold/postgresql_yml.cg rename to scaffold/config/postgresql.yml.cg diff --git a/scaffold/routes.cg b/scaffold/config/routes.cg similarity index 100% rename from scaffold/routes.cg rename to scaffold/config/routes.cg diff --git a/scaffold/settings_yml.cg b/scaffold/config/settings.yml.cg similarity index 100% rename from scaffold/settings_yml.cg rename to scaffold/config/settings.yml.cg diff --git a/scaffold/sqlite_yml.cg b/scaffold/config/sqlite.yml.cg similarity index 100% rename from scaffold/sqlite_yml.cg rename to scaffold/config/sqlite.yml.cg diff --git a/scaffold/boilerplate-layout_hamlet.cg b/scaffold/hamlet/boilerplate-layout.hamlet.cg similarity index 100% rename from scaffold/boilerplate-layout_hamlet.cg rename to scaffold/hamlet/boilerplate-layout.hamlet.cg diff --git a/scaffold/default-layout_hamlet.cg b/scaffold/hamlet/default-layout.hamlet.cg similarity index 100% rename from scaffold/default-layout_hamlet.cg rename to scaffold/hamlet/default-layout.hamlet.cg diff --git a/scaffold/homepage_hamlet.cg b/scaffold/hamlet/homepage.hamlet.cg similarity index 100% rename from scaffold/homepage_hamlet.cg rename to scaffold/hamlet/homepage.hamlet.cg diff --git a/scaffold/homepage_julius.cg b/scaffold/julius/homepage.julius.cg similarity index 100% rename from scaffold/homepage_julius.cg rename to scaffold/julius/homepage.julius.cg diff --git a/scaffold/mini-Controller_hs.cg b/scaffold/mini/Controller.hs.cg similarity index 100% rename from scaffold/mini-Controller_hs.cg rename to scaffold/mini/Controller.hs.cg diff --git a/scaffold/mini-Root_hs.cg b/scaffold/mini/Handler/Root.hs.cg similarity index 100% rename from scaffold/mini-Root_hs.cg rename to scaffold/mini/Handler/Root.hs.cg diff --git a/scaffold/mini-cabal.cg b/scaffold/mini/cabal.cg similarity index 100% rename from scaffold/mini-cabal.cg rename to scaffold/mini/cabal.cg diff --git a/scaffold/mini-Settings_hs.cg b/scaffold/mini/config/Settings.hs.cg similarity index 100% rename from scaffold/mini-Settings_hs.cg rename to scaffold/mini/config/Settings.hs.cg diff --git a/scaffold/mini-routes.cg b/scaffold/mini/config/routes.cg similarity index 100% rename from scaffold/mini-routes.cg rename to scaffold/mini/config/routes.cg diff --git a/scaffold/mini-homepage_hamlet.cg b/scaffold/mini/hamlet/homepage.hamlet.cg similarity index 100% rename from scaffold/mini-homepage_hamlet.cg rename to scaffold/mini/hamlet/homepage.hamlet.cg diff --git a/scaffold/mini-sitearg_hs.cg b/scaffold/mini/sitearg.hs.cg similarity index 100% rename from scaffold/mini-sitearg_hs.cg rename to scaffold/mini/sitearg.hs.cg diff --git a/scaffold/test_hs.cg b/scaffold/project.hs.cg similarity index 100% rename from scaffold/test_hs.cg rename to scaffold/project.hs.cg diff --git a/scaffold/sitearg_hs.cg b/scaffold/sitearg.hs.cg similarity index 100% rename from scaffold/sitearg_hs.cg rename to scaffold/sitearg.hs.cg diff --git a/scaffold/boilerplate_css.cg b/scaffold/static/css/html5boilerplate.css.cg similarity index 100% rename from scaffold/boilerplate_css.cg rename to scaffold/static/css/html5boilerplate.css.cg