git.iko.soy/typeable/pandoc
on master help sign in
Man reader: Improved header parsing.

- .SH should be level 1, .SS level 2. - The header title can come on the next line.

commit7dd06e96d784b093120e0f8e816c869184613ff9 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 19 Oct 2018, 23:27 (8 years ago) parentcfa824b
3 files changed+25−24
src/Text/Pandoc/Readers/Man.hs+11−10 test/Tests/Readers/Man.hs+2−2 test/man-reader.native+12−12
src/Text/Pandoc/Readers/Man.hs+11−10
@@ -72,7 +72,6 @@ data ManToken = MStr RoffStr
7272 | MLine [RoffStr]
7373 | MMaybeLink String
7474 | MEmptyLine
75− | MHeader Int [RoffStr]
7675 | MMacro MacroKind [RoffStr]
7776 | MComment String
7877 deriving Show
@@ -299,8 +298,6 @@ lexMacro = do
299298 "BR" -> MMaybeLink joinedArgs
300299 x | x `elem` ["BI", "IB"] -> MStr (joinedArgs, S.fromList [Italic, Bold])
301300 x | x `elem` ["I", "IR", "RI"] -> MStr (joinedArgs, singleton Italic)
302− "SH" -> MHeader 2 args
303− "SS" -> MHeader 3 args
304301 x | x `elem` [ "P", "PP", "LP", "sp"] -> MEmptyLine
305302 _ -> MMacro macroName args
306303 return tok
@@ -399,11 +396,6 @@ memptyLine = msatisfy isMEmptyLine where
399396 isMEmptyLine MEmptyLine = True
400397 isMEmptyLine _ = False
401398
402−mheader :: PandocMonad m => ManParser m ManToken
403−mheader = msatisfy isMHeader where
404− isMHeader (MHeader _ _) = True
405− isMHeader _ = False
406−
407399mmacro :: PandocMonad m => MacroKind -> ManParser m ManToken
408400mmacro mk = msatisfy isMMacro where
409401 isMMacro (MMacro mk' _) | mk == mk' = True
@@ -524,8 +516,17 @@ parseCodeBlock = try $ do
524516
525517parseHeader :: PandocMonad m => ManParser m Blocks
526518parseHeader = do
527− (MHeader lvl ss) <- mheader
528− return $ header lvl (mconcat $ intersperse B.space $ strToInlines <$> ss)
519+ MMacro name args <- mmacro "SH" <|> mmacro "SS"
520+ contents <- if null args
521+ then do
522+ MLine ils <- mline
523+ return $ mconcat $ map strToInlines ils
524+ else do
525+ return $ mconcat
526+ $ intersperse B.space
527+ $ map strToInlines args
528+ let lvl = if name == "SH" then 1 else 2
529+ return $ header lvl contents
529530
530531type ListBuilder = [Blocks] -> Blocks
531532
test/Tests/Readers/Man.hs+2−2
@@ -33,10 +33,10 @@ tests = [
3333 =?> (para $ strong $ emph $ text "foo bar")
3434 , "H1" =:
3535 ".SH The header\n"
36− =?> header 2 (text "The header")
36+ =?> header 1 (text "The header")
3737 , "H2" =:
3838 ".SS \"The header 2\""
39− =?> header 3 (text "The header 2")
39+ =?> header 2 (text "The header 2")
4040 , "Macro args" =:
4141 ".B \"single arg with \"\"Q\"\"\""
4242 =?> (para $ strong $ text "single arg with \"Q\"")
test/man-reader.native+12−12
@@ -2,42 +2,42 @@ Pandoc (Meta {unMeta = fromList [("title",MetaString "Pandoc Man tests")]})
22[Header 1 ("",[],[]) [Str "Pandoc",Space,Str "Man",Space,Str "tests"]
33,Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "set",Space,Str "of",Space,Str "tests",Space,Str "for",Space,Str "pandoc."]
44,Para [Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]
5−,Header 2 ("",[],[]) [Str "Headers"]
6−,Header 2 ("",[],[]) [Str "Level",Space,Str "1"]
7−,Header 3 ("",[],[]) [Str "Level",Space,Str "2"]
5+,Header 1 ("",[],[]) [Str "Headers"]
6+,Header 1 ("",[],[]) [Str "Level",Space,Str "1"]
7+,Header 2 ("",[],[]) [Str "Level",Space,Str "2"]
88,Para [Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]
9−,Header 2 ("",[],[]) [Str "Paragraphs"]
9+,Header 1 ("",[],[]) [Str "Paragraphs"]
1010,Para [Str "Here's",Space,Str "a",Space,Str "regular",Space,Str "paragraph."]
1111,Para [Str "Another",Space,Str "paragraph",Space,Str "In",Space,Str "Markdown",Space,Str "1.0.0",Space,Str "and",Space,Str "earlier.",Space,Str "Version",Space,Str "8.",Space,Str "This",Space,Str "line",Space,Str "turns",Space,Str "into",Space,Str "a",Space,Str "list",Space,Str "item.",Space,Str "Because",Space,Str "a",Space,Str "hard-wrapped",Space,Str "line",Space,Str "in",Space,Str "the",Space,Str "middle",Space,Str "of",Space,Str "a",Space,Str "paragraph",Space,Str "looked",Space,Str "like",Space,Str "a",Space,Str "list",Space,Str "item."]
1212,Para [Str "There",Space,Str "should",Space,Str "be",Space,Str "a",Space,Str "hard",Space,Str "line",Space,Str "break"]
1313,Para [Str "here."]
1414,Para [Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]
15−,Header 2 ("",[],[]) [Str "Block",Space,Str "Quotes"]
15+,Header 1 ("",[],[]) [Str "Block",Space,Str "Quotes"]
1616,Para [Str "Code",Space,Str "in",Space,Str "a",Space,Str "block",Space,Str "quote:"]
1717,CodeBlock ("",[],[]) "\nsub status {\n print \"working\";\n}"
1818,Para [Str "A",Space,Str "list:"]
1919,OrderedList (1,Decimal,Period)
2020 [[Para [Str "item",Space,Str "one"]]
2121 ,[Para [Str "item",Space,Str "two"]]]
22−,Header 2 ("",[],[]) [Str "Code",Space,Str "Blocks"]
22+,Header 1 ("",[],[]) [Str "Code",Space,Str "Blocks"]
2323,Para [Str "Code:"]
2424,CodeBlock ("",[],[]) "\n---- (should be four hyphens)\n\nsub status {\n print \"working\";\n}\n"
2525,Para [Str "And:"]
2626,CodeBlock ("",[],[]) "\n\tthis code line is indented by one tab"
2727,Para [Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]
28−,Header 2 ("",[],[]) [Str "Lists"]
29−,Header 3 ("",[],[]) [Str "Unordered"]
28+,Header 1 ("",[],[]) [Str "Lists"]
29+,Header 2 ("",[],[]) [Str "Unordered"]
3030,Para [Str "Asterisks:"]
3131,BulletList
3232 [[Para [Str "asterisk",Space,Str "1"]]
3333 ,[Para [Str "asterisk",Space,Str "2"]]
3434 ,[Para [Str "asterisk",Space,Str "3"]]]
35−,Header 3 ("",[],[]) [Str "Ordered"]
35+,Header 2 ("",[],[]) [Str "Ordered"]
3636,OrderedList (1,Decimal,Period)
3737 [[Para [Str "First"]]
3838 ,[Para [Str "Second"]]
3939 ,[Para [Str "Third"]]]
40−,Header 3 ("",[],[]) [Str "Nested"]
40+,Header 2 ("",[],[]) [Str "Nested"]
4141,BulletList
4242 [[Para [Str "Tab"]
4343 ,BulletList
@@ -62,7 +62,7 @@ Pandoc (Meta {unMeta = fromList [("title",MetaString "Pandoc Man tests")]})
6262 ,[Para [Str "Fie"]]
6363 ,[Para [Str "Foe"]]]]
6464 ,[Para [Str "Third"]]]
65−,Header 3 ("",[],[]) [Str "different",Space,Str "styles:"]
65+,Header 2 ("",[],[]) [Str "different",Space,Str "styles:"]
6666,OrderedList (1,UpperAlpha,Period)
6767 [[Para [Str "Upper",Space,Str "Alpha"]
6868 ,OrderedList (1,UpperRoman,Period)
@@ -72,7 +72,7 @@ Pandoc (Meta {unMeta = fromList [("title",MetaString "Pandoc Man tests")]})
7272 ,OrderedList (3,LowerAlpha,OneParen)
7373 [[Para [Str "Lower",Space,Str "alpha",Space,Str "with",Space,Str "paren"]]]]]]]]]
7474,Para [Str "*",Space,Str "*",Space,Str "*",Space,Str "*",Space,Str "*"]
75−,Header 2 ("",[],[]) [Str "Special",Space,Str "Characters"]
75+,Header 1 ("",[],[]) [Str "Special",Space,Str "Characters"]
7676,Para [Str "AT&T",Space,Str "has",Space,Str "an",Space,Str "ampersand",Space,Str "in",Space,Str "their",Space,Str "name."]
7777,Para [Str "4",Space,Str "<",Space,Str "5."]
7878,Para [Str "6",Space,Str ">",Space,Str "5."]