module Rakka.Page ( PageName , Page(..) , encodePageName , decodePageName , mkPageURI , mkPageFragmentURI , mkObjectURI ) where import Data.ByteString.Base (LazyByteString) import qualified Data.ByteString.Char8 as C8 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 = 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 isSafe . C8.unpack . encode UTF8 where 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] }