在 Lua 过滤器中使用空格匹配模式

我找到了一个 pandoc 中的 Lua 过滤器,可以将 [[Link]] 这样的模式转换为 file:///Link。但它现在无法匹配 [[Link more words]] 这样的模式。

  1. 我想要匹配 [[Link more words]] 这样的模式,并且
  2. 将空格转换为 %20

这样的结果将会是 file:///Link%20more%20words

local List = require 'pandoc.List'

return {
  {
    Str = function (elem)
      local tgt

      -- 我们必须返回一个 Inline 对象的列表
      local rlst = {}

      -- 匹配 [[...]] 字符串元素
      tgt = elem.text:match("%[%[(.+)%]%]")
      if tgt == null then
        return null  -- 没有匹配,null 表示保持元素不变
      else
        -- 匹配成功,构造一个 Link 元素以返回 AST
        
        -- 我想我们应该将本地文件 URL 作为目标
        local urlText = "file:///" .. tgt .. ""
        -- 链接文本应该如在 Obsidian 中一样
        local linkText = "[[" .. tgt .. "]]"

        -- 单元素返回列表
        rlst[1] = pandoc.Link( List:new( {pandoc.Str(linkText)} ), urlText )
        return rlst
      end
    end,
  }
}

(在 Obsidian Discord 中,该过滤器的来源是 spacejunky)

点赞
用户2858170
用户2858170
使用[string.gsub](https://www.lua.org/manual/5.4/manual.html#pdf-string.gsub)将空格替换为"%20"

local txt = "Hello world!"

txt = txt:gsub("%s+", "%%20")

print(txt)


> Hello%20world!
2021-03-16 11:26:50