17 import Data.ByteString.Base (LazyByteString)
18 import qualified Data.ByteString.Char8 as C8
20 import Data.Encoding.UTF8
22 import Network.HTTP.Lucu
24 import Subversion.Types
25 import System.FilePath
29 type PageName = String
31 type LanguageTag = String -- See RFC 3066: http://www.ietf.org/rfc/rfc3066.txt
32 type LanguageName = String -- i.e. "日本語"
37 redirName :: !PageName
38 , redirDest :: !PageName
39 , redirRevision :: !(Maybe RevNum)
40 , redirLastMod :: !CalendarTime
44 , pageType :: !MIMEType
45 , pageLanguage :: !(Maybe LanguageTag)
46 , pageIsTheme :: !Bool -- text/css 以外では無意味
47 , pageIsFeed :: !Bool -- text/x-rakka 以外では無意味
48 , pageIsLocked :: !Bool
49 , pageIsBoring :: !Bool
50 , pageIsBinary :: !Bool
51 , pageRevision :: !RevNum
52 , pageLastMod :: !CalendarTime
53 , pageSummary :: !(Maybe String)
54 , pageOtherLang :: !(Map LanguageTag PageName)
55 , pageContent :: !LazyByteString
59 -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
60 encodePageName :: PageName -> FilePath
61 encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8
63 isSafe :: Char -> Bool
66 | isReserved c = False
67 | c >= ' ' && c <= '~' = True
71 -- URI unescape して UTF-8 から decode する。
72 decodePageName :: FilePath -> PageName
73 decodePageName = decode UTF8 . C8.pack . unEscapeString
76 mkPageURI :: URI -> PageName -> URI
77 mkPageURI baseURI name
79 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
83 mkPageFragmentURI :: URI -> PageName -> String -> URI
84 mkPageFragmentURI baseURI name fragment
86 uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
87 , uriFragment = ('#':fragment)
91 mkObjectURI :: URI -> PageName -> URI
92 mkObjectURI baseURI name
93 = mkAuxiliaryURI baseURI ["object"] name
96 mkAuxiliaryURI :: URI -> [String] -> PageName -> URI
97 mkAuxiliaryURI baseURI basePath name
99 uriPath = foldl combine "/" ([uriPath baseURI] ++ basePath ++ [encodePageName name])
103 mkRakkaURI :: PageName -> URI
104 mkRakkaURI name = URI {
106 , uriAuthority = Nothing
107 , uriPath = encodePageName name