X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Main.hs;h=8dec3829a18d5fe82717ccc98ded344292763635;hb=625a2981711271d1f5841c55978d69881d6054da;hp=8df5e74512d59202e045879579251682846208ce;hpb=a3c05f5d3f4be5f28a3eae7739f138a07fa263ad;p=yawbih.git diff --git a/Main.hs b/Main.hs index 8df5e74..8dec382 100644 --- a/Main.hs +++ b/Main.hs @@ -1,21 +1,27 @@ module Main where -import CGI hiding (div, head, map, span) +import CGI hiding (div, head, map, span, Text) import RawCGIInternal import CGIOutput import CGITypes import System import Wiki +import Control.Monad -testDB = createPGB "wave" "wiki" "wiki" "12wiki34db" +import Text.ParserCombinators.Parsec +testDB = createPGB "localhost" "wiki" "wiki" "12wiki34db" + +test key = do + db <- testDB + s <- getCurrent db key + print s + --main = start [] cgi main = do db <- testDB - runWithHook [] (\(key:act) -> sp db key act ) $ sp db "MainPage" [] - -ps a = standardQuery "Hello" a + runWithHook [] (\(key:act) -> showPage db (filter (/= '\\') key)) $ showPage db "itproj3" editPage db key = do s <- io $ getCurrent db key @@ -23,39 +29,136 @@ editPage db key = do Nothing -> return "" Just (x,_) -> return x standardQuery key $ do - t <- p $ makeTextarea s' (attr_SS "rows" "10" ## attr_SS "cols" "75" ## attr_SS "colspan" "2") - p (text "Author: ") + t <- p $ makeTextarea s' (attr_SS "rows" "25" ## attr_SS "cols" "120" ## attr_SS "colspan" "2") + p empty + text "Author: " a <- textInputField (fieldSIZE 20) - p (text "Comment: ") + p empty + text "Comment: " c <- textInputField (fieldSIZE 20) - --p $ submit (F2 t a) testing (attr "value" "Send") p $ defaultSubmit (F3 t a c) (savePage db key) (attr "value" "Send") - --submit0 (sp db key []) (attr "value" "Send1") - -sp db key _ = do - s <- io $ getCurrent db key - standardQuery key $ showPage db key s savePage db key (F3 t a c) = do - s <- io $ update db key fulltext author comment - standardQuery key $ do - text "Updated with revision: " - text s - address (hlink (URL {unURL = ("wiki?"++key)}) (text "Back to keyword") ) + io $ update db key fulltext author comment + showPage db key where fulltext = value t author = value a comment = value c -showPage db key s = do +showPage db key = do + s <- io $ getCurrent db key + standardQuery key $ do case s of Nothing -> text "No text added for this keyword" Just (full, date) -> do - text full - p $ text $ "Last edited: "++date + parseText full + p $ tt $ text $ "Last edited: "++date footer db key +parseText full = case parse wikiParser "" full of + Right n -> toWash n + Left e -> do + text "PARSE ERROR: " + text (show e) + p $ text full + footer db key = do hr empty - submit0 (editPage db key) (attr "value" "Edit") - --address (hlink (URL {unURL = ("wiki?"++key++"+edit")}) (text "Edit this page") ) + table $ tr $ do + td $ submitLink0 (showPage db "itproj3") (text "Back to main page") + when (e key) $ td $ submitLink0 (editPage db key) (text "Edit this keyword") + when (e key) $ td $ submitLink0 (listRevs db key) (text "List old versions") + td $ submitLink0 (listKeywords db) (text "List all keywords") + td $ text "Keyword: " + td $ activate (showPage db) textInputField empty + +e "" = False +e _ = True + +listRevs db key = do + list <- io $ getList db key + standardQuery key $ do + table $ do + tr $ mapM (\header -> th (text header)) + ["Id", "Date", "Author", "Comment"] + mapM (revRow db key) list + footer db key + +listKeywords db = do + list <- io $ listKeys db + standardQuery "List of keywords" $ do + table (do + tr $ th (text "Keyword") + mapM (\key -> tr $ td $ linkKey db key) list) + footer db "" + +linkKey db key = submitLink0 (showPage db key) (text key) + +revRow db key (id, date, author, comment) = tr $ do + td $ submitLink0 (showRev db key id) (text id) + td $ text date + td $ linkKey db author + td $ text comment + +showRev db key id = do + s <- io $ get db key id + standardQuery key $ do + case s of + Nothing -> text "No such revision" + Just s -> parseText s + p empty + submitLink0 (changeCurrent db key id) (text "Set this version as the current one") + footer db key +changeCurrent db key id = do + b <- io $ setCurrent db key id + if b then showPage db key + else standardQuery key $ do + text "Could not set this revision as the current active one." + p empty + linkKey db key + +toWash [] = return () +toWash ((Paragraph):xs) = do + p empty + toWash xs +toWash ((Text s):xs) = do + text s + toWash xs +toWash ((Link l d):xs) = do + hlink (URL {unURL = ("wiki?"++l)}) (text d) + toWash xs +toWash ((Font o d):xs) = do + fontOp o (toWash d) + toWash xs +toWash ((Heading n d):xs) = do + heading n $ toWash d + toWash xs +toWash ((Url l):xs) = do + hlink (URL {unURL = (l)}) (text $ stripMailto l) + toWash xs +toWash ((Pre s):xs) = do + pre $ toWash s + toWash xs +toWash ((List o l):xs) = do + listType o $ mapM (\s -> li $ toWash s) l + toWash xs + +listType True = ol +listType False = ul + +stripMailto ('m':'a':'i':'l':'t':'o':':':xs) = xs +stripMailto xs = xs + +fontOp Bold = b +fontOp Emph = em +fontOp Mono = tt +fontOp Underline = u +fontOp Strike = strike + +heading 1 = h1 +heading 2 = h2 +heading 3 = h3 +heading 4 = h4 +heading 5 = h5 +heading 6 = h6