11 import Data.ByteString.Base (LazyByteString)
12 import qualified Data.ByteString.Char8 as C8
14 import Data.Encoding.UTF8
15 import Network.HTTP.Lucu
17 import Subversion.Types
18 import System.FilePath
22 type PageName = String
27 redirName :: !PageName
28 , redirDest :: !PageName
29 , redirRevision :: !(Maybe RevNum)
30 , redirLastMod :: !CalendarTime
34 , pageType :: !MIMEType
35 , pageIsTheme :: !Bool -- text/css 以外では無意味
36 , pageIsFeed :: !Bool -- text/x-rakka 以外では無意味
37 , pageIsLocked :: !Bool
38 , pageIsBoring :: !Bool
39 , pageIsBinary :: !Bool
40 , pageRevision :: !(Maybe RevNum)
41 , pageLastMod :: !CalendarTime
42 , pageSummary :: !(Maybe String)
43 , pageOtherLang :: ![(String, PageName)]
44 , pageContent :: !LazyByteString
48 -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
49 encodePageName :: PageName -> FilePath
50 encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8
52 isSafe :: Char -> Bool
54 | c >= ' ' && c <= '~' = True
58 -- URI unescape して UTF-8 から decode する。
59 decodePageName :: FilePath -> PageName
60 decodePageName = decode UTF8 . C8.pack . unEscapeString
63 mkPageURI :: URI -> PageName -> URI
64 mkPageURI baseURI name
66 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name]
70 mkObjectURI :: URI -> PageName -> URI
71 mkObjectURI baseURI name
73 uriPath = foldl combine "/" [uriPath baseURI, "object", encodePageName name]