git.iko.soy/typeable/pandoc
on master help sign in
Man reader: support tables.

Closes #4982.

commit5945c3b01197d17e48d06bef3dd76fa2547b245f authorJohn MacFarlane <jgm@berkeley.edu> dateThu 25 Oct 2018, 22:13 (8 years ago) parent096cbe6
3 files changed+234−16
src/Text/Pandoc/Readers/Man.hs+16−15 test/man-reader.man+151 test/man-reader.native+67−1
src/Text/Pandoc/Readers/Man.hs+16−15
@@ -115,21 +115,19 @@ parseTable = do
115115 isMTable _ = False
116116 MTable _opts aligns rows pos <- msatisfy isMTable
117117 case aligns of
118− [as] -> do
118+ [as] -> try (do
119119 let as' = map (columnTypeToAlignment . columnType) as
120− if all isJust as'
121− then do
122− let alignments = catMaybes as'
123− let (headerRow', bodyRows') =
124− case rows of
125− (h:[x]:bs)
126− | isHrule x -> (h, bs)
127− _ -> ([], rows)
128− headerRow <- mapM parseTableCell headerRow'
129− bodyRows <- mapM (mapM parseTableCell) bodyRows'
130− return $ B.table mempty (zip alignments (repeat 0.0))
131− headerRow bodyRows
132− else fallback pos
120+ guard $ all isJust as'
121+ let alignments = catMaybes as'
122+ let (headerRow', bodyRows') =
123+ case rows of
124+ (h:[x]:bs)
125+ | isHrule x -> (h, bs)
126+ _ -> ([], rows)
127+ headerRow <- mapM parseTableCell headerRow'
128+ bodyRows <- mapM (mapM parseTableCell) bodyRows'
129+ return $ B.table mempty (zip alignments (repeat 0.0))
130+ headerRow bodyRows) <|> fallback pos
133131 _ -> fallback pos
134132
135133 where
@@ -137,7 +135,10 @@ parseTable = do
137135 parseTableCell ts = do
138136 st <- getState
139137 let ts' = Foldable.toList $ unGroffTokens ts
140− res <- lift $ readWithMTokens (mconcat <$> many parseBlock <* eof) st ts'
138+ let tcell = do
139+ skipMany memptyLine
140+ plain . trimInlines <$> (parseInlines <* eof)
141+ res <- lift $ readWithMTokens tcell st ts'
141142 case res of
142143 Left e -> throwError e
143144 Right x -> return x
test/man-reader.man+151
@@ -221,3 +221,154 @@ and I.
221221.auth "John Jones"
222222.ds me The \f[B]Author\f[R]
223223It's \*(me.
224+.SH Tables
225+.TS
226+tab(@);
227+r l c l.
228+T{
229+Right
230+T}@T{
231+Left
232+T}@T{
233+Center
234+T}@T{
235+Default
236+T}
237+_
238+T{
239+12
240+T}@T{
241+12
242+T}@T{
243+12
244+T}@T{
245+12
246+T}
247+T{
248+123
249+T}@T{
250+123
251+T}@T{
252+123
253+T}@T{
254+123
255+T}
256+T{
257+1
258+T}@T{
259+1
260+T}@T{
261+1
262+T}@T{
263+1
264+T}
265+.TE
266+.TS
267+allbox tab(;);
268+rlcl.
269+T{
270+Right
271+T};T{
272+Left
273+T};T{
274+Center
275+T};T{
276+Left
277+\f[I]more\f[R]
278+T}
279+_
280+T{
281+12
282+T};T{
283+12
284+T};T{
285+12
286+T};T{
287+12
288+T}
289+T{
290+123
291+T};T{
292+123
293+T};T{
294+123
295+T};T{
296+123
297+T}
298+T{
299+1
300+T};T{
301+1
302+T};T{
303+1
304+T};T{
305+1
306+T}
307+.TE
308+.TS
309+tab(@);
310+cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
311+T{
312+Centered Header
313+T}@T{
314+Left Aligned
315+T}@T{
316+Right Aligned
317+T}@T{
318+Default aligned
319+T}
320+_
321+T{
322+First
323+T}@T{
324+row
325+T}@T{
326+12.0
327+T}@T{
328+Example of a row that spans multiple lines.
329+T}
330+T{
331+Second
332+T}@T{
333+row
334+T}@T{
335+5.0
336+T}@T{
337+Here\[cq]s another one.
338+Note the blank line between rows.
339+T}
340+.TE
341+.PP
342+Table without column headers:
343+.PP
344+.TS
345+tab(@);
346+r l c r.
347+T{
348+12
349+T}@T{
350+12
351+T}@T{
352+12
353+T}@T{
354+12
355+T}
356+T{
357+123
358+T}@T{
359+123
360+T}@T{
361+123
362+T}@T{
363+123
364+T}
365+T{
366+1
367+T}@T{
368+1
369+T}@T{
370+1
371+T}@T{
372+1
373+T}
374+.TE
test/man-reader.native+67−1
@@ -103,4 +103,70 @@ Pandoc (Meta {unMeta = fromList [("date",MetaInlines [Str "Oct",Space,Str "17,",
103103,Para [Link ("",[],[]) [Str "some",Space,Str "randomsite"] ("http://example.com",""),Str "."]
104104,Para [Link ("",[],[]) [Str "my",Space,Str "email",Space,Str "address"] ("mailto:me@example.com",""),Str "."]
105105,Header 1 ("",[],[]) [Str "Macros"]
106−,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 "."]]
106+,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 "."]
107+,Header 1 ("",[],[]) [Str "Tables"]
108+,Table [] [AlignRight,AlignLeft,AlignCenter,AlignLeft] [0.0,0.0,0.0,0.0]
109+ [[Plain [Str "Right"]]
110+ ,[Plain [Str "Left"]]
111+ ,[Plain [Str "Center"]]
112+ ,[Plain [Str "Default"]]]
113+ [[[Plain [Str "12"]]
114+ ,[Plain [Str "12"]]
115+ ,[Plain [Str "12"]]
116+ ,[Plain [Str "12"]]]
117+ ,[[Plain [Str "123"]]
118+ ,[Plain [Str "123"]]
119+ ,[Plain [Str "123"]]
120+ ,[Plain [Str "123"]]]
121+ ,[[Plain [Str "1"]]
122+ ,[Plain [Str "1"]]
123+ ,[Plain [Str "1"]]
124+ ,[Plain [Str "1"]]]]
125+,Table [] [AlignRight,AlignLeft,AlignCenter,AlignLeft] [0.0,0.0,0.0,0.0]
126+ [[Plain [Str "Right"]]
127+ ,[Plain [Str "Left"]]
128+ ,[Plain [Str "Center"]]
129+ ,[Plain [Str "Left",Space,Emph [Str "more"]]]]
130+ [[[Plain [Str "12"]]
131+ ,[Plain [Str "12"]]
132+ ,[Plain [Str "12"]]
133+ ,[Plain [Str "12"]]]
134+ ,[[Plain [Str "123"]]
135+ ,[Plain [Str "123"]]
136+ ,[Plain [Str "123"]]
137+ ,[Plain [Str "123"]]]
138+ ,[[Plain [Str "1"]]
139+ ,[Plain [Str "1"]]
140+ ,[Plain [Str "1"]]
141+ ,[Plain [Str "1"]]]]
142+,Table [] [AlignCenter,AlignLeft,AlignRight,AlignLeft] [0.0,0.0,0.0,0.0]
143+ [[Plain [Str "Centered",Space,Str "Header"]]
144+ ,[Plain [Str "Left",Space,Str "Aligned"]]
145+ ,[Plain [Str "Right",Space,Str "Aligned"]]
146+ ,[Plain [Str "Default",Space,Str "aligned"]]]
147+ [[[Plain [Str "First"]]
148+ ,[Plain [Str "row"]]
149+ ,[Plain [Str "12.0"]]
150+ ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines."]]]
151+ ,[[Plain [Str "Second"]]
152+ ,[Plain [Str "row"]]
153+ ,[Plain [Str "5.0"]]
154+ ,[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."]]]]
155+,Para [Str "Table",Space,Str "without",Space,Str "column",Space,Str "headers:"]
156+,Table [] [AlignRight,AlignLeft,AlignCenter,AlignRight] [0.0,0.0,0.0,0.0]
157+ [[]
158+ ,[]
159+ ,[]
160+ ,[]]
161+ [[[Plain [Str "12"]]
162+ ,[Plain [Str "12"]]
163+ ,[Plain [Str "12"]]
164+ ,[Plain [Str "12"]]]
165+ ,[[Plain [Str "123"]]
166+ ,[Plain [Str "123"]]
167+ ,[Plain [Str "123"]]
168+ ,[Plain [Str "123"]]]
169+ ,[[Plain [Str "1"]]
170+ ,[Plain [Str "1"]]
171+ ,[Plain [Str "1"]]
172+ ,[Plain [Str "1"]]]]]