git.iko.soy/typeable/pandoc
on master help sign in
tests, parsing fixes
1ce067fYan Pas
src/Text/Pandoc/Readers/Man.hs+19−16
@@ -37,7 +37,7 @@ import Control.Monad (liftM)
37import Control.Monad.Except (throwError)
37import Control.Monad.Except (throwError)
38import Data.Default (Default)
38import Data.Default (Default)
39import Data.Map (insert)
39import Data.Map (insert)
40−import Data.Maybe (isJust, catMaybes)
40+import Data.Maybe (catMaybes)
41import Data.List (intersperse, intercalate)
41import Data.List (intersperse, intercalate)
42import qualified Data.Text as T
42import qualified Data.Text as T
43
43
@@ -159,6 +159,9 @@ parseMan = do
159 isNull Null = True
159 isNull Null = True
160 isNull _ = False
160 isNull _ = False
161
161
162+eofline :: PandocMonad m => ManLexer m ()
163+eofline = (newline >> return ()) <|> eof
164+
162-- TODO escape characters in arguments
165-- TODO escape characters in arguments
163lexMacro :: PandocMonad m => ManLexer m ManToken
166lexMacro :: PandocMonad m => ManLexer m ManToken
164lexMacro = do
167lexMacro = do
@@ -166,7 +169,7 @@ lexMacro = do
166 many space
169 many space
167 macroName <- many1 (letter <|> oneOf ['\\', '"'])
170 macroName <- many1 (letter <|> oneOf ['\\', '"'])
168 args <- lexArgs
171 args <- lexArgs
169− let joinedArgs = concat $ intersperse " " args
172+ let joinedArgs = unwords args
170 let knownMacro mkind = MMacro mkind args
173 let knownMacro mkind = MMacro mkind args
171
174
172 let tok = case macroName of
175 let tok = case macroName of
@@ -190,17 +193,17 @@ lexMacro = do
190
193
191 lexArgs :: PandocMonad m => ManLexer m [String]
194 lexArgs :: PandocMonad m => ManLexer m [String]
192 lexArgs = do
195 lexArgs = do
193− eolOpt <- optionMaybe $ char '\n'
196+ args <- many oneArg
194− if isJust eolOpt
197+ eofline
195− then return []
196− else do
197− many1 space
198− arg <- try quotedArg <|> plainArg
199− otherargs <- lexArgs
200− return $ arg : otherargs
198+ return args
201
199
202 where
200 where
203
201
202+ oneArg :: PandocMonad m => ManLexer m String
203+ oneArg = do
204+ many1 $ char ' '
205+ try quotedArg <|> plainArg
206+
204 plainArg :: PandocMonad m => ManLexer m String
207 plainArg :: PandocMonad m => ManLexer m String
205 plainArg = many1 $ noneOf " \t\n"
208 plainArg = many1 $ noneOf " \t\n"
206
209
@@ -257,7 +260,7 @@ escapeLexer = do
257lexLine :: PandocMonad m => ManLexer m ManToken
260lexLine :: PandocMonad m => ManLexer m ManToken
258lexLine = do
261lexLine = do
259 lnparts <- many1 (esc <|> linePart)
262 lnparts <- many1 (esc <|> linePart)
260− newline
263+ eofline
261 return $ MLine $ catMaybes lnparts
264 return $ MLine $ catMaybes lnparts
262 where
265 where
263
266
@@ -384,7 +387,7 @@ strToInline s ItalicBold = Strong [Emph [Str s]]
384parsePara :: PandocMonad m => ManParser m Block
387parsePara :: PandocMonad m => ManParser m Block
385parsePara = do
388parsePara = do
386 inls <- many1 (strInl <|> lineInl <|> linkInl <|> comment)
389 inls <- many1 (strInl <|> lineInl <|> linkInl <|> comment)
387− let withspaces = intersperse [Str " "] inls
390+ let withspaces = intersperse [Space] inls
388 return $ Para (concat withspaces)
391 return $ Para (concat withspaces)
389
392
390 where
393 where
@@ -420,7 +423,9 @@ parsePara = do
420 other <- many anyChar
423 other <- many anyChar
421 let manurl pagename section = "../"++section++"/"++pagename++"."++section
424 let manurl pagename section = "../"++section++"/"++pagename++"."++section
422 return $ [ Link nullAttr [Strong [Str mpage]] (manurl mpage [mansect], mpage)
425 return $ [ Link nullAttr [Strong [Str mpage]] (manurl mpage [mansect], mpage)
423− , Strong [Str $ " ("++[mansect] ++ ")", Str other]]
426+ , Strong [Str $ " ("++[mansect] ++ ")"
427+ , Str other]
428+ ]
424
429
425 comment :: PandocMonad m => ManParser m [Inline]
430 comment :: PandocMonad m => ManParser m [Inline]
426 comment = mcomment >> return []
431 comment = mcomment >> return []
@@ -448,9 +453,7 @@ parseHeader = do
448 return $ Header lvl nullAttr [Str s]
453 return $ Header lvl nullAttr [Str s]
449
454
450parseBulletList :: PandocMonad m => ManParser m Block
455parseBulletList :: PandocMonad m => ManParser m Block
451−parseBulletList = do
456+parseBulletList = BulletList . map (: []) <$> many1 block
452− bls <- many1 block
453− return $ BulletList $ map (:[]) bls
454
457
455 where
458 where
456
459
test/Tests/Readers/Man.hs+15−3
@@ -23,10 +23,22 @@ tests = [
23 -- .SH "HEllo bbb" "aaa"" as"
23 -- .SH "HEllo bbb" "aaa"" as"
24 testGroup "Macros" [
24 testGroup "Macros" [
25 "Bold" =:
25 "Bold" =:
26− ".B foo\n"
26+ ".B foo"
27 =?> (para $ strong "foo")
27 =?> (para $ strong "foo")
28 , "Italic" =:
28 , "Italic" =:
29− ".I foo\n"
29+ ".I bar\n"
30− =?> (para $ emph "foo")
30+ =?> (para $ emph "bar")
31+ , "BoldItalic" =:
32+ ".BI foo bar"
33+ =?> (para $ strong $ emph $ str "foo bar")
34+ , "H1" =:
35+ ".SH The header\n"
36+ =?> header 2 (str "The header")
37+ , "H2" =:
38+ ".SS The header 2"
39+ =?> header 3 (str "The header 2")
40+ , "Macro args" =:
41+ ".B \"single arg with \"\"Q\"\"\""
42+ =?> (para $ strong $ str "single arg with \"Q\"")
31 ]
43 ]
32 ]
44 ]