From 7c35c0bc253c3ca15c29adf3309f08a42b99127c Mon Sep 17 00:00:00 2001
From: fiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>
Date: Tue, 15 Jul 2008 20:41:27 +0000
Subject: [PATCH] Fixed bug in Markdown parser:  regular $s triggering math
 mode. For example:  "shoes ($20) and socks ($5)."

The fix consists in two new restrictions:
+ the $ that ends a math span may not be directly followed by a digit.
+ no blank lines may be included within a math span.

Thanks to Joseph Reagle for noticing the bug.


git-svn-id: https://pandoc.googlecode.com/svn/trunk@1326 788f1e2b-df1e-0410-8736-df70ead52e1b
---
 Text/Pandoc/Readers/Markdown.hs | 3 ++-
 tests/testsuite.native          | 1 +
 tests/testsuite.txt             | 1 +
 tests/writer.docbook            | 5 +++++
 tests/writer.html               | 2 ++
 tests/writer.latex              | 2 ++
 tests/writer.man                | 2 ++
 tests/writer.markdown           | 1 +
 tests/writer.native             | 1 +
 tests/writer.rst                | 1 +
 tests/writer.rtf                | 1 +
 tests/writer.texinfo            | 2 ++
 12 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/Text/Pandoc/Readers/Markdown.hs b/Text/Pandoc/Readers/Markdown.hs
index f702a6e33..db9e214b0 100644
--- a/Text/Pandoc/Readers/Markdown.hs
+++ b/Text/Pandoc/Readers/Markdown.hs
@@ -873,8 +873,9 @@ math = try $ do
   failIfStrict
   char '$'
   notFollowedBy space
-  words' <- sepBy1 mathWord (many1 space)
+  words' <- sepBy1 mathWord (many1 (spaceChar <|> (newline >>~ notFollowedBy' blankline)))
   char '$'
+  notFollowedBy digit
   return $ Math $ joinWithSep " " words'
 
 emph :: GenParser Char ParserState Inline
diff --git a/tests/testsuite.native b/tests/testsuite.native
index 4ecc51438..564faf0d8 100644
--- a/tests/testsuite.native
+++ b/tests/testsuite.native
@@ -294,6 +294,7 @@ Pandoc (Meta [Str "Pandoc",Space,Str "Test",Space,Str "Suite"] ["John MacFarlane
 , BulletList
   [ [ Plain [Str "To",Space,Str "get",Space,Str "the",Space,Str "famous",Space,Str "equation,",Space,Str "write",Space,Code "$e = mc^2$",Str "."] ]
   , [ Plain [Str "$",Str "22,000",Space,Str "is",Space,Str "a",Space,Emph [Str "lot"],Space,Str "of",Space,Str "money",Str ".",Space,Str "So",Space,Str "is",Space,Str "$",Str "34,000",Str ".",Space,Str "(It",Space,Str "worked",Space,Str "if",Space,Quoted DoubleQuote [Str "lot"],Space,Str "is",Space,Str "emphasized",Str ".",Str ")"] ]
+  , [ Plain [Str "Shoes",Space,Str "(",Str "$",Str "20)",Space,Str "and",Space,Str "socks",Space,Str "(",Str "$",Str "5)",Str "."] ]
   , [ Plain [Str "Escaped",Space,Code "$",Str ":",Space,Str "$",Str "73",Space,Emph [Str "this",Space,Str "should",Space,Str "be",Space,Str "emphasized"],Space,Str "23",Str "$",Str "."] ] ]
 , Para [Str "Here",Apostrophe,Str "s",Space,Str "a",Space,Str "LaTeX",Space,Str "table:"]
 , Para [TeX "\\begin{tabular}{|l|l|}\\hline\nAnimal & Number \\\\ \\hline\nDog    & 2      \\\\\nCat    & 1      \\\\ \\hline\n\\end{tabular}"]
diff --git a/tests/testsuite.txt b/tests/testsuite.txt
index dc5340021..d55a93a4e 100644
--- a/tests/testsuite.txt
+++ b/tests/testsuite.txt
@@ -482,6 +482,7 @@ These shouldn't be math:
 - To get the famous equation, write `$e = mc^2$`.
 - $22,000 is a *lot* of money.  So is $34,000.
   (It worked if "lot" is emphasized.)
+- Shoes ($20) and socks ($5).
 - Escaped `$`:  $73 *this should be emphasized* 23\$.
 
 Here's a LaTeX table:
diff --git a/tests/writer.docbook b/tests/writer.docbook
index e8f963b58..424141cc9 100644
--- a/tests/writer.docbook
+++ b/tests/writer.docbook
@@ -902,6 +902,11 @@ These should not be escaped:  \$ \\ \&gt; \[ \{
           worked if <quote>lot</quote> is emphasized.)
         </para>
       </listitem>
+      <listitem>
+        <para>
+          Shoes ($20) and socks ($5).
+        </para>
+      </listitem>
       <listitem>
         <para>
           Escaped <literal>$</literal>: $73
diff --git a/tests/writer.html b/tests/writer.html
index 819917c57..38eaf6a2a 100644
--- a/tests/writer.html
+++ b/tests/writer.html
@@ -796,6 +796,8 @@ Blah
 	>lot</em
 	> of money. So is $34,000. (It worked if &ldquo;lot&rdquo; is emphasized.)</li
       ><li
+      >Shoes ($20) and socks ($5).</li
+      ><li
       >Escaped <code
 	>$</code
 	>: $73 <em
diff --git a/tests/writer.latex b/tests/writer.latex
index 551d6adec..b4547b7db 100644
--- a/tests/writer.latex
+++ b/tests/writer.latex
@@ -590,6 +590,8 @@ These shouldn't be math:
 \item 
   \$22,000 is a \emph{lot} of money. So is \$34,000. (It worked if
   ``lot'' is emphasized.)
+\item 
+  Shoes (\$20) and socks (\$5).
 \item 
   Escaped \verb!$!: \$73 \emph{this should be emphasized} 23\$.
 \end{itemize}
diff --git a/tests/writer.man b/tests/writer.man
index 0e3b7608a..d1a8b8a86 100644
--- a/tests/writer.man
+++ b/tests/writer.man
@@ -570,6 +570,8 @@ To get the famous equation, write \f[B]$e\ =\ mc^2$\f[]\.
 $22,000 is a \f[I]lot\f[] of money\. So is $34,000\. (It worked if
 \[lq]lot\[rq] is emphasized\.)
 .IP \[bu] 2
+Shoes ($20) and socks ($5)\.
+.IP \[bu] 2
 Escaped \f[B]$\f[]: $73 \f[I]this should be emphasized\f[] 23$\.
 .PP
 Here's a LaTeX table:
diff --git a/tests/writer.markdown b/tests/writer.markdown
index 41a116e9a..fbe3c085f 100644
--- a/tests/writer.markdown
+++ b/tests/writer.markdown
@@ -507,6 +507,7 @@ These shouldn't be math:
 -   To get the famous equation, write `$e = mc^2$`.
 -   $22,000 is a *lot* of money. So is $34,000. (It worked if "lot"
     is emphasized.)
+-   Shoes ($20) and socks ($5).
 -   Escaped `$`: $73 *this should be emphasized* 23$.
 
 Here's a LaTeX table:
diff --git a/tests/writer.native b/tests/writer.native
index 4ecc51438..564faf0d8 100644
--- a/tests/writer.native
+++ b/tests/writer.native
@@ -294,6 +294,7 @@ Pandoc (Meta [Str "Pandoc",Space,Str "Test",Space,Str "Suite"] ["John MacFarlane
 , BulletList
   [ [ Plain [Str "To",Space,Str "get",Space,Str "the",Space,Str "famous",Space,Str "equation,",Space,Str "write",Space,Code "$e = mc^2$",Str "."] ]
   , [ Plain [Str "$",Str "22,000",Space,Str "is",Space,Str "a",Space,Emph [Str "lot"],Space,Str "of",Space,Str "money",Str ".",Space,Str "So",Space,Str "is",Space,Str "$",Str "34,000",Str ".",Space,Str "(It",Space,Str "worked",Space,Str "if",Space,Quoted DoubleQuote [Str "lot"],Space,Str "is",Space,Str "emphasized",Str ".",Str ")"] ]
+  , [ Plain [Str "Shoes",Space,Str "(",Str "$",Str "20)",Space,Str "and",Space,Str "socks",Space,Str "(",Str "$",Str "5)",Str "."] ]
   , [ Plain [Str "Escaped",Space,Code "$",Str ":",Space,Str "$",Str "73",Space,Emph [Str "this",Space,Str "should",Space,Str "be",Space,Str "emphasized"],Space,Str "23",Str "$",Str "."] ] ]
 , Para [Str "Here",Apostrophe,Str "s",Space,Str "a",Space,Str "LaTeX",Space,Str "table:"]
 , Para [TeX "\\begin{tabular}{|l|l|}\\hline\nAnimal & Number \\\\ \\hline\nDog    & 2      \\\\\nCat    & 1      \\\\ \\hline\n\\end{tabular}"]
diff --git a/tests/writer.rst b/tests/writer.rst
index b9dbc31e0..fc921ea76 100644
--- a/tests/writer.rst
+++ b/tests/writer.rst
@@ -638,6 +638,7 @@ These shouldn't be math:
 -  To get the famous equation, write ``$e = mc^2$``.
 -  $22,000 is a *lot* of money. So is $34,000. (It worked if "lot"
    is emphasized.)
+-  Shoes ($20) and socks ($5).
 -  Escaped ``$``: $73 *this should be emphasized* 23$.
 
 Here's a LaTeX table:
diff --git a/tests/writer.rtf b/tests/writer.rtf
index 367eeba2f..05dd26344 100644
--- a/tests/writer.rtf
+++ b/tests/writer.rtf
@@ -252,6 +252,7 @@ quoted link
 {\pard \ql \f0 \sa180 \li0 \fi0 These shouldn\u8217't be math:\par}
 {\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab To get the famous equation, write {\f1 $e = mc^2$}.\par}
 {\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab $22,000 is a {\i lot} of money. So is $34,000. (It worked if \u8220"lot\u8221" is emphasized.)\par}
+{\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab Shoes ($20) and socks ($5).\par}
 {\pard \ql \f0 \sa0 \li360 \fi-360 \bullet \tx360\tab Escaped {\f1 $}: $73 {\i this should be emphasized} 23$.\sa180\par}
 {\pard \ql \f0 \sa180 \li0 \fi0 Here\u8217's a LaTeX table:\par}
 {\pard \ql \f0 \sa180 \li0 \fi0 \par}
diff --git a/tests/writer.texinfo b/tests/writer.texinfo
index 224aa2091..3dcb93832 100644
--- a/tests/writer.texinfo
+++ b/tests/writer.texinfo
@@ -736,6 +736,8 @@ To get the famous equation@comma{} write @code{$e = mc^2$}.
 @item
 $22@comma{}000 is a @emph{lot} of money. So is $34@comma{}000. (It worked if ``lot'' is emphasized.)
 @item
+Shoes ($20) and socks ($5).
+@item
 Escaped @code{$}: $73 @emph{this should be emphasized} 23$.
 @end itemize