diff options
author | John MacFarlane <fiddlosopher@gmail.com> | 2011-12-29 23:44:12 -0800 |
---|---|---|
committer | John MacFarlane <fiddlosopher@gmail.com> | 2011-12-29 23:44:12 -0800 |
commit | 925a4c5164026bfda25bf50b552bacec074fdf3f (patch) | |
tree | 2ddf5a2cd3530789434697d19c0bf8fd892d0f9f /src/Text/Pandoc/Parsing.hs | |
parent | 600c22e7bf57b219467794cd8e37c19571988462 (diff) | |
download | pandoc-925a4c5164026bfda25bf50b552bacec074fdf3f.tar.gz |
Better smart quote parsing.
* Added stateLastStrPos to ParserState. This lets us keep track
of whether we're parsing the position immediately after a 'str'.
If we encounter a ' in such a location, it must be an apostrophe,
and can't be a single quote start.
* Set this in the markdown, textile, html, and rst str parsers.
* Closes #360.
Diffstat (limited to 'src/Text/Pandoc/Parsing.hs')
-rw-r--r-- | src/Text/Pandoc/Parsing.hs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Parsing.hs b/src/Text/Pandoc/Parsing.hs index 5fa375ca6..c2c512033 100644 --- a/src/Text/Pandoc/Parsing.hs +++ b/src/Text/Pandoc/Parsing.hs @@ -603,6 +603,7 @@ data ParserState = ParserState { stateParseRaw :: Bool, -- ^ Parse raw HTML and LaTeX? stateParserContext :: ParserContext, -- ^ Inside list? stateQuoteContext :: QuoteContext, -- ^ Inside quoted environment? + stateLastStrPos :: Maybe SourcePos, -- ^ Position after last str parsed stateKeys :: KeyTable, -- ^ List of reference keys stateCitations :: [String], -- ^ List of available citations stateNotes :: NoteTable, -- ^ List of notes @@ -630,6 +631,7 @@ defaultParserState = ParserState { stateParseRaw = False, stateParserContext = NullState, stateQuoteContext = NoQuote, + stateLastStrPos = Nothing, stateKeys = M.empty, stateCitations = [], stateNotes = [], @@ -751,8 +753,12 @@ charOrRef cs = return c) singleQuoteStart :: GenParser Char ParserState () -singleQuoteStart = do +singleQuoteStart = do failIfInQuoteContext InSingleQuote + pos <- getPosition + st <- getState + -- single quote start can't be right after str + guard $ stateLastStrPos st /= Just pos try $ do charOrRef "'\8216\145" notFollowedBy (oneOf ")!],;:-? \t\n") notFollowedBy (char '.') <|> lookAhead (string "..." >> return ()) |