local id_pbox_w = node.id('hlist') + 513 -- cluster which consists of a whatsit
local sid_user = node.subtype('user_defined')
+local sid_start_link = node.subtype('pdf_start_link')
+local sid_start_thread = node.subtype('pdf_start_thread')
+local sid_end_link = node.subtype('pdf_end_link')
+local sid_end_thread = node.subtype('pdf_end_thread')
+
local ITALIC = 1
local PACKED = 2
local KINSOKU = 3
local function calc_np_pbox()
local uid = has_attr(lp, attr_uniqid)
- Np.first = lp; Np.id = id_pbox
+ Np.first = Np.first or lp; Np.id = id_pbox
lpa = KINSOKU -- dummy=
while lp~=last and lpa>=PACKED and lpa~=BOXBDD
and has_attr(lp, attr_uniqid) == uid do
local calc_np_auxtable = {
[id_glyph] = function()
- Np.first = lp
+ Np.first = Np.first or lp
if lp.font == has_attr(lp, attr_curjfnt) then
Np.id = id_jglyph
else
Np.id = id_glyph
end
- Np.first = lp; Np.nuc = lp; set_attr_icflag_processed(lp)
+ Np.nuc = lp; set_attr_icflag_processed(lp)
lp = node_next(lp); check_next_ickern(); return true
end,
[id_hlist] = function()
- Np.first = lp; Np.last = lp; Np.nuc = lp;
+ Np.first = Np.first or lp; Np.last = lp; Np.nuc = lp;
set_attr_icflag_processed(lp)
if lp.shift~=0 then
Np.id = id_box_like
lp = node_next(lp); return true
end,
[id_vlist] = function()
- Np.first = lp; Np.nuc = lp; Np.last = lp;
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
Np.id = id_box_like; set_attr_icflag_processed(lp);
lp = node_next(lp); return true
end,
[id_rule] = function()
- Np.first = lp; Np.nuc = lp; Np.last = lp;
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
Np.id = id_box_like; set_attr_icflag_processed(lp);
lp = node_next(lp); return true
end,
return false
end,
[id_disc] = function()
- Np.first = lp; Np.nuc = lp; set_attr_icflag_processed(lp);
+ Np.first = Np.first or lp;
+ Np.nuc = lp; set_attr_icflag_processed(lp);
Np.last = lp; Np.id = id_disc; lp = node_next(lp); return true
end,
[id_whatsit] = function()
end
end
else
+ -- we do special treatment for these whatsit nodes.
+ if lp.subtype == sid_start_link or lp.subtype == sid_start_thread then
+ Np.first = lp
+ elseif lp.subtype == sid_end_link or lp.subtype == sid_end_thread then
+ Nq.last = lp; Np.first = nil
+ end
set_attr_icflag_processed(lp); lp = node_next(lp)
end
return false
end,
[id_math] = function()
- Np.first = lp; Np.nuc = lp;
+ Np.first = Np.first or lp; Np.nuc = lp;
set_attr_icflag_processed(lp); lp = node_next(lp)
while lp.id~=id_math do
set_attr_icflag_processed(lp); lp = node_next(lp)
return true
end,
[id_glue] = function()
- Np.first = lp; Np.nuc = lp; set_attr_icflag_processed(lp);
+ Np.first = Np.first or lp; Np.nuc = lp; set_attr_icflag_processed(lp);
Np.last = lp; Np.id = id_glue; lp = node_next(lp); return true
end,
[id_kern] = function()
- Np.first = lp
+ Np.first = Np.first or lp
if lp.subtype==2 then
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); lp = node_next(lp)
lp = node_next(lp); return false
end,
[13] = function()
- Np.first = lp; Np.nuc = lp; Np.last = lp;
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
Np.id = id_box_like; set_attr_icflag_processed(lp);
lp = node_next(lp); return true
end,
end
local function whatsit_callback(Np, lp, Nq, bsl)
- if Np.nuc then return Np
- elseif lp.user_id == 30114 then
+ if Np and Np.nuc then return Np
+ elseif Np and lp.user_id == 30114 then
Np.first = lp; Np.nuc = lp; Np.last = lp
Np.char = 'parbdd'
Np.met = nil