+
+pBold,pEmph,pUnderline,pStrike :: GenParser Char st 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
+ s <- pStopAt s
+ return (f s)
+
+pOtherChar :: GenParser Char st Markup
+pOtherChar = do
+ c <- oneOf "*,;.:!?[]()'\"=-%$£<>/\\|"
+ return (Text (c:[]))
+
+pText :: GenParser Char st Markup
+pText = do
+ t <- many1 alphaNum
+ return (Text t)
+
+pLinkContent :: GenParser Char st (String, String)
+pLinkContent = do try (string "]]" >> return ([],[]))
+ <|> try (do
+ string " | "
+ d <- pString "]]"
+ return ([],d))
+ <|> (do
+ c <- anyChar
+ (l,d) <- pLinkContent
+ return (c:l,d))
+
+pStopAt :: String -> GenParser Char st Document
+pStopAt xs = pUntil pMain xs
+
+pString :: String -> GenParser Char st String
+pString xs = pUntil anyChar xs
+
+pEol :: GenParser Char st String
+pEol = string "\n" <|> string "\r\n"
+
+pUntil :: GenParser Char st a -> String -> GenParser Char st [a]
+pUntil p xs = manyTill p (try $ string xs)