我正在尝试为Luakit编写一个模块,该模块需要一个.js
文件并将其注入到每个页面中,因此在没有任何Web扩展支持的情况下,这是一个简单的包装程序/解决方法。我目前的唯一问题是,我似乎无法从目录my中找到如何在没有require
的情况下读取文件(因为它不是.lua
文件,我只是想以字符串形式读取)。模块已插入。显然,lua不在那儿寻找它。我不想指定绝对路径,因为它实际上仅取决于模块的位置。
...
|- mymodule.lua
\- mymodule.js
module.lua:
local f = assert(io.open("mymodule.js", "r"))
local jsbase = f:read("*all")
f:close()
-- ...
但是,这会导致
E [core/common/lualib]: Lua error: mymodule.js: No such file or directory
[编辑] 我需要的基本上是一个可用作io.open(findContainingDirPathOfCurrentModuleWithoutHardCoding()..'mymodule.js')
[编辑] Luakit在Lua 5.1上运行。
答案 0 :(得分:0)
我尝试了一个简单的示例,该示例查找相对于模块的.js
文件,但是我将其保存在与模块相同的目录中。
-- Structure
- 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 = "Test String"
-- init.lua
local str = require "mod.mymodule"
print(str) -- Test String
答案 1 :(得分:0)
这适用于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()
答案 2 :(得分:0)
为解决发布的尝试,我现在找到了这个解决方案。它不是完美的,但是可以正常工作,并且如果模块名称是唯一的(特别是当.js
的目录中没有其他package.path
文件时)就应该没有问题地工作:
-- get name of this module
local modulename = (function (m)
t = {}
for e in m do
table.insert(t, e)
end
return t[#t]
end)(string.gmatch(..., "[^.]+"))
local f = nil
-- find the js file named like this module from any relevant paths
for i in string.gmatch(package.path, "[^;]+") do
-- ignore all ?/init.lua etc.
if string.find(i, "?.lua") then
f = io.open(i:gsub("?.lua$", modulename..".js"), "r")
if f ~= nil then
-- found a match!
break
end
end
end
assert(f)
local jsbase = f:read("*all")
f:close()
-- ...