在Pandoc lua过滤器中连接字符串片段

我正在尝试创建一个可以帮助我汇总数据的Pandoc过滤器。我已经看到了一些可以创建目录的过滤器,但我想根据标题中的内容组织索引。

例如,在下面的示例中,我想根据标题中标记的日期提供内容摘要(某些标题不包含日期...)

[nwatkins@sapporo foo]$ cat test.md
# 1 May 2018
some info

# not a date
some data

# 2 May 2018
some more info

我首先尝试查看标题内容。打算只对不同日期/时间模式应用简单的正则表达式。

[nwatkins@sapporo foo]$ cat test.lua
function Header(el)
  return pandoc.walk_block(el, {
    Str = function(el)
      print(el.text)
    end })
end

不幸的是,这似乎是针对每个以空格分隔的字符串应用打印状态,而不是允许我分析整个标题内容的串联:

[nwatkins@sapporo foo]$ pandoc --lua-filter test.lua test.md
1
May
2018
not
...

在过滤器中有没有标准的方法可以做到这一点?我还没有在Lua过滤器文档中看到任何帮助函数。

点赞
用户2425163
用户2425163

更新: 开发版本现在提供了新功能 pandoc.utils.stringifypandoc.utils.normalize_date。它们将成为下一个 pandoc 版本 (可能是 2.0.6) 的一部分。使用这些,您可以通过以下代码测试标题是否包含日期:

function Header (el)
  content_str = pandoc.utils.stringify(el.content)
  if pandoc.utils.normalize_date(content_str) ~= nil then
    print 'header contains a date'
  else
    print 'not a date'
  end
end

目前还没有辅助函数,但我们计划在不久的将来提供 pandoc.utils.tostring 函数。

在此期间,以下代码段 (取自此讨论) 可以帮助您获得所需的内容:

--- 将一系列内联元素转换为字符串。
function inlines_tostring (inlines)
  local strs = {}
  for i = 1, #inlines do
    strs[i] = tostring(inlines[i])
  end
  return table.concat(strs)
end

-- 向所有内联元素添加一个 `__tostring` 方法。将换行符转换为空格。
for k, v in pairs(pandoc.Inline.constructor) do
  v.__tostring = function (inln)
    return ((inln.content and inlines_tostring(inln.content))
        or (inln.caption and inlines_tostring(inln.caption))
        or (inln.text and inln.text)
        or " ")
  end
end

function Header (el)
  header_text = inlines_tostring(el.content)
end
2017-12-21 08:17:25