X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Rakka.git;a=blobdiff_plain;f=Rakka%2FStorage%2FDefaultPage.hs;h=9cdaf45afed2152cc8b37b7753e985dab48a1461;hp=8770ef05264a2f18ece8047b0f1b4861da9967d7;hb=03585f9c5773f6c0b59497f4f563909576c402b5;hpb=484e15845d9c06d0fa62044d3b6b3ff8c78a6e04 diff --git a/Rakka/Storage/DefaultPage.hs b/Rakka/Storage/DefaultPage.hs index 8770ef0..9cdaf45 100644 --- a/Rakka/Storage/DefaultPage.hs +++ b/Rakka/Storage/DefaultPage.hs @@ -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