X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Wiki.hs;h=59e592938df2e7fbb25634bb30b65dd357f05735;hb=ee02e144cc032d02afc0aaf3b1e73a1a68963ac6;hp=0b9e337da4bd7e50f7ebb266c88ca2d9c7bf6c28;hpb=6dc23e95f52602a2718045d57c8d3b441c40bbe5;p=yawbih.git diff --git a/Wiki.hs b/Wiki.hs index 0b9e337..59e5929 100644 --- a/Wiki.hs +++ b/Wiki.hs @@ -2,7 +2,7 @@ module Wiki ( Backend (getCurrent,getList,get,setCurrent,update) ,PGB ,createPGB - ,Markup (Text, Paragraph, Link, Bold) + ,Markup (Text, Paragraph, Link, Bold, Emph, Heading, Url) ,Document ,wikiParser @@ -32,17 +32,15 @@ data Markup = Text String | Paragraph | Link String String | Bold [Markup] + | Emph [Markup] + | Heading Int [Markup] + | Url String type Document = [Markup] wikiParser :: GenParser Char st Document wikiParser = do - s <- (try (pPara) - <|> pSpace - <|> try (pLinkLong) - <|> try (pLink) - <|> pOtherChar - <|> pText) + s <- pMain ss <- (wikiParser <|> return []) return (s:ss) @@ -68,18 +66,54 @@ pLinkLong = do string "]]" return (Link l d) -pBold = do - string "'''" - s <- wikiParser - return (Bold s) - pLink = do string "[[" l <- many1 $ noneOf "]" string "]]" return (Link l l) + +pBold = do + string "**" + s <- pStringParser "**" + return (Bold s) + +pEmph = do + string "//" + s <- pStringParser "//" + return (Emph s) + +pStringParser xs = do + try (string xs >> return []) <|> (do + s <- pMain + ss <- pStringParser xs + return (s:ss)) + +pHeading = do + many1 pEol + level <- many1 $ char '=' + char ' ' + s <- pStringParser (' ':level) + return (Heading (length level) s) + +pURL = do + proto <- many1 letter + string "://" + s <- many1 (alphaNum <|> oneOf "?.:&-/") + return (Url (proto++"://"++s)) + +pMain = try (pHeading) + <|> (try (pPara) + <|> pSpace + <|> try(pBold) + <|> try(pEmph) + <|> try (pLinkLong) + <|> try (pLink) + <|> try (pURL) + <|> pOtherChar + <|> pText) + pOtherChar = do - c <- oneOf ",;.:!?[]()\'\"=-%$£<>/\\|" + c <- oneOf "*,;.:!?[]()'\"=-%$£<>/\\|" return (Text (c:[])) pText = do