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

sty*_*fle 3 markdown docx pandoc

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

我正在使用的标志如下:

pandoc --wrap none --to markdown_github --output fms.md "FMS.docx"
Run Code Online (Sandbox Code Playgroud)

当我查看输出 markdown 文件时,它用换行符分隔每个列表项。该文档将其定义为一个松散列表,如下所示。

- one

- two

- three
Run Code Online (Sandbox Code Playgroud)

我想使用一个紧凑的列表来输出,如下所示。

- one
- two
- three
Run Code Online (Sandbox Code Playgroud)

是否有一个标志可以使 pandoc 输出一个紧凑列表?

如果没有,我该如何使用过滤器来实现所需的输出?

tar*_*leb 6

没有标志可以实现此目的,但有一个使用 pandoc过滤功能的简单解决方案。在内部,列表项表示为块列表;如果所有块项仅由块组成,则列表是紧凑的Plain。如果所有项目仅包含一个段落,则将项目块的类型从Para(for paragraph ) 更改为就足够了Plain

下面的 Lua 程序就是这样做的。保存它并将其用作Lua 过滤器:(pandoc -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
}}
Run Code Online (Sandbox Code Playgroud)

如果人们更喜欢 Haskell 而不是 Lua,也可以使用下面的过滤器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
Run Code Online (Sandbox Code Playgroud)

如果 Lua 和 Haskell 都不可用,使用 Python 过滤器也可以实现同样的效果。有关详细信息,请参阅 pandoc 的过滤器页面。