@@ -87,7 +87,6 @@ type MacroKind = String
88data LinePart = RoffStr String
88data LinePart = RoffStr String
89 | Font FontSpec
89 | Font FontSpec
91 | MacroArg Int
90 | MacroArg Int
92 deriving Show
91 deriving Show
@@ -215,58 +214,85 @@ escapeNormal :: PandocMonad m => RoffLexer m [LinePart]
215escapeNormal = do
214escapeNormal = do
216 c <- anyChar
215 c <- anyChar
217 case c of
216 case c of
218− 'A' -> quoteArg >>= checkDefined
217+ ' ' -> return [RoffStr " "]
219− 'C' -> quoteArg >>= resolveGlyph '\''
223 '"' -> mempty <$ skipMany (satisfy (/='\n')) -- line comment
218 '"' -> mempty <$ skipMany (satisfy (/='\n')) -- line comment
224 '#' -> mempty <$ manyTill anyChar newline
219 '#' -> mempty <$ manyTill anyChar newline
225 '%' -> return mempty -- optional hyphenation
220 '%' -> return mempty -- optional hyphenation
226− ':' -> return mempty -- zero-width break
227− '{' -> return mempty
228− '}' -> return mempty
229 '&' -> return mempty -- nonprintable zero-width
221 '&' -> return mempty -- nonprintable zero-width
230 ')' -> return mempty -- nonprintable zero-width
222 ')' -> return mempty -- nonprintable zero-width
231− '/' -> return mempty -- to fix spacing before roman
223+ '*' -> escString
232 ',' -> return mempty -- to fix spacing after roman
224 ',' -> return mempty -- to fix spacing after roman
233− '\n' -> return mempty -- line continuation
234− 'c' -> return mempty -- interrupt text processing
235− 'a' -> return mempty -- "non-interpreted leader character"
236 '-' -> return [RoffStr "-"]
225 '-' -> return [RoffStr "-"]
237− '_' -> return [RoffStr "_"]
226+ '.' -> return [RoffStr "`"]
227+ '/' -> return mempty -- to fix spacing before roman
238− ' ' -> return [RoffStr " "]
228+ '0' -> return [RoffStr "\x2007"] -- digit-width space
239− '\\' -> do
229+ ':' -> return mempty -- zero-width break
240− mode <- roffMode <$> getState
230+ 'A' -> quoteArg >>= checkDefined
241− case mode of
231+ 'B' -> escIgnore 'B' [quoteArg]
242− CopyMode -> char '\\'
232+ 'C' -> quoteArg >>= resolveGlyph '\''
243− NormalMode -> return '\\'
233+ 'D' -> escIgnore 'D' [quoteArg]
244− return [RoffStr "\\"]
245− 't' -> return [RoffStr "\t"]
246− 'e' -> return [RoffStr "\\"]
247 'E' -> do
234 'E' -> do
248 mode <- roffMode <$> getState
235 mode <- roffMode <$> getState
249 case mode of
236 case mode of
250 CopyMode -> return mempty
237 CopyMode -> return mempty
251 NormalMode -> return [RoffStr "\\"]
238 NormalMode -> return [RoffStr "\\"]
239+ 'H' -> escIgnore 'H' [quoteArg]
240+ 'L' -> escIgnore 'L' [quoteArg]
241+ 'M' -> escIgnore 'M' [escapeArg, count 1 (satisfy (/='\n'))]
242+ 'N' -> escIgnore 'N' [quoteArg]
243+ 'O' -> escIgnore 'O' [count 1 (oneOf ['0','1'])]
244+ 'R' -> escIgnore 'R' [quoteArg]
245+ 'S' -> escIgnore 'S' [quoteArg]
246+ 'V' -> escIgnore 'V' [escapeArg, count 1 alphaNum]
247+ 'X' -> escIgnore 'X' [quoteArg]
248+ 'Y' -> escIgnore 'Y' [escapeArg, count 1 (satisfy (/='\n'))]
249+ 'Z' -> escIgnore 'Z' [quoteArg]
252− '`' -> return [RoffStr "`"]
250+ '\'' -> return [RoffStr "`"]
251+ '\n' -> return mempty -- line continuation
253 '^' -> return [RoffStr "\x200A"] -- 1/12 em space
252 '^' -> return [RoffStr "\x200A"] -- 1/12 em space
253+ '_' -> return [RoffStr "_"]
254+ '`' -> return [RoffStr "`"]
255+ 'a' -> return mempty -- "non-interpreted leader character"
256+ 'b' -> escIgnore 'b' [quoteArg]
257+ 'c' -> return mempty -- interrupt text processing
258+ 'd' -> escIgnore 'd' [] -- forward down 1/2em
259+ 'e' -> return [RoffStr "\\"]
261+ 'g' -> escIgnore 'g' [escapeArg, count 1 (satisfy (/='\n'))]
262+ 'h' -> escIgnore 'h' [quoteArg]
263+ 'k' -> escIgnore 'k' [escapeArg, count 1 (satisfy (/='\n'))]
264+ 'l' -> escIgnore 'l' [quoteArg]
265+ 'm' -> escIgnore 'm' [escapeArg, count 1 (satisfy (/='\n'))]
266+ 'n' -> escIgnore 'm' [escapeArg, count 1 (satisfy (/='\n'))]
267+ 'o' -> escIgnore 'o' [quoteArg]
268+ 'p' -> escIgnore 'p' []
269+ 'r' -> escIgnore 'r' []
270+ 's' -> escIgnore 's' [escapeArg, signedNumber]
271+ 't' -> return [RoffStr "\t"]
272+ 'u' -> escIgnore 'u' []
273+ 'v' -> escIgnore 'v' [quoteArg]
274+ 'w' -> escIgnore 'w' [quoteArg]
275+ 'x' -> escIgnore 'x' [quoteArg]
276+ 'z' -> escIgnore 'z' [count 1 anyChar]
277+ '{' -> return mempty
254 '|' -> return [RoffStr "\x2006"] --1/6 em space
278 '|' -> return [RoffStr "\x2006"] --1/6 em space
255− '\'' -> return [RoffStr "`"]
279+ '}' -> return mempty
256− '.' -> return [RoffStr "`"]
257 '~' -> return [RoffStr "\160"] -- nonbreaking space
280 '~' -> return [RoffStr "\160"] -- nonbreaking space
258− '0' -> return [RoffStr "\x2007"] -- digit-width space
281+ '\\' -> do
259− _ -> escIgnore c
282+ mode <- roffMode <$> getState
284+ CopyMode -> char '\\'
285+ NormalMode -> return '\\'
286+ return [RoffStr "\\"]
287+ _ -> fail $ "Unknown escape character \\" ++ [c]
261−escIgnore :: PandocMonad m => Char -> RoffLexer m [LinePart]
289+escIgnore :: PandocMonad m
291+ -> [RoffLexer m String]
292+ -> RoffLexer m [LinePart]
262−escIgnore c = do
293+escIgnore c argparsers = do
263 pos <- getPosition
294 pos <- getPosition
264− nextc <- lookAhead anyChar
295+ arg <- snd <$> withRaw (choice argparsers) <|> return ""
265− arg <- case nextc of
266− '[' -> (\x -> "[" ++ x ++ "]") <$> escapeArg
267− '(' -> ('(':) <$> escapeArg
268− '\'' -> (\x -> "'" ++ x ++ "'") <$> quoteArg
269− _ -> count 1 anyChar
270 report $ SkippedContent ('\\':c:arg) pos
296 report $ SkippedContent ('\\':c:arg) pos
271 return mempty
297 return mempty
@@ -276,34 +302,17 @@ escUnknown s = do
276 report $ SkippedContent s pos
302 report $ SkippedContent s pos
277 return [RoffStr "\xFFFD"]
303 return [RoffStr "\xFFFD"]
280−escFontSize :: PandocMonad m => RoffLexer m [LinePart]
305+signedNumber :: PandocMonad m => RoffLexer m String
281−escFontSize = do
306+signedNumber = try $ do
282− let sign = option "" ("-" <$ char '-' <|> "" <$ char '+')
307+ sign <- option "" ("-" <$ char '-' <|> "" <$ char '+')
283− let toFontSize xs =
308+ ds <- many1 digit
286− Just n -> return [FontSize n]
291− toFontSize (s ++ ds)
296− toFontSize (s ++ ds)
297− , do s <- sign
309+ return (sign ++ ds)
299− toFontSize (s ++ ds)
302-- Parses: [..] or (..
311-- Parses: [..] or (..
303escapeArg :: PandocMonad m => RoffLexer m String
312escapeArg :: PandocMonad m => RoffLexer m String
304escapeArg = choice
313escapeArg = choice
305 [ char '[' *> manyTill (noneOf ['\n',']']) (char ']')
314 [ char '[' *> manyTill (noneOf ['\n',']']) (char ']')
306− , char '(' *> count 2 anyChar
315+ , char '(' *> count 2 (satisfy (/='\n'))
309-- Parses: '..'
318-- Parses: '..'