]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Resource/PageEntity.hs
code clean up
[Rakka.git] / Rakka / Resource / PageEntity.hs
index 8f4bd9caced4f263c09be86f1f02d6bfbcaf953c..fdc95b6bb6912d2d62f25d96e8c9c651689ee189 100644 (file)
@@ -3,12 +3,11 @@ module Rakka.Resource.PageEntity
     )
     where
 
-import           Control.Arrow
-import           Control.Arrow.ArrowIO
-import           Control.Arrow.ArrowIf
-import           Control.Arrow.ArrowList
+import qualified Codec.Binary.UTF8.String as UTF8
 import           Control.Monad.Trans
+import qualified Data.ByteString.Lazy as L hiding (ByteString)
 import           Data.Char
+import qualified Data.Map as M
 import           Data.Maybe
 import           Data.Time
 import           Network.HTTP.Lucu
@@ -24,11 +23,7 @@ import           Rakka.W3CDateTime
 import           Rakka.Wiki.Engine
 import           System.FilePath
 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.XmlIOStateArrow
-import           Text.XML.HXT.Arrow.XmlNodeSet
+import           Text.XML.HXT.Arrow
 import           Text.XML.HXT.DOM.TypeDefs
 import           Text.XML.HXT.DOM.XmlKeywords
 
@@ -55,19 +50,20 @@ fallbackPageEntity env path
 
 handleGet :: Environment -> PageName -> Resource ()
 handleGet env name
-    = runIdempotentA $ 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
+    = 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
 
 
 {-
@@ -122,11 +118,9 @@ entityToXHTML env
           let cssHref   = [uriToString id (mkObjectURI baseURI styleSheet) ""]
               scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI </> "js" }) ""]
 
-          feeds <- arrIO0 (findFeeds (envStorage env)) -< ()
-
-          pageTitle    <- listA (readSubPage env) -< (Just name, Just page, "PageTitle")
-          leftSideBar  <- listA (readSubPage env) -< (Just name, Just page, "SideBar/Left")
-          rightSideBar <- listA (readSubPage env) -< (Just name, Just page, "SideBar/Right")
+          pageTitle    <- listA (readSubPage env) -< (name, Just page, "PageTitle")
+          leftSideBar  <- listA (readSubPage env) -< (name, Just page, "SideBar/Left")
+          rightSideBar <- listA (readSubPage env) -< (name, Just page, "SideBar/Right")
           pageBody     <- listA (makeMainXHTML (envStorage env) (envSysConf env) (envInterpTable env)) -< page
 
           ( eelem "/"
@@ -150,14 +144,7 @@ entityToXHTML env
                            += sattr "type" "text/css"
                            += attr "href" (arr id >>> mkText)
                          )
-                      += ( constL feeds
-                           >>>
-                           eelem "link"
-                           += sattr "rel"   "alternate"
-                           += sattr "type"  "application/rss+xml"
-                           += attr  "title" (txt siteName <+> txt " - " <+> mkText)
-                           += attr  "href"  (arr (mkFeedURIStr baseURI) >>> mkText)
-                         )
+                      += mkFeedList env
                       += ( constL scriptSrc
                            >>>
                            eelem "script"
@@ -170,6 +157,7 @@ entityToXHTML env
                            += txt ("Rakka.isLocked=" ++ trueOrFalse isLocked ++ ";")
                            += txt ("Rakka.isGlobalLocked=" ++ trueOrFalse isGLocked ++ ";")
                          )
+                      += mkGlobalJSList env
                     )
                  += ( eelem "body"
                       += ( eelem "div"
@@ -300,13 +288,38 @@ entityToRSS env
 
 readSubPage :: (ArrowXml a, ArrowChoice a, ArrowIO a) =>
                Environment
-            -> a (Maybe PageName, Maybe XmlTree, PageName) XmlTree
+            -> a (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)
+      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) -< (l, subPage)
+         subPageXml   <- xmlizePage -< localSubPage
+         subXHTML     <- makeSubXHTML (envStorage env) (envSysConf env) (envInterpTable env)
+                         -< (Just mainPageName, mainPage, subPageXml)
          returnA -< subXHTML
+    where
+      localize :: (ArrowChoice a, ArrowIO a) => Storage -> a (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
 
 
 {-
@@ -345,9 +358,9 @@ pageListingToXHTML env
           let cssHref   = [uriToString id (mkObjectURI baseURI styleSheet) ""]
               scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI </> "js" }) ""]
 
-          pageTitle    <- listA (readSubPage env) -< (Just name, Nothing, "PageTitle")
-          leftSideBar  <- listA (readSubPage env) -< (Just name, Nothing, "SideBar/Left")
-          rightSideBar <- listA (readSubPage env) -< (Just name, Nothing, "SideBar/Right")
+          pageTitle    <- listA (readSubPage env) -< (name, Nothing, "PageTitle")
+          leftSideBar  <- listA (readSubPage env) -< (name, Nothing, "SideBar/Left")
+          rightSideBar <- listA (readSubPage env) -< (name, Nothing, "SideBar/Right")
 
           ( eelem "/"
             += ( eelem "html"
@@ -365,6 +378,7 @@ pageListingToXHTML env
                            += sattr "type" "text/css"
                            += attr "href" (arr id >>> mkText)
                          )
+                      += mkFeedList env
                       += ( constL scriptSrc
                            >>>
                            eelem "script"
@@ -376,6 +390,7 @@ pageListingToXHTML env
                            += txt ("Rakka.baseURI = \"" ++ uriToString id baseURI "" ++ "\";")
                            += txt ("Rakka.isGlobalLocked=" ++ trueOrFalse isGLocked ++ ";")
                          )
+                      += mkGlobalJSList env
                     )
                  += ( eelem "body"
                       += ( eelem "div"
@@ -457,9 +472,9 @@ notFoundToXHTML env
           let cssHref   = [uriToString id (mkObjectURI baseURI styleSheet) ""]
               scriptSrc = [uriToString id (baseURI { uriPath = uriPath baseURI </> "js" }) ""]
 
-          pageTitle    <- listA (readSubPage env) -< (Just name, Nothing, "PageTitle")
-          leftSideBar  <- listA (readSubPage env) -< (Just name, Nothing, "SideBar/Left")
-          rightSideBar <- listA (readSubPage env) -< (Just name, Nothing, "SideBar/Right")
+          pageTitle    <- listA (readSubPage env) -< (name, Nothing, "PageTitle")
+          leftSideBar  <- listA (readSubPage env) -< (name, Nothing, "SideBar/Left")
+          rightSideBar <- listA (readSubPage env) -< (name, Nothing, "SideBar/Right")
 
           ( eelem "/"
             += ( eelem "html"
@@ -477,6 +492,7 @@ notFoundToXHTML env
                            += sattr "type" "text/css"
                            += attr "href" (arr id >>> mkText)
                          )
+                      += mkFeedList env
                       += ( constL scriptSrc
                            >>>
                            eelem "script"
@@ -488,6 +504,7 @@ notFoundToXHTML env
                            += txt ("Rakka.baseURI = \"" ++ uriToString id baseURI "" ++ "\";")
                            += txt ("Rakka.isGlobalLocked=" ++ trueOrFalse isGLocked ++ ";")
                          )
+                      += mkGlobalJSList env
                     )
                  += ( eelem "body"
                       += ( eelem "div"
@@ -543,6 +560,20 @@ handleDelete env name
          setStatus status
 
 
+mkFeedList :: (ArrowIO a, ArrowXml a) => Environment -> a b 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 siteName <+> txt " - " <+> mkText)
+                     += attr  "href"  (arr (mkFeedURIStr baseURI) >>> mkText) ) -<< feed
+
+
 findFeeds :: Storage -> IO [PageName]
 findFeeds sto
     = do cond <- newCondition
@@ -553,6 +584,46 @@ findFeeds sto
          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 baseURI name
-    = uriToString id (mkFeedURI baseURI name) ""
\ No newline at end of file
+    = uriToString id (mkFeedURI baseURI name) ""
+
+
+mkObjectURIStr :: URI -> PageName -> String
+mkObjectURIStr baseURI name
+    = uriToString id (mkObjectURI baseURI name) ""