@@ -305,22 +305,24 @@ escapeString opts (c:cs) =
305305 _ -> c : escapeString opts cs
306306
307307-- | Construct table of contents from list of header blocks.
308−tableOfContents :: PandocMonad m => WriterOptions -> [Block] -> m Doc
309−tableOfContents opts headers =
310− let contents = BulletList $ map (elementToListItem opts) $ hierarchicalize headers
311− in evalMD (blockToMarkdown opts contents) def def
308+tableOfContents :: PandocMonad m => WriterOptions -> [Block] -> MD m Doc
309+tableOfContents opts headers = do
310+ contents <- BulletList <$> mapM (elementToListItem opts) (hierarchicalize headers)
311+ blockToMarkdown opts contents
312312
313313-- | Converts an Element to a list item for a table of contents,
314−elementToListItem :: WriterOptions -> Element -> [Block]
314+elementToListItem :: PandocMonad m => WriterOptions -> Element -> MD m [Block]
315315elementToListItem opts (Sec lev _nums (ident,_,_) headerText subsecs)
316− = Plain headerLink :
317− [ BulletList (map (elementToListItem opts) subsecs) |
318− not (null subsecs) && lev < writerTOCDepth opts ]
319− where headerLink = if null ident
316+ = do isPlain <- asks envPlain
317+ let headerLink = if null ident || isPlain
320318 then walk deNote headerText
321319 else [Link nullAttr (walk deNote headerText)
322320 ('#':ident, "")]
323−elementToListItem _ (Blk _) = []
321+ listContents <- if null subsecs || lev >= writerTOCDepth opts
322+ then return []
323+ else mapM (elementToListItem opts) subsecs
324+ return [Plain headerLink, BulletList listContents]
325+elementToListItem _ (Blk _) = return []
324326
325327attrsToMarkdown :: Attr -> Doc
326328attrsToMarkdown attribs = braces $ hsep [attribId, attribClasses, attribKeys]