X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FEnvironment.hs;h=8d3c16c04fec4e430a286ff91643b579ec7b8341;hb=223d4df57fa1371945075d4d2714e5f36c1fc5dd;hp=e793d0001f401b7e07a1c0b4fd9c38bc10787a4b;hpb=484e15845d9c06d0fa62044d3b6b3ff8c78a6e04;p=Rakka.git diff --git a/Rakka/Environment.hs b/Rakka/Environment.hs index e793d00..8d3c16c 100644 --- a/Rakka/Environment.hs +++ b/Rakka/Environment.hs @@ -1,29 +1,100 @@ module Rakka.Environment ( Environment(..) + , InterpTable , setupEnv ) where -import Network +import Control.Arrow +import Control.Arrow.ArrowList +import qualified Data.Map as M +import Network.Socket import qualified Network.HTTP.Lucu.Config as LC +import Rakka.Authorization +import Rakka.Page import Rakka.Storage +import Rakka.SystemConfig +import Rakka.Wiki.Engine +import Rakka.Wiki.Interpreter +import qualified Rakka.Wiki.Interpreter.Base as Base +import qualified Rakka.Wiki.Interpreter.Image as Image +import qualified Rakka.Wiki.Interpreter.PageList as PageList +--import qualified Rakka.Wiki.Interpreter.Trackback as Trackback +import qualified Rakka.Wiki.Interpreter.Outline as Outline +import Subversion.Repository +import System.Directory +import System.FilePath +import System.Log.Logger +import Text.HyperEstraier +import Text.XML.HXT.Arrow.XmlIOStateArrow + + +logger :: String +logger = "Rakka.Environment" data Environment = Environment { - envLocalStateDir :: FilePath - , envLucuConf :: LC.Config - , envStorage :: Storage + envLocalStateDir :: !FilePath + , envLucuConf :: !LC.Config + , envRepository :: !Repository + , envSysConf :: !SystemConfig + , envStorage :: !Storage + , envInterpTable :: !InterpTable + , envAuthDB :: !AuthDB } -setupEnv :: FilePath -> PortNumber -> IO Environment +setupEnv :: FilePath -> ServiceName -> IO Environment setupEnv lsdir portNum - = do let lucuConf = LC.defaultConfig { - LC.cnfServerPort = PortNumber portNum - } - storage <- mkStorage -- FIXME - return $ Environment { + = do let lucuConf = LC.defaultConfig { + LC.cnfServerPort = portNum + } + reposPath = lsdir "repos" + interpTable = mkInterpTable + + reposExist <- doesDirectoryExist reposPath + repos <- if reposExist then + do debugM logger ("Found a subversion repository on " ++ reposPath) + openRepository reposPath + else + do noticeM logger ("Creating a subversion repository on " ++ reposPath) + createRepository reposPath [] [] + sysConf <- mkSystemConfig lucuConf repos + storage <- mkStorage lsdir repos (makeDraft' interpTable) + authDB <- mkAuthDB lsdir + + return Environment { envLocalStateDir = lsdir , envLucuConf = lucuConf + , envRepository = repos + , envSysConf = sysConf , envStorage = storage - } \ No newline at end of file + , envInterpTable = interpTable + , envAuthDB = authDB + } + where + makeDraft' :: InterpTable -> Page -> IO Document + makeDraft' interpTable page + = do [doc] <- runX ( setErrorMsgHandler False fail + >>> + constA page + >>> + xmlizePage + >>> + makeDraft interpTable + ) + return doc + + +mkInterpTable :: InterpTable +mkInterpTable = listToTable $ + foldl (++) [] [ Base.interpreters + , Image.interpreters + , PageList.interpreters + --, Trackback.interpreters + , Outline.interpreters + ] + where + listToTable :: [Interpreter] -> InterpTable + listToTable xs + = M.fromList [ (commandName x, x) | x <- xs ]