wiki
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 で強制的に脱出してる。
トークンか何かを使えばもっと簡潔に書けるような。。。