X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FPage.hs;h=93c7465c2079ea448571e78d0a7c804134eda0d1;hb=dcfffa578c5dd6647a5be7d2074488a520dfcf2d;hp=607a0a81b9035b76104b4d87fd677eb190da0266;hpb=484e15845d9c06d0fa62044d3b6b3ff8c78a6e04;p=Rakka.git diff --git a/Rakka/Page.hs b/Rakka/Page.hs index 607a0a8..93c7465 100644 --- a/Rakka/Page.hs +++ b/Rakka/Page.hs @@ -2,6 +2,10 @@ module Rakka.Page ( PageName , Page(..) , encodePageName + , decodePageName + , mkPageURI + , mkPageFragmentURI + , mkObjectURI ) where @@ -12,32 +16,68 @@ import Data.Encoding.UTF8 import Network.HTTP.Lucu import Network.URI import Subversion.Types +import System.FilePath +import System.Time type PageName = String data Page - = Redirect PageName - | Page { - pageName :: PageName - , pageType :: MIMEType - , pageIsTheme :: Bool -- text/css 以外では無意味 - , pageIsFeed :: Bool -- text/x-rakka 以外では無意味 - , pageIsLocked :: Bool - , pageIsBoring :: Bool - , pageRevision :: Maybe RevNum - , pageSummary :: Maybe String - , pageOtherLang :: [(String, PageName)] - , pageContent :: LazyByteString + = Redirection { + redirName :: !PageName + , redirDest :: !PageName + , redirRevision :: !(Maybe RevNum) + , redirLastMod :: !CalendarTime + } + | Entity { + pageName :: !PageName + , pageType :: !MIMEType + , pageIsTheme :: !Bool -- text/css 以外では無意味 + , pageIsFeed :: !Bool -- text/x-rakka 以外では無意味 + , pageIsLocked :: !Bool + , pageIsBoring :: !Bool + , pageIsBinary :: !Bool + , pageRevision :: !(Maybe RevNum) + , pageLastMod :: !CalendarTime + , pageSummary :: !(Maybe String) + , pageOtherLang :: ![(String, PageName)] + , pageContent :: !LazyByteString } -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。 encodePageName :: PageName -> FilePath -encodePageName = escapeURIString shouldEscape . C8.unpack . encode UTF8 +encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8 where - shouldEscape :: Char -> Bool - shouldEscape c - | c >= ' ' && c <= '~' = False - | otherwise = True + isSafe :: Char -> Bool + isSafe c + | c >= ' ' && c <= '~' = True + | otherwise = False + + +-- URI unescape して UTF-8 から decode する。 +decodePageName :: FilePath -> PageName +decodePageName = decode UTF8 . C8.pack . unEscapeString + + +mkPageURI :: URI -> PageName -> URI +mkPageURI baseURI name + = baseURI { + uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"] + } + + +mkPageFragmentURI :: URI -> PageName -> String -> URI +mkPageFragmentURI baseURI name fragment + = baseURI { + uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"] + , uriFragment = ('#':fragment) + } + + +mkObjectURI :: URI -> PageName -> URI +mkObjectURI baseURI name + = baseURI { + uriPath = foldl combine "/" [uriPath baseURI, "object", encodePageName name] + }