git.iko.soy/typeable/pandoc
on master help sign in
tests, parsing fixes
commit1ce067fc2a4f70963c2c879eac74807bb4fa9e7c authorYan Pas <yanp.bugz@gmail.com> dateWed 23 May 2018, 00:20 (8 years ago) parent7f7e1c2
2 files changed+34−19
src/Text/Pandoc/Readers/Man.hs+19−16 test/Tests/Readers/Man.hs+15−3
src/Text/Pandoc/Readers/Man.hs+19−16
@@ -37,7 +37,7 @@ import Control.Monad (liftM)
3737import Control.Monad.Except (throwError)
3838import Data.Default (Default)
3939import Data.Map (insert)
40−import Data.Maybe (isJust, catMaybes)
40+import Data.Maybe (catMaybes)
4141import Data.List (intersperse, intercalate)
4242import qualified Data.Text as T
4343
@@ -159,6 +159,9 @@ parseMan = do
159159 isNull Null = True
160160 isNull _ = False
161161
162+eofline :: PandocMonad m => ManLexer m ()
163+eofline = (newline >> return ()) <|> eof
164+
162165-- TODO escape characters in arguments
163166lexMacro :: PandocMonad m => ManLexer m ManToken
164167lexMacro = do
@@ -166,7 +169,7 @@ lexMacro = do
166169 many space
167170 macroName <- many1 (letter <|> oneOf ['\\', '"'])
168171 args <- lexArgs
169− let joinedArgs = concat $ intersperse " " args
172+ let joinedArgs = unwords args
170173 let knownMacro mkind = MMacro mkind args
171174
172175 let tok = case macroName of
@@ -190,17 +193,17 @@ lexMacro = do
190193
191194 lexArgs :: PandocMonad m => ManLexer m [String]
192195 lexArgs = do
193− eolOpt <- optionMaybe $ char '\n'
194− if isJust eolOpt
195− then return []
196− else do
197− many1 space
198− arg <- try quotedArg <|> plainArg
199− otherargs <- lexArgs
200− return $ arg : otherargs
196+ args <- many oneArg
197+ eofline
198+ return args
201199
202200 where
203201
202+ oneArg :: PandocMonad m => ManLexer m String
203+ oneArg = do
204+ many1 $ char ' '
205+ try quotedArg <|> plainArg
206+
204207 plainArg :: PandocMonad m => ManLexer m String
205208 plainArg = many1 $ noneOf " \t\n"
206209
@@ -257,7 +260,7 @@ escapeLexer = do
257260lexLine :: PandocMonad m => ManLexer m ManToken
258261lexLine = do
259262 lnparts <- many1 (esc <|> linePart)
260− newline
263+ eofline
261264 return $ MLine $ catMaybes lnparts
262265 where
263266
@@ -384,7 +387,7 @@ strToInline s ItalicBold = Strong [Emph [Str s]]
384387parsePara :: PandocMonad m => ManParser m Block
385388parsePara = do
386389 inls <- many1 (strInl <|> lineInl <|> linkInl <|> comment)
387− let withspaces = intersperse [Str " "] inls
390+ let withspaces = intersperse [Space] inls
388391 return $ Para (concat withspaces)
389392
390393 where
@@ -420,7 +423,9 @@ parsePara = do
420423 other <- many anyChar
421424 let manurl pagename section = "../"++section++"/"++pagename++"."++section
422425 return $ [ Link nullAttr [Strong [Str mpage]] (manurl mpage [mansect], mpage)
423− , Strong [Str $ " ("++[mansect] ++ ")", Str other]]
426+ , Strong [Str $ " ("++[mansect] ++ ")"
427+ , Str other]
428+ ]
424429
425430 comment :: PandocMonad m => ManParser m [Inline]
426431 comment = mcomment >> return []
@@ -448,9 +453,7 @@ parseHeader = do
448453 return $ Header lvl nullAttr [Str s]
449454
450455parseBulletList :: PandocMonad m => ManParser m Block
451−parseBulletList = do
452− bls <- many1 block
453− return $ BulletList $ map (:[]) bls
456+parseBulletList = BulletList . map (: []) <$> many1 block
454457
455458 where
456459
test/Tests/Readers/Man.hs+15−3
@@ -23,10 +23,22 @@ tests = [
2323 -- .SH "HEllo bbb" "aaa"" as"
2424 testGroup "Macros" [
2525 "Bold" =:
26− ".B foo\n"
26+ ".B foo"
2727 =?> (para $ strong "foo")
2828 , "Italic" =:
29− ".I foo\n"
30− =?> (para $ emph "foo")
29+ ".I bar\n"
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\"")
3143 ]
3244 ]