, encodePageName
, decodePageName
- , entityFileName'
- , defaultFileName
-
, mkPageURI
, mkPageFragmentURI
, mkObjectURI
entityName :: !PageName
, entityType :: !MIMEType
, entityLanguage :: !(Maybe LanguageTag)
- , entityFileName :: !(Maybe String)
, entityIsTheme :: !Bool -- text/css 以外では無意味
, entityIsFeed :: !Bool -- text/x-rakka 以外では無意味
, entityIsLocked :: !Bool
isEntity :: Page -> Bool
-isEntity (Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) = True
-isEntity _ = False
+isEntity (Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _) = True
+isEntity _ = False
pageName :: Page -> PageName
encodeFragment = escapeURIString isSafeChar . UTF8.encodeString
-entityFileName' :: Page -> String
-entityFileName' page
- = fromMaybe (defaultFileName (entityType page) (entityName page)) (entityFileName page)
-
-
-defaultFileName :: MIMEType -> PageName -> String
-defaultFileName pType pName
- = let baseName = takeFileName pName
- in
- case pType of
- MIMEType "text" "x-rakka" _ -> baseName <.> "rakka"
- MIMEType "text" "css" _ -> baseName <.> "css"
- _ -> baseName
-
-
mkPageURI :: URI -> PageName -> URI
mkPageURI baseURI name
= baseURI {
<page name="Foo/Bar"
type="text/x-rakka"
lang="ja" -- 存在しない場合もある
- fileName="bar.rakka" -- 存在しない場合もある
isTheme="no" -- text/css の場合のみ存在
isFeed="no" -- text/x-rakka の場合のみ存在
isLocked="no"
Just x -> sattr "lang" x
Nothing -> none
)
- += ( case entityFileName page of
- Just x -> sattr "fileName" x
- Nothing -> none
- )
+= ( case entityType page of
MIMEType "text" "css" _
-> sattr "isTheme" (yesOrNo $ entityIsTheme page)
mimeTypeStr <- withDefault (getXPathTreesInDoc "/page/@type/text()" >>> getText) "" -< tree
lang <- maybeA (getXPathTreesInDoc "/page/@lang/text()" >>> getText) -< tree
- fileName <- maybeA (getXPathTreesInDoc "/page/@filename/text()" >>> getText) -< tree
isTheme <- (withDefault (getXPathTreesInDoc "/page/@isTheme/text()" >>> getText) "no"
>>> parseYesOrNo) -< tree
entityName = name
, entityType = mimeType
, entityLanguage = lang
- , entityFileName = fileName
, entityIsTheme = isTheme
, entityIsFeed = isFeed
, entityIsLocked = isLocked
)
where
-import Data.ByteString.Char8 as C8
import Data.Maybe
import Network.HTTP.Lucu
import Network.HTTP.Lucu.Utils
handleGet env name
= do pageM <- getPage (envStorage env) name Nothing
case pageM of
- Nothing
- -> foundNoEntity Nothing
-
- Just redir@(Redirection _ _ _ _ _)
- -> handleRedirect env redir
-
- Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _ _)
- -> handleGetEntity entity
+ Nothing -> foundNoEntity Nothing
+ Just page -> if isEntity page then
+ handleGetEntity page
+ else
+ handleRedirect env page
{-
rev -> foundEntity (strongETag $ show rev) (entityLastMod page)
setContentType (entityType page)
- setHeader (C8.pack "Content-Disposition")
- (C8.pack $ "attachment; filename=" ++ quoteStr (entityFileName' page))
outputLBS (entityContent page)
= runIdempotentA $ proc ()
-> do pageM <- getPageA (envStorage env) -< (name, Nothing)
case pageM of
- Nothing
- -> handlePageNotFound env -< name
+ Nothing -> handlePageNotFound env -< name
+ Just page -> if isEntity page then
+ handleGetEntity env -< page
+ else
+ handleRedirect env -< page
- Just redir@(Redirection _ _ _ _ _)
- -> handleRedirect env -< redir
-
- Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _ _)
- -> handleGetEntity env -< entity
{-
HTTP/1.1 302 Found
-< fpath
page <- parseXmlizedPage -< (name, tree)
- case page of
- Redirection _ _ _ _ _
- -> returnA -< page {
- redirRevision = 0
- , redirLastMod = lastMod
- }
-
- Entity _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- -> returnA -< page {
- entityRevision = 0
- , entityLastMod = lastMod
- }
+ if isEntity page then
+ returnA -< page {
+ entityRevision = 0
+ , entityLastMod = lastMod
+ }
+ else
+ returnA -< page {
+ redirRevision = 0
+ , redirLastMod = lastMod
+ }
entityName = name
, entityType = mimeType
, entityLanguage = fmap chomp (lookup "rakka:lang" props)
- , entityFileName = fmap chomp (lookup "rakka:fileName" props)
, entityIsTheme = any ((== "rakka:isTheme") . fst) props
, entityIsFeed = any ((== "rakka:isFeed") . fst) props
, entityIsLocked = any ((== "rakka:isLocked") . fst) props
= do let path = mkPagePath name
setNodeProp path "svn:mime-type" (Just "application/x-rakka-redirection")
setNodeProp path "rakka:lang" Nothing
- setNodeProp path "rakka:fileName" Nothing
setNodeProp path "rakka:isTheme" Nothing
setNodeProp path "rakka:isFeed" Nothing
setNodeProp path "rakka:isLocked" Nothing
= do let path = mkPagePath name
setNodeProp path "svn:mime-type" ((Just . show . entityType) page)
setNodeProp path "rakka:lang" (entityLanguage page)
- setNodeProp path "rakka:fileName" (entityFileName page)
setNodeProp path "rakka:isTheme" (encodeFlag $ entityIsTheme page)
setNodeProp path "rakka:isFeed" (encodeFlag $ entityIsFeed page)
setNodeProp path "rakka:isLocked" (encodeFlag $ entityIsLocked page)
wikifyPage :: (ArrowXml a, ArrowChoice a) => InterpTable -> a XmlTree WikiPage
wikifyPage interpTable
= proc tree
- -> do pName <- getXPathTreesInDoc "/page/@name/text()" >>> getText -< tree
- pType <- getXPathTreesInDoc "/page/@type/text()" >>> getText >>> arr read -< tree
- pFileName <- maybeA (getXPathTreesInDoc "/page/fileName/text()" >>> getText) -< tree
+ -> do pType <- getXPathTreesInDoc "/page/@type/text()" >>> getText >>> arr read -< tree
textData <- maybeA (getXPathTreesInDoc "/page/textData/text()" >>> getText) -< tree
base64Data <- maybeA (getXPathTreesInDoc "/page/binaryData/text()" >>> getText) -< tree
-> returnA -< [ Paragraph [Image (Left $ fromJust dataURI) Nothing] ]
_ -> if isJust dataURI then
- -- <a href="data:application/zip;base64,...">foo.zip</a>
+ -- <a href="data:application/zip;base64,...">
+ -- application/zip
+ -- </a>
returnA -< [ Paragraph [ Anchor
[("href", show dataURI)]
- [Text (fromMaybe (defaultFileName pType pName) pFileName)]
+ [Text (show pType)]
]
]
else