From 8418c1a7d7e5312dfddbc011adb257552b2a864b Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 4 Feb 2017 12:52:08 +0100
Subject: [PATCH] Implemented +/-smart in rst writer.

Moved unsmartify to Writers.Shared.
---
 src/Text/Pandoc/Writers/Markdown.hs | 12 ------------
 src/Text/Pandoc/Writers/RST.hs      | 17 ++++++++++++++---
 src/Text/Pandoc/Writers/Shared.hs   | 15 +++++++++++++++
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs
index e965528cc..7826c4bdd 100644
--- a/src/Text/Pandoc/Writers/Markdown.hs
+++ b/src/Text/Pandoc/Writers/Markdown.hs
@@ -1136,15 +1136,3 @@ makeMathPlainer = walk go
   go (Emph xs) = Span nullAttr xs
   go x = x
 
-unsmartify :: WriterOptions -> String -> String
-unsmartify opts ('\8217':xs) = '\'' : unsmartify opts xs
-unsmartify opts ('\8230':xs) = "..." ++ unsmartify opts xs
-unsmartify opts ('\8211':xs)
-  | isEnabled Ext_old_dashes opts = '-' : unsmartify opts xs
-  | otherwise                     = "--" ++ unsmartify opts xs
-unsmartify opts ('\8212':xs)
-  | isEnabled Ext_old_dashes opts = "--" ++ unsmartify opts xs
-  | otherwise                     = "---" ++ unsmartify opts xs
-unsmartify opts (x:xs) = x : unsmartify opts xs
-unsmartify _ [] = []
-
diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs
index ee3ecd9cd..4e0fe1011 100644
--- a/src/Text/Pandoc/Writers/RST.hs
+++ b/src/Text/Pandoc/Writers/RST.hs
@@ -432,14 +432,25 @@ inlineToRST (Subscript lst) = do
 inlineToRST (SmallCaps lst) = inlineListToRST lst
 inlineToRST (Quoted SingleQuote lst) = do
   contents <- inlineListToRST lst
-  return $ "‘" <> contents <> "’"
+  opts <- gets stOptions
+  if isEnabled Ext_smart opts
+     then return $ "'" <> contents <> "'"
+     else return $ "‘" <> contents <> "’"
 inlineToRST (Quoted DoubleQuote lst) = do
   contents <- inlineListToRST lst
-  return $ "“" <> contents <> "”"
+  opts <- gets stOptions
+  if isEnabled Ext_smart opts
+     then return $ "\"" <> contents <> "\""
+     else return $ "“" <> contents <> "”"
 inlineToRST (Cite _  lst) =
   inlineListToRST lst
 inlineToRST (Code _ str) = return $ "``" <> text str <> "``"
-inlineToRST (Str str) = return $ text $ escapeString str
+inlineToRST (Str str) = do
+  opts <- gets stOptions
+  let str' = if isEnabled Ext_smart opts
+                then unsmartify opts str
+                else str
+  return $ text $ escapeString str'
 inlineToRST (Math t str) = do
   modify $ \st -> st{ stHasMath = True }
   return $ if t == InlineMath
diff --git a/src/Text/Pandoc/Writers/Shared.hs b/src/Text/Pandoc/Writers/Shared.hs
index 845d22077..3d50d3312 100644
--- a/src/Text/Pandoc/Writers/Shared.hs
+++ b/src/Text/Pandoc/Writers/Shared.hs
@@ -35,10 +35,12 @@ module Text.Pandoc.Writers.Shared (
                      , defField
                      , tagWithAttrs
                      , fixDisplayMath
+                     , unsmartify
                      )
 where
 import Text.Pandoc.Definition
 import Text.Pandoc.Pretty
+import Text.Pandoc.Options
 import Text.Pandoc.XML (escapeStringForXML)
 import Control.Monad (liftM)
 import Text.Pandoc.Options (WriterOptions(..))
@@ -167,3 +169,16 @@ fixDisplayMath (Para lst)
        groupBy (\x y -> (isDisplayMath x && isDisplayMath y) ||
                          not (isDisplayMath x || isDisplayMath y)) lst
 fixDisplayMath x = x
+
+unsmartify :: WriterOptions -> String -> String
+unsmartify opts ('\8217':xs) = '\'' : unsmartify opts xs
+unsmartify opts ('\8230':xs) = "..." ++ unsmartify opts xs
+unsmartify opts ('\8211':xs)
+  | isEnabled Ext_old_dashes opts = '-' : unsmartify opts xs
+  | otherwise                     = "--" ++ unsmartify opts xs
+unsmartify opts ('\8212':xs)
+  | isEnabled Ext_old_dashes opts = "--" ++ unsmartify opts xs
+  | otherwise                     = "---" ++ unsmartify opts xs
+unsmartify opts (x:xs) = x : unsmartify opts xs
+unsmartify _ [] = []
+