X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=Wiki.hs;h=210708df3d3a100fb50d267f33d1e647604acb37;hb=66579a5b5cf49483f40de590f9b3b0527ba5621c;hp=2b8b31383779ae576115b14cdc106522b4bf99d1;hpb=b0821b704ddf955948416ec8bfa0afcc6512c933;p=yawbih.git diff --git a/Wiki.hs b/Wiki.hs index 2b8b313..210708d 100644 --- a/Wiki.hs +++ b/Wiki.hs @@ -2,10 +2,12 @@ module Wiki ( Backend (getCurrent,getList,get,setCurrent,update,listKeys) ,PGB ,createPGB - ,Markup (Text, Paragraph, Link, Bold, Emph, Heading, Url, Underline, Strike, Pre,List) + ,Markup (Text, Paragraph, Font, Link, Heading, Url, Pre,List) + ,FontOp (Bold, Emph, Mono, Underline, Strike) ,Document ,wikiParser - ,htmlOutput + ,toHtml + ,toLatex ) where @@ -35,15 +37,14 @@ class Backend a where data Markup = Text String | Paragraph | Link String String - | Bold [Markup] - | Emph [Markup] + | Font FontOp [Markup] | Heading Int [Markup] | Url String - | Underline [Markup] - | Strike [Markup] - | Pre String + | Pre [Markup] | List Bool [[Markup]] +data FontOp = Bold | Emph | Mono | Underline | Strike + type Document = [Markup] wikiParser :: Parser Document @@ -85,7 +86,7 @@ pURL :: Parser Markup pURL = do proto <- many1 letter string "://" - s <- many1 (alphaNum <|> oneOf "?.:&-/") + s <- many1 (alphaNum <|> oneOf "?.:&-/~%=\\_") return (Url (proto++"://"++s)) pMail :: Parser Markup @@ -98,17 +99,19 @@ pMail = do pPre :: Parser Markup pPre = string "
" >> do - s <- pString "" + s <- pUntil (pOneLine <|> pEol) "" return (Pre s) pBold,pEmph,pUnderline,pStrike :: Parser Markup -pBold = pS "**" (\s -> Bold s) -pEmph = pS "//" (\s -> Emph s) -pUnderline = pS "__" (\s -> Underline s) -pStrike = pS "--" (\s -> Strike s) -pS s f = string s >> do +pBold = pFont "**" Bold +pEmph = pFont "//" Emph +pUnderline = pFont "__" Underline +pStrike = pFont "--" Strike +pMono = pFont "||" Mono + +pFont s o = string s >> do s <- pStopAt s - return (f s) + return (Font o s) pOtherChar :: Parser Markup pOtherChar = do @@ -156,6 +159,7 @@ pMain = choice [ ,try(pEmph) ,try(pUnderline) ,try(pStrike) + ,try(pMono) ,try (pLink) ,try (pURL) ,try (pMail) @@ -169,6 +173,7 @@ pOneLine = choice [ ,try pEmph ,try pUnderline ,try pStrike + ,try pMono ,try pLink ,try pURL ,try pMail @@ -238,18 +243,44 @@ toHtml [] = [] toHtml ((Paragraph):xs) = "
\n"++toHtml xs
toHtml ((Text s):xs) = s++toHtml xs
toHtml ((Link l d):xs) = ""++toHtml d++""++toHtml xs
+toHtml ((Font o d):xs) = "<"++htmlFontOp o++">"++toHtml d++""++htmlFontOp o++">"++toHtml xs
toHtml ((Heading n d):xs) = "\n"++s++"
"++toHtml xs
-toHtml ((List o l):xs) = "<"++listType o++">\n"++(unlines $ map (\s -> ""++toHtml s++"
"++toHtml xs
+toHtml ((List o l):xs) = "<"++htmlListType o++">\n"++(unlines $ map (\s -> ""++toLatex s++"
"++toLatex xs
+toLatex ((List o l):xs) = "\n\\begin{"++latexListType o++"}\n"++(unlines $ map (\s -> "\\item "++toLatex s++"\n") l) ++ "\\end{"++latexListType o++"}"++toLatex xs
+
+latexFontOp Bold = "bf"
+latexFontOp Emph = "em"
+latexFontOp Mono = "tt"
+latexFontOp Underline = "u"
+latexFontOp Strike = "strike"
+
+latexListType True = "enumeration"
+latexListType False = "itemize"
+
+output s f = case parse wikiParser "" s of
+ Right n -> putStr (f n)
Left e -> print e
+
+htmlOutput s = output s toHtml
+latexOutput s = output s toLatex