From 48b8267126fc82aadf289762718b8c01e5331e4c Mon Sep 17 00:00:00 2001 From: fiddlosopher Date: Thu, 21 Dec 2006 09:02:06 +0000 Subject: Fixed a serious bug in the Markdown reader (also affecting LaTeX and RST readers). The problem: these readers ran 'runParser' on processed chunks of text to handle embedded block lists in lists and quotation blocks. But then any changes made to the parser state in these chunks was lost, as the state is local to the parser. So, for example, footnotes didn't work in quotes or list items. The fix: instead of calling runParser on some raw text, use setInput to make it the input, then parse it, then use setInput to restore the input to what it was before. This is shorter and more elegant, and it fixes the problem. 'BlockQuoteContext' was also eliminated from ParserContext, as it isn't used anywhere. git-svn-id: https://pandoc.googlecode.com/svn/trunk@261 788f1e2b-df1e-0410-8736-df70ead52e1b --- src/Text/Pandoc/Readers/LaTeX.hs | 11 +++++---- src/Text/Pandoc/Readers/Markdown.hs | 47 +++++++++++++++++-------------------- src/Text/Pandoc/Readers/RST.hs | 17 ++++++-------- src/Text/Pandoc/Shared.hs | 3 +-- 4 files changed, 36 insertions(+), 42 deletions(-) (limited to 'src/Text/Pandoc') diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 0b101b4d9..f82705bb2 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -601,13 +601,14 @@ footnote = try (do then string "" else fail "not a footnote or thanks command" let contents' = stripFirstAndLast contents + -- parse the extracted block, which may contain various block elements: + rest <- getInput + setInput $ contents' + blocks <- parseBlocks + setInput rest state <- getState - let blocks = case runParser parseBlocks state "footnote" contents of - Left err -> error $ "Input:\n" ++ show contents' ++ - "\nError:\n" ++ show err - Right result -> result let notes = stateNoteBlocks state - let nextRef = case notes of + let nextRef = case notes of [] -> "1" (Note ref body):rest -> (show ((read ref) + 1)) setState (state { stateNoteBlocks = (Note nextRef blocks):notes }) diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 63a87e273..2556c0aac 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -263,17 +263,15 @@ note = try (do raw <- sepBy rawLines (try (do {blankline; indentSpaces})) option "" blanklines -- parse the extracted text, which may contain various block elements: + rest <- getInput + setInput $ (joinWithSep "\n" raw) ++ "\n\n" + contents <- parseBlocks + setInput rest state <- getState - let parsed = case runParser parseBlocks - (state {stateParserContext = BlockQuoteState}) "block" - ((joinWithSep "\n" raw) ++ "\n\n") of - Left err -> error $ "Raw block:\n" ++ show raw ++ - "\nError:\n" ++ show err - Right result -> result let identifiers = stateNoteIdentifiers state case (findIndex (== ref) identifiers) of Just n -> updateState (\s -> s {stateNoteBlocks = - (Note (show (n+1)) parsed):(stateNoteBlocks s)}) + (Note (show (n+1)) contents):(stateNoteBlocks s)}) Nothing -> updateState id return Null) @@ -315,15 +313,12 @@ emailBlockQuote = try (do blockQuote = do raw <- choice [ emailBlockQuote, emacsBoxQuote ] -- parse the extracted block, which may contain various block elements: - state <- getState - let parsed = case runParser parseBlocks - (state {stateParserContext = BlockQuoteState}) "block" - ((joinWithSep "\n" raw) ++ "\n\n") of - Left err -> error $ "Raw block:\n" ++ show raw ++ - "\nError:\n" ++ show err - Right result -> result - return (BlockQuote parsed) - + rest <- getInput + setInput $ (joinWithSep "\n" raw) ++ "\n\n" + contents <- parseBlocks + setInput rest + return (BlockQuote contents) + -- -- list blocks -- @@ -382,19 +377,21 @@ listContinuationLine start = try (do listItem start = try (do first <- rawListItem start - rest <- many (listContinuation start) + continuations <- many (listContinuation start) -- parsing with ListItemState forces markers at beginning of lines to -- count as list item markers, even if not separated by blank space. -- see definition of "endline" state <- getState - let parsed = case runParser parseBlocks - (state {stateParserContext = ListItemState}) - "block" raw of - Left err -> error $ "Raw block:\n" ++ raw ++ - "\nError:\n" ++ show err - Right result -> result - where raw = concat (first:rest) - return parsed) + let oldContext = stateParserContext state + setState $ state {stateParserContext = ListItemState} + -- parse the extracted block, which may contain various block elements: + rest <- getInput + let raw = concat (first:continuations) + setInput $ raw + contents <- parseBlocks + setInput rest + updateState (\st -> st {stateParserContext = oldContext}) + return contents) orderedList = try (do items <- many1 (listItem orderedListStart) diff --git a/src/Text/Pandoc/Readers/RST.hs b/src/Text/Pandoc/Readers/RST.hs index 3132e78be..cec4f9313 100644 --- a/src/Text/Pandoc/Readers/RST.hs +++ b/src/Text/Pandoc/Readers/RST.hs @@ -112,7 +112,7 @@ parseRST = do "RST source, second pass" input of Left err -> error $ "\nError:\n" ++ show err Right result -> - (filter isNotAnonKeyBlock result) + filter isNotAnonKeyBlock result let (blocks'', title) = if stateStandalone state then titleTransform blocks' else (blocks', []) @@ -352,16 +352,13 @@ rawLaTeXBlock = try (do -- blockQuote = try (do - block <- indentedBlock True + raw <- indentedBlock True -- parse the extracted block, which may contain various block elements: - state <- getState - let parsed = case runParser parseBlocks - (state {stateParserContext = BlockQuoteState}) - "block" (block ++ "\n\n") of - Left err -> error $ "Raw block:\n" ++ show block ++ - "\nError:\n" ++ show err - Right result -> result - return (BlockQuote parsed)) + rest <- getInput + setInput $ raw ++ "\n\n" + contents <- parseBlocks + setInput rest + return (BlockQuote contents)) -- -- list blocks diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs index c933742bd..8418ecffd 100644 --- a/src/Text/Pandoc/Shared.hs +++ b/src/Text/Pandoc/Shared.hs @@ -95,8 +95,7 @@ data HeaderType deriving (Eq, Show) data ParserContext - = BlockQuoteState -- ^ Used when running parser on contents of blockquote - | ListItemState -- ^ Used when running parser on list item contents + = ListItemState -- ^ Used when running parser on list item contents | NullState -- ^ Default state deriving (Eq, Show) -- cgit v1.2.3