From d46f434d4b8906ae3b983e568549213de94fd1a2 Mon Sep 17 00:00:00 2001
From: John MacFarlane <fiddlosopher@gmail.com>
Date: Sun, 3 Feb 2013 10:30:48 -0800
Subject: [PATCH] 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(-)

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