From d46f434d4b8906ae3b983e568549213de94fd1a2 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sun, 3 Feb 2013 10:30:48 -0800 Subject: Citation changes. * Citations will work in markdown even if `--biblio` isn't specified. Note: this may cause unexpected behavior for people who use strings of the form `@foo` that are not citations! * If `--biblio` isn't used, the markdown writer will write markdown citations rather than CSL-rendered citations. * This means, for example, that you can do `pandoc -f latex -t markdown` and convert biblatex or natbib citations into pandoc citations. --- src/Text/Pandoc/Readers/Markdown.hs | 22 ++++++++++++++-------- src/Text/Pandoc/Writers/Markdown.hs | 4 +++- 2 files changed, 17 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index dc30e17ed..c476e23a7 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -1247,6 +1247,7 @@ inline = choice [ whitespace , emph , note , cite + , textCite , link , image , math @@ -1625,12 +1626,12 @@ rawHtmlInline = do cite :: MarkdownParser (F Inlines) cite = do guardEnabled Ext_citations - getOption readerReferences >>= guard . not . null - citations <- textualCite <|> normalCite + citations <- normalCite return $ flip B.cite mempty <$> citations -textualCite :: MarkdownParser (F [Citation]) -textualCite = try $ do +textCite :: MarkdownParser (F Inlines) +textCite = try $ do + guardEnabled Ext_citations (_, key) <- citeKey let first = Citation{ citationId = key , citationPrefix = [] @@ -1641,8 +1642,15 @@ textualCite = try $ do } mbrest <- option Nothing $ try $ spnl >> Just <$> normalCite case mbrest of - Just rest -> return $ (first:) <$> rest - Nothing -> option (return [first]) $ bareloc first + Just rest -> return $ (flip B.cite mempty . (first:)) <$> rest + Nothing -> (do cites <- bareloc first + return $ flip B.cite mempty <$> cites) + <|> (do guardEnabled Ext_example_lists + st <- getState + case M.lookup key (stateExamples st) of + Just n -> return $ return $ B.str (show n) + Nothing -> mzero) + <|> (return $ return $ flip B.cite mempty [first]) bareloc :: Citation -> MarkdownParser (F [Citation]) bareloc c = try $ do @@ -1674,8 +1682,6 @@ citeKey = try $ do let internal p = try $ p >>~ lookAhead (letter <|> digit) rest <- many $ letter <|> digit <|> internal (oneOf ":.#$%&-_?<>~/") let key = first:rest - citations' <- map CSL.refId <$> getOption readerReferences - guard $ key `elem` citations' return (suppress_author, key) suffix :: MarkdownParser (F Inlines) diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs index 4d848d55b..8ff5ff9de 100644 --- a/src/Text/Pandoc/Writers/Markdown.hs +++ b/src/Text/Pandoc/Writers/Markdown.hs @@ -614,7 +614,9 @@ inlineToMarkdown opts (LineBreak) | otherwise = return $ " " <> cr inlineToMarkdown _ Space = return space inlineToMarkdown opts (Cite (c:cs) lst) - | writerCiteMethod opts == Citeproc = inlineListToMarkdown opts lst + | writerCiteMethod opts == Citeproc && not (null lst) && + case lst of { RawInline "latex" _ : _ -> False; _ -> True} = + inlineListToMarkdown opts lst | citationMode c == AuthorInText = do suffs <- inlineListToMarkdown opts $ citationSuffix c rest <- mapM convertOne cs -- cgit v1.2.3