]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Storage/DefaultPage.hs
I'm getting tired so I must have a rest.
[Rakka.git] / Rakka / Storage / DefaultPage.hs
index 8770ef05264a2f18ece8047b0f1b4861da9967d7..9cdaf45afed2152cc8b37b7753e985dab48a1461 100644 (file)
@@ -5,12 +5,14 @@ module Rakka.Storage.DefaultPage
 
 import qualified Codec.Binary.Base64.String as B64
 import           Control.Arrow
+import           Control.Arrow.ArrowIO
 import           Control.Arrow.ArrowList
 import qualified Data.ByteString.Lazy.Char8 as L8
 import           Paths_Rakka -- Cabal が用意する。
 import           Rakka.Page
 import           Rakka.Utils
 import           System.Directory
+import           System.Time
 import           Text.XML.HXT.Arrow.ReadDocument
 import           Text.XML.HXT.Arrow.XmlArrow
 import           Text.XML.HXT.Arrow.XmlIOStateArrow
@@ -37,7 +39,9 @@ loadDefaultPage pageName
 
 loadPageFile :: PageName -> FilePath -> IO Page
 loadPageFile name path
-    = do [page] <- runX ( constA (name, path)
+    = do [page] <- runX ( setErrorMsgHandler False fail
+                          >>>
+                          constA (name, path)
                           >>>
                           loadPageFileA
                         )
@@ -47,16 +51,31 @@ loadPageFile name path
 loadPageFileA :: IOStateArrow s (PageName, FilePath) Page
 loadPageFileA
     = proc (name, fpath) ->
-      do tree <- readFromDocument [ (a_validate         , v_0)
-                                  , (a_check_namespaces , v_1)
-                                  , (a_remove_whitespace, v_1)
-                                  ] -< fpath
-         parsePage -< (name, tree)
+      do tree    <- readFromDocument [ (a_validate         , v_0)
+                                     , (a_check_namespaces , v_1)
+                                     , (a_remove_whitespace, v_1)
+                                     ] -< fpath
+         lastMod <- arrIO (\ x -> getModificationTime x >>= toCalendarTime) -< fpath
+         parsePage -< (name, lastMod, tree)
+
 
+parsePage :: (ArrowXml a, ArrowChoice a) => a (PageName, CalendarTime, XmlTree) Page
+parsePage 
+    = proc (name, lastMod, tree)
+    -> do redirect <- maybeA (getXPathTreesInDoc "/page/@redirect/text()" >>> getText) -< tree
+          case redirect of
+            Nothing   -> parseEntity -< (name, lastMod, tree)
+            Just dest -> returnA     -< (Redirection {
+                                           redirName     = name
+                                         , redirDest     = dest
+                                         , redirRevision = Nothing
+                                         , redirLastMod  = lastMod
+                                         })
+            
 
-parsePage :: (ArrowXml a, ArrowChoice a) => a (PageName, XmlTree) Page
-parsePage
-    = proc (name, tree)
+parseEntity :: (ArrowXml a, ArrowChoice a) => a (PageName, CalendarTime, XmlTree) Page
+parseEntity
+    = proc (name, lastMod, tree)
     -> do mimeType <- (getXPathTreesInDoc "/page/@type/text()" >>> getText
                        >>> arr read) -< tree
 
@@ -90,7 +109,7 @@ parsePage
                           (Just text, _          ) -> L8.pack text
                           (_        , Just binary) -> L8.pack $ B64.decode binary
 
-          returnA -< Page {
+          returnA -< Entity {
                         pageName      = name
                       , pageType      = mimeType
                       , pageIsTheme   = isTheme
@@ -98,6 +117,7 @@ parsePage
                       , pageIsLocked  = isLocked
                       , pageIsBoring  = isBoring
                       , pageRevision  = Nothing
+                      , pageLastMod   = lastMod
                       , pageSummary   = summary
                       , pageOtherLang = otherLang
                       , pageContent   = content