diff options
Diffstat (limited to 'luaotfload.lua')
-rw-r--r-- | luaotfload.lua | 71 |
1 files changed, 19 insertions, 52 deletions
diff --git a/luaotfload.lua b/luaotfload.lua index bdbae0e..70d89a2 100644 --- a/luaotfload.lua +++ b/luaotfload.lua @@ -218,67 +218,34 @@ Now that things are sorted out we can finally load the fontloader. loadmodule"fonts.lua" --[[doc-- -By default, the fontloader requires a number of \emph{private +By default, the fontloader requires a number of \emphasis{private attributes} for internal use. These must be kept consistent with the attribute handling methods as provided by \identifier{luatexbase}. -Previously, when \identifier{luaotfload} imported individual files from -\CONTEXT, the strategy was to override the function that allocates new -attributes at the appropriate time during initialization, making it a -wrapper around \luafunction{luatexbase.new_attribute}. - -\begin{verbatim} -attributes.private = function (name) - local attr = "otfl@" .. name - local number = luatexbase.attributes[attr] - if not number then - number = luatexbase.new_attribute(attr) - end - return number -end -\end{verbatim} - -Now that the fontloader comes as a package, this hack is no longer -applicable. -The attribute handler installed by \identifier{luatex-fonts} (see the -file \fileent{otfl-basics-nod.lua}) cannot be intercepted before the -first call to it takes place. -While it is not feasible to prevent insertion of attributes at the -wrong places, we can still retrieve them from the closure surrounding -the allocation function \luafunction{attributes.private} -using \LUA’s introspection features. - -The recovered attribute identifiers are prefixed “\fileent{otfl@}” to +Our strategy is to override the function that allocates new attributes +before we initialize the font loader, making it a wrapper around +\luafunction{luatexbase.new_attribute}.\footnote{% + Many thanks, again, to Hans Hagen for making this part + configurable! +} +The attribute identifiers are prefixed “\fileent{otfl@}” to avoid name clashes. --doc]]-- do - local debug_getupvalue = debug.getupvalue - - local nups = debug.getinfo(attributes.private, "u").nups - local nup, numbers = 0 - while nup <= nups do - nup = nup + 1 - local upname, upvalue = debug_getupvalue(attributes.private, nup) - if upname == "numbers" then - numbers = upvalue - break - end - end - if numbers then - local luatexbase_attributes = luatexbase.attributes - local prefix = "otfl@" - --- re-register attributes from “numbers” - --- ... pull request for luatexbase pending - for name, num in next, numbers do - name = prefix .. name - luatexbase_attributes[name] = num + local new_attribute = luatexbase.new_attribute + local the_attributes = luatexbase.attributes + + _G.attributes = _G.attributes or { } + + _G.attributes.private = function (name) + local attr = "otfl@" .. name + local number = the_attributes[attr] + if not number then + number = new_attribute(attr) end + return number end - --- The definitions used by the fontloader are never - --- called again so it is safe to nil them, I suppose. - debug.setupvalue(attributes.private, nup, { }) - _G.attributes = nil --- needed for initialization only end --[[doc-- |