]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Resource/Render.hs
Implemented the outline command
[Rakka.git] / Rakka / Resource / Render.hs
index e9929903e75fce46e92bd45fc717bbb0632c6666..698e789e7467c1ce86fc6b6a0f4c99686f9095c0 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...
@@ -89,71 +89,115 @@ handleRedirect env
       <link lang="ja" page="Bar/Baz" />
     </otherLang>
 
-    <content>
+    <pageTitle>
       blah blah...
-    </content>
+    </pageTitle>
+
+    <sideBar>
+      <left>
+        blah blah...
+      </left>
+      <right>
+        blah blah...
+      </right>
+    </sideBar>
+
+    <body>
+      blah blah...
+    </body>
   </page>
 -}
 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) -< ()
-
-                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 "content"
-                                    += (constA page >>> formatPage env )
-                                  )
-                               >>>
-                               uniqueNamespacesFromDeclAndQNames
-                             )
-                        ) -<< ()
-
-                returnA -< do let lastMod = toClockTime $ pageLastMod page
-
-                              case pageRevision page of
-                                Nothing  -> foundTimeStamp lastMod
-                                Just rev -> foundEntity (strongETag $ show rev) lastMod
-
-                              outputXmlPage tree entityToXHTML
+    = 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 (pageName page) &&& constA (Just page) &&& constA pageTitle)
+                                   >>>
+                                   formatSubPage env
+                                 )
+                            )
+                         += ( eelem "sideBar"
+                              += ( eelem "left"
+                                   += ( (constA (pageName page) &&& constA (Just page) &&& constA leftSideBar)
+                                        >>>
+                                        formatSubPage env
+                                      )
+                                 )
+                              += ( eelem "right"
+                                   += ( (constA (pageName page) &&& constA (Just 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
+                          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
@@ -182,25 +226,152 @@ entityToXHTML
                      += sattr "class" "center"
                      += ( eelem "div"
                           += sattr "class" "title"
+                          += getXPathTreesInDoc "/page/pageTitle/*"
+                        )
+                     += ( eelem "div"
+                          += sattr "class" "body"
+                          += getXPathTreesInDoc "/page/body/*"
+                        )
+                   )
+                += ( eelem "div"
+                     += sattr "class" "footer"
+                   )
+                += ( eelem "div"
+                     += sattr "class" "left sideBar"
+                     += ( eelem "div"
+                          += sattr "class" "content"
+                          += getXPathTreesInDoc "/page/sideBar/left/*"
+                        )
+                   )
+                += ( eelem "div"
+                     += sattr "class" "right sideBar"
+                     += ( eelem "div"
+                          += sattr "class" "content"
+                          += getXPathTreesInDoc "/page/sideBar/right/*"
+                        )
+                   )
+              )
+           >>>
+           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 Nothing &&& constA pageTitle)
+                                   >>>
+                                   formatSubPage env
+                                 )
+                            )
+                         += ( eelem "sideBar"
+                              += ( eelem "left"
+                                   += ( (constA name &&& constA Nothing &&& constA leftSideBar)
+                                        >>>
+                                        formatSubPage env
+                                      )
+                                 )
+                              += ( eelem "right"
+                                   += ( (constA name &&& constA Nothing &&& 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"
-                          += getXPathTreesInDoc "/page/content/*"
+                          += txt "404 Not Found (FIXME)" -- FIXME
                         )
                    )
                 += ( eelem "div"
                      += sattr "class" "footer"
                    )
                 += ( eelem "div"
-                     += sattr "class" "left side-bar"
+                     += sattr "class" "left sideBar"
                      += ( eelem "div"
                           += sattr "class" "content"
+                          += getXPathTreesInDoc "/pageNotFound/sideBar/left/*"
                         )
                    )
                 += ( eelem "div"
-                     += sattr "class" "right side-bar"
+                     += sattr "class" "right sideBar"
                      += ( eelem "div"
                           += sattr "class" "content"
+                          += getXPathTreesInDoc "/pageNotFound/sideBar/right/*"
                         )
                    )
               )