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
32 logger = "Rakka.Environment"
35 data Environment = Environment {
36 envLocalStateDir :: !FilePath
37 , envLucuConf :: !LC.Config
38 , envRepository :: !Repository
39 , envSysConf :: !SystemConfig
40 , envStorage :: !Storage
41 , envInterpTable :: !InterpTable
45 setupEnv :: FilePath -> PortNumber -> IO Environment
46 setupEnv lsdir portNum
47 = do let lucuConf = LC.defaultConfig {
48 LC.cnfServerPort = PortNumber portNum
50 reposPath = lsdir </> "repos"
51 interpTable = mkInterpTable
53 reposExist <- doesDirectoryExist reposPath
54 repos <- if reposExist then
55 do debugM logger ("Found a subversion repository on " ++ reposPath)
56 openRepository reposPath
58 do noticeM logger ("Creating a subversion repository on " ++ reposPath)
59 createRepository reposPath [] []
60 sysConf <- mkSystemConfig lucuConf repos
61 storage <- mkStorage lsdir repos (makeDraft' interpTable)
63 return $ Environment {
64 envLocalStateDir = lsdir
65 , envLucuConf = lucuConf
66 , envRepository = repos
67 , envSysConf = sysConf
68 , envStorage = storage
69 , envInterpTable = interpTable
72 makeDraft' :: InterpTable -> Page -> IO Document
73 makeDraft' interpTable page
74 = do [doc] <- runX ( setErrorMsgHandler False fail
85 mkInterpTable :: InterpTable
86 mkInterpTable = listToTable $
87 foldl (++) [] [ Base.interpreters
89 , PageList.interpreters
90 , Trackback.interpreters
91 , Outline.interpreters
94 listToTable :: [Interpreter] -> InterpTable
96 = M.fromList [ (commandName x, x) | x <- xs ]