]> ruin.nu Git - yawbih.git/blob - Wiki.hs
simple links
[yawbih.git] / Wiki.hs
1 module Wiki (
2         Backend (getCurrent,getList,get,setCurrent,update)
3         ,PGB
4         ,createPGB
5         ,Markup (Text, Paragraph, Link)
6         ,Document
7         ,wikiParser
8
9 ) where
10
11 import Dbconnect
12 import Data.Char
13 import Text.ParserCombinators.Parsec
14
15 class Backend a where
16         --Keyword -> (Full text,date)
17         getCurrent :: a -> String -> IO (Maybe (String,String))
18
19         --Keyword -> [(id,date,author,comment)]
20         getList :: a -> String -> IO [(String, String, String, String)]
21
22         --Keyword -> id -> Full text
23         get :: a -> String -> String -> IO String
24
25         --Keyword -> id -> ()
26         setCurrent :: a -> String -> String -> IO Bool
27
28         --Keyword -> Full text -> id
29         update :: a -> String -> String -> String -> String -> IO String
30
31 data Markup = Text String
32         | Paragraph 
33         | Link String String
34
35 type Document = [Markup]
36
37 wikiParser :: GenParser Char st Document        
38 wikiParser = do 
39         s <- (try (pPara) 
40                 <|> pOneEol 
41                 <|> try (pLinkLong)
42                 <|> pLink
43                 <|> pText)
44         ss <- (wikiParser <|> return [])
45         return (s:ss)
46
47 pPara = do
48         pEol
49         pEol
50         return (Paragraph)
51
52 pOneEol = do
53         pEol
54         return (Text " ")
55
56 pEol = char '\n' <|> do
57         char '\r'
58         char '\n'
59
60 pLinkLong = do
61         string "[["
62         l <- many1 $ noneOf ['|','[',']']
63         char '|'
64         d <- many1 $ noneOf ['|','[',']'] 
65         string "]]"
66         return (Link l d)
67 pLink = do
68         string "[["
69         l <- many1 $ noneOf ['|','[',']']
70         string "]]"
71         return (Link l l)
72
73 pText = do
74         t <- many1 (noneOf ['\n','\r','[',']'])
75         return (Text t)
76
77 newtype PGB = PGB DBService
78
79 createPGB :: String -> String -> String -> String -> IO PGB
80 createPGB host database user password = let db = createDBService host database "" user password Nothing in return (PGB db)
81
82
83 testDB = createPGB "wave" "wiki" "wiki" "12wiki34db"
84
85 instance Backend PGB where
86
87         getCurrent (PGB db) key = do 
88                 result <- selectReturnTuples db $ "SELECT fulltext,timestamp FROM curtexts WHERE keyword="++tov key
89                 case result of
90                         [text,date]:_ -> return (Just (text,date))
91                         _ -> return Nothing
92
93         getList (PGB db) key = do
94                 list <- selectReturnTuples db $ "SELECT id, timestamp, author, comment from fulltexts WHERE keyword = "++tov key
95                 return $ map (\[id,date,author,comment] -> (id,date,author,comment)) list
96
97         get (PGB db) key id = return ""
98
99         setCurrent (PGB db) key id = do
100                 full <- selectReturnTuples db $ "SELECT keyword FROM fulltexts WHERE keyword="++tov key++" AND id='"++id++"'"
101                 cur <- selectReturnTuples db $ "SELECT keyword FROM curtexts WHERE keyword="++tov key
102                 case full of
103                         [[]] -> do
104                                 return False
105                         _  -> do
106                                 rows <- case cur of
107                                         [[]] -> do
108                                                 execute db $ "INSERT INTO current (keyword, id) VALUES ("++tov key++","++tov id++")"
109                                         _  -> do
110                                                 execute db $ "UPDATE current SET id = "++tov id++" WHERE keyword = "++tov key
111                                 if rows == 1 then return True
112                                         else return False 
113
114         update (PGB db) key text author comment = do
115                 rows <- execute db $ "INSERT INTO fulltexts (keyword,fulltext, author, comment) VALUES ("++tov key++","++tov text++","++tov author++","++tov comment++")"
116                 if rows == 0 then return ""
117                         else do
118                                 [[id]] <- selectReturnTuples db $ "SELECT currval('fulltexts_id_seq')" 
119                                 setCurrent (PGB db) key id
120                                 return id
121                         
122
123 tov :: String -> String
124 tov s = '\'':escapeQuery s++"'"
125                 
126