]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Resource/Render.hs
Resurrection from bitrot
[Rakka.git] / Rakka / Resource / Render.hs
index 01c75e105091994cb43a1c30abb3ab1ff3640cff..302360e645830239f1a4fa06394cb2981b78ecc3 100644 (file)
@@ -1,47 +1,49 @@
+{-# LANGUAGE
+    Arrows
+  , TypeOperators
+  , UnicodeSyntax
+  #-}
 module Rakka.Resource.Render
     ( resRender
     )
     where
-
+import qualified Codec.Binary.UTF8.String as UTF8
 import           Control.Arrow
 import           Control.Arrow.ArrowIO
 import           Control.Arrow.ArrowList
+import           Control.Arrow.Unicode
 import           Control.Monad.Trans
-import qualified Codec.Binary.UTF8.String as UTF8
+import Control.Monad.Unicode
 import qualified Data.ByteString.Lazy as Lazy
-import qualified Data.Map as M
+import Data.Text as T
 import           Network.HTTP.Lucu
-import           Network.HTTP.Lucu.Utils
+import           OpenSSL.EVP.Base64
+import Prelude.Unicode
 import           Rakka.Environment
 import           Rakka.Page
-import           Rakka.Wiki
+import           Rakka.Utils
 import           Rakka.Wiki.Engine
-import           Rakka.Wiki.Parser
-import           Rakka.Wiki.Interpreter
-import           Text.ParserCombinators.Parsec
+import           System.FilePath.Posix
 import           Text.XML.HXT.Arrow.Namespace
 import           Text.XML.HXT.Arrow.WriteDocument
 import           Text.XML.HXT.Arrow.XmlArrow
-import           Text.XML.HXT.Arrow.XmlIOStateArrow
+import Text.XML.HXT.Arrow.XmlState
 import           Text.XML.HXT.DOM.TypeDefs
-import           Text.XML.HXT.DOM.XmlKeywords
 
-
-resRender :: Environment -> ResourceDef
+resRender ∷ Environment → ResourceDef
 resRender env
     = ResourceDef {
         resUsesNativeThread = False
       , resIsGreedy         = True
       , resGet              = Nothing
       , resHead             = Nothing
-      , resPost             = Just $ getPathInfo >>= handleRender env . toPageName
+      , resPost             = Just $ getPathInfo ≫= handleRender env ∘ toPageName
       , resPut              = Nothing
       , resDelete           = Nothing
       }
     where
-      toPageName :: [String] -> PageName
-      toPageName = decodePageName . joinWith "/" 
-
+      toPageName ∷ [String] → PageName
+      toPageName = T.pack ∘ UTF8.decodeString ∘ joinPath
 
 {-
   --- Request ---
@@ -65,38 +67,44 @@ resRender env
 -}
 handleRender :: Environment -> PageName -> Resource ()
 handleRender env name
-    = do cType <- guessTypeIfNeeded =<< getContentType
-         bin   <- inputLBS defaultLimit
+    = do entity <- inputLBS defaultLimit
+         cTypeM <- getContentType
 
-         setContentType $ read "text/xml"
-         [xmlStr] <- liftIO $ runX ( setErrorMsgHandler False fail
-                                     >>>
-                                     constA (name, cType, bin)
-                                     >>>
-                                     render env
-                                     >>>
-                                     writeDocumentToString [ (a_indent, v_1) ]
-                                   )
-         output xmlStr
-    where
-      guessTypeIfNeeded :: Maybe MIMEType -> Resource MIMEType
-      guessTypeIfNeeded (Just t) = return t
-      guessTypeIfNeeded Nothing  = fail "not impl"
+         let (bin, cType) = case cTypeM of
+                              Just (MIMEType "application" "x-rakka-base64-stream" _)
+                                  -> let b = decodeBase64LBS entity
+                                     in
+                                       (b, guessMIMEType b)
+                              Just t
+                                  -> (entity, t)
+                              Nothing
+                                  -> (entity, guessMIMEType entity)
 
+         setContentType $ read "text/xml"
+         [xmlStr] ← liftIO $ runX ( setErrorMsgHandler False fail
+                                    ⋙
+                                    constA (name, cType, bin)
+                                    ⋙
+                                    render env
+                                    ⋙
+                                    writeDocumentToString [ withIndent yes
+                                                          , withXmlPi  yes
+                                                          ]
+                                  )
+         output $ UTF8.encodeString xmlStr
 
-render :: (ArrowXml a, ArrowChoice a, ArrowIO a) =>
-          Environment
-       -> a (PageName, MIMEType, Lazy.ByteString) XmlTree
+render ∷ (ArrowXml (⇝), ArrowChoice (⇝), ArrowIO (⇝))
+        Environment
+       → (PageName, MIMEType, Lazy.ByteString) ⇝ XmlTree
 render env
     = proc (pName, pType, pBin)
-    -> do pageBody <- listA (makePreviewXHTML (envStorage env) (envSysConf env) (envInterpTable env))
-                      -< (pName, pType, pBin)
-
-          ( eelem "/"
-            += ( eelem "renderResult"
-                 += sattr "name" pName
-                 += constL pageBody
-                 >>>
-                 uniqueNamespacesFromDeclAndQNames
-               ) ) -<< ()
-
+    → do pageBody ← listA (makePreviewXHTML (envStorage env) (envSysConf env) (envInterpTable env))
+                    ⤙ (pName, pType, pBin)
+         ( eelem "/"
+           += ( eelem "renderResult"
+                += sattr "xmlns:xhtml" "http://www.w3.org/1999/xhtml"
+                += sattr "name" (T.unpack pName)
+                += constL pageBody
+                ⋙
+                uniqueNamespacesFromDeclAndQNames
+              ) ) ⤛ ()