X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FResource%2FPageEntity.hs;h=1388f71cc78024f144b7ad44f9a6dcdfc7b6f250;hb=42f51754dea02201aececaacbf194d714cd58aaf;hp=32a4a6155698b4a62152eb19e459eee7f41620db;hpb=e0da4e15d6a4053be720bddf62ae755f1f63ec3b;p=Rakka.git
diff --git a/Rakka/Resource/PageEntity.hs b/Rakka/Resource/PageEntity.hs
index 32a4a61..1388f71 100644
--- a/Rakka/Resource/PageEntity.hs
+++ b/Rakka/Resource/PageEntity.hs
@@ -1,278 +1,633 @@
+{-# LANGUAGE
+ Arrows
+ , OverloadedStrings
+ , TypeOperators
+ , UnicodeSyntax
+ #-}
module Rakka.Resource.PageEntity
( fallbackPageEntity
)
where
-
-import Control.Arrow
-import Control.Arrow.ArrowIO
-import Control.Arrow.ArrowIf
-import Control.Arrow.ArrowList
+import Control.Applicative
+import Control.Arrow
+import Control.Arrow.ArrowIO
+import Control.Arrow.ArrowIf
+import Control.Arrow.ArrowList
+import Control.Arrow.Unicode
+import qualified Codec.Binary.UTF8.String as UTF8
+import Control.Monad.Trans
+import qualified Data.ByteString.Lazy as L hiding (ByteString)
+import qualified Data.CaseInsensitive as CI
import Data.Char
+import qualified Data.Map as M
import Data.Maybe
+import Data.Monoid.Unicode
+import qualified Data.Text as T
+import Data.Time
import Network.HTTP.Lucu
-import Network.HTTP.Lucu.Utils
-import Network.URI
+import Network.URI hiding (path)
+import Prelude.Unicode
import Rakka.Environment
import Rakka.Page
import Rakka.Resource
import Rakka.Storage
import Rakka.SystemConfig
+import Rakka.Utils
+import Rakka.W3CDateTime
import Rakka.Wiki.Engine
-import System.FilePath
-import System.Time
-import Text.XML.HXT.Arrow.XmlArrow
-import Text.XML.HXT.Arrow.XmlNodeSet
-import Text.XML.HXT.DOM.TypeDefs
-
+import System.FilePath.Posix
+import Text.HyperEstraier hiding (getText)
+import Text.XML.HXT.Arrow.Namespace
+import Text.XML.HXT.Arrow.WriteDocument
+import Text.XML.HXT.Arrow.XmlArrow
+import Text.XML.HXT.Arrow.XmlState
+import Text.XML.HXT.DOM.TypeDefs
+import Text.XML.HXT.XPath
-fallbackPageEntity :: Environment -> [String] -> IO (Maybe ResourceDef)
+fallbackPageEntity â· Environment â [String] â IO (Maybe ResourceDef)
fallbackPageEntity env path
- | null path = return Nothing
- | null $ head path = return Nothing
- | isLower $ head $ head path = return Nothing -- å
é ã®æåãå°æåã§ãã£ã¦ã¯ãªããªã
+ | T.null name = return Nothing
+ | isLower $ T.head name = return Nothing -- å
é ã®æåãå°æåã§ãã£ã¦ã¯ãªããªã
| otherwise
- = return $ Just $ ResourceDef {
+ = pure $ Just ResourceDef {
resUsesNativeThread = False
, resIsGreedy = True
- , resGet = Just $ handleGet env (toPageName path)
+ , resGet = Just $ handleGet env name
, resHead = Nothing
, resPost = Nothing
- , resPut = Just $ handlePut env (toPageName path)
- , resDelete = Nothing
+ , resPut = Just $ handlePut env name
+ , resDelete = Just $ handleDelete env name
}
where
- toPageName :: [String] -> PageName
- toPageName = decodePageName . dropExtension . joinWith "/"
-
+ name â· PageName
+ name = T.pack â dropExtension â UTF8.decodeString $ joinPath path
handleGet :: Environment -> PageName -> Resource ()
handleGet env name
- = runIdempotentA $ proc ()
- -> do pageM <- getPageA (envStorage env) -< (name, Nothing)
- case pageM of
- Nothing
- -> handlePageNotFound env -< name
-
- Just redir@(Redirection _ _ _ _)
- -> handleRedirect env -< redir
-
- Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _)
- -> handleGetEntity env -< entity
+ = do BaseURI baseURI <- getSysConf (envSysConf env)
+ runIdempotentA baseURI $ proc ()
+ -> do pageM <- getPageA (envStorage env) -< (name, Nothing)
+ case pageM of
+ Nothing
+ -> do items <- getDirContentsA (envStorage env) -< (name, Nothing)
+ case items of
+ [] -> handlePageNotFound env -< name
+ _ -> handleGetPageListing env -< (name, items)
+ Just page
+ -> if isEntity page then
+ handleGetEntity env -< page
+ else
+ handleRedirect env -< page
{-
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 â· (ArrowXml (â), ArrowIO (â)) â Environment â 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 "text" "xml" _
+ â do setContentType mType
+ [resultStr] â liftIO $
+ runX ( setErrorMsgHandler False fail
+ â
+ constA redir
+ â
+ xmlizePage
+ â
+ writeDocumentToString
+ [ withIndent yes
+ , withXmlPi yes
+ ]
+ )
+ output $ UTF8.encodeString resultStr
+ _ â do BaseURI baseURI â getSysConf (envSysConf env)
+ let uri = mkPageFragmentURI
+ baseURI
+ (redirDest redir)
+ ("Redirect:" â redirName redir)
+ redirect Found uri
handleGetEntity :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a Page (Resource ())
handleGetEntity env
= proc page
-> do tree <- xmlizePage -< page
- returnA -< do let lastMod = toClockTime $ pageLastMod page
-
- -- text/x-rakka ã®å ´åã¯ãå
容ãåçã«çæãã
- -- ã¦ããå¯è½æ§ãããã®ã§ãETag ã
- -- Last-Modified ãè¿ãäºãåºä¾ãªãã
- case pageType page of
- MIMEType "text" "x-rakka" _
- -> return ()
- _ -> case pageRevision page of
- 0 -> foundTimeStamp lastMod -- 0 ã¯ããã©ã«ããã¼ã¸
- rev -> foundEntity (strongETag $ show rev) lastMod
-
- outputXmlPage tree (entityToXHTML env)
-
-
-entityToXHTML :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a XmlTree XmlTree
+ returnA -< outputXmlPage tree [ (MIMEType "application" "xhtml+xml" [], entityToXHTML env)
+ , (MIMEType "application" "rss+xml" [], entityToRSS env)
+ ]
+
+
+entityToXHTML â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â XmlTree â XmlTree
entityToXHTML env
= proc page
- -> do SiteName siteName <- getSysConfA (envSysConf env) -< ()
- BaseURI baseURI <- getSysConfA (envSysConf env) -< ()
- StyleSheet styleSheet <- getSysConfA (envSysConf env) -< ()
-
- pageName <- (getXPathTreesInDoc "/page/@name/text()" >>> getText) -< page
-
- let cssHref = [uriToString id (mkObjectURI baseURI styleSheet) ""]
- scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI > "js" }) ""]
-
- pageTitle <- listA (readSubPage env) -< (pageName, Just page, "PageTitle")
- leftSideBar <- listA (readSubPage env) -< (pageName, Just page, "SideBar/Left")
- rightSideBar <- listA (readSubPage env) -< (pageName, Just page, "SideBar/Right")
- pageBody <- listA (makeMainXHTML (envStorage env) (envSysConf env) (envInterpTable env)) -< page
-
- ( eelem "/"
- += ( eelem "html"
- += sattr "xmlns" "http://www.w3.org/1999/xhtml"
- += ( getXPathTreesInDoc "/page/@lang"
- `guards`
- qattr (QN "xml" "lang" "")
- ( getXPathTreesInDoc "/page/@lang/text()" )
- )
- += ( eelem "head"
- += ( eelem "title"
- += txt siteName
- += txt " - "
- += getXPathTreesInDoc "/page/@name/text()"
- )
- += ( constL cssHref
- >>>
- eelem "link"
- += sattr "rel" "stylesheet"
- += sattr "type" "text/css"
- += attr "href" (arr id >>> mkText)
- )
- += ( constL scriptSrc
- >>>
- eelem "script"
- += sattr "type" "text/javascript"
- += attr "src" (arr id >>> mkText)
- )
- )
- += ( eelem "body"
- += ( eelem "div"
- += sattr "class" "header"
- )
- += ( eelem "div"
- += sattr "class" "center"
- += ( eelem "div"
- += sattr "class" "title"
- += constL pageTitle
- )
- += ( eelem "div"
- += sattr "class" "body"
- += constL pageBody
- )
- )
- += ( eelem "div"
- += sattr "class" "footer"
- )
- += ( eelem "div"
- += sattr "class" "left sideBar"
- += ( eelem "div"
- += sattr "class" "content"
- += constL leftSideBar
- )
- )
- += ( eelem "div"
- += sattr "class" "right sideBar"
- += ( eelem "div"
- += sattr "class" "content"
- += constL rightSideBar
- )
- )
- )
- ) ) -<< page
-
-
-readSubPage :: (ArrowXml a, ArrowChoice a, ArrowIO a) =>
- Environment
- -> a (PageName, Maybe XmlTree, PageName) XmlTree
+ â do SiteName siteName â getSysConfA (envSysConf env) ⤠()
+ BaseURI baseURI â getSysConfA (envSysConf env) ⤠()
+ StyleSheet styleSheet â getSysConfA (envSysConf env) ⤠()
+ GlobalLock isGLocked â getSysConfA (envSysConf env) ⤠()
+
+ name â (getXPathTreesInDoc "/page/@name/text()" â getText) ⤠page
+ isLocked â (getXPathTreesInDoc "/page/@isLocked/text()" â getText â parseYesOrNo) ⤠page
+
+ let cssHref = [uriToString id (mkObjectURI baseURI styleSheet) ""]
+ scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI > "js" }) ""]
+
+ pageTitle â listA (readSubPage env) ⤠(T.pack name, Just page, "PageTitle")
+ leftSideBar â listA (readSubPage env) ⤠(T.pack name, Just page, "SideBar/Left")
+ rightSideBar â listA (readSubPage env) ⤠(T.pack name, Just page, "SideBar/Right")
+ pageBody â listA (makeMainXHTML (envStorage env) (envSysConf env) (envInterpTable env)) ⤠page
+
+ ( eelem "/"
+ += ( eelem "html"
+ += sattr "xmlns" "http://www.w3.org/1999/xhtml"
+ += ( getXPathTreesInDoc "/page/@lang"
+ `guards`
+ qattr (mkQName "xml" "lang" "")
+ ( getXPathTreesInDoc "/page/@lang/text()" )
+ )
+ += ( eelem "head"
+ += ( eelem "title"
+ += txt (T.unpack siteName)
+ += txt " - "
+ += getXPathTreesInDoc "/page/@name/text()"
+ )
+ += ( constL cssHref
+ â
+ eelem "link"
+ += sattr "rel" "stylesheet"
+ += sattr "type" "text/css"
+ += attr "href" (arr id â mkText)
+ )
+ += mkFeedList env
+ += ( constL scriptSrc
+ â
+ eelem "script"
+ += sattr "type" "text/javascript"
+ += attr "src" (arr id â mkText)
+ )
+ += ( eelem "script"
+ += sattr "type" "text/javascript"
+ += txt ("Rakka.baseURI=\"" â uriToString id baseURI "" â "\";")
+ += txt ("Rakka.isLocked=" â trueOrFalse isLocked â ";" )
+ += txt ("Rakka.isGlobalLocked=" â trueOrFalse isGLocked â ";" )
+ )
+ += mkGlobalJSList env
+ )
+ += ( eelem "body"
+ += ( eelem "div"
+ += sattr "class" "header"
+ )
+ += ( eelem "div"
+ += sattr "class" "center"
+ += ( eelem "div"
+ += sattr "class" "title"
+ += constL pageTitle
+ )
+ += ( eelem "div"
+ += sattr "class" "body"
+ += constL pageBody
+ )
+ )
+ += ( eelem "div"
+ += sattr "class" "footer"
+ )
+ += ( eelem "div"
+ += sattr "class" "left sideBar"
+ += ( eelem "div"
+ += sattr "class" "content"
+ += constL leftSideBar
+ )
+ )
+ += ( eelem "div"
+ += sattr "class" "right sideBar"
+ += ( eelem "div"
+ += sattr "class" "content"
+ += constL rightSideBar
+ )
+ )
+ )
+ â
+ uniqueNamespacesFromDeclAndQNames
+ ) ) ⤠page
+
+entityToRSS â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â XmlTree â XmlTree
+entityToRSS env
+ = proc page
+ â do SiteName siteName â getSysConfA (envSysConf env) ⤠()
+ BaseURI baseURI â getSysConfA (envSysConf env) ⤠()
+
+ name â (getXPathTreesInDoc "/page/@name/text()" â getText) ⤠page
+ summary â maybeA (getXPathTreesInDoc "/page/summary/text()" â getText) ⤠page
+ pages â makePageLinkList (envStorage env) (envSysConf env) (envInterpTable env) ⤠page
+
+ ( eelem "/"
+ += ( eelem "rdf:RDF"
+ += sattr "xmlns" "http://purl.org/rss/1.0/"
+ += sattr "xmlns:rdf" "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ += sattr "xmlns:dc" "http://purl.org/dc/elements/1.1/"
+ += sattr "xmlns:trackback" "http://madskills.com/public/xml/rss/module/trackback/"
+ += ( eelem "channel"
+ += sattr "rdf:about" (uriToString id (mkFeedURI baseURI (T.pack name)) "")
+ += ( eelem "title"
+ += txt (T.unpack siteName)
+ += txt " - "
+ += getXPathTreesInDoc "/page/@name/text()"
+ )
+ += ( eelem "link"
+ += txt (uriToString id baseURI "")
+ )
+ += ( eelem "description"
+ += txt (case summary of
+ Nothing â "RSS Feed for " â T.unpack siteName
+ Just s â s)
+ )
+ += ( eelem "items"
+ += ( eelem "rdf:Seq"
+ += ( constL pages
+ â
+ eelem "rdf:li"
+ += attr "resource" (arr (mkPageURIStr baseURI) â mkText) ) ) ) )
+ += ( constL pages
+ â
+ arr (\n â (n, Nothing))
+ â
+ getPageA (envStorage env)
+ â
+ arr fromJust
+ â
+ eelem "item"
+ += attr "rdf:about" (arr (mkPageURIStr baseURI â entityName) â mkText)
+ += ( eelem "title"
+ += (arr (T.unpack â entityName) â mkText)
+ )
+ += ( eelem "link"
+ += (arr (mkPageURIStr baseURI â entityName) â mkText)
+ )
+ += ( arrL (\p â case entitySummary p of
+ Nothing â []
+ Just s â [s])
+ â
+ eelem "description"
+ += mkText
+ )
+ += ( eelem "dc:date"
+ += ( arrIO (utcToLocalZonedTime . entityLastMod)
+ â
+ arr formatW3CDateTime
+ â
+ mkText
+ )
+ )
+ += ( eelem "trackback:ping"
+ += attr "rdf:resource" (arr (mkTrackbackURIStr baseURI . entityName) â mkText)
+ )
+ )
+ â
+ uniqueNamespacesFromDeclAndQNames
+ ) ) ⤠page
+ where
+ mkPageURIStr :: URI â PageName â String
+ mkPageURIStr baseURI name
+ = uriToString id (mkPageURI baseURI name) ""
+
+ mkTrackbackURIStr :: URI â PageName â String
+ mkTrackbackURIStr baseURI name
+ = uriToString id (mkAuxiliaryURI baseURI ["trackback"] name) ""
+
+readSubPage â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â (PageName, Maybe XmlTree, PageName) â XmlTree
readSubPage env
- = proc (mainPageName, mainPage, subPageName) ->
- do subPage <- getPageA (envStorage env) >>> arr fromJust >>> xmlizePage -< (subPageName, Nothing)
- subXHTML <- makeSubXHTML (envStorage env) (envSysConf env) (envInterpTable env)
- -< (mainPageName, mainPage, subPage)
- returnA -< subXHTML
+ = proc (mainPageName, mainPage, subPageName) â
+ do langM â case mainPage of
+ Nothing
+ â returnA ⤠Nothing
+ Just p
+ â maybeA (getXPathTreesInDoc "/page/@lang/text()" â getText) ⤠p
+ subPage â getPageA (envStorage env) â arr fromJust ⤠(subPageName, Nothing)
+ localSubPage â case langM of
+ Nothing
+ â returnA ⤠subPage
+ Just l
+ â localize (envStorage env) ⤠(CI.mk $ T.pack l, subPage)
+ subPageXml â xmlizePage ⤠localSubPage
+ subXHTML â makeSubXHTML (envStorage env) (envSysConf env) (envInterpTable env)
+ ⤠(Just mainPageName, mainPage, subPageXml)
+ returnA ⤠subXHTML
+ where
+ localize â· (ArrowChoice (â), ArrowIO (â)) â Storage â (LanguageTag, Page) â Page
+ localize sto
+ = proc (lang, origPage)
+ â do let otherLang = entityOtherLang origPage
+ localName = M.lookup lang otherLang
+ case localName of
+ Nothing
+ â returnA ⤠origPage
+ Just ln
+ â do localPage â getPageA sto ⤠(ln, Nothing)
+ returnA ⤠case localPage of
+ Nothing â origPage
+ Just p â p
+{-
+
+
+
+
+-}
+handleGetPageListing â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â (PageName, [PageName]) â Resource ()
+handleGetPageListing env
+ = proc (dir, items)
+ â do tree â ( eelem "/"
+ += ( eelem "pageListing"
+ += attr "path" (arr (T.unpack â fst) â mkText)
+ += ( arrL snd
+ â
+ ( eelem "page"
+ += attr "name" (arr (T.unpack â id) â mkText)
+ )
+ )
+ )
+ ) ⤠(dir, items)
+ returnA ⤠outputXmlPage' tree (pageListingToXHTML env) -- FIXME: rss å°æ
+
+pageListingToXHTML â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â XmlTree â XmlTree
+pageListingToXHTML env
+ = proc pageListing
+ â do SiteName siteName â getSysConfA (envSysConf env) ⤠()
+ BaseURI baseURI â getSysConfA (envSysConf env) ⤠()
+ StyleSheet styleSheet â getSysConfA (envSysConf env) ⤠()
+ GlobalLock isGLocked â getSysConfA (envSysConf env) ⤠()
+
+ name â (getXPathTreesInDoc "/pageListing/@path/text()" â getText) ⤠pageListing
+
+ let cssHref = [uriToString id (mkObjectURI baseURI styleSheet) ""]
+ scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI > "js" }) ""]
+
+ pageTitle â listA (readSubPage env) ⤠(T.pack name, Nothing, "PageTitle")
+ leftSideBar â listA (readSubPage env) ⤠(T.pack name, Nothing, "SideBar/Left")
+ rightSideBar â listA (readSubPage env) ⤠(T.pack name, Nothing, "SideBar/Right")
+
+ ( eelem "/"
+ += ( eelem "html"
+ += sattr "xmlns" "http://www.w3.org/1999/xhtml"
+ += ( eelem "head"
+ += ( eelem "title"
+ += txt (T.unpack siteName)
+ += txt " - "
+ += getXPathTreesInDoc "/pageListing/@path/text()"
+ )
+ += ( constL cssHref
+ â
+ eelem "link"
+ += sattr "rel" "stylesheet"
+ += sattr "type" "text/css"
+ += attr "href" (arr id â mkText)
+ )
+ += mkFeedList env
+ += ( constL scriptSrc
+ â
+ eelem "script"
+ += sattr "type" "text/javascript"
+ += attr "src" (arr id â mkText)
+ )
+ += ( eelem "script"
+ += sattr "type" "text/javascript"
+ += txt ("Rakka.baseURI = \"" ++ uriToString id baseURI "" ++ "\";")
+ += txt ("Rakka.isGlobalLocked=" ++ trueOrFalse isGLocked ++ ";")
+ )
+ += mkGlobalJSList env
+ )
+ += ( eelem "body"
+ += ( eelem "div"
+ += sattr "class" "header"
+ )
+ += ( eelem "div"
+ += sattr "class" "center"
+ += ( eelem "div"
+ += sattr "class" "title"
+ += constL pageTitle
+ )
+ += ( eelem "div"
+ += sattr "class" "body"
+ += ( eelem "ul"
+ += ( getXPathTreesInDoc "/pageListing/page/@name/text()"
+ â
+ eelem "li"
+ += ( eelem "a"
+ += attr "href" ( getText
+ â
+ arr (\ x â uriToString id (mkPageURI baseURI (T.pack x)) "")
+ â
+ mkText
+ )
+ += this
+ ) ) ) ) )
+ += ( eelem "div"
+ += sattr "class" "footer"
+ )
+ += ( eelem "div"
+ += sattr "class" "left sideBar"
+ += ( eelem "div"
+ += sattr "class" "content"
+ += constL leftSideBar
+ )
+ )
+ += ( eelem "div"
+ += sattr "class" "right sideBar"
+ += ( eelem "div"
+ += sattr "class" "content"
+ += constL rightSideBar
+ )
+ )
+ )
+ â
+ uniqueNamespacesFromDeclAndQNames
+ ) ) ⤠pageListing
+
{-
-}
-handlePageNotFound :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a PageName (Resource ())
+handlePageNotFound â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â PageName â Resource ()
handlePageNotFound env
= proc name
- -> do tree <- ( eelem "/"
- += ( eelem "pageNotFound"
- += attr "name" (arr id >>> mkText)
- )
- ) -< name
- returnA -< do setStatus NotFound
- outputXmlPage tree (notFoundToXHTML env)
-
+ â do tree â ( eelem "/"
+ += ( eelem "pageNotFound"
+ += attr "name" (arr T.unpack â mkText)
+ )
+ ) ⤠name
+ returnA ⤠do setStatus NotFound
+ outputXmlPage' tree (notFoundToXHTML env)
-notFoundToXHTML :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a XmlTree XmlTree
+notFoundToXHTML â· (ArrowXml (â), ArrowChoice (â), ArrowIO (â))
+ â Environment
+ â XmlTree â XmlTree
notFoundToXHTML env
= proc pageNotFound
- -> do SiteName siteName <- getSysConfA (envSysConf env) -< ()
- BaseURI baseURI <- getSysConfA (envSysConf env) -< ()
- StyleSheet styleSheet <- getSysConfA (envSysConf env) -< ()
-
- pageName <- (getXPathTreesInDoc "/pageNotFound/@name/text()" >>> getText) -< pageNotFound
-
- let cssHref = [uriToString id (mkObjectURI baseURI styleSheet) ""]
- scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI > "js" }) ""]
-
- pageTitle <- listA (readSubPage env) -< (pageName, Nothing, "PageTitle")
- leftSideBar <- listA (readSubPage env) -< (pageName, Nothing, "SideBar/Left")
- rightSideBar <- listA (readSubPage env) -< (pageName, Nothing, "SideBar/Right")
-
- ( eelem "/"
- += ( eelem "html"
- += sattr "xmlns" "http://www.w3.org/1999/xhtml"
- += ( eelem "head"
- += ( eelem "title"
- += txt siteName
- += txt " - "
- += getXPathTreesInDoc "/pageNotFound/@name/text()"
- )
- += ( constL cssHref
- >>>
- eelem "link"
- += sattr "rel" "stylesheet"
- += sattr "type" "text/css"
- += attr "href" (arr id >>> mkText)
- )
- += ( constL scriptSrc
- >>>
- eelem "script"
- += sattr "type" "text/javascript"
- += attr "src" (arr id >>> mkText)
- )
- )
- += ( eelem "body"
- += ( eelem "div"
- += sattr "class" "header"
- )
- += ( eelem "div"
- += sattr "class" "center"
- += ( eelem "div"
- += sattr "class" "title"
- += constL pageTitle
- )
- += ( eelem "div"
- += sattr "class" "body"
- += txt "404 Not Found (FIXME)" -- FIXME
- )
- )
- += ( eelem "div"
- += sattr "class" "footer"
- )
- += ( eelem "div"
- += sattr "class" "left sideBar"
- += ( eelem "div"
- += sattr "class" "content"
- += constL leftSideBar
- )
- )
- += ( eelem "div"
- += sattr "class" "right sideBar"
- += ( eelem "div"
- += sattr "class" "content"
- += constL rightSideBar
- )
- )
- )
- ) ) -<< pageNotFound
-
-
-handlePut :: Environment -> PageName -> Resource ()
+ â do SiteName siteName â getSysConfA (envSysConf env) ⤠()
+ BaseURI baseURI â getSysConfA (envSysConf env) ⤠()
+ StyleSheet styleSheet â getSysConfA (envSysConf env) ⤠()
+ GlobalLock isGLocked â getSysConfA (envSysConf env) ⤠()
+
+ name â (getXPathTreesInDoc "/pageNotFound/@name/text()" â getText) ⤠pageNotFound
+
+ let cssHref = [uriToString id (mkObjectURI baseURI styleSheet) ""]
+ scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI > "js" }) ""]
+
+ pageTitle â listA (readSubPage env) ⤠(T.pack name, Nothing, "PageTitle" )
+ leftSideBar â listA (readSubPage env) ⤠(T.pack name, Nothing, "SideBar/Left" )
+ rightSideBar â listA (readSubPage env) ⤠(T.pack name, Nothing, "SideBar/Right")
+
+ ( eelem "/"
+ += ( eelem "html"
+ += sattr "xmlns" "http://www.w3.org/1999/xhtml"
+ += ( eelem "head"
+ += ( eelem "title"
+ += txt (T.unpack siteName)
+ += txt " - "
+ += getXPathTreesInDoc "/pageNotFound/@name/text()"
+ )
+ += ( constL cssHref
+ â
+ eelem "link"
+ += sattr "rel" "stylesheet"
+ += sattr "type" "text/css"
+ += attr "href" (arr id â mkText)
+ )
+ += mkFeedList env
+ += ( constL scriptSrc
+ â
+ eelem "script"
+ += sattr "type" "text/javascript"
+ += attr "src" (arr id â mkText)
+ )
+ += ( eelem "script"
+ += sattr "type" "text/javascript"
+ += txt ("Rakka.baseURI = \"" ++ uriToString id baseURI "" ++ "\";")
+ += txt ("Rakka.isGlobalLocked=" ++ trueOrFalse isGLocked ++ ";")
+ )
+ += mkGlobalJSList env
+ )
+ += ( eelem "body"
+ += ( eelem "div"
+ += sattr "class" "header"
+ )
+ += ( eelem "div"
+ += sattr "class" "center"
+ += ( eelem "div"
+ += sattr "class" "title"
+ += constL pageTitle
+ )
+ += ( eelem "div"
+ += sattr "class" "body"
+ += txt "404 Not Found (FIXME)" -- FIXME
+ )
+ )
+ += ( eelem "div"
+ += sattr "class" "footer"
+ )
+ += ( eelem "div"
+ += sattr "class" "left sideBar"
+ += ( eelem "div"
+ += sattr "class" "content"
+ += constL leftSideBar
+ )
+ )
+ += ( eelem "div"
+ += sattr "class" "right sideBar"
+ += ( eelem "div"
+ += sattr "class" "content"
+ += constL rightSideBar
+ )
+ )
+ )
+ â
+ uniqueNamespacesFromDeclAndQNames
+ ) ) ⤠pageNotFound
+
+handlePut â· Environment â PageName â Resource ()
handlePut env name
- = do xml <- input defaultLimit
- setContentType $ read "text/xml"
- output xml
+ = do userID â getUserID env
+ runXmlA "rakka-page-1.0.rng" $ proc tree
+ â do page â parseXmlizedPage ⤠(name, tree)
+ status â putPageA (envStorage env) ⤠(userID, page)
+ returnA ⤠setStatus status
+
+handleDelete â· Environment â PageName â Resource ()
+handleDelete env name
+ = do userID â getUserID env
+ status â deletePage (envStorage env) userID name
+ setStatus status
+
+mkFeedList â· (ArrowIO (â), ArrowXml (â)) â Environment â β â XmlTree
+mkFeedList env
+ = proc _
+ â do SiteName siteName â getSysConfA (envSysConf env) ⤠()
+ BaseURI baseURI â getSysConfA (envSysConf env) ⤠()
+ feed â unlistA â arrIO0 (findFeeds $ envStorage env) ⤠()
+ ( eelem "link"
+ += sattr "rel" "alternate"
+ += sattr "type" "application/rss+xml"
+ += attr "title" (txt (T.unpack siteName) <+> txt " - " <+> (arr T.unpack â mkText))
+ += attr "href" (arr (mkFeedURIStr baseURI) â mkText) ) ⤠feed
+
+findFeeds :: Storage -> IO [PageName]
+findFeeds sto
+ = do cond <- newCondition
+ setPhrase cond "[UVSET]"
+ addAttrCond cond "rakka:isFeed STREQ yes"
+ setOrder cond "@uri STRA"
+ result <- searchPages sto cond
+ return (map hpPageName $ srPages result)
+
+
+mkGlobalJSList :: (ArrowIO a, ArrowXml a, ArrowChoice a) => Environment -> a b XmlTree
+mkGlobalJSList env
+ = proc _ -> do BaseURI baseURI <- getSysConfA (envSysConf env) -< ()
+
+ scriptName <- unlistA <<< arrIO0 (findJavaScripts $ envStorage env) -< ()
+ pageM <- getPageA (envStorage env) -< (scriptName, Nothing)
+
+ case pageM of
+ Nothing -> none -< ()
+ Just page
+ | isEntity page
+ -> ( if entityIsBinary page then
+ ( eelem "script"
+ += sattr "type" "text/javascript"
+ += attr "src" (arr (mkObjectURIStr baseURI . pageName) >>> mkText) )
+ else
+ ( eelem "script"
+ += sattr "type" "text/javascript"
+ += (arr (UTF8.decode . L.unpack . entityContent) >>> mkText) )
+ ) -<< page
+ | otherwise
+ -> none -< ()
+
+findJavaScripts â· Storage â IO [PageName]
+findJavaScripts sto
+ = do cond â newCondition
+ setPhrase cond "[UVSET]"
+ addAttrCond cond "@title STRBW Global/"
+ addAttrCond cond "@type STRBW text/javascript"
+ setOrder cond "@uri STRA"
+ result â searchPages sto cond
+ return (map hpPageName $ srPages result)
+
+mkFeedURIStr â· URI â PageName â String
+mkFeedURIStr = flip flip "" â (uriToString id â) â mkFeedURI
+
+mkObjectURIStr â· URI â PageName â String
+mkObjectURIStr = flip flip "" â (uriToString id â) â mkObjectURI