X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FPage.hs;h=fdc622090771c780656cd80adac2548eaf9efc4d;hb=1647278f9393f7382b6e8b8a5e9e14ce50aae718;hp=5647c8e1481d61df62cf49828164e302cbdb3923;hpb=35f9c2ec3c1e81e42737c54f3f1a8230427691c6;p=Rakka.git diff --git a/Rakka/Page.hs b/Rakka/Page.hs index 5647c8e..fdc6220 100644 --- a/Rakka/Page.hs +++ b/Rakka/Page.hs @@ -2,6 +2,10 @@ module Rakka.Page ( PageName , Page(..) , encodePageName + , decodePageName + , mkPageURI + , mkPageFragmentURI + , mkObjectURI ) where @@ -11,30 +15,69 @@ import Data.Encoding 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 { - pageType :: MIMEType - , pageIsTheme :: Bool -- text/css 以外では無意味 - , pageIsFeed :: Bool -- text/x-rakka 以外では無意味 - , pageIsLocked :: Bool - , pageIsBoring :: Bool - , 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] + } + + +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] + }