diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Text/Pandoc/Parsing.hs | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index 549042d14..0c97d4060 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -247,8 +247,9 @@ instance Monoid a => Monoid (Future s a) where mconcat = liftM mconcat . sequence -- | Parse characters while a predicate is true. -takeWhileP :: Stream [Char] m Char - => (Char -> Bool) -> ParserT [Char] st m [Char] +takeWhileP :: Monad m + => (Char -> Bool) + -> ParserT [Char] st m [Char] takeWhileP f = do -- faster than 'many (satisfy f)' inp <- getInput @@ -262,7 +263,7 @@ takeWhileP f = do -- Parse n characters of input (or the rest of the input if -- there aren't n characters). -takeP :: Stream [Char] m Char => Int -> ParserT [Char] st m [Char] +takeP :: Monad m => Int -> ParserT [Char] st m [Char] takeP n = do guard (n > 0) -- faster than 'count n anyChar' @@ -276,7 +277,7 @@ takeP n = do return xs -- | Parse any line of text -anyLine :: Stream [Char] m Char => ParserT [Char] st m [Char] +anyLine :: Monad m => ParserT [Char] st m [Char] anyLine = do -- This is much faster than: -- manyTill anyChar newline @@ -292,13 +293,13 @@ anyLine = do _ -> mzero -- | Parse any line, include the final newline in the output -anyLineNewline :: Stream [Char] m Char => ParserT [Char] st m [Char] +anyLineNewline :: Monad m => ParserT [Char] st m [Char] anyLineNewline = (++ "\n") <$> anyLine -- | Parse indent by specified number of spaces (or equiv. tabs) -indentWith :: Stream [Char] m Char +indentWith :: Stream s m Char => HasReaderOptions st - => Int -> ParserT [Char] st m [Char] + => Int -> ParserT s st m [Char] indentWith num = do tabStop <- getOption readerTabStop if (num < tabStop) @@ -394,9 +395,9 @@ stringAnyCase (x:xs) = do -- | Parse contents of 'str' using 'parser' and return result. parseFromString :: Monad m - => ParserT String st m a + => ParserT [Char] st m a -> String - -> ParserT String st m a + -> ParserT [Char] st m a parseFromString parser str = do oldPos <- getPosition setPosition $ initialPos "chunk" @@ -422,9 +423,9 @@ parseFromString' parser str = do return res -- | Parse raw line block up to and including blank lines. -lineClump :: Stream [Char] m Char => ParserT [Char] st m String +lineClump :: Monad m => ParserT [Char] st m String lineClump = blanklines - <|> (many1 (notFollowedBy blankline >> anyLine) >>= return . unlines) + <|> (unlines <$> many1 (notFollowedBy blankline >> anyLine)) -- | Parse a string of characters between an open character -- and a close character, including text between balanced @@ -520,7 +521,7 @@ uriScheme :: Stream s m Char => ParserT s st m String uriScheme = oneOfStringsCI (Set.toList schemes) -- | Parses a URI. Returns pair of original and URI-escaped version. -uri :: Stream [Char] m Char => ParserT [Char] st m (String, String) +uri :: Monad m => ParserT [Char] st m (String, String) uri = try $ do scheme <- uriScheme char ':' @@ -625,7 +626,9 @@ withHorizDisplacement parser = do -- | Applies a parser and returns the raw string that was parsed, -- along with the value produced by the parser. -withRaw :: Stream [Char] m Char => ParsecT [Char] st m a -> ParsecT [Char] st m (a, [Char]) +withRaw :: Monad m + => ParsecT [Char] st m a + -> ParsecT [Char] st m (a, [Char]) withRaw parser = do pos1 <- getPosition inp <- getInput @@ -786,7 +789,7 @@ charRef = do c <- characterReference return $ Str [c] -lineBlockLine :: Stream [Char] m Char => ParserT [Char] st m String +lineBlockLine :: Monad m => ParserT [Char] st m String lineBlockLine = try $ do char '|' char ' ' @@ -796,11 +799,11 @@ lineBlockLine = try $ do continuations <- many (try $ char ' ' >> anyLine) return $ white ++ unwords (line : continuations) -blankLineBlockLine :: Stream [Char] m Char => ParserT [Char] st m Char +blankLineBlockLine :: Stream s m Char => ParserT s st m Char blankLineBlockLine = try (char '|' >> blankline) -- | Parses an RST-style line block and returns a list of strings. -lineBlockLines :: Stream [Char] m Char => ParserT [Char] st m [String] +lineBlockLines :: Monad m => ParserT [Char] st m [String] lineBlockLines = try $ do lines' <- many1 (lineBlockLine <|> ((:[]) <$> blankLineBlockLine)) skipMany1 $ blankline <|> blankLineBlockLine @@ -870,7 +873,7 @@ widthsFromIndices numColumns' indices = -- (which may be grid), then the rows, -- which may be grid, separated by blank lines, and -- ending with a footer (dashed line followed by blank line). -gridTableWith :: (Stream [Char] m Char, HasReaderOptions st, +gridTableWith :: (Monad m, HasReaderOptions st, Functor mf, Applicative mf, Monad mf) => ParserT [Char] st m (mf Blocks) -- ^ Block list parser -> Bool -- ^ Headerless table @@ -879,7 +882,7 @@ gridTableWith blocks headless = tableWith (gridTableHeader headless blocks) (gridTableRow blocks) (gridTableSep '-') gridTableFooter -gridTableWith' :: (Stream [Char] m Char, HasReaderOptions st, +gridTableWith' :: (Monad m, HasReaderOptions st, Functor mf, Applicative mf, Monad mf) => ParserT [Char] st m (mf Blocks) -- ^ Block list parser -> Bool -- ^ Headerless table @@ -919,7 +922,7 @@ gridTableSep :: Stream s m Char => Char -> ParserT s st m Char gridTableSep ch = try $ gridDashedLines ch >> return '\n' -- | Parse header for a grid table. -gridTableHeader :: (Stream [Char] m Char, Functor mf, Applicative mf, Monad mf) +gridTableHeader :: (Monad m, Functor mf, Applicative mf, Monad mf) => Bool -- ^ Headerless table -> ParserT [Char] st m (mf Blocks) -> ParserT [Char] st m (mf [Blocks], [Alignment], [Int]) @@ -952,7 +955,7 @@ gridTableRawLine indices = do return (gridTableSplitLine indices line) -- | Parse row of grid table. -gridTableRow :: (Stream [Char] m Char, Functor mf, Applicative mf, Monad mf) +gridTableRow :: (Monad m, Functor mf, Applicative mf, Monad mf) => ParserT [Char] st m (mf Blocks) -> [Int] -> ParserT [Char] st m (mf [Blocks]) @@ -981,8 +984,8 @@ gridTableFooter = blanklines --- -- | Removes the ParsecT layer from the monad transformer stack -readWithM :: (Monad m) - => ParserT [Char] st m a -- ^ parser +readWithM :: Monad m + => ParserT [Char] st m a -- ^ parser -> st -- ^ initial state -> String -- ^ input -> m (Either PandocError a) @@ -998,7 +1001,7 @@ readWith :: Parser [Char] st a readWith p t inp = runIdentity $ readWithM p t inp -- | Parse a string with @parser@ (for testing). -testStringWith :: (Show a) +testStringWith :: Show a => ParserT [Char] ParserState Identity a -> [Char] -> IO () |