Marcel Fabian Krüger
94ba4a2557
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.
97 lines
2.4 KiB
Lua
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,
|
|
}
|