From 69ecfedf2b7e27f50f7c2cedf534a036fe16907e Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Thu, 9 Dec 2004 23:15:25 +0000 Subject: [PATCH] parser is looking better --- Main.hs | 36 +++++++++++++++++++++++++++++++++--- Wiki.hs | 41 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/Main.hs b/Main.hs index 8df5e74..471fee4 100644 --- a/Main.hs +++ b/Main.hs @@ -1,12 +1,14 @@ 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 Text.ParserCombinators.Parsec + testDB = createPGB "wave" "wiki" "wiki" "12wiki34db" --main = start [] cgi @@ -51,11 +53,39 @@ showPage db key s = do case s of Nothing -> text "No text added for this keyword" Just (full, date) -> do - text full + case parse wikiParser "" full of + Right n -> ex n + Left e -> do + text "PARSE ERROR: " + text (show e) + p $ text full p $ text $ "Last edited: "++date footer db key footer db key = do hr empty submit0 (editPage db key) (attr "value" "Edit") - --address (hlink (URL {unURL = ("wiki?"++key++"+edit")}) (text "Edit this page") ) + --address (hlink (URL {unURL = ("wiki?"++key++"+edit")}) (text "Edit this page") + +ex [] = return () +ex ((Paragraph):xs) = do + p empty + ex xs +ex ((Text s):xs) = do + text s + ex xs +ex ((Link l d):xs) = do + hlink (URL {unURL = ("wiki?"++l)}) (text d) + ex xs + +ex2 [] = [] +ex2 ((Paragraph):xs) = "

"++ex2 xs +ex2 ((Text s):xs) = s++ex2 xs +ex2 ((Link l d):xs) = ""++ex2 xs + + +test s = case parse wikiParser "" s of + Right n -> do + print (ex2 n) + Left e -> do + print e diff --git a/Wiki.hs b/Wiki.hs index d6ece0d..ab89fff 100644 --- a/Wiki.hs +++ b/Wiki.hs @@ -2,11 +2,15 @@ module Wiki ( Backend (getCurrent,getList,get,setCurrent,update) ,PGB ,createPGB + ,Markup (Text, Paragraph, Link) + ,Document + ,wikiParser ) where import Dbconnect import Data.Char +import Text.ParserCombinators.Parsec class Backend a where --Keyword -> (Full text,date) @@ -25,11 +29,44 @@ class Backend a where update :: a -> String -> String -> String -> String -> IO String data Markup = Text String - | Bold String - | Paragraph [Markup] + | Paragraph + | Link String String type Document = [Markup] +wikiParser :: GenParser Char st Document +wikiParser = do + s <- (try (pPara) + <|> pOneEol + <|> pLinkLong + <|> pText) + ss <- (wikiParser <|> return []) + return (s:ss) + +pPara = do + pEol + pEol + return (Paragraph) + +pOneEol = do + pEol + return (Text " ") + +pEol = char '\n' <|> do + char '\r' + char '\n' + +pLinkLong = do + string "[[" + l <- many1 $ noneOf ['|','[',']'] + char '|' + d <- many1 $ noneOf ['|','[',']'] + string "]]" + return (Link l d) +pText = do + t <- many1 (noneOf ['\n','\r','[',']']) + return (Text t) + newtype PGB = PGB DBService createPGB :: String -> String -> String -> String -> IO PGB -- 2.39.2