, decodePageName
, pageFileName'
+ , defaultFileName
, mkPageURI
, mkPageFragmentURI
, mkObjectURI
+ , mkFragmentURI
, mkAuxiliaryURI
, mkRakkaURI
)
-- UTF-8 に encode してから 0x20 - 0x7E の範圍を除いて URI escape する。
encodePageName :: PageName -> FilePath
-encodePageName = escapeURIString isSafe . C8.unpack . encode UTF8 . fixPageName
+encodePageName = escapeURIString isSafeChar . C8.unpack . encode UTF8 . 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
+encodeFragment :: String -> String
+encodeFragment = escapeURIString isSafeChar . C8.unpack . encode UTF8
+
+
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
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)
}