|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- lualoader.lua: make LuaTeX's "require" behave more like Lua's
-- This file:
-- http://angg.twu.net/dednat6/dednat6/lualoader.lua
-- http://angg.twu.net/dednat6/dednat6/lualoader.lua.html
-- (find-angg "dednat6/dednat6/lualoader.lua")
-- By Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2022apr22
--
-- Loaded by:
-- (find-dn6 "dednat6.lua" "luatex-require")
-- (find-dn6 "dednat6.lua" "luatex-require" "lualoader")
-- Also here:
-- (find-angg "LUA/DednatRequire1.lua")
-- IMPORTANT: before april/2022 this file defined a function called
-- "dednatlualoader" and inserted it in the table package.searchers...
-- This approach was fragile, and buggy. Luatex includes this file in
-- its core:
--
-- https://github.com/latex3/lualibs/blob/main/lualibs-package.lua
--
-- and that file has this comment near its top:
--
-- "We overload the regular loader"
--
-- It turns out that that file redefines the table package.searchers
-- in a way in which the numbering of the entries is important. I was
-- doing this,
--
-- table.insert(package.searchers, 2, dednatlualoader)
--
-- which was making the entry 3 become the entry 4, the entry 4 become
-- the entry 5, and so on... my "table.insert" was causing subtle
-- bugs, and as I didn't understand the code of lualibs-package.lua
-- well I couldn't fix them.
-- «.compatibility» (to "compatibility")
-- «.DednatRequire» (to "DednatRequire")
--
-- Obsolete code:
-- «.dednatlualoader» (to "dednatlualoader")
-- «.adddednatlualoader» (to "adddednatlualoader")
-- «.temporary-fix» (to "temporary-fix")
-- «compatibility» (to ".compatibility")
-- Compatibility stuff.
-- See: http://www.lua.org/manual/5.1/manual.html#pdf-package.loaders
-- http://www.lua.org/manual/5.2/manual.html#pdf-package.searchers
-- http://www.lua.org/manual/5.1/manual.html#pdf-loadstring
-- http://www.lua.org/manual/5.2/manual.html#8.2 loadstring is deprecated
-- http://www.lua.org/manual/5.2/manual.html#8.2 .loaders -> .searchers
package.searchers = package.searchers or package.loaders
loadstring = loadstring or load
-- «DednatRequire» (to ".DednatRequire")
-- Experimental, 2022apr22.
-- Note: my "real" classes are defined like this:
--
-- ClassName = Class { ..., __index = { ... } }
--
-- This is a "fake" class, that doesn't have __index,
-- and doesn't have a metatable. See:
--
-- http://angg.twu.net/LUA/eoo.lua.html
-- http://angg.twu.net/LUA/eoo.lua
-- (find-angg "LUA/eoo.lua")
--
oldrequire = oldrequire or require
DednatRequire = {
--
-- Method 0:
alreadyloaded = function (modulename)
if package.loaded[modulename] then
return package.loaded[modulename]
end
end,
--
-- Method 1:
findandload = function (modulename)
local filename = DednatRequire.find(modulename)
if not filename then return nil end
return DednatRequire.loadfile(modulename, filename)
end,
find = function (modulename)
local modulepath = string.gsub(modulename, "%.", "/")
for path in string.gmatch(package.path, "([^;]+)") do
local filename = string.gsub(path, "%?", modulepath)
local file = io.open(filename, "rb")
if file then
file:close()
return filename
end
end
end,
loadfile = function (modulename, filename)
local runcode = assert(loadfile(filename)) -- the file must exist
local retval = runcode() -- and this must succeed
package.loaded[modulename] = retval or _G -- mark as loaded
return package.loaded[modulename]
end,
--
newrequire = function (modulename)
return DednatRequire.alreadyloaded(modulename) -- try the method 0
or DednatRequire.findandload(modulename) -- try the method 1
or oldrequire(modulename) -- try the oldrequire
end,
--
usenewrequire = function ()
require = DednatRequire.newrequire
end,
}
-- The default action of the block below is to replace the "old
-- require" by a "new require" that is a wrapper around the "old
-- require" (see above).
--
if adddednatlualoader == nil then -- The default is to
DednatRequire.usenewrequire() -- use the new require
else
adddednatlualoader() -- Alternative action
end
-- Old code, commented out:
--
-- -- «dednatlualoader» (to ".dednatlualoader")
-- -- Based on: http://lua-users.org/wiki/LuaModulesLoader
-- -- See: http://tug.org/pipermail/luatex/2015-February/005071.html (problem)
-- -- http://tug.org/pipermail/luatex/2015-February/005073.html (solution)
-- -- (find-es "luatex" "require")
-- dednatlualoader = function (modulename)
-- local errmsg = ""
-- -- Find source
-- local modulepath = string.gsub(modulename, "%.", "/")
-- for path in string.gmatch(package.path, "([^;]+)") do
-- local filename = string.gsub(path, "%?", modulepath)
-- local file = io.open(filename, "rb")
-- if file then
-- -- Compile and return the module.
-- -- Was:
-- -- return assert(loadstring(assert(file:read("*a")), filename))
-- -- but due to this issue,
-- -- http://tug.org/pipermail/luatex/2017-July/006589.html
-- -- http://tug.org/pipermail/luatex/2017-July/006590.html
-- -- I had to change it to:
-- file:close()
-- return assert(loadfile(filename))
-- end
-- errmsg = errmsg.."\n\tno file '"..filename.."' (checked with custom loader)"
-- end
-- return errmsg
-- end
--
--
--
-- -- «adddednatlualoader» (to ".adddednatlualoader")
-- -- The default action is to add dednatlualoader to package.searchers,
-- -- but the "if" below lets me hack that while I don't I find a solution
-- -- to this problem:
-- -- https://tug.org/pipermail/luatex/2020-November/007426.html
-- -- https://github.com/latex3/lualibs/issues/4
-- if adddednatlualoader then
-- adddednatlualoader()
-- else
-- table.insert(package.searchers, 2, dednatlualoader)
-- end
--
--
--
-- -- «temporary-fix» (to ".temporary-fix")
-- -- % If you are using TeXLive/MikTeX/whateverTeX 2020
-- -- % and dednat6 doesn't work there, a ___TEMPORARY SOLUTION___
-- -- % is to install a new dednat6 from
-- -- %
-- -- % http://angg.twu.net/dednat6.zip
-- -- %
-- -- % and then add this to your .tex file:
-- --
-- -- \directlua{adddednatlualoader = function ()
-- -- require = function (stem)
-- -- local fname = dednat6dir..stem..".lua"
-- -- package.loaded[stem] = package.loaded[stem] or dofile(fname) or fname
-- -- end
-- -- end}
-- --
-- -- % just before the:
-- --
-- -- \catcode`\^^J=10
-- -- \directlua{dofile "dednat6load.lua"} % (find-LATEX "dednat6load.lua")
-- Local Variables:
-- coding: utf-8-unix
-- End: