packages feed

tkhs-0.2.1: src/Parser.hs

{-# OPTIONS_GHC -fglasgow-exts -XNoMonomorphismRestriction #-}

module Parser (parseSlides) where

import Tkhs

import Text.Parsec hiding (newline, (<|>))
import Control.Monad.Identity
import Control.Applicative hiding (many)

import Prelude hiding (lines)

parseSlides :: String -> Either ParseError [Slide]
parseSlides str = parse (many1 slide) "" str

type PC a = ParsecT String () Identity a

t_sig, f_sig, any_sig :: PC ()
t_sig = char '-' >> newline >> return ()
f_sig = char '=' >> newline >> return ()
any_sig = choice [t_sig,f_sig]

t :: PC Slide
t = do
  t_sig
  T <$> lines

f :: PC Slide
f = do
  f_sig
  F <$> lines

lines :: PC [String]
lines = line `manyTill` (lookAhead (any_sig <|> eof))

slide :: PC Slide
slide = try t <|> try f <?> "slide"

line :: PC String
line = noneOf "\r\n" `manyTill` try newline

newline :: PC String
newline =   try (string "\r\n")
        <|> try (string "\n")
        <|> try (string "\r")
        <?> "newline"