]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Page.hs
Implemented findChangedPagesAtRevision
[Rakka.git] / Rakka / Page.hs
index 1fd54c92f326ad1e84e348b0452c3d0541c780b4..c6469a7f10552ca37fa97f5e1f2b338e8c16875d 100644 (file)
@@ -8,27 +8,27 @@ module Rakka.Page
     , decodePageName
 
     , pageFileName'
+    , defaultFileName
 
     , mkPageURI
     , mkPageFragmentURI
     , mkObjectURI
+    , mkFragmentURI
     , mkAuxiliaryURI
     , mkRakkaURI
     )
     where
 
-import           Data.ByteString.Base (LazyByteString)
-import qualified Data.ByteString.Char8 as C8
+import           Codec.Binary.UTF8.String
+import qualified Data.ByteString.Lazy as Lazy (ByteString)
 import           Data.Char
-import           Data.Encoding
-import           Data.Encoding.UTF8
 import           Data.Map (Map)
 import           Data.Maybe
+import           Data.Time
 import           Network.HTTP.Lucu
-import           Network.URI
+import           Network.URI hiding (fragment)
 import           Subversion.Types
 import           System.FilePath.Posix
-import           System.Time
 
 
 type PageName = String
@@ -42,7 +42,7 @@ data Page
         redirName     :: !PageName
       , redirDest     :: !PageName
       , redirRevision :: !(Maybe RevNum)
-      , redirLastMod  :: !CalendarTime
+      , redirLastMod  :: !UTCTime
       }
     | Entity {
         pageName      :: !PageName
@@ -55,42 +55,49 @@ data Page
       , pageIsBoring  :: !Bool
       , pageIsBinary  :: !Bool
       , pageRevision  :: !RevNum
-      , pageLastMod   :: !CalendarTime
+      , pageLastMod   :: !UTCTime
       , pageSummary   :: !(Maybe String)
       , pageOtherLang :: !(Map LanguageTag PageName)
-      , pageContent   :: !LazyByteString
+      , pageContent   :: !Lazy.ByteString
       }
+    deriving (Show, Eq)
 
 
 -- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
 encodePageName :: PageName -> FilePath
-encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8 . fixPageName
+encodePageName = escapeURIString isSafeChar . encodeString . fixPageName
     where
-      isSafe :: Char -> Bool
-      isSafe c
-          | c == '/'             = True
-          | isReserved c         = False
-          | c >= ' ' && c <= '~' = True
-          | otherwise            = False
-
       fixPageName :: PageName -> PageName
       fixPageName = (\ (x:xs) -> toUpper x : xs) . map (\ c -> if c == ' ' then '_' else c)
 
 
+isSafeChar :: Char -> Bool
+isSafeChar c
+    | c == '/'            = True
+    | isReserved c        = False
+    | c > ' ' && c <= '~' = True
+    | otherwise           = False
+
+
 -- URI unescape して UTF-8 から decode する。
 decodePageName :: FilePath -> PageName
-decodePageName = decode UTF8 . C8.pack . unEscapeString
+decodePageName = decodeString . unEscapeString
+
+
+encodeFragment :: String -> String
+encodeFragment = escapeURIString isSafeChar . encodeString
 
 
 pageFileName' :: Page -> String
-pageFileName' page = fromMaybe (defaultFileName page) (pageFileName page)
+pageFileName' page
+    = fromMaybe (defaultFileName (pageType page) (pageName page)) (pageFileName page)
 
 
-defaultFileName :: Page -> String
-defaultFileName page
-    = let baseName = takeFileName (pageName page)
+defaultFileName :: MIMEType -> PageName -> String
+defaultFileName pType pName
+    = let baseName = takeFileName pName
       in 
-        case pageType page of
+        case pType of
           MIMEType "text" "x-rakka" _ -> baseName <.> "rakka"
           MIMEType "text" "css"     _ -> baseName <.> "css"
           _                           -> baseName
@@ -107,7 +114,14 @@ mkPageFragmentURI :: URI -> PageName -> String -> URI
 mkPageFragmentURI baseURI name fragment
     = baseURI {
         uriPath     = foldl (</>) "/" [uriPath baseURI, encodePageName name ++ ".html"]
-      , uriFragment = ('#':fragment)
+      , uriFragment = ('#' : encodeFragment fragment)
+      }
+
+
+mkFragmentURI :: String -> URI
+mkFragmentURI fragment
+    = nullURI {
+        uriFragment = ('#' : encodeFragment fragment)
       }