Lua: чтение файла относительно модуля - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь написать модуль для Luakit, который берет файл .js и внедряет его в каждую страницу, поэтому простой обертка / обходной путь при отсутствии какой-либо поддержки веб-расширения.В настоящее время моя единственная проблема в том, что я не могу понять, как читать файл без require (потому что это не .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.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Это работает в 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()
0 голосов
/ 26 октября 2018

Возиться с опубликованными попытками, теперь я пришел к этому решению.Он не идеален, но работает нормально и должен работать без проблем, если имя модуля уникально (особенно, если в каталогах из package.path нет других файлов .js):

-- 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()

-- ...
0 голосов
/ 25 октября 2018

Я попробовал простой пример, который находит файлы .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...