( PageName
, Page(..)
, encodePageName
+ , decodePageName
+ , mkPageURI
+ , mkObjectURI
)
where
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]
+ }
+
+
+mkObjectURI :: URI -> PageName -> URI
+mkObjectURI baseURI name
+ = baseURI {
+ uriPath = foldl combine "/" [uriPath baseURI, "object", encodePageName name]
+ }