1 module Rakka.Resource.Page.Get
7 import Control.Arrow.ArrowIf
8 import Control.Arrow.ArrowIO
9 import Control.Arrow.ArrowList
11 import Data.Encoding.UTF8
12 import Network.HTTP.Lucu
14 import Rakka.Environment
18 import Rakka.SystemConfig
21 import Text.XML.HXT.Arrow.XmlArrow
22 import Text.XML.HXT.Arrow.XmlNodeSet
23 import Text.XML.HXT.DOM.TypeDefs
26 handleGet :: Environment -> PageName -> Resource ()
28 = runIdempotentA $ proc ()
29 -> do pageM <- getPageA (envStorage env) -< name
32 -> returnA -< foundNoEntity Nothing
34 Just redir@(Redirection _ _ _ _)
35 -> handleRedirect env -< redir
37 Just entity@(Entity _ _ _ _ _ _ _ _ _ _ _ _)
38 -> handleGetEntity env -< entity
42 Location: http://example.org/Destination?from=Source&revision=112
44 handleRedirect :: (ArrowXml a, ArrowIO a) => Environment -> a Page (Resource ())
47 -> do BaseURI baseURI <- getSysConfA (envSysConf env) (BaseURI undefined) -< ()
48 returnA -< redirect Found (mkPageURI baseURI $ redirName redir) -- FIXME
52 [pageIsBinary が False の場合]
54 <page site="CieloNegro"
55 baseURI="http://example.org/"
56 styleSheet="StyleSheet/Default"
59 isTheme="no" -- text/css の場合のみ存在
60 isFeed="no" -- text/x-rakka の場合のみ存在
62 revision="112"> -- デフォルトでない場合のみ存在
63 lastModified="2000-01-01T00:00:00" />
67 </summary> -- 存在しない場合もある
69 <otherLang> -- 存在しない場合もある
70 <link lang="ja" page="Bar/Baz" />
79 [pageIsBinary が True の場合: content 要素の代はりに object 要素]
81 <object data="/object/Foo/Bar" /> -- data 屬性に URI
83 handleGetEntity :: (ArrowXml a, ArrowIO a) => Environment -> a Page (Resource ())
85 = let sysConf = envSysConf env
88 -> do SiteName siteName <- getSysConfA sysConf (SiteName undefined) -< ()
89 BaseURI baseURI <- getSysConfA sysConf (BaseURI undefined) -< ()
90 StyleSheet cssName <- getSysConfA sysConf (StyleSheet undefined) -< ()
94 += sattr "site" siteName
95 += sattr "baseURI" (uriToString id baseURI "")
96 += sattr "styleSheet" cssName
97 += sattr "name" (pageName page)
98 += sattr "type" (show $ pageType page)
99 += ( case pageType page of
100 MIMEType "text" "css" _
101 -> sattr "isTheme" (yesOrNo $ pageIsTheme page)
104 += ( case pageType page of
105 MIMEType "text" "x-rakka" _
106 -> sattr "isFeed" (yesOrNo $ pageIsFeed page)
109 += sattr "isLocked" (yesOrNo $ pageIsLocked page)
110 += ( case pageRevision page of
112 Just rev -> sattr "revision" (show rev)
114 += sattr "lastModified" (formatW3CDateTime $ pageLastMod page)
116 += ( case pageSummary page of
118 Just s -> eelem "summary" += txt s
121 += ( case pageOtherLang page of
123 xs -> selem "otherLang"
127 | (lang, page) <- xs ]
130 += ( case pageIsBinary page of
131 False -> eelem "content"
132 += txt (decodeLazy UTF8 $ pageContent page)
134 True -> eelem "object"
135 += sattr "data" (uriToString id (mkObjectURI baseURI $ pageName page) "")
140 returnA -< do let lastMod = toClockTime $ pageLastMod page
142 case pageRevision page of
143 Nothing -> foundTimeStamp lastMod
144 Just rev -> foundEntity (strongETag $ show rev) lastMod
146 outputXmlPage tree entityToXHTML
149 entityToXHTML :: ArrowXml a => a XmlTree XmlTree
153 += sattr "xmlns" "http://www.w3.org/1999/xhtml"
156 += getXPathTreesInDoc "/page/@site/text()"
158 += getXPathTreesInDoc "/page/@name/text()"
162 ( getXPathTreesInDoc "/page/@baseURI/text()" )
165 += sattr "rel" "stylesheet"
166 += sattr "type" "text/css"
170 getXPathTreesInDoc "/page/@styleSheet/text()"
182 += sattr "class" "header"
185 += sattr "class" "center"
187 += sattr "class" "title"
190 += sattr "class" "body"
191 += ( getXPathTreesInDoc "/page/content"
193 getXPathTreesInDoc "/page/content/text()" -- FIXME
195 += ( getXPathTreesInDoc "/page/object"
199 ( getXPathTreesInDoc "/page/object/@data/text()" )
204 += sattr "class" "footer"
207 += sattr "class" "left side-bar"
209 += sattr "class" "content"
213 += sattr "class" "right side-bar"
215 += sattr "class" "content"