如何使用lua过滤器将表格转换为json或本机文本?

我想要用原始块替换Markdown文档中的表格块,最终将包含LaTeX。

我可以使用以下代码在文档中查找表格块:

function Table(table)

但是我需要将每个表格块转换为JSON或本机文本,以便将其提供给以下函数:

local function table2latex(t)
    local latex = pandoc.pipe('pandoc',{'-f','native','-t','latex'},t)
    ...

我无法找到任何执行此类转换的示例,即使仔细查看了pandoc文档以及其他网站(如github和stackoverflow)。

是否可能还是我需要编写特定的嵌入式writer?

编辑

接下来。下面的答案引导我编写了以下脚本:

-- file: boxtables.lua
--
-- 这个过滤器提取了表格并将其转换为LaTeX。
-- 然后使用sed脚本更改LaTeX,使用“|”和“\hline”作为列和行分隔符进行“框”处理。
-- 包含表格的原始文档必须有包含'header-includes'的
-- '\usepackage{longtable,booktabs)}'
-- 用户应该安装`jq`和'sed'实用程序和
-- shell脚本'table2latex.sh'可执行于当前工作目录中
--
-- #!/bin/sh
-- latex="$(pandoc -f json -t latex)"
-- tmpl='{blocks:[{t:"RawBlock",c:["latex",$tab]}],"pandoc-api-version":[1,17,3],meta:{}}'
-- jq -n --arg tab "$latex" $tmpl
--
-- 可以调用lua过滤器:
--    pandoc --lua-filter boxtables.lua -o documentContainingTable.pdf documentContainingTable.md
--
-- 'header-includes'和其他详细信息可以设置在命令行或YAML头中,例如
--
-- ---
-- geometry: landscape, scale=0.9, centering
-- header-includes:
--   - \usepackage{longtable,booktabs}
-- ---
--
function table (tab)
  -- 创建一个只包含表格的新pandoc文档
  local dummy_doc = pandoc.Pandoc(tab)
  -- 使用table2latex.sh将文档转换为LaTeX
  local tex_doc = pandoc.utils.run_json_filter(dummy_doc, 'table2latex.sh')
  -- 仅返回包含表格的单个块
  return tex_doc.blocks
end

function rawblock (rb)
  local oldlatex = rb.text
  local sed = [[/^\\begin{longtable}/{s/@{}/&\n/;:a;ta;/\n@{}/!s/\n\(.\)/|\1\n/;ta;s/\n/|/};s/toprule/hline/;/mid\|bottom/d;/tabularnewline/a\\\hline]]
  local newlatex = pandoc.pipe('sed',{sed},oldlatex)
  return pandoc.RawBlock('latex', newlatex)
end

return {{Table = table},{RawBlock = rawblock}}
点赞
用户2425163
用户2425163

没有内建的、因此也没有完全可移植的方法来完成这项任务。我能想到的最好方法是使用作为 JSON 过滤器调用的 shell 脚本将表格转换为 LaTeX。以下是在 pandoc 2.1.1 可用的 pandoc.utils.run_json_filter 上构建的。

-- 文件:table2latex.lua
local utils = require 'pandoc.utils'

function Table (tab)
  -- 创建只包含表格的新 pandoc 文档
  local dummy_doc = pandoc.Pandoc(tab)
  -- 使用 table2latex.sh 将文档转换为 LaTeX
  local tex_doc = utils.run_json_filter(dummy_doc, 'table2latex.sh')
  -- 仅返回包含表格的单个块
  return tex_doc.blocks
end

table2latex.sh 帮助过滤器使用 jq 生成 JSON。

#!/bin/sh
latex="$(pandoc -f json -t latex)"
tmpl='{blocks:[{t:"RawBlock",c:["latex",$tab]}],"pandoc-api-version":[1,17,3],meta:{}}'
jq -n --arg tab "$latex" $tmpl
2018-04-08 12:17:53