@@ -163,6 +163,32 @@ flatBlockListToMuse bs@(DefinitionList _ : DefinitionList _ : _) = catWithBlankL
163163flatBlockListToMuse bs@(_ : _) = catWithBlankLines bs 0
164164flatBlockListToMuse [] = return mempty
165165
166+simpleTable :: PandocMonad m
167+ => [Inline]
168+ -> [TableCell]
169+ -> [[TableCell]]
170+ -> Muse m Doc
171+simpleTable caption headers rows = do
172+ caption' <- inlineListToMuse caption
173+ headers' <- mapM blockListToMuse headers
174+ rows' <- mapM (mapM blockListToMuse) rows
175+ let noHeaders = all null headers
176+ let numChars = maximum . map offset
177+ let widthsInChars =
178+ map numChars $ transpose (headers' : rows')
179+ let hpipeBlocks sep blocks = hcat $ intersperse sep' blocks
180+ where h = maximum (1 : map height blocks)
181+ sep' = lblock (length sep) $ vcat (replicate h (text sep))
182+ let makeRow sep = (" " <>) . hpipeBlocks sep . zipWith lblock widthsInChars
183+ let head' = makeRow " || " headers'
184+ let rowSeparator = if noHeaders then " | " else " | "
185+ rows'' <- mapM (\row -> makeRow rowSeparator <$> mapM blockListToMuse row) rows
186+ let body = vcat rows''
187+ return $ (if noHeaders then empty else head')
188+ $$ body
189+ $$ (if null caption then empty else " |+ " <> caption' <> " +|")
190+ $$ blankline
191+
166192-- | Convert list of Pandoc block elements to Muse.
167193blockListToMuse :: PandocMonad m
168194 => [Block] -- ^ List of block elements
@@ -252,29 +278,15 @@ blockToMuse (Header level (ident,_,_) inlines) = do
252278 return $ blankline <> attr' $$ nowrap (header' <> contents) <> blankline
253279-- https://www.gnu.org/software/emacs-muse/manual/muse.html#Horizontal-Rules-and-Anchors
254280blockToMuse HorizontalRule = return $ blankline $$ "----" $$ blankline
255−blockToMuse (Table caption _ _ headers rows) = do
256− caption' <- inlineListToMuse caption
257− headers' <- mapM blockListToMuse headers
258− rows' <- mapM (mapM blockListToMuse) rows
259− let noHeaders = all null headers
260−
261− let numChars = maximum . map offset
262− -- FIXME: width is not being used.
263− let widthsInChars =
264− map numChars $ transpose (headers' : rows')
265− -- FIXME: Muse doesn't allow blocks with height more than 1.
266− let hpipeBlocks sep blocks = hcat $ intersperse sep' blocks
267− where h = maximum (1 : map height blocks)
268− sep' = lblock (length sep) $ vcat (replicate h (text sep))
269− let makeRow sep = (" " <>) . hpipeBlocks sep . zipWith lblock widthsInChars
270− let head' = makeRow " || " headers'
271− let rowSeparator = if noHeaders then " | " else " | "
272− rows'' <- mapM (\row -> makeRow rowSeparator <$> mapM blockListToMuse row) rows
273− let body = vcat rows''
274− return $ (if noHeaders then empty else head')
275− $$ body
276− $$ (if null caption then empty else " |+ " <> caption' <> " +|")
277− $$ blankline
281+blockToMuse (Table caption aligns widths headers rows) =
282+ if all (== 0.0) widths
283+ then simpleTable caption headers rows
284+ else do
285+ opts <- asks envOptions
286+ gridTable opts blocksToDoc True (map (const AlignDefault) aligns) widths headers rows
287+ where
288+ blocksToDoc opts blocks =
289+ local (\env -> env { envOptions = opts }) $ blockListToMuse blocks
278290blockToMuse (Div _ bs) = flatBlockListToMuse bs
279291blockToMuse Null = return empty
280292