X-Git-Url: https://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FResource%2FRender.hs;h=302360e645830239f1a4fa06394cb2981b78ecc3;hb=42f51754dea02201aececaacbf194d714cd58aaf;hp=01c75e105091994cb43a1c30abb3ab1ff3640cff;hpb=71f2db55513679098869de2122b5d5989dbc2be2;p=Rakka.git diff --git a/Rakka/Resource/Render.hs b/Rakka/Resource/Render.hs index 01c75e1..302360e 100644 --- a/Rakka/Resource/Render.hs +++ b/Rakka/Resource/Render.hs @@ -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 + ) ) ⤛ ()