aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2010-12-06 20:36:58 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2010-12-06 20:36:58 -0800
commit7864f30717767f89ee33532b59819b51ef2e14d4 (patch)
treec1a19f3b6c416cde72d929f76c453a43a7fe5c2c /src/Text/Pandoc
parent5a4609584c84114e8d148f558bed86353c7f0146 (diff)
downloadpandoc-7864f30717767f89ee33532b59819b51ef2e14d4.tar.gz
Markdown reader: handle curly quotes better.
Previously, curly quotes were just parsed literally, leading to problems in some output formats. Now they are parsed as Quoted inlines, if --smart is specified. Resolves Issue #270.
Diffstat (limited to 'src/Text/Pandoc')
-rw-r--r--src/Text/Pandoc/Readers/Markdown.hs29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index feee31ec5..90e8e19bb 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -71,7 +71,7 @@ setextHChars = "=-"
-- treat these as potentially non-text when parsing inline:
specialChars :: [Char]
-specialChars = "\\[]*_~`<>$!^-.&@'\";"
+specialChars = "\\[]*_~`<>$!^-.&@'\";\8216\8217\8220\8221"
--
-- auxiliary functions
@@ -1076,10 +1076,11 @@ singleQuoted = try $ do
return . Quoted SingleQuote . normalizeSpaces
doubleQuoted :: GenParser Char ParserState Inline
-doubleQuoted = try $ do
+doubleQuoted = try $ do
doubleQuoteStart
- withQuoteContext InDoubleQuote $ many1Till inline doubleQuoteEnd >>=
- return . Quoted DoubleQuote . normalizeSpaces
+ withQuoteContext InDoubleQuote $ do
+ contents <- manyTill inline doubleQuoteEnd
+ return . Quoted DoubleQuote . normalizeSpaces $ contents
failIfInQuoteContext :: QuoteContext -> GenParser tok ParserState ()
failIfInQuoteContext context = do
@@ -1088,31 +1089,29 @@ failIfInQuoteContext context = do
then fail "already inside quotes"
else return ()
-singleQuoteStart :: GenParser Char ParserState Char
+singleQuoteStart :: GenParser Char ParserState ()
singleQuoteStart = do
failIfInQuoteContext InSingleQuote
- try $ do char '\''
+ try $ do oneOf "'\8216"
notFollowedBy (oneOf ")!],.;:-? \t\n")
notFollowedBy (try (oneOfStrings ["s","t","m","ve","ll","re"] >>
satisfy (not . isAlphaNum)))
-- possess/contraction
- return '\''
+ return ()
-singleQuoteEnd :: GenParser Char st Char
+singleQuoteEnd :: GenParser Char st ()
singleQuoteEnd = try $ do
- char '\''
+ oneOf "'\8217"
notFollowedBy alphaNum
- return '\''
-doubleQuoteStart :: GenParser Char ParserState Char
+doubleQuoteStart :: GenParser Char ParserState ()
doubleQuoteStart = do
failIfInQuoteContext InDoubleQuote
- try $ do char '"'
+ try $ do oneOf "\"\8220"
notFollowedBy (oneOf " \t\n")
- return '"'
-doubleQuoteEnd :: GenParser Char st Char
-doubleQuoteEnd = char '"'
+doubleQuoteEnd :: GenParser Char st ()
+doubleQuoteEnd = oneOf "\"\8221" >> return ()
ellipses :: GenParser Char st Inline
ellipses = oneOfStrings ["...", " . . . ", ". . .", " . . ."] >> return Ellipses