module Rakka.Page
( PageName
, Page(..)
+ , LanguageTag
+ , LanguageName
+
, encodePageName
, decodePageName
, mkPageURI
+ , mkPageFragmentURI
, mkObjectURI
+ , mkAuxiliaryURI
)
where
import qualified Data.ByteString.Char8 as C8
import Data.Encoding
import Data.Encoding.UTF8
+import Data.Map (Map)
import Network.HTTP.Lucu
import Network.URI
import Subversion.Types
type PageName = String
+type LanguageTag = String -- See RFC 3066: http://www.ietf.org/rfc/rfc3066.txt
+type LanguageName = String -- i.e. "日本語"
+
data Page
= Redirection {
| Entity {
pageName :: !PageName
, pageType :: !MIMEType
+ , pageLanguage :: !(Maybe LanguageTag)
, pageIsTheme :: !Bool -- text/css 以外では無意味
, pageIsFeed :: !Bool -- text/x-rakka 以外では無意味
, pageIsLocked :: !Bool
, pageRevision :: !(Maybe RevNum)
, pageLastMod :: !CalendarTime
, pageSummary :: !(Maybe String)
- , pageOtherLang :: ![(String, PageName)]
+ , pageOtherLang :: !(Map LanguageTag PageName)
, pageContent :: !LazyByteString
}
mkPageURI :: URI -> PageName -> URI
mkPageURI baseURI name
= baseURI {
- uriPath = foldl combine "/" [uriPath baseURI, encodePageName name]
+ uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
+ }
+
+
+mkPageFragmentURI :: URI -> PageName -> String -> URI
+mkPageFragmentURI baseURI name fragment
+ = baseURI {
+ uriPath = foldl combine "/" [uriPath baseURI, encodePageName name ++ ".html"]
+ , uriFragment = ('#':fragment)
}
mkObjectURI :: URI -> PageName -> URI
mkObjectURI baseURI name
+ = mkAuxiliaryURI baseURI ["object"] name
+
+
+mkAuxiliaryURI :: URI -> [String] -> PageName -> URI
+mkAuxiliaryURI baseURI basePath name
= baseURI {
- uriPath = foldl combine "/" [uriPath baseURI, "object", encodePageName name]
+ uriPath = foldl combine "/" ([uriPath baseURI] ++ basePath ++ [encodePageName name])
}