]> gitweb @ CieloNegro.org - Rakka.git/blob - Rakka/Environment.hs
The big change
[Rakka.git] / Rakka / Environment.hs
1 module Rakka.Environment
2     ( Environment(..)
3     , InterpTable
4     , setupEnv
5     )
6     where
7
8 import           Control.Arrow
9 import           Control.Arrow.ArrowList
10 import qualified Data.Map as M
11 import           Network
12 import qualified Network.HTTP.Lucu.Config as LC
13 import           Rakka.Page
14 import           Rakka.Storage
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
26 import           System.IO
27 import           System.Log.Logger
28 import           Text.HyperEstraier
29 import           Text.XML.HXT.Arrow.XmlIOStateArrow
30
31
32 logger = "Rakka.Environment"
33
34
35 data Environment = Environment {
36       envLocalStateDir :: !FilePath
37     , envLucuConf      :: !LC.Config
38     , envRepository    :: !Repository
39     , envSysConf       :: !SystemConfig
40     , envStorage       :: !Storage
41     , envInterpTable   :: !InterpTable
42     }
43
44
45 setupEnv :: FilePath -> PortNumber -> IO Environment
46 setupEnv lsdir portNum
47     = do let lucuConf    = LC.defaultConfig {
48                              LC.cnfServerPort = PortNumber portNum
49                            }
50              reposPath   = lsdir </> "repos"
51              interpTable = mkInterpTable
52          
53          reposExist  <- doesDirectoryExist reposPath
54          repos       <- if reposExist then
55                             do debugM logger ("Found a subversion repository on " ++ reposPath)
56                                openRepository reposPath
57                         else
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)
62
63          return $ Environment {
64                       envLocalStateDir = lsdir
65                     , envLucuConf      = lucuConf
66                     , envRepository    = repos
67                     , envSysConf       = sysConf
68                     , envStorage       = storage
69                     , envInterpTable   = interpTable
70                     }
71     where
72       makeDraft' :: InterpTable -> Page -> IO Document
73       makeDraft' interpTable page
74           = do [doc] <- runX ( setErrorMsgHandler False fail
75                                >>>
76                                constA page
77                                >>>
78                                xmlizePage
79                                >>>
80                                makeDraft interpTable
81                              )
82                return doc
83
84
85 mkInterpTable :: InterpTable
86 mkInterpTable = listToTable $
87                 foldl (++) [] [ Base.interpreters
88                               , Image.interpreters
89                               , PageList.interpreters
90                               , Trackback.interpreters
91                               , Outline.interpreters
92                               ]
93     where
94       listToTable :: [Interpreter] -> InterpTable
95       listToTable xs
96           = M.fromList [ (commandName x, x) | x <- xs ]