16 import Data.ByteString.Base (LazyByteString)
17 import qualified Data.ByteString.Char8 as C8
19 import Data.Encoding.UTF8
21 import Network.HTTP.Lucu
23 import Subversion.Types
24 import System.FilePath
28 type PageName = String
30 type LanguageTag = String -- See RFC 3066: http://www.ietf.org/rfc/rfc3066.txt
31 type LanguageName = String -- i.e. "日本語"
36 redirName :: !PageName
37 , redirDest :: !PageName
38 , redirRevision :: !(Maybe RevNum)
39 , redirLastMod :: !CalendarTime
43 , pageType :: !MIMEType
44 , pageLanguage :: !(Maybe LanguageTag)
45 , pageIsTheme :: !Bool -- text/css 以外では無意味
46 , pageIsFeed :: !Bool -- text/x-rakka 以外では無意味
47 , pageIsLocked :: !Bool
48 , pageIsBoring :: !Bool
49 , pageIsBinary :: !Bool
50 , pageRevision :: !(Maybe RevNum)
51 , pageLastMod :: !CalendarTime
52 , pageSummary :: !(Maybe String)
53 , pageOtherLang :: !(Map LanguageTag PageName)
54 , pageContent :: !LazyByteString
58 -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
59 encodePageName :: PageName -> FilePath
60 encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8
62 isSafe :: Char -> Bool
64 | c >= ' ' && c <= '~' = True
68 -- URI unescape して UTF-8 から decode する。
69 decodePageName :: FilePath -> PageName
70 decodePageName = decode UTF8 . C8.pack . unEscapeString
73 mkPageURI :: URI -> PageName -> URI
74 mkPageURI baseURI name
76 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
80 mkPageFragmentURI :: URI -> PageName -> String -> URI
81 mkPageFragmentURI baseURI name fragment
83 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
84 , uriFragment = ('#':fragment)
88 mkObjectURI :: URI -> PageName -> URI
89 mkObjectURI baseURI name
90 = mkAuxiliaryURI baseURI ["object"] name
93 mkAuxiliaryURI :: URI -> [String] -> PageName -> URI
94 mkAuxiliaryURI baseURI basePath name
96 uriPath = foldl combine "/" ([uriPath baseURI] ++ basePath ++ [encodePageName name])