http://www.n314.com/Haskell/wiki/
はてな記法のpreを採用してみた。
パーサが何となく分かってきた。まだ何となく・・。
普通の文章をパース中にリストとか表示するために中断する方法がまだ無駄なことやってるかも。
type WikiParser a = GenParser String State a
paragraph = do es <- many1 sentences <?> "paragraph"
return $ map p' es
where p' es = Tag "p" [] es
sentences = do ss <- many1 sentence <?> "sentence"
return $ sepByBr ss
sentence :: WikiParser Contents
sentence = do line <- sentenceLine <?> "sentence"
st <- getState
return [(Text $ compileText st line)]
-- テキストから脱出するためのパーサ
sentenceLine :: WikiParser String
sentenceLine = try ((breakString >> unexpected "breakString")
<|> (breakBlock >> unexpected "breakBlock")
<|> anyLine )
breakString :: WikiParser String
breakString = satisfyString (== preStart)
<|> satisfyString (== superPreStart)
<|> satisfyString (== hrString)
<|> blank
breakBlock :: WikiParser Contents
breakBlock = lists 1文章読み込み中に何かの構文があれば unexpected で強制的に脱出してる。
トークンか何かを使えばもっと簡潔に書けるような。。。