]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Resource/Render.hs
wrote many
[Rakka.git] / Rakka / Resource / Render.hs
index 27671dac98738115ac85a815f7d41c9bb06bd4e0..df141b13ee2445db2df690fb8094ca54427c520a 100644 (file)
@@ -51,7 +51,7 @@ handleGet env name
     -> do pageM <- getPageA (envStorage env) -< name
           case pageM of
             Nothing
-                -> returnA -< foundNoEntity Nothing
+                -> handlePageNotFound env -< name
 
             Just redir@(Redirection _ _ _ _)
                 -> handleRedirect env -< redir
@@ -79,7 +79,7 @@ handleRedirect env
         isFeed="no"         -- text/x-rakka の場合のみ存在
         isLocked="no"
         revision="112">     -- デフォルトでない場合のみ存在
-        lastModified="2000-01-01T00:00:00" />
+        lastModified="2000-01-01T00:00:00">
 
     <summary>
         blah blah...
@@ -109,94 +109,95 @@ handleRedirect env
 -}
 handleGetEntity :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a Page (Resource ())
 handleGetEntity env
-    = let sysConf = envSysConf env
-      in
-        proc page
-          -> do SiteName   siteName <- getSysConfA sysConf (SiteName   undefined) -< ()
-                BaseURI    baseURI  <- getSysConfA sysConf (BaseURI    undefined) -< ()
-                StyleSheet cssName  <- getSysConfA sysConf (StyleSheet undefined) -< ()
-
-                Just pageTitle    <- getPageA (envStorage env) -< "PageTitle"
-                Just leftSideBar  <- getPageA (envStorage env) -< "SideBar/Left"
-                Just rightSideBar <- getPageA (envStorage env) -< "SideBar/Right"
-
-                tree <- ( eelem "/"
-                          += ( eelem "page"
-                               += sattr "site"       siteName
-                               += sattr "styleSheet" (uriToString id (mkObjectURI baseURI cssName) "")
-                               += sattr "name"       (pageName page)
-                               += sattr "type"       (show $ pageType page)
-                               += ( case pageType page of
-                                      MIMEType "text" "css" _
-                                          -> sattr "isTheme" (yesOrNo $ pageIsTheme page)
-                                      _   -> none
-                                  )
-                               += ( case pageType page of
-                                      MIMEType "text" "x-rakka" _
-                                          -> sattr "isFeed" (yesOrNo $ pageIsFeed page)
-                                      _   -> none
-                                  )
-                               += sattr "isLocked" (yesOrNo $ pageIsLocked page)
-                               += ( case pageRevision page of
-                                      Nothing  -> none
-                                      Just rev -> sattr "revision" (show rev)
-                                  )
-                               += sattr "lastModified" (formatW3CDateTime $ pageLastMod page)
-
-                               += ( case pageSummary page of
-                                      Nothing -> none
-                                      Just s  -> eelem "summary" += txt s
-                                  )
-
-                               += ( case pageOtherLang page of
-                                      [] -> none
-                                      xs -> selem "otherLang"
-                                            [ eelem "link"
-                                              += sattr "lang" lang
-                                              += sattr "page" page
-                                                  | (lang, page) <- xs ]
-                                  )
-                               += ( eelem "pageTitle"
-                                    += ( (constA page &&& constA pageTitle)
-                                         >>>
-                                         formatSubPage env
-                                       )
-                                  )
-                               += ( eelem "sideBar"
-                                    += ( eelem "left"
-                                         += ( (constA page &&& constA leftSideBar)
-                                              >>>
-                                              formatSubPage env
-                                            )
-                                       )
-                                    += ( eelem "right"
-                                         += ( (constA page &&& constA rightSideBar)
-                                              >>>
-                                              formatSubPage env
-                                            )
-                                       )
-                                  )
-                               += ( eelem "body"
-                                    += (constA page >>> formatPage env)
-                                  )
-                               >>>
-                               uniqueNamespacesFromDeclAndQNames
-                             )
-                        ) -<< ()
-
-                returnA -< do let lastMod = toClockTime $ pageLastMod page
-                              
-                              -- text/x-rakka の場合は、内容が動的に生
-                              -- 成されてゐる可能性があるので、ETag も
-                              -- Last-Modified も返す事が出來ない。
-                              case pageType page of
+    = proc page
+    -> do SiteName   siteName <- getSysConfA sysConf (SiteName   undefined) -< ()
+          BaseURI    baseURI  <- getSysConfA sysConf (BaseURI    undefined) -< ()
+          StyleSheet cssName  <- getSysConfA sysConf (StyleSheet undefined) -< ()
+
+          Just pageTitle    <- getPageA (envStorage env) -< "PageTitle"
+          Just leftSideBar  <- getPageA (envStorage env) -< "SideBar/Left"
+          Just rightSideBar <- getPageA (envStorage env) -< "SideBar/Right"
+
+          tree <- ( eelem "/"
+                    += ( eelem "page"
+                         += sattr "site"       siteName
+                         += sattr "styleSheet" (uriToString id (mkObjectURI baseURI cssName) "")
+                         += sattr "name"       (pageName page)
+                         += sattr "type"       (show $ pageType page)
+                         += ( case pageType page of
+                                MIMEType "text" "css" _
+                                    -> sattr "isTheme" (yesOrNo $ pageIsTheme page)
+                                _   -> none
+                            )
+                         += ( case pageType page of
                                 MIMEType "text" "x-rakka" _
-                                    -> return ()
-                                _   -> case pageRevision page of
-                                         Nothing  -> foundTimeStamp lastMod
-                                         Just rev -> foundEntity (strongETag $ show rev) lastMod
+                                    -> sattr "isFeed" (yesOrNo $ pageIsFeed page)
+                                _   -> none
+                            )
+                         += sattr "isLocked" (yesOrNo $ pageIsLocked page)
+                         += ( case pageRevision page of
+                                Nothing  -> none
+                                Just rev -> sattr "revision" (show rev)
+                            )
+                         += sattr "lastModified" (formatW3CDateTime $ pageLastMod page)
+
+                         += ( case pageSummary page of
+                                Nothing -> none
+                                Just s  -> eelem "summary" += txt s
+                            )
+
+                         += ( case pageOtherLang page of
+                                [] -> none
+                                xs -> selem "otherLang"
+                                      [ eelem "link"
+                                        += sattr "lang" lang
+                                        += sattr "page" page
+                                            | (lang, page) <- xs ]
+                            )
+                         += ( eelem "pageTitle"
+                              += ( (constA (pageName page) &&& constA pageTitle)
+                                   >>>
+                                   formatSubPage env
+                                 )
+                            )
+                         += ( eelem "sideBar"
+                              += ( eelem "left"
+                                   += ( (constA (pageName page) &&& constA leftSideBar)
+                                        >>>
+                                        formatSubPage env
+                                      )
+                                 )
+                              += ( eelem "right"
+                                   += ( (constA (pageName page) &&& constA rightSideBar)
+                                        >>>
+                                        formatSubPage env
+                                      )
+                                 )
+                            )
+                         += ( eelem "body"
+                              += (constA page >>> formatPage env)
+                            )
+                         >>>
+                         uniqueNamespacesFromDeclAndQNames
+                       )
+                  ) -<< ()
 
-                              outputXmlPage tree entityToXHTML
+          returnA -< do let lastMod = toClockTime $ pageLastMod page
+                              
+                        -- text/x-rakka の場合は、内容が動的に生成され
+                        -- てゐる可能性があるので、ETag も
+                        -- Last-Modified も返す事が出來ない。
+                        case pageType page of
+                          MIMEType "text" "x-rakka" _
+                              -> return ()
+                          _   -> case pageRevision page of
+                                   Nothing  -> foundTimeStamp lastMod
+                                   Just rev -> foundEntity (strongETag $ show rev) lastMod
+
+                        outputXmlPage tree entityToXHTML
+    where
+      sysConf :: SystemConfig
+      sysConf = envSysConf env
 
 
 entityToXHTML :: ArrowXml a => a XmlTree XmlTree
@@ -253,3 +254,127 @@ entityToXHTML
            >>>
            uniqueNamespacesFromDeclAndQNames
          )
+
+
+{-
+  <pageNotFound site="CieloNegro"
+                styleSheet="http://example.org/object/StyleSheet/Default"
+                name="Foo/Bar">
+
+    <pageTitle>
+      blah blah...
+    </pageTitle>
+
+    <sideBar>
+      <left>
+        blah blah...
+      </left>
+      <right>
+        blah blah...
+      </right>
+    </sideBar>
+  </pageNotFound>
+-}
+handlePageNotFound :: (ArrowXml a, ArrowChoice a, ArrowIO a) => Environment -> a PageName (Resource ())
+handlePageNotFound env
+    = proc name
+    -> do SiteName   siteName <- getSysConfA sysConf (SiteName   undefined) -< ()
+          BaseURI    baseURI  <- getSysConfA sysConf (BaseURI    undefined) -< ()
+          StyleSheet cssName  <- getSysConfA sysConf (StyleSheet undefined) -< ()
+
+          Just pageTitle    <- getPageA (envStorage env) -< "PageTitle"
+          Just leftSideBar  <- getPageA (envStorage env) -< "SideBar/Left"
+          Just rightSideBar <- getPageA (envStorage env) -< "SideBar/Right"
+
+          tree <- ( eelem "/"
+                    += ( eelem "pageNotFound"
+                         += sattr "site"       siteName
+                         += sattr "styleSheet" (uriToString id (mkObjectURI baseURI cssName) "")
+                         += sattr "name"       name
+                         
+                         += ( eelem "pageTitle"
+                              += ( (constA name &&& constA pageTitle)
+                                   >>>
+                                   formatSubPage env
+                                 )
+                            )
+                         += ( eelem "sideBar"
+                              += ( eelem "left"
+                                   += ( (constA name &&& constA leftSideBar)
+                                        >>>
+                                        formatSubPage env
+                                      )
+                                 )
+                              += ( eelem "right"
+                                   += ( (constA name &&& constA rightSideBar)
+                                        >>>
+                                        formatSubPage env
+                                      )
+                                 )
+                            )
+                         >>>
+                         uniqueNamespacesFromDeclAndQNames
+                       )
+                  ) -<< ()
+
+          returnA -< do setStatus NotFound
+                        outputXmlPage tree notFoundToXHTML
+    where
+      sysConf :: SystemConfig
+      sysConf = envSysConf env
+
+
+notFoundToXHTML :: ArrowXml a => a XmlTree XmlTree
+notFoundToXHTML
+    = eelem "/"
+      += ( eelem "html"
+           += sattr "xmlns" "http://www.w3.org/1999/xhtml"
+           += ( eelem "head"
+                += ( eelem "title"
+                     += getXPathTreesInDoc "/pageNotFound/@site/text()"
+                     += txt " - "
+                     += getXPathTreesInDoc "/pageNotFound/@name/text()"
+                   )
+                += ( eelem "link"
+                     += sattr "rel"  "stylesheet"
+                     += sattr "type" "text/css"
+                     += attr "href"
+                            ( getXPathTreesInDoc "/pageNotFound/@styleSheet/text()" )
+                   )
+              )
+           += ( eelem "body"
+                += ( eelem "div"
+                     += sattr "class" "header"
+                   )
+                += ( eelem "div"
+                     += sattr "class" "center"
+                     += ( eelem "div"
+                          += sattr "class" "title"
+                          += getXPathTreesInDoc "/pageNotFound/pageTitle/*"
+                        )
+                     += ( eelem "div"
+                          += sattr "class" "body"
+                          += txt "404 Not Found (FIXME)" -- FIXME
+                        )
+                   )
+                += ( eelem "div"
+                     += sattr "class" "footer"
+                   )
+                += ( eelem "div"
+                     += sattr "class" "left sideBar"
+                     += ( eelem "div"
+                          += sattr "class" "content"
+                          += getXPathTreesInDoc "/pageNotFound/sideBar/left/*"
+                        )
+                   )
+                += ( eelem "div"
+                     += sattr "class" "right sideBar"
+                     += ( eelem "div"
+                          += sattr "class" "content"
+                          += getXPathTreesInDoc "/pageNotFound/sideBar/right/*"
+                        )
+                   )
+              )
+           >>>
+           uniqueNamespacesFromDeclAndQNames
+         )