]> gitweb @ CieloNegro.org - Rakka.git/blob - Rakka/Page.hs
c22e5206583c819facd8baab5ec437a4038d60a7
[Rakka.git] / Rakka / Page.hs
1 module Rakka.Page
2     ( PageName
3     , Page(..)
4     , encodePageName
5     , decodePageName
6     , mkPageURI
7     , mkObjectURI
8     )
9     where
10
11 import           Data.ByteString.Base (LazyByteString)
12 import qualified Data.ByteString.Char8 as C8
13 import           Data.Encoding
14 import           Data.Encoding.UTF8
15 import           Network.HTTP.Lucu
16 import           Network.URI
17 import           Subversion.Types
18 import           System.FilePath
19 import           System.Time
20
21
22 type PageName = String
23
24
25 data Page
26     = Redirection {
27         redirName     :: !PageName
28       , redirDest     :: !PageName
29       , redirRevision :: !(Maybe RevNum)
30       , redirLastMod  :: !CalendarTime
31       }
32     | Entity {
33         pageName      :: !PageName
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
45       }
46
47
48 -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
49 encodePageName :: PageName -> FilePath
50 encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8 
51     where
52       isSafe :: Char -> Bool
53       isSafe c
54           | c >= ' ' && c <= '~' = True
55           | otherwise            = False
56
57
58 -- URI unescape して UTF-8 から decode する。
59 decodePageName :: FilePath -> PageName
60 decodePageName = decode UTF8 . C8.pack . unEscapeString
61
62
63 mkPageURI :: URI -> PageName -> URI
64 mkPageURI baseURI name
65     = baseURI {
66         uriPath = foldl combine "/" [uriPath baseURI, encodePageName name]
67       }
68
69
70 mkObjectURI :: URI -> PageName -> URI
71 mkObjectURI baseURI name
72     = baseURI {
73         uriPath = foldl combine "/" [uriPath baseURI, "object", encodePageName name]
74       }