]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Environment.hs
merge branch origin/master
[Rakka.git] / Rakka / Environment.hs
index 881a9e69ef40fe3f8023fb81aafc80bb90f08b2f..2de28b2ce2bf8df28106d664b0bd4abde30f742e 100644 (file)
@@ -1,68 +1,95 @@
+{-# LANGUAGE
+    UnicodeSyntax
+  #-}
 module Rakka.Environment
     ( Environment(..)
+    , InterpTable
     , setupEnv
-
-    , getSiteName
-    , getSiteNameA
-
-    , getBaseURI
-    , getBaseURIA
     )
     where
-
-import           Control.Arrow.ArrowIO
-import qualified Data.ByteString.Char8 as C8
-import           Data.Maybe
-import           Network
+import Control.Arrow.ArrowList
+import Control.Arrow.Unicode
+import qualified Data.Map as M
+import Network.Socket
 import qualified Network.HTTP.Lucu.Config as LC
-import           Network.URI
+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.Outline   as Outline
+import           Subversion.Repository
+import           System.Directory
+import           System.FilePath
+import           System.Log.Logger
+import           Text.HyperEstraier
+import Text.XML.HXT.Arrow.XmlState
+
+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 lsdir portNum
-    = do let lucuConf = LC.defaultConfig {
-                          LC.cnfServerPort = PortNumber portNum
-                        }
-         storage <- mkStorage -- FIXME
-         return $ Environment {
+setupEnv ∷ FilePath → ServiceName → IO Environment
+setupEnv lsdir port
+    = do let lucuConf    = LC.defaultConfig {
+                             LC.cnfServerPort = port
+                           }
+             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
+                    , envInterpTable   = interpTable
+                    , envAuthDB        = authDB
                     }
-
-
-getSiteName :: Environment -> IO String
-getSiteName env
-    = return "Rakka" -- FIXME
-
-
-getSiteNameA :: ArrowIO a => Environment -> a b String
-getSiteNameA = arrIO0 . getSiteName
-
-
-getBaseURI :: Environment -> IO URI
-getBaseURI env
-    = do let conf = envLucuConf env
-             host = C8.unpack $ LC.cnfServerHost conf
-             port = case LC.cnfServerPort conf of
-                      PortNumber num -> fromIntegral num
-             
-             defaultURI
-                  = "http://" ++ host ++
-                    (if port == 80
-                     then ""
-                     else ':' : show port) ++ "/"
-
-         return $ fromJust $ parseURI defaultURI -- FIXME
-
-
-getBaseURIA :: ArrowIO a => Environment -> a b URI
-getBaseURIA = arrIO0 . getBaseURI
\ No newline at end of file
+    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 $
+                concat [ Base.interpreters
+                       , Image.interpreters
+                       , PageList.interpreters
+                       , Outline.interpreters
+                       ]
+    where
+      listToTable ∷ [Interpreter] → InterpTable
+      listToTable xs
+          = M.fromList [ (commandName x, x) | x ← xs ]