ログ日記

作業ログと日記とメモ

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