From afe18e53f12da5299f274810cd3424ac211179f6 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Mon, 12 Jul 2010 23:05:46 -0700
Subject: [PATCH] Modified example refs so they can occur before or after
 target.

The refs are now replaced by numbers at the final stage, using
processWith.
---
 README                              |  4 ++--
 src/Text/Pandoc/Readers/Markdown.hs | 20 +++++++++++++++-----
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/README b/README
index 2e2a14e3f..47bf714cd 100644
--- a/README
+++ b/README
@@ -710,7 +710,7 @@ where the last stopped. So, for example:
 
     (@)  My third example will be numbered (3).
 
-Numbered examples can be labeled and referred to later in the
+Numbered examples can be labeled and referred to elsewhere in the
 document:
 
     (@good)  This is a good example.
@@ -718,7 +718,7 @@ document:
     As (@good) illustrates, ...
 
 The label can be any string of alphanumeric characters, underscores,
-or hyphens.  The example must occur before the reference.
+or hyphens.
 
 Definition lists
 ----------------
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 086f85bb4..33fb3d8e6 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -185,7 +185,18 @@ parseMarkdown = do
   -- now parse it for real...
   (title, author, date) <- option ([],[],[]) titleBlock
   blocks <- parseBlocks
-  return $ Pandoc (Meta title author date) $ filter (/= Null) blocks
+  let doc = Pandoc (Meta title author date) $ filter (/= Null) blocks
+  -- if there are labeled examples, change references into numbers
+  examples <- liftM stateExamples getState
+  let handleExampleRef :: Inline -> Inline
+      handleExampleRef z@(Str ('@':xs)) =
+        case M.lookup xs examples of
+              Just n     -> Str (show n)
+              Nothing    -> z
+      handleExampleRef z = z
+  if M.null examples
+     then return doc
+     else return $ processWith handleExampleRef doc
 
 -- 
 -- initial pass for references and notes
@@ -928,10 +939,9 @@ exampleRef :: GenParser Char ParserState Inline
 exampleRef = try $ do
   char '@'
   lab <- many1 (alphaNum <|> oneOf "-_")
-  examples <- liftM stateExamples getState
-  case M.lookup lab examples of
-       Just num  -> return (Str $ show num)
-       Nothing   -> pzero
+  -- We just return a Str. These are replaced with numbers
+  -- later. See the end of parseMarkdown.
+  return $ Str $ '@' : lab
 
 symbol :: GenParser Char ParserState Inline
 symbol = do