From 805b9f8a1238288ee094b8593cdb24e24636f01d Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Fri, 2 Nov 2018 21:35:49 -0700
Subject: [PATCH] Roff reader: Improved handling of custom strings as
 arguments.

Added test.
---
 src/Text/Pandoc/Readers/Roff.hs | 12 ++++++------
 test/command/5039.md            | 27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 6 deletions(-)
 create mode 100644 test/command/5039.md

diff --git a/src/Text/Pandoc/Readers/Roff.hs b/src/Text/Pandoc/Readers/Roff.hs
index fdf9a7f06..0559bab42 100644
--- a/src/Text/Pandoc/Readers/Roff.hs
+++ b/src/Text/Pandoc/Readers/Roff.hs
@@ -212,6 +212,7 @@ readUnicodeChar _ = Nothing
 escapeNormal :: PandocMonad m => RoffLexer m [LinePart]
 escapeNormal = do
   c <- anyChar
+  optional expandString
   case c of
     ' ' -> return [RoffStr " "]
     '"' -> mempty <$ skipMany (satisfy (/='\n')) -- line comment
@@ -313,13 +314,12 @@ signedNumber = try $ do
 -- Parses: [..] or (..
 escapeArg :: PandocMonad m => RoffLexer m String
 escapeArg = choice
-    [ char '[' *> manyTill (expanding $ noneOf ['\n',']']) (char ']')
-    , char '(' *> count 2 (expanding $ satisfy (/='\n'))
+    [ char '[' *> optional expandString *>
+                  manyTill (noneOf ['\n',']']) (char ']')
+    , char '(' *> optional expandString *>
+                  count 2 (satisfy (/='\n'))
     ]
 
-expanding :: PandocMonad m => RoffLexer m a -> RoffLexer m a
-expanding parser = try $ optional expandString >> parser
-
 expandString :: PandocMonad m => RoffLexer m ()
 expandString = try $ do
   pos <- getPosition
@@ -336,7 +336,7 @@ quoteArg = char '\'' *> manyTill (noneOf ['\n','\'']) (char '\'')
 
 escFont :: PandocMonad m => RoffLexer m [LinePart]
 escFont = do
-  font <- expanding (escapeArg <|> count 1 alphaNum)
+  font <- escapeArg <|> count 1 alphaNum
   font' <- if null font || font == "P"
               then prevFont <$> getState
               else return $ foldr processFontLetter defaultFontSpec font
diff --git a/test/command/5039.md b/test/command/5039.md
new file mode 100644
index 000000000..651a023b7
--- /dev/null
+++ b/test/command/5039.md
@@ -0,0 +1,27 @@
+```
+% pandoc -f man -t plain
+.ds foo bar
+.ds bar baz
+\*[\*[foo]]
+^D
+baz
+```
+
+```
+% pandoc -f man -t plain
+.ds foo [bar]
+.ds bar baz
+\*\*[foo]
+^D
+baz
+```
+
+```
+% pandoc -f man -t html
+.ds B-Font B
+.ds I-Font I
+.ds R-Font R
+\f\*[B-Font]certtool\fP
+^D
+<p><strong>certtool</strong></p>
+```