13 import Data.ByteString.Base (LazyByteString)
14 import qualified Data.ByteString.Char8 as C8
16 import Data.Encoding.UTF8
17 import Network.HTTP.Lucu
19 import Subversion.Types
20 import System.FilePath
24 type PageName = String
29 redirName :: !PageName
30 , redirDest :: !PageName
31 , redirRevision :: !(Maybe RevNum)
32 , redirLastMod :: !CalendarTime
36 , pageType :: !MIMEType
37 , pageIsTheme :: !Bool -- text/css 以外では無意味
38 , pageIsFeed :: !Bool -- text/x-rakka 以外では無意味
39 , pageIsLocked :: !Bool
40 , pageIsBoring :: !Bool
41 , pageIsBinary :: !Bool
42 , pageRevision :: !(Maybe RevNum)
43 , pageLastMod :: !CalendarTime
44 , pageSummary :: !(Maybe String)
45 , pageOtherLang :: ![(String, PageName)]
46 , pageContent :: !LazyByteString
50 -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
51 encodePageName :: PageName -> FilePath
52 encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8
54 isSafe :: Char -> Bool
56 | c >= ' ' && c <= '~' = True
60 -- URI unescape して UTF-8 から decode する。
61 decodePageName :: FilePath -> PageName
62 decodePageName = decode UTF8 . C8.pack . unEscapeString
65 mkPageURI :: URI -> PageName -> URI
66 mkPageURI baseURI name
68 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
72 mkPageFragmentURI :: URI -> PageName -> String -> URI
73 mkPageFragmentURI baseURI name fragment
75 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
76 , uriFragment = ('#':fragment)
80 mkObjectURI :: URI -> PageName -> URI
81 mkObjectURI baseURI name
82 = mkAuxiliaryURI baseURI ["object"] name
85 mkAuxiliaryURI :: URI -> [String] -> PageName -> URI
86 mkAuxiliaryURI baseURI basePath name
88 uriPath = foldl combine "/" ([uriPath baseURI] ++ basePath ++ [encodePageName name])