X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FPage.hs;h=2e3ea45cae6250310d6d88191e2c4e4208b957d8;hb=03585f9c5773f6c0b59497f4f563909576c402b5;hp=607a0a81b9035b76104b4d87fd677eb190da0266;hpb=484e15845d9c06d0fa62044d3b6b3ff8c78a6e04;p=Rakka.git diff --git a/Rakka/Page.hs b/Rakka/Page.hs index 607a0a8..2e3ea45 100644 --- a/Rakka/Page.hs +++ b/Rakka/Page.hs @@ -2,6 +2,8 @@ module Rakka.Page ( PageName , Page(..) , encodePageName + , decodePageName + , mkPageURI ) where @@ -12,14 +14,20 @@ import Data.Encoding.UTF8 import Network.HTTP.Lucu import Network.URI import Subversion.Types +import System.Time type PageName = String data Page - = Redirect PageName - | Page { + = Redirection { + redirName :: PageName + , redirDest :: PageName + , redirRevision :: Maybe RevNum + , redirLastMod :: CalendarTime + } + | Entity { pageName :: PageName , pageType :: MIMEType , pageIsTheme :: Bool -- text/css 以外では無意味 @@ -27,6 +35,7 @@ data Page , pageIsLocked :: Bool , pageIsBoring :: Bool , pageRevision :: Maybe RevNum + , pageLastMod :: CalendarTime , pageSummary :: Maybe String , pageOtherLang :: [(String, PageName)] , pageContent :: LazyByteString @@ -41,3 +50,18 @@ encodePageName = escapeURIString shouldEscape . C8.unpack . encode UTF8 shouldEscape c | c >= ' ' && c <= '~' = False | otherwise = True + + +-- URI unescape して UTF-8 から decode する。 +decodePageName :: FilePath -> PageName +decodePageName = decode UTF8 . C8.pack . unEscapeString + + +mkPageURI :: URI -> PageName -> URI +mkPageURI baseURI name + | uriPath baseURI == "" = baseURI { uriPath = "/" ++ encoded } + | uriPath baseURI == "/" = baseURI { uriPath = "/" ++ encoded } + | last (uriPath baseURI) == '/' = baseURI { uriPath = uriPath baseURI ++ encoded } + | otherwise = baseURI { uriPath = uriPath baseURI ++ "/" ++ encoded } + where + encoded = encodePageName name