X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FResource%2FPageEntity.hs;h=1ad3ffaf5c782b6b543497ec3b682ba600c0a93f;hb=044a917ed3908780479b759ac772e1545616c7fc;hp=19e9768f7bd02e92039b85e6cf2ea4fc4438edec;hpb=7a4f13a3d483c950743e1ced001ade4406d239d3;p=Rakka.git diff --git a/Rakka/Resource/PageEntity.hs b/Rakka/Resource/PageEntity.hs index 19e9768..1ad3ffa 100644 --- a/Rakka/Resource/PageEntity.hs +++ b/Rakka/Resource/PageEntity.hs @@ -7,6 +7,7 @@ import Control.Arrow import Control.Arrow.ArrowIO import Control.Arrow.ArrowIf import Control.Arrow.ArrowList +import Control.Monad.Trans import Data.Char import Data.Maybe import Network.HTTP.Lucu @@ -19,9 +20,13 @@ import Rakka.Storage import Rakka.SystemConfig import Rakka.Wiki.Engine import System.FilePath +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.XmlNodeSet import Text.XML.HXT.DOM.TypeDefs +import Text.XML.HXT.DOM.XmlKeywords fallbackPageEntity :: Environment -> [String] -> IO (Maybe ResourceDef) @@ -33,11 +38,11 @@ fallbackPageEntity env path = return $ Just $ ResourceDef { resUsesNativeThread = False , resIsGreedy = True - , resGet = Just $ handleGet env (toPageName path) + , resGet = Just $ handleGet env (toPageName path) , resHead = Nothing , resPost = Nothing - , resPut = Just $ handlePut env (toPageName path) - , resDelete = Nothing + , resPut = Just $ handlePut env (toPageName path) + , resDelete = Just $ handleDelete env (toPageName path) } where toPageName :: [String] -> PageName @@ -49,24 +54,43 @@ handleGet env name = runIdempotentA $ proc () -> do pageM <- getPageA (envStorage env) -< (name, Nothing) case pageM of - Nothing - -> handlePageNotFound env -< name + Nothing -> handlePageNotFound env -< name + Just page -> if isEntity page then + handleGetEntity env -< page + else + handleRedirect env -< page - Just redir@(Redirection _ _ _ _) - -> handleRedirect env -< redir - - Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _) - -> handleGetEntity env -< entity {- HTTP/1.1 302 Found - Location: http://example.org/Destination?from=Source + Location: http://example.org/Destination.html#Redirect:Source -} handleRedirect :: (ArrowXml a, ArrowIO a) => Environment -> a Page (Resource ()) handleRedirect env = proc redir - -> do BaseURI baseURI <- getSysConfA (envSysConf env) -< () - returnA -< redirect Found (mkPageURI baseURI $ redirName redir) -- FIXME + -> returnA -< do mType <- getEntityType + case mType of + MIMEType "application" "xhtml+xml" _ + -> do BaseURI baseURI <- getSysConf (envSysConf env) + let uri = mkPageFragmentURI + baseURI + (redirDest redir) + ("Redirect:" ++ redirName redir) + redirect Found uri + + MIMEType "text" "xml" _ + -> do setContentType mType + [resultStr] <- liftIO $ runX ( setErrorMsgHandler False fail + >>> + constA redir + >>> + xmlizePage + >>> + writeDocumentToString [ (a_indent, v_1) ] + ) + output resultStr + + _ -> fail ("internal error: getEntityType returned " ++ show mType) handleGetEntity :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a Page (Resource ()) @@ -76,12 +100,12 @@ handleGetEntity env returnA -< do -- text/x-rakka の場合は、内容が動的に生成され -- てゐる可能性があるので、ETag も -- Last-Modified も返す事が出來ない。 - case pageType page of + case entityType page of MIMEType "text" "x-rakka" _ -> return () - _ -> case pageRevision page of - 0 -> foundTimeStamp (pageLastMod page) -- 0 はデフォルトページ - rev -> foundEntity (strongETag $ show rev) (pageLastMod page) + _ -> case entityRevision page of + 0 -> foundTimeStamp (entityLastMod page) -- 0 はデフォルトページ + rev -> foundEntity (strongETag $ show rev) (entityLastMod page) outputXmlPage tree (entityToXHTML env) @@ -130,6 +154,10 @@ entityToXHTML env += sattr "type" "text/javascript" += attr "src" (arr id >>> mkText) ) + += ( eelem "script" + += sattr "type" "text/javascript" + += txt ("Rakka.baseURI = \"" ++ uriToString id baseURI "" ++ "\";") + ) ) += ( eelem "body" += ( eelem "div" @@ -164,6 +192,8 @@ entityToXHTML env ) ) ) + >>> + uniqueNamespacesFromDeclAndQNames ) ) -<< page @@ -231,6 +261,10 @@ notFoundToXHTML env += sattr "type" "text/javascript" += attr "src" (arr id >>> mkText) ) + += ( eelem "script" + += sattr "type" "text/javascript" + += txt ("Rakka.baseURI = \"" ++ uriToString id baseURI "" ++ "\";") + ) ) += ( eelem "body" += ( eelem "div" @@ -265,11 +299,20 @@ notFoundToXHTML env ) ) ) + >>> + uniqueNamespacesFromDeclAndQNames ) ) -<< pageNotFound handlePut :: Environment -> PageName -> Resource () -handlePut _env _name - = do xml <- input defaultLimit - setContentType $ read "text/xml" - output xml +handlePut env name + = runXmlA env "rakka-page-1.0.rng" $ proc tree + -> do page <- parseXmlizedPage -< (name, tree) + status <- putPageA (envStorage env) -< page + returnA -< setStatus status + + +handleDelete :: Environment -> PageName -> Resource () +handleDelete env name + = do status <- deletePage (envStorage env) name + setStatus status