git.iko.soy/typeable/pandoc
on master help sign in
Roff reader: expand strings in font commands.

Closes #5039.

commite95aeeafb89eed801c574aeafc05d9eeaff1bd0f authorJohn MacFarlane <jgm@berkeley.edu> dateFri 2 Nov 2018, 21:25 (8 years ago) parentaca87bb
1 file changed+26−12
src/Text/Pandoc/Readers/Roff.hs+26−12
src/Text/Pandoc/Readers/Roff.hs+26−12
@@ -313,17 +313,30 @@ signedNumber = try $ do
313313-- Parses: [..] or (..
314314escapeArg :: PandocMonad m => RoffLexer m String
315315escapeArg = choice
316− [ char '[' *> manyTill (noneOf ['\n',']']) (char ']')
317− , char '(' *> count 2 (satisfy (/='\n'))
316+ [ char '[' *> manyTill (expanding $ noneOf ['\n',']']) (char ']')
317+ , char '(' *> count 2 (expanding $ satisfy (/='\n'))
318318 ]
319319
320+expanding :: PandocMonad m => RoffLexer m a -> RoffLexer m a
321+expanding parser = try $ optional expandString >> parser
322+
323+expandString :: PandocMonad m => RoffLexer m ()
324+expandString = try $ do
325+ pos <- getPosition
326+ char '\\'
327+ char '*'
328+ cs <- escapeArg <|> count 1 anyChar
329+ s <- linePartsToString <$> resolveString cs pos
330+ getInput >>= setInput . (s ++)
331+ return ()
332+
320333-- Parses: '..'
321334quoteArg :: PandocMonad m => RoffLexer m String
322335quoteArg = char '\'' *> manyTill (noneOf ['\n','\'']) (char '\'')
323336
324337escFont :: PandocMonad m => RoffLexer m [LinePart]
325338escFont = do
326− font <- escapeArg <|> count 1 alphaNum
339+ font <- expanding (escapeArg <|> count 1 alphaNum)
327340 font' <- if null font || font == "P"
328341 then prevFont <$> getState
329342 else return $ foldr processFontLetter defaultFontSpec font
@@ -647,15 +660,16 @@ escString = try $ do
647660 resolveString cs pos)
648661 <|> mempty <$ char 'S'
649662
650− where
651− -- strings and macros share namespace
652− resolveString stringname pos = do
653− RoffTokens ts <- resolveMacro stringname [] pos
654− case Foldable.toList ts of
655− [TextLine xs] -> return xs
656− _ -> do
657− report $ SkippedContent ("unknown string " ++ stringname) pos
658− return mempty
663+-- strings and macros share namespace
664+resolveString :: PandocMonad m
665+ => String -> SourcePos -> RoffLexer m [LinePart]
666+resolveString stringname pos = do
667+ RoffTokens ts <- resolveMacro stringname [] pos
668+ case Foldable.toList ts of
669+ [TextLine xs] -> return xs
670+ _ -> do
671+ report $ SkippedContent ("unknown string " ++ stringname) pos
672+ return mempty
659673
660674lexLine :: PandocMonad m => RoffLexer m RoffTokens
661675lexLine = do