packages feed

mahoro-0.1.1: Parsers.hs

-- | Parsers.hs
-- Chans parsers.

module Parsers (
    parsePage
) where

import Config
import Parsers.Post
---
import Parsers.Wakaba
import Parsers.Dobrochan
import Parsers.Nowai
---

import Control.OldException
import Data.List


parsers = [ ("wakaba_thread", wakabaThread)
          , ("wakaba_board", wakabaBoard)
          , ("dobrochan_thread", dobrochanThread)
          , ("dobrochan_board", dobrochanBoard)
          , ("nowai_thread", nowaiThread)
          , ("nowai_board", nowaiBoard)
          ]


-- | Function what find parser and return new msgs.
parsePage :: Chan -> Integer -> String -> IO (Maybe (Integer, String))
parsePage chan lastPost body =
    case lookup (cengine chan) parsers of
      -- find parser, let's parse it
      Just parser -> do
        let ps = parser lastPost body
        len <- try (evaluate $ length ps)
        case len of
          -- err
          Left _ -> return Nothing
          -- no new posts
          Right 0 -> return Nothing
          _ -> do
            -- test for errors
            err <- try (evaluate $ snd $ last ps)
            return $ case err of
              Left _ ->
                Nothing
              Right _ ->
                Just (fst $ last ps
                     ,intercalate "\n\n" $ map (showPost chan) ps)

      -- no parser for such engine
      _ ->
        return Nothing