Lua:相对于模块读取文件

我正在尝试为Luakit编写一个模块,该模块接受一个.js文件并将其注入每个页面,因此在没有任何Web扩展支持的情况下进行简单的包装/解决方案。 我目前唯一的问题是我似乎找不到如何读取文件(因为它不是.lua文件,我只想将其作为字符串读取)从我的模块所在的目录中。 显然,Lua不会在那里查找它。 我不想指定绝对路径,因为它实际上完全取决于我的模块的位置。

...
 |- mymodule.lua
 \- mymodule.js

module.lua:

local f = assertio.open(“mymodule.js”,“r”))
local jsbase = f:read(“*所有”)
f:close()

-- ...

但是,这导致

E [core/common/lualib]:Lua错误:mymodule.js:没有这样的文件或目录

**_\ [编辑] _**我需要的基本上是一个函数,用作io.open(findContainingDirPathOfCurrentModuleWithoutHardCoding()..'mymodule.js')

_\ [编辑] _ Luakit在Lua 5.1上运行。

点赞
用户5525442
用户5525442

我尝试了一个简单的例子,找到相对于模块的.js文件,但是我将其保留在与模块相同的目录中。

-- 结构
- init.lua
- mod
 |- mymodule.lua
 |- mymodule.js

 -- mymodule.lua
 local f = assert(io.open("mod/mymodule.js", "r"))
 local jsbase = f:read("*all")
 f:close()
 return jsbase

 -- mymodule.js
 str = "测试字符串"

 -- init.lua
 local str = require "mod.mymodule"
 print(str) -- 测试字符串
2018-10-25 10:32:20
用户6834680
用户6834680

这在 Lua 5.2 / 5.3 / 5.4 中都可以运行

mymodule.lua :

local f = assert(io.open(({...})[2]:gsub("%.lua$", ".js"), "r"))
local jsbase = f:read("*all")
f:close()
2018-10-25 11:00:50
用户4067384
用户4067384

通过调整已发布的尝试,我现在得到了这个解决方案。它不是完美的,但还不错,并且应该可以在模块名称唯一的情况下正常工作(特别是当package.path中没有其他.js文件时):

-- 获取这个模块的名称
local modulename = (function (m)
  t = {}
  for e in m do
    table.insert(t, e)
  end
  return t[#t]
end)(string.gmatch(..., "[^.]+"))

local f = nil

-- 从任何相关路径中查找与此模块同名的js文件
for i in string.gmatch(package.path, "[^;]+") do
  -- 忽略所有的?/init.lua等等
  if string.find(i, "?.lua") then
    f = io.open(i:gsub("?.lua$", modulename..".js"), "r")
    if f ~= nil then
      --找到匹配!
      break
    end
  end
end

assert(f)

local jsbase = f:read("*all")
f:close()

-- ...
2018-10-25 21:31:41