1 module Rakka.Environment
9 import Control.Arrow.ArrowList
10 import qualified Data.Map as M
12 import qualified Network.HTTP.Lucu.Config as LC
15 import Rakka.SystemConfig
16 import Rakka.Wiki.Engine
17 import Rakka.Wiki.Interpreter
18 import qualified Rakka.Wiki.Interpreter.Base as Base
19 import qualified Rakka.Wiki.Interpreter.Image as Image
20 import qualified Rakka.Wiki.Interpreter.PageList as PageList
21 import qualified Rakka.Wiki.Interpreter.Trackback as Trackback
22 import qualified Rakka.Wiki.Interpreter.Outline as Outline
23 import Subversion.Repository
24 import System.Directory
25 import System.FilePath
27 import System.Log.Logger
28 import Text.HyperEstraier
29 import Text.XML.HXT.Arrow.XmlIOStateArrow
33 logger = "Rakka.Environment"
36 data Environment = Environment {
37 envLocalStateDir :: !FilePath
38 , envLucuConf :: !LC.Config
39 , envRepository :: !Repository
40 , envSysConf :: !SystemConfig
41 , envStorage :: !Storage
42 , envInterpTable :: !InterpTable
46 setupEnv :: FilePath -> PortNumber -> IO Environment
47 setupEnv lsdir portNum
48 = do let lucuConf = LC.defaultConfig {
49 LC.cnfServerPort = PortNumber portNum
51 reposPath = lsdir </> "repos"
52 interpTable = mkInterpTable
54 reposExist <- doesDirectoryExist reposPath
55 repos <- if reposExist then
56 do debugM logger ("Found a subversion repository on " ++ reposPath)
57 openRepository reposPath
59 do noticeM logger ("Creating a subversion repository on " ++ reposPath)
60 createRepository reposPath [] []
61 sysConf <- mkSystemConfig lucuConf repos
62 storage <- mkStorage lsdir repos (makeDraft' interpTable)
64 return $ Environment {
65 envLocalStateDir = lsdir
66 , envLucuConf = lucuConf
67 , envRepository = repos
68 , envSysConf = sysConf
69 , envStorage = storage
70 , envInterpTable = interpTable
73 makeDraft' :: InterpTable -> Page -> IO Document
74 makeDraft' interpTable page
75 = do [doc] <- runX ( setErrorMsgHandler False fail
86 mkInterpTable :: InterpTable
87 mkInterpTable = listToTable $
88 foldl (++) [] [ Base.interpreters
90 , PageList.interpreters
91 , Trackback.interpreters
92 , Outline.interpreters
95 listToTable :: [Interpreter] -> InterpTable
97 = M.fromList [ (commandName x, x) | x <- xs ]