X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FPage.hs;h=fdc622090771c780656cd80adac2548eaf9efc4d;hb=7c3065043cdfbd96539a9bf6bff9b1d4281c0b2a;hp=2e3ea45cae6250310d6d88191e2c4e4208b957d8;hpb=03585f9c5773f6c0b59497f4f563909576c402b5;p=Rakka.git diff --git a/Rakka/Page.hs b/Rakka/Page.hs index 2e3ea45..fdc6220 100644 --- a/Rakka/Page.hs +++ b/Rakka/Page.hs @@ -4,6 +4,8 @@ module Rakka.Page , encodePageName , decodePageName , mkPageURI + , mkPageFragmentURI + , mkObjectURI ) where @@ -14,6 +16,7 @@ import Data.Encoding.UTF8 import Network.HTTP.Lucu import Network.URI import Subversion.Types +import System.FilePath import System.Time @@ -22,34 +25,35 @@ type PageName = String data Page = Redirection { - redirName :: PageName - , redirDest :: PageName - , redirRevision :: Maybe RevNum - , redirLastMod :: CalendarTime + 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 - , pageRevision :: Maybe RevNum - , pageLastMod :: CalendarTime - , pageSummary :: Maybe String - , pageOtherLang :: [(String, PageName)] - , pageContent :: LazyByteString + 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 する。 @@ -59,9 +63,21 @@ 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 + = baseURI { + uriPath = foldl combine "/" [uriPath baseURI, encodePageName name] + } + + +mkPageFragmentURI :: URI -> PageName -> String -> URI +mkPageFragmentURI baseURI name fragment + = baseURI { + uriPath = foldl combine "/" [uriPath baseURI, encodePageName name] + , uriFragment = ('#':fragment) + } + + +mkObjectURI :: URI -> PageName -> URI +mkObjectURI baseURI name + = baseURI { + uriPath = foldl combine "/" [uriPath baseURI, "object", encodePageName name] + }