X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-jfmglue.lua;h=0659fd01dd26868f9ecc4eb236e545306da81705;hb=2e9566b50d653da63edab02f263bcbf96df78d0e;hp=4d9c59acb780349d375c152d5a421de0e9ca516b;hpb=52e2a269e2d63cb0905877c63cb4d6ace6629c9c;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-jfmglue.lua b/src/ltj-jfmglue.lua index 4d9c59a..0659fd0 100644 --- a/src/ltj-jfmglue.lua +++ b/src/ltj-jfmglue.lua @@ -52,6 +52,11 @@ local id_pbox = node.id('hlist') + 512 -- already processed nodes (by \un 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 @@ -178,12 +183,8 @@ local function check_box(box_ptr, box_end) end while p and p~=box_end do local pid = p.id - if pid==id_kern then - if p.subtype==2 then - p = node_next(node_next(node_next(p))); pid = p.id - elseif has_attr(p, attr_icflag)==IC_PROCESSED then - p = node_next(p); pid = p.id - end + if pid==id_kern and p.subtype==2 then + p = node_next(node_next(node_next(p))); pid = p.id -- p must be glyph_node end if pid==id_glyph then repeat @@ -193,9 +194,11 @@ local function check_box(box_ptr, box_end) last_char = p; found_visible_node = true; p=node_next(p) if (not p) or p==box_end then return found_visible_node end until p.id~=id_glyph - pid = p.id + pid = p.id -- p must be non-nil end - if pid==id_hlist then + if pid==id_kern and has_attr(p, attr_icflag)==IC_PROCESSED then + p = node_next(p); + elseif pid==id_hlist then if has_attr(p, attr_icflag)==PACKED then for q in node.traverse_id(id_glyph, p.head) do if find_first_char then @@ -273,7 +276,7 @@ end 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 @@ -285,17 +288,17 @@ end 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 @@ -305,12 +308,12 @@ local calc_np_auxtable = { 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, @@ -327,7 +330,8 @@ local calc_np_auxtable = { 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() @@ -345,12 +349,18 @@ local calc_np_auxtable = { 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) @@ -360,11 +370,11 @@ local calc_np_auxtable = { 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) @@ -387,7 +397,7 @@ local calc_np_auxtable = { 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, @@ -988,8 +998,8 @@ function create_beginpar_node() 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