@@ -53,7 +53,8 @@ import Control.Monad (void, mzero, guard, when)
53import Control.Monad.Except (throwError)
53import Control.Monad.Except (throwError)
54import Text.Pandoc.Class
54import Text.Pandoc.Class
55 (getResourcePath, readFileFromDirs, PandocMonad(..), report)
55 (getResourcePath, readFileFromDirs, PandocMonad(..), report)
56−import Data.Char (toLower, isHexDigit, chr, ord, isAscii, isAlphaNum, isSpace)
56+import Data.Char (isLower, toLower, toUpper, isHexDigit, chr, ord,
57+ isAscii, isAlphaNum, isSpace)
57import Data.Default (Default)
58import Data.Default (Default)
58import qualified Data.Map as M
59import qualified Data.Map as M
59import Data.List (intercalate, isSuffixOf)
60import Data.List (intercalate, isSuffixOf)
@@ -267,35 +268,34 @@ escFontSize = do
267 toFontSize (s ++ ds)
268 toFontSize (s ++ ds)
271+-- Parses: [..], (.., or . (single character).
272+escapeArg :: PandocMonad m => RoffLexer m String
274+ [ char '[' *> manyTill (noneOf ['\n',']']) (char ']')
275+ , char ')' *> count 2 anyChar
280+quoteArg :: PandocMonad m => RoffLexer m String
281+quoteArg = char '\'' *> manyTill (noneOf ['\n','\'']) (char '\'')
270escFont :: PandocMonad m => RoffLexer m [LinePart]
283escFont :: PandocMonad m => RoffLexer m [LinePart]
271escFont = do
284escFont = do
272− font <- choice
285+ font <- escapeArg
273− [ digit >> return defaultFontSpec
286+ font' <- if null font
274− , digit >> return defaultFontSpec
287+ then prevFont <$> getState
275− , ($ defaultFontSpec) <$> letterFontKind
288+ else return $ foldr processFontLetter defaultFontSpec font
278 modifyState $ \st -> st{ prevFont = currentFont st
289 modifyState $ \st -> st{ prevFont = currentFont st
279− , currentFont = font }
290+ , currentFont = font' }
280− return [Font font]
291+ return [Font font']
282−lettersFont :: PandocMonad m => RoffLexer m FontSpec
293+ processFontLetter c fs
283−lettersFont = try $ do
294+ | isLower c = processFontLetter (toUpper c) fs
284− fs <- (char '[' *> many letterFontKind <* char ']')
285− <|> (char '(' *> count 2 letterFontKind)
287− then prevFont <$> getState
288− else return $ foldr ($) defaultFontSpec fs
290−letterFontKind :: PandocMonad m => RoffLexer m (FontSpec -> FontSpec)
291−letterFontKind = choice [
292− oneOf ['B','b'] >> return (\fs -> fs{ fontBold = True })
295+ processFontLetter 'B' fs = fs{ fontBold = True }
293− , oneOf ['I','i'] >> return (\fs -> fs { fontItalic = True })
296+ processFontLetter 'I' fs = fs{ fontItalic = True }
294− , oneOf ['C','c'] >> return (\fs -> fs { fontMonospace = True })
297+ processFontLetter 'C' fs = fs{ fontMonospace = True }
295− , oneOf ['P','p','R','r'] >> return id
298+ processFontLetter _ fs = fs -- do nothing
296− , letter >> return id -- L, S, etc.
300-- separate function from lexMacro since real man files sometimes do not
300-- separate function from lexMacro since real man files sometimes do not
301-- follow the rules
301-- follow the rules