|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/DednatRequire1.lua.html
-- http://anggtwu.net/LUA/DednatRequire1.lua
-- (find-angg "LUA/DednatRequire1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- This is a commented version of:
-- (find-angg "LUA/lua50init.lua" "DednatRequire")
--
-- This file makes the "require" in lualatex behave in a way that is
-- more compatible with the "require"s of plain Luas.
--
-- Initially I tried to fix the "broken" require of lualatex by using
-- a table.insert to insert a new function in the middle of this
-- table:
--
-- (find-lua51manual "#pdf-package.loaders")
-- (find-lua52manual "#pdf-package.searchers")
-- (find-lua52manual "#8.2" "package.loaders was renamed package.searchers")
--
-- Here are some e-mails about my first attempts to fix it:
--
-- https://tug.org/pipermail/luatex/2015-February/005071.html My problem with require
-- https://tug.org/pipermail/luatex/2015-February/005073.html My (obsolete) solution
-- https://tug.org/pipermail/luatex/2017-July/006589.html My problem with the .fls
-- https://tug.org/pipermail/luatex/2017-July/006590.html A solution: use loadfile
-- https://tug.org/pipermail/luatex/2020-November/007426.html My original question
-- https://tug.org/pipermail/luatex/2020-November/007427.html Luigi's answer 1
-- https://tug.org/pipermail/luatex/2020-November/007428.html My answer 1
-- https://tug.org/pipermail/luatex/2020-November/007429.html Luigi's answer 2
-- https://tug.org/pipermail/luatex/2020-November/007430.html Ulrike's answer
--
-- Then, at some point in texlive2020, my fix stopped working, and it
-- broke require in horrible ways... the new lualibs-package.lua was
-- redefining the entries in package.searchers and then referring to
-- the new seacher functions by their numeric indices, and my
-- table.insert was moving package.searchers[3] to
-- package.searchers[4] - and BOOM. See here:
--
-- https://github.com/latex3/lualibs/issues/4
--
-- This file has a fix for "require" that works (AFAIK) in all
-- versions of lualuatex. It saves a copy of "require" in
-- "oldrequire", defines "dednatrequire" as a wrapper around
-- "oldrequire", and then sets "require" to "dednatrequire". After
-- that we can switch between the two behaviors with:
--
-- require = oldrequire
-- require = dednatrequire
--
-- Also here:
-- (find-angg "LUA/lua50init.lua" "DednatRequire")
-- (find-angg "LUA/lua50init.lua" "loaddednatrequire")
-- Used by:
-- (find-angg "LUA/Show2.lua" "defs_repl")
-- Based on:
-- (find-dn6 "lualoader.lua")
-- (find-dn6 "lualoader.lua" "dednatlualoader")
-- (find-es "luatex" "package.searchers-2020")
--
-- (defun e () (interactive) (find-angg "LUA/DednatRequire1.lua"))
-- «.compatibility» (to "compatibility")
-- «.DednatRequire» (to "DednatRequire")
-- ____ _ _ _ _ _ _ _
-- / ___|___ _ __ ___ _ __ __ _| |_(_) |__ (_) (_) |_ _ _
-- | | / _ \| '_ ` _ \| '_ \ / _` | __| | '_ \| | | | __| | | |
-- | |__| (_) | | | | | | |_) | (_| | |_| | |_) | | | | |_| |_| |
-- \____\___/|_| |_| |_| .__/ \__,_|\__|_|_.__/|_|_|_|\__|\__, |
-- |_| |___/
--
-- «compatibility» (to ".compatibility")
-- (find-lua51manual "#pdf-package.loaders")
-- (find-lua52manual "#pdf-package.searchers")
-- (find-lua52manual "#8.2" "package.loaders was renamed package.searchers")
package.searchers = package.searchers or package.loaders
-- ____ _ _ ____ _
-- | _ \ ___ __| |_ __ __ _| |_| _ \ ___ __ _ _ _(_)_ __ ___
-- | | | |/ _ \/ _` | '_ \ / _` | __| |_) / _ \/ _` | | | | | '__/ _ \
-- | |_| | __/ (_| | | | | (_| | |_| _ < __/ (_| | |_| | | | | __/
-- |____/ \___|\__,_|_| |_|\__,_|\__|_| \_\___|\__, |\__,_|_|_| \___|
-- |_|
--
-- «DednatRequire» (to ".DednatRequire")
-- Note that this is "fake" class, that doesn't
-- have __index, and doesn't have a metatable.
-- See: (find-lua51manual "#pdf-package.loaders" "first searcher")
-- (find-lua51manual "#pdf-package.loaders" "second searcher")
-- (find-angg "LUA/lua50init.lua" "DednatRequire")
--
DednatRequire = {
alreadyloaded = function (modulename)
if package.loaded[modulename] then
return package.loaded[modulename]
end
end,
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 DednatRequire_oldrequire(modulename) -- try the oldrequire
end,
}
DednatRequire_oldrequire = DednatRequire_oldrequire or require -- backup
require = DednatRequire.newrequire
-- oldrequire = oldrequire or require
-- dednatrequire = DednatRequire.newrequire
-- require = dednatrequire
-- Local Variables:
-- coding: utf-8-unix
-- End: