aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Text/Pandoc/Readers/Man.hs31
-rw-r--r--test/man-reader.man151
-rw-r--r--test/man-reader.native68
3 files changed, 234 insertions, 16 deletions
diff --git a/src/Text/Pandoc/Readers/Man.hs b/src/Text/Pandoc/Readers/Man.hs
index df740fa73..6f3a1a78d 100644
--- a/src/Text/Pandoc/Readers/Man.hs
+++ b/src/Text/Pandoc/Readers/Man.hs
@@ -115,21 +115,19 @@ parseTable = do
isMTable _ = False
MTable _opts aligns rows pos <- msatisfy isMTable
case aligns of
- [as] -> do
+ [as] -> try (do
let as' = map (columnTypeToAlignment . columnType) as
- if all isJust as'
- then do
- let alignments = catMaybes as'
- let (headerRow', bodyRows') =
- case rows of
- (h:[x]:bs)
- | isHrule x -> (h, bs)
- _ -> ([], rows)
- headerRow <- mapM parseTableCell headerRow'
- bodyRows <- mapM (mapM parseTableCell) bodyRows'
- return $ B.table mempty (zip alignments (repeat 0.0))
- headerRow bodyRows
- else fallback pos
+ guard $ all isJust as'
+ let alignments = catMaybes as'
+ let (headerRow', bodyRows') =
+ case rows of
+ (h:[x]:bs)
+ | isHrule x -> (h, bs)
+ _ -> ([], rows)
+ headerRow <- mapM parseTableCell headerRow'
+ bodyRows <- mapM (mapM parseTableCell) bodyRows'
+ return $ B.table mempty (zip alignments (repeat 0.0))
+ headerRow bodyRows) <|> fallback pos
_ -> fallback pos
where
@@ -137,7 +135,10 @@ parseTable = do
parseTableCell ts = do
st <- getState
let ts' = Foldable.toList $ unGroffTokens ts
- res <- lift $ readWithMTokens (mconcat <$> many parseBlock <* eof) st ts'
+ let tcell = do
+ skipMany memptyLine
+ plain . trimInlines <$> (parseInlines <* eof)
+ res <- lift $ readWithMTokens tcell st ts'
case res of
Left e -> throwError e
Right x -> return x
diff --git a/test/man-reader.man b/test/man-reader.man
index 7f0e7d242..6f2e763ab 100644
--- a/test/man-reader.man
+++ b/test/man-reader.man
@@ -221,3 +221,154 @@ and I.
.auth "John Jones"
.ds me The \f[B]Author\f[R]
It's \*(me.
+.SH Tables
+.TS
+tab(@);
+r l c l.
+T{
+Right
+T}@T{
+Left
+T}@T{
+Center
+T}@T{
+Default
+T}
+_
+T{
+12
+T}@T{
+12
+T}@T{
+12
+T}@T{
+12
+T}
+T{
+123
+T}@T{
+123
+T}@T{
+123
+T}@T{
+123
+T}
+T{
+1
+T}@T{
+1
+T}@T{
+1
+T}@T{
+1
+T}
+.TE
+.TS
+allbox tab(;);
+rlcl.
+T{
+Right
+T};T{
+Left
+T};T{
+Center
+T};T{
+Left
+\f[I]more\f[R]
+T}
+_
+T{
+12
+T};T{
+12
+T};T{
+12
+T};T{
+12
+T}
+T{
+123
+T};T{
+123
+T};T{
+123
+T};T{
+123
+T}
+T{
+1
+T};T{
+1
+T};T{
+1
+T};T{
+1
+T}
+.TE
+.TS
+tab(@);
+cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
+T{
+Centered Header
+T}@T{
+Left Aligned
+T}@T{
+Right Aligned
+T}@T{
+Default aligned
+T}
+_
+T{
+First
+T}@T{
+row
+T}@T{
+12.0
+T}@T{
+Example of a row that spans multiple lines.
+T}
+T{
+Second
+T}@T{
+row
+T}@T{
+5.0
+T}@T{
+Here\[cq]s another one.
+Note the blank line between rows.
+T}
+.TE
+.PP
+Table without column headers:
+.PP
+.TS
+tab(@);
+r l c r.
+T{
+12
+T}@T{
+12
+T}@T{
+12
+T}@T{
+12
+T}
+T{
+123
+T}@T{
+123
+T}@T{
+123
+T}@T{
+123
+T}
+T{
+1
+T}@T{
+1
+T}@T{
+1
+T}@T{
+1
+T}
+.TE
diff --git a/test/man-reader.native b/test/man-reader.native
index a30d1baa0..4dc1f4c77 100644
--- a/test/man-reader.native
+++ b/test/man-reader.native
@@ -103,4 +103,70 @@ Pandoc (Meta {unMeta = fromList [("date",MetaInlines [Str "Oct",Space,Str "17,",
,Para [Link ("",[],[]) [Str "some",Space,Str "randomsite"] ("http://example.com",""),Str "."]
,Para [Link ("",[],[]) [Str "my",Space,Str "email",Space,Str "address"] ("mailto:me@example.com",""),Str "."]
,Header 1 ("",[],[]) [Str "Macros"]
-,Para [Strong [Str "Me",Space,Str "Myself"],Space,Str "and",Space,Str "I.",Space,Emph [Str "The",Space,Str "author",Space,Str "is",Space,Str "John",Space,Str "Jones."],Space,Str "It's",Space,Str "The",Space,Strong [Str "Author"],Str "."]]
+,Para [Strong [Str "Me",Space,Str "Myself"],Space,Str "and",Space,Str "I.",Space,Emph [Str "The",Space,Str "author",Space,Str "is",Space,Str "John",Space,Str "Jones."],Space,Str "It's",Space,Str "The",Space,Strong [Str "Author"],Str "."]
+,Header 1 ("",[],[]) [Str "Tables"]
+,Table [] [AlignRight,AlignLeft,AlignCenter,AlignLeft] [0.0,0.0,0.0,0.0]
+ [[Plain [Str "Right"]]
+ ,[Plain [Str "Left"]]
+ ,[Plain [Str "Center"]]
+ ,[Plain [Str "Default"]]]
+ [[[Plain [Str "12"]]
+ ,[Plain [Str "12"]]
+ ,[Plain [Str "12"]]
+ ,[Plain [Str "12"]]]
+ ,[[Plain [Str "123"]]
+ ,[Plain [Str "123"]]
+ ,[Plain [Str "123"]]
+ ,[Plain [Str "123"]]]
+ ,[[Plain [Str "1"]]
+ ,[Plain [Str "1"]]
+ ,[Plain [Str "1"]]
+ ,[Plain [Str "1"]]]]
+,Table [] [AlignRight,AlignLeft,AlignCenter,AlignLeft] [0.0,0.0,0.0,0.0]
+ [[Plain [Str "Right"]]
+ ,[Plain [Str "Left"]]
+ ,[Plain [Str "Center"]]
+ ,[Plain [Str "Left",Space,Emph [Str "more"]]]]
+ [[[Plain [Str "12"]]
+ ,[Plain [Str "12"]]
+ ,[Plain [Str "12"]]
+ ,[Plain [Str "12"]]]
+ ,[[Plain [Str "123"]]
+ ,[Plain [Str "123"]]
+ ,[Plain [Str "123"]]
+ ,[Plain [Str "123"]]]
+ ,[[Plain [Str "1"]]
+ ,[Plain [Str "1"]]
+ ,[Plain [Str "1"]]
+ ,[Plain [Str "1"]]]]
+,Table [] [AlignCenter,AlignLeft,AlignRight,AlignLeft] [0.0,0.0,0.0,0.0]
+ [[Plain [Str "Centered",Space,Str "Header"]]
+ ,[Plain [Str "Left",Space,Str "Aligned"]]
+ ,[Plain [Str "Right",Space,Str "Aligned"]]
+ ,[Plain [Str "Default",Space,Str "aligned"]]]
+ [[[Plain [Str "First"]]
+ ,[Plain [Str "row"]]
+ ,[Plain [Str "12.0"]]
+ ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines."]]]
+ ,[[Plain [Str "Second"]]
+ ,[Plain [Str "row"]]
+ ,[Plain [Str "5.0"]]
+ ,[Plain [Str "Here\8217s",Space,Str "another",Space,Str "one.",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows."]]]]
+,Para [Str "Table",Space,Str "without",Space,Str "column",Space,Str "headers:"]
+,Table [] [AlignRight,AlignLeft,AlignCenter,AlignRight] [0.0,0.0,0.0,0.0]
+ [[]
+ ,[]
+ ,[]
+ ,[]]
+ [[[Plain [Str "12"]]
+ ,[Plain [Str "12"]]
+ ,[Plain [Str "12"]]
+ ,[Plain [Str "12"]]]
+ ,[[Plain [Str "123"]]
+ ,[Plain [Str "123"]]
+ ,[Plain [Str "123"]]
+ ,[Plain [Str "123"]]]
+ ,[[Plain [Str "1"]]
+ ,[Plain [Str "1"]]
+ ,[Plain [Str "1"]]
+ ,[Plain [Str "1"]]]]]