@@ -32,8 +32,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3232Tokenizer for groff formats (man, ms).
3333-}
3434module Text.Pandoc.Readers.Groff
35− ( FontKind(..)
36− , MacroKind
35+ ( MacroKind
36+ , FontSpec(..)
37+ , defaultFontSpec
3738 , LinePart(..)
3839 , Arg
3940 , ManToken(..)
@@ -72,12 +73,18 @@ import qualified Data.Text.Normalize as Normalize
7273--
7374-- Data Types
7475--
75−data FontKind = Bold | Italic | Monospace | Regular deriving (Show, Eq, Ord)
76+data FontSpec = FontSpec{ fontBold :: Bool
77+ , fontItalic :: Bool
78+ , fontMonospace :: Bool
79+ } deriving (Show, Eq, Ord)
80+
81+defaultFontSpec :: FontSpec
82+defaultFontSpec = FontSpec False False False
7683
7784type MacroKind = String
7885
7986data LinePart = RoffStr String
80− | Font [FontKind]
87+ | Font FontSpec
8188 | FontSize Int
8289 | MacroArg Int
8390 deriving Show
@@ -97,7 +104,8 @@ newtype ManTokens = ManTokens { unManTokens :: Seq.Seq ManToken }
97104singleTok :: ManToken -> ManTokens
98105singleTok t = ManTokens (Seq.singleton t)
99106
100−data RoffState = RoffState { customMacros :: M.Map String ManTokens
107+data RoffState = RoffState { customMacros :: M.Map String ManTokens
108+ , lastFont :: FontSpec
101109 } deriving Show
102110
103111instance Default RoffState where
@@ -109,6 +117,7 @@ instance Default RoffState where
109117 , ("lq", "\x201C")
110118 , ("rq", "\x201D")
111119 , ("R", "\x00AE") ]
120+ , lastFont = defaultFontSpec
112121 }
113122
114123type ManLexer m = ParserT [Char] RoffState m
@@ -245,29 +254,32 @@ escFontSize = do
245254escFont :: PandocMonad m => ManLexer m [LinePart]
246255escFont = do
247256 font <- choice
248− [ char 'S' >> return [Regular]
249− , digit >> return [Regular]
250− , (:[]) <$> letterFontKind
251− , char '(' >> anyChar >> anyChar >> return [Regular]
257+ [ char 'S' >> return defaultFontSpec
258+ , digit >> return defaultFontSpec
259+ , char '(' >> anyChar >> anyChar >> return defaultFontSpec
260+ , digit >> return defaultFontSpec
261+ , ($ defaultFontSpec) <$> letterFontKind
252262 , lettersFont
253− , digit >> return [Regular]
254263 ]
264+ modifyState $ \st -> st{ lastFont = font }
255265 return [Font font]
256266
257−lettersFont :: PandocMonad m => ManLexer m [FontKind]
267+lettersFont :: PandocMonad m => ManLexer m FontSpec
258268lettersFont = try $ do
259269 char '['
260270 fs <- many letterFontKind
261271 skipMany letter
262272 char ']'
263− return fs
273+ if null fs
274+ then lastFont <$> getState
275+ else return $ foldr ($) defaultFontSpec fs
264276
265−letterFontKind :: PandocMonad m => ManLexer m FontKind
277+letterFontKind :: PandocMonad m => ManLexer m (FontSpec -> FontSpec)
266278letterFontKind = choice [
267− oneOf ['B','b'] >> return Bold
268− , oneOf ['I','i'] >> return Italic
269− , oneOf ['C','c'] >> return Monospace
270− , oneOf ['P','p','R','r'] >> return Regular
279+ oneOf ['B','b'] >> return (\fs -> fs{ fontBold = True })
280+ , oneOf ['I','i'] >> return (\fs -> fs { fontItalic = True })
281+ , oneOf ['C','c'] >> return (\fs -> fs { fontMonospace = True })
282+ , oneOf ['P','p','R','r'] >> return id
271283 ]
272284
273285