从 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 filter: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
}}
如果比 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 页面。
我在 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 filter: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
}}
如果比 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 页面。