, encodePageName
, decodePageName
+
+ , pageFileName'
+
, mkPageURI
, mkPageFragmentURI
, mkObjectURI
import Data.ByteString.Base (LazyByteString)
import qualified Data.ByteString.Char8 as C8
+import Data.Char
import Data.Encoding
import Data.Encoding.UTF8
import Data.Map (Map)
+import Data.Maybe
import Network.HTTP.Lucu
import Network.URI
import Subversion.Types
-import System.FilePath
+import System.FilePath.Posix
import System.Time
pageName :: !PageName
, pageType :: !MIMEType
, pageLanguage :: !(Maybe LanguageTag)
+ , pageFileName :: !(Maybe String)
, pageIsTheme :: !Bool -- text/css 以外では無意味
, pageIsFeed :: !Bool -- text/x-rakka 以外では無意味
, pageIsLocked :: !Bool
-- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
encodePageName :: PageName -> FilePath
-encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8
+encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8 . fixPageName
where
isSafe :: Char -> Bool
isSafe c
| c >= ' ' && c <= '~' = True
| otherwise = False
+ fixPageName :: PageName -> PageName
+ fixPageName = (\ (x:xs) -> toUpper x : xs) . map (\ c -> if c == ' ' then '_' else c)
+
-- URI unescape して UTF-8 から decode する。
decodePageName :: FilePath -> PageName
decodePageName = decode UTF8 . C8.pack . unEscapeString
+pageFileName' :: Page -> String
+pageFileName' page = fromMaybe (defaultFileName page) (pageFileName page)
+
+
+defaultFileName :: Page -> String
+defaultFileName page
+ = let baseName = takeFileName (pageName page)
+ in
+ case pageType page of
+ MIMEType "text" "x-rakka" _ -> baseName <.> "rakka"
+ MIMEType "text" "css" _ -> baseName <.> "css"
+ _ -> baseName
+
+
mkPageURI :: URI -> PageName -> URI
mkPageURI baseURI name
= baseURI {
- uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
+ uriPath = foldl (</>) "/" [uriPath baseURI, encodePageName name ++ ".html"]
}
mkPageFragmentURI :: URI -> PageName -> String -> URI
mkPageFragmentURI baseURI name fragment
= baseURI {
- uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
+ uriPath = foldl (</>) "/" [uriPath baseURI, encodePageName name ++ ".html"]
, uriFragment = ('#':fragment)
}
mkAuxiliaryURI :: URI -> [String] -> PageName -> URI
mkAuxiliaryURI baseURI basePath name
= baseURI {
- uriPath = foldl combine "/" ([uriPath baseURI] ++ basePath ++ [encodePageName name])
+ uriPath = foldl (</>) "/" ([uriPath baseURI] ++ basePath ++ [encodePageName name])
}