OSDN Git Service

Fix ticket #29140/
[luatex-ja/luatexja.git] / src / ltj-jfmglue.lua
index 4d9c59a..0659fd0 100644 (file)
@@ -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