luametalatex/luametalatex-whatsits.lua
Marcel Fabian Krüger 94ba4a2557 Better errors and new whatsit handling
The whatsit handling is actually much more similar to the old whatsit
handling then the previous new one, so that part could be seen as a
partial revert of the new whatsit handling... Anyway, whatsits work
different than in the previous commit now.
2020-07-01 19:47:25 +02:00

97 lines
2.4 KiB
Lua

local whatsit_id = node.id'whatsit'
local whatsits = {
[0] = "open",
"write",
"close",
"special",
nil,
nil,
"save_pos",
"late_lua",
"user_defined",
nil,
nil,
nil,
nil,
nil,
nil,
nil,
"pdf_literal",
"pdf_refobj",
"pdf_annot",
"pdf_start_link",
"pdf_end_link",
"pdf_dest",
"pdf_action",
"pdf_thread",
"pdf_start_thread",
"pdf_end_thread",
"pdf_thread_data",
"pdf_link_data",
"pdf_colorstack",
"pdf_setmatrix",
"pdf_save",
"pdf_restore",
}
local whatsithandler = {}
-- for i = 0,#whatsits do -- #whatsits isn't guaranteed to work because of the nil entries
for i = 0,31 do
local v = whatsits[i]
if v then
whatsits[v] = i
end
end
function node.whatsits() return whatsits end
function node.subtype(s) return type(s) == "string" and whatsits[s] or nil end
local direct = node.direct
local getsubtype = direct.getsubtype
local properties = direct.get_properties_table()
local tonode, todirect = direct.tonode, direct.todirect
local function get_handler(n, subtype)
local props = properties[n]
return props and props.handle or whatsithandler[subtype or getsubtype(n)], props
end
local function new(name, handler)
assert(type(name) == 'string')
local subtype = whatsits[name]
if subtype then
if whatsithandler[subtype] then
texio.write_nl'WARNING: Overwriting default whatsit handler'
end
else
subtype = #whatsits + 1
whatsits[subtype] = name
whatsits[name] = subtype
end
whatsithandler[subtype] = handler
return subtype
end
-- TODO: Some fields might expect different values
local function setwhatsitfield(n, name, value)
local props = properties[n]
if not props then
props = {}
properties[n] = props
end
props[name] = value
end
direct.setwhatsitfield = setwhatsitfield
local function getwhatsitfield(n, name)
local props = properties[n]
return props and props[name]
end
direct.getwhatsitfield = getwhatsitfield
-- TODO: Some fields might be nodes and therefore have to be converted
function node.setwhatsitfield(n, ...) return setwhatsitfield(todirect(n), ...) end
function node.getwhatsitfield(n, ...) return getwhatsitfield(todirect(n), ...) end
return {
handler = get_handler,
new = new,
}