git.iko.soy/typeable/pandoc
on master help sign in
Man reader: support '..' (end macro).

Also give feedback for unknown character codes, and return a replacement character U+FFFD.

commit08179695fa9741b9d617f1b7729f2dd2476b4f27 authorJohn MacFarlane <jgm@berkeley.edu> dateSat 20 Oct 2018, 10:37 (8 years ago) parent02b33a7
1 file changed+10−8
src/Text/Pandoc/Readers/Man.hs+10−8
src/Text/Pandoc/Readers/Man.hs+10−8
@@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2222
2323{- |
2424 Module : Text.Pandoc.Readers.Man
25− Copyright : Copyright (C) 2018 Yan Pashkovsky
25+ Copyright : Copyright (C) 2018 Yan Pashkovsky and John MacFarlane
2626 License : GNU GPL, version 2 or above
2727
2828 Maintainer : Yan Pashkovsky <yanp.bugz@gmail.com>
@@ -74,6 +74,7 @@ data ManToken = MStr RoffStr
7474 | MEmptyLine
7575 | MMacro MacroKind [RoffStr]
7676 | MComment String
77+ | MEndMacro
7778 deriving Show
7879
7980data RoffState = RoffState { fontKind :: Font
@@ -159,7 +160,7 @@ escapeLexer = do
159160 cs <- count 2 anyChar
160161 case M.lookup cs characterCodeMap of
161162 Just c -> return [c]
162− Nothing -> escUnknown ('(':cs)
163+ Nothing -> escUnknown ('\\':'(':cs) "\xFFFD"
163164
164165 bracketedGlyph =
165166 char '[' *>
@@ -177,7 +178,7 @@ escapeLexer = do
177178 charCode = do
178179 cs <- many1 (noneOf ['[',']',' ','\t','\n'])
179180 case M.lookup cs characterCodeMap of
180− Nothing -> mzero
181+ Nothing -> escUnknown ("\\[" ++ cs ++ "]") '\xFFFD'
181182 Just c -> return c
182183
183184 escStar = do
@@ -216,7 +217,7 @@ escapeLexer = do
216217 '|' -> return " "
217218 '\'' -> return "`"
218219 '.' -> return "`"
219− _ -> escUnknown [c]
220+ _ -> escUnknown [c] "\xFFFD"
220221
221222 escFont :: PandocMonad m => ManLexer m String
222223 escFont = do
@@ -245,11 +246,11 @@ escapeLexer = do
245246 , (char 'P' <|> char 'R') >> return Regular
246247 ]
247248
248− escUnknown :: PandocMonad m => String -> ManLexer m String
249− escUnknown s = do
249+ escUnknown :: PandocMonad m => String -> a -> ManLexer m a
250+ escUnknown s x = do
250251 pos <- getPosition
251252 report $ SkippedContent ("Unknown escape sequence " ++ s) pos
252− return mempty
253+ return x
253254
254255currentFont :: PandocMonad m => ManLexer m Font
255256currentFont = fontKind <$> getState
@@ -267,12 +268,13 @@ lexMacro :: PandocMonad m => ManLexer m ManToken
267268lexMacro = do
268269 char '.' <|> char '\''
269270 many spacetab
270− macroName <- many (letter <|> oneOf ['\\', '"', '&'])
271+ macroName <- many (letter <|> oneOf ['\\', '"', '&', '.'])
271272 args <- lexArgs
272273 let joinedArgs = unwords $ fst <$> args
273274
274275 tok = case macroName of
275276 "" -> MComment ""
277+ "." -> MEndMacro
276278 x | x `elem` ["\\\"", "\\#"] -> MComment joinedArgs
277279 "B" -> MStr (joinedArgs, singleton Bold)
278280 "BR" -> MMaybeLink joinedArgs