从 docx 转换为 markdown 时使用紧凑列表

Use compact lists when converting from docx to markdown

我在 Windows 上使用 pandoc 将 .docx 文件转换为 .md 文件。

我使用的标志如下:

pandoc --wrap none --to markdown_github --output fms.md "FMS.docx"

当我查看输出降价文件时,它用换行符分隔每个列表项。文档将其定义为 loose list,如下所示。

- one

- two

- three

我想使用 紧凑列表 作为输出,如下所示。

- one
- two
- three

是否有使 pandoc 输出紧凑列表的标志?

如果没有,我如何使用过滤器来获得所需的输出?

没有实现这一点的标志,但是有一个使用 pandoc 的 filter 功能的简单解决方案。在内部,列表项表示为块列表;如果所有块项目仅包含 Plain 个块,则列表是紧凑的。如果所有项目仅包含一个段落,则将项目块的类型从 Para(对于 paragraph)更改为 Plain 就足够了。 =19=]

下面的 Lua 程序就是这样做的。将其保存并用作 Lua filterpandoc -t markdown --lua-filter the-filter.lua your-document.docx(需要 pandoc 2.1 或更高版本):

local List = require 'pandoc.List'

function compactifyItem (blocks)
  return (#blocks == 1 and blocks[1].t == 'Para')
    and {pandoc.Plain(blocks[1].content)}
    or blocks
end

function compactifyList (l)
  l.content = List.map(l.content, compactifyItem)
  return l
end

return {{
    BulletList = compactifyList,
    OrderedList = compactifyList
}}

如果比 Lua 更喜欢 Haskell,也可以将下面的过滤器与 pandoc -t markdown --filter the-filter.hs your-document.docx 一起使用:

import Text.Pandoc.JSON

main = toJSONFilter compactifyList

compactifyList :: Block -> Block
compactifyList blk = case blk of
  (BulletList items)         -> BulletList $ map compactifyItem items
  (OrderedList attrbs items) -> OrderedList attrbs $ map compactifyItem items
  _                          -> blk

compactifyItem :: [Block] -> [Block]
compactifyItem [Para bs] = [Plain bs]
compactifyItem item      = item

如果 Lua 和 Haskell 都不是一个选项,那么使用 Python 过滤器也是可能的。有关详细信息,请参阅 pandoc 的 filters 页面。