summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Readers
diff options
context:
space:
mode:
authorfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>2007-07-15 23:53:22 +0000
committerfiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>2007-07-15 23:53:22 +0000
commit7e1370aa874195761aae6e504c66f7111f9a2ccc (patch)
treef32ed23c4579b850191ae1af01f7a841f02d60b0 /src/Text/Pandoc/Readers
parent8e71c4c388a086efb7ea971fa3ea96d0b4c975fd (diff)
Markdown reader: Added inlinesInBalanced parser combinator to
unify treatment of embedded brackets in links and inline footnotes. Note that the solution adopted here causes one of John Gruber's markdown tests to fail: [with_underscore](/url/with_underscore) Here the whole phrase "underscore](/url/with" is treated as emphasized. The previous version of the markdown reader handled this the way Gruber's script handles it, but it ran into trouble on the following: [link with verbatim `]`](/url) where the inner ] was treated as the end of the reference link label. I don't see any good way to handle both cases in the framework of pandoc, so I choose to require an escape in the first example: [with\_underscore](/url/with_underscore) git-svn-id: https://pandoc.googlecode.com/svn/trunk@729 788f1e2b-df1e-0410-8736-df70ead52e1b
Diffstat (limited to 'src/Text/Pandoc/Readers')
-rw-r--r--src/Text/Pandoc/Readers/Markdown.hs53
1 files changed, 24 insertions, 29 deletions
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index eb771efe6..572288661 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -128,6 +128,24 @@ failUnlessSmart = do
state <- getState
if stateSmart state then return () else fail "Smart typography feature"
+-- | Parse a sequence of inline elements between a string
+-- @opener@ and a string @closer@, including inlines
+-- between balanced pairs of @opener@ and a @closer@.
+inlinesInBalanced :: String -> String -> GenParser Char ParserState [Inline]
+inlinesInBalanced opener closer = try $ do
+ let nonOpenerSymbol = try $ do -- succeeds if next inline would be Str opener
+ res <- inline -- fails if next inline merely begins with opener
+ if res == Str opener
+ then pzero
+ else return ' '
+ try (string opener)
+ result <- manyTill ( (do notFollowedBy nonOpenerSymbol
+ bal <- inlinesInBalanced opener closer
+ return $ [Str opener] ++ bal ++ [Str closer])
+ <|> (count 1 inline))
+ (try (string closer))
+ return $ concat result
+
--
-- document structure
--
@@ -915,22 +933,9 @@ endline = try (do
-- links
--
-rawLabel = try $ do
- char labelStart
- -- allow for embedded brackets:
- raw <- manyTill (do{res <- rawLabel; return ("[" ++ res ++ "]")} <|>
- count 1 anyChar) (char labelEnd)
- return $ concat raw
-
-- a reference label for a link
-reference = try $ do
- raw <- rawLabel
- oldInput <- getInput
- setInput raw
- label <- many inline
- setInput oldInput
- return (normalizeSpaces label)
-
+reference = inlinesInBalanced [labelStart] [labelEnd] >>= (return . normalizeSpaces)
+
-- source for a link, with optional title
source = try $ do
char srcStart
@@ -948,10 +953,9 @@ titleWith startChar endChar = try (do
then fail "title must be separated by space and on same or next line"
else return ()
char startChar
- tit <- manyTill anyChar (try (do
- char endChar
- skipSpaces
- notFollowedBy (noneOf ")\n")))
+ tit <- manyTill anyChar (try (do char endChar
+ skipSpaces
+ notFollowedBy (noneOf ")\n")))
return $ decodeEntities tit)
title = choice [ titleWith '(' ')',
@@ -1011,19 +1015,10 @@ note = try $ do
Nothing -> fail "note not found"
Just contents -> return (Note contents)
-inlinesInBrackets = try $ do
- char '['
- results <- many $ count 1 (choice [link, referenceLink, image]) <|>
- try (do{res <- inlinesInBrackets; return
- ([Str "["] ++ res ++ [Str "]"])}) <|>
- (do{notFollowedBy (char ']'); count 1 inline})
- char ']'
- return $ concat results
-
inlineNote = try $ do
failIfStrict
char noteStart
- contents <- inlinesInBrackets
+ contents <- inlinesInBalanced "[" "]"
return (Note [Para contents])
rawLaTeXInline' = do