[Fencommits] fenserve: edit and reply work
Benja Fallenstein
benja.fallenstein at gmail.com
Thu Mar 22 22:16:45 EET 2007
Thu Mar 22 22:16:24 EET 2007 Benja Fallenstein <benja.fallenstein at gmail.com>
* edit and reply work
diff -rN -u old-fenserve/board-demo.page new-fenserve/board-demo.page
--- old-fenserve/board-demo.page 2007-03-22 22:16:44.000000000 +0200
+++ new-fenserve/board-demo.page 2007-03-22 22:16:44.000000000 +0200
@@ -2,7 +2,10 @@
import Fenfire.RDF
import qualified Data.List as List
-import Data.Maybe (fromMaybe)
+import Data.Maybe (fromMaybe, catMaybes)
+
+import System.Time
+import System.IO.Unsafe (unsafePerformIO)
dc = "http://purl.org/dc/elements/1.1/"
dcterms = "http://purl.org/dc/terms/"
@@ -77,28 +80,64 @@
| otherwise = "Re: " ++ s
title = maybe "" (\irt -> addRe $ postTitle $ IRI irt)
(lookM ?req "inReplyTo") in
- <form action="" method="POST">
+ <form action=(path $ rqURI ?req) method="POST">
<p><b>Title:</b> <input type="text" name="title" value=title/></p>
<p><b>Your name:</b> <input type="text" name="author"/></p>
<% maybe (HTML "")
(\irt -> <input type="hidden" name="inReplyTo" value=irt/>)
(lookM ?req "inReplyTo") %>
+ <input type="hidden" name="view" value="post"/>
<p><textarea name="content" rows="10" cols="70"></textarea></p>
<p><input type="submit"/></p>
</form>
editForm :: (?graph :: Graph, ?req :: Request) => () -> HTML
editForm () = let post = IRI (lookWithDefault "post" "ex:post" ?req) in
- <form action="" method="POST">
+ <form action=(path $ rqURI ?req) method="POST">
<p><b>Title:</b> <input type="text" name="title"
value=(postTitle post)/></p>
<p><b>Your name:</b> <input type="text" name="author"
value=(postAuthor post)/></p>
+ <input type="hidden" name="view" value="edit"/>
<input type="hidden" name="post" value=(iriStr post)/>
<p><textarea name="content" rows="10" cols="70">
<% postContent post %></textarea></p>
<p><input type="submit"/></p>
</form>
+
+postHandler :: Handler
+postHandler req = do
+ let time = unsafeGetW3CTime ()
+ let f = lit . g; g = fromMaybe "" . lookM ?req
+ p = IRI $ "ex:post:" ++ literalStr time
+ board = maybe blog IRI $ lookM ?req "board"
+ parent = fmap IRI $ lookM ?req "inReplyTo"
+ graph' = foldr Fenfire.RDF.insert ?graph $ [
+ (p, sioc_has_container, board),
+ (p, dc_title, f "title"),
+ (p, dc_creator, f "author"),
+ (p, content_encoded, f "content"),
+ (p, dcterms_created, time),
+ (p, dcterms_modified, time)]
+ ++ catMaybes [do parent' <- parent -- running in Maybe
+ return (p, sioc_reply_of, parent')]
+ bid <- writeGraph graph'
+ putEntry ["testdata","blog"] $ FileEntry $ bIRI bid
+ pageHandler (let ?graph = graph' in renderBoard blog) ?req
+
+editHandler :: Handler
+editHandler req = do
+ let time = unsafeGetW3CTime ()
+ let f = lit . g; g = fromMaybe "" . lookM ?req
+ graph' = foldr Fenfire.RDF.update ?graph $ [
+ (post, dc_title, f "title"),
+ (post, dc_creator, f "author"),
+ (post, content_encoded, f "content"),
+ (post, dcterms_modified, time)]
+ bid <- writeGraph graph'
+ putEntry ["testdata","blog"] $ FileEntry $ bIRI bid
+ pageHandler (let ?graph = graph' in renderBoard blog) ?req
+
handler req = do
e <- getEntry ["testdata","blog"]
@@ -107,6 +146,24 @@
let ?graph = graph; ?req = req in
case (lookM req "view", rqMethod req) of
- (Just "post", GET) -> pageHandler (postForm ()) req
- (Just "edit", GET) -> pageHandler (editForm ()) req
- _ -> flip pageHandler req $ let ?graph = graph in renderBoard blog
+ (Just "post", GET) -> pageHandler (postForm ()) req
+ (Just "edit", GET) -> pageHandler (editForm ()) req
+ (Just "post", POST) -> postHandler req
+ (Just "edit", POST) -> editHandler req
+ _ -> pageHandler (renderBoard blog) req
+
+
+-------------------------------------------------------------------------
+-- Utilities.
+-------------------------------------------------------------------------
+
+unsafeGetW3CTime () = Literal (iso8601 y (fromEnum mo + 1) d h m s) Plain where
+ time = unsafePerformIO $ getClockTime -- XXX
+ CalendarTime y mo d h m s ps wd yd tzn tz isDST = toUTCTime $ time
+
+iso8601 y mo d h m s =
+ let p n i = take (n - length (show i)) (repeat '0') ++ show i
+ in p 4 y ++ '-':p 2 mo ++ '-':p 2 d ++
+ 'T':p 2 h ++ ':':p 2 m ++ ':':p 2 s ++ ['Z']
+
+
More information about the Fencommits
mailing list