| Url String
| Underline [Markup]
| Strike [Markup]
- | Pre String
- | List [[Markup]]
+ | Pre [Markup]
+ | List Bool [[Markup]]
type Document = [Markup]
[] -> return (Link l l)
_ -> return (Link l d)
-pList :: Parser Markup
-pList = do
- list <- many1 $ try pListItem
- return (List list)
+pList :: Bool -> Parser Markup
+pList enum = do
+ list <- many1 $ try $ pListItem enum
+ return (List enum list)
-pListItem :: Parser [Markup]
-pListItem = do
+pListItem :: Bool -> Parser [Markup]
+pListItem enum = do
many1 pEol
- char '*'
+ char $ listToken enum
many pOneLine
+
+listToken True = '#'
+listToken False = '*'
pHeading :: Parser Markup
pHeading = do
many1 pEol
level <- many1 $ char '='
- char ' '
- s <- pStopAt (' ':level)
+ s <- pStopAt level
return (Heading (length level) s)
pURL :: Parser Markup
pURL = do
proto <- many1 letter
string "://"
- s <- many1 (alphaNum <|> oneOf "?.:&-/")
+ s <- many1 (alphaNum <|> oneOf "?.:&-/~%=\\_")
return (Url (proto++"://"++s))
pMail :: Parser Markup
pPre :: Parser Markup
pPre = string "<pre>" >> do
- s <- pString "</pre>"
+ s <- pUntil (pOneLine <|> pEol) "</pre>"
return (Pre s)
pBold,pEmph,pUnderline,pStrike :: Parser Markup
pMain :: Parser Markup
pMain = choice [
try (pHeading)
- ,try pList
+ ,try $ pList True
+ ,try $ pList False
,try (pPara)
,try(pPre)
,try(pBold)
toHtml ((Strike d):xs) = "<strike>"++toHtml d++"</strike>"++toHtml xs
toHtml ((Heading n d):xs) = "\n<h"++show n++">"++toHtml d++"</h"++show n++">\n"++toHtml xs
toHtml ((Url l):xs) = "<link: "++l++">"++toHtml xs
-toHtml ((Pre s):xs) = "<pre>"++s++"</pre>"++toHtml xs
-toHtml ((List l):xs) = "<ul>\n"++(unlines $ map (\s -> "<li>"++toHtml s++"</li>\n") l) ++ "</ul>"++toHtml xs
+toHtml ((Pre s):xs) = "<pre>"++toHtml s++"</pre>"++toHtml xs
+toHtml ((List o l):xs) = "<"++listType o++">\n"++(unlines $ map (\s -> "<li>"++toHtml s++"</li>\n") l) ++ "</"++listType o++">"++toHtml xs
+
+listType True = "ol"
+listType False = "ul"
htmlOutput s = case parse wikiParser "" s of
Right n -> putStr (toHtml n)