OSDN Git Service

fig a bug in lltjext + array
[luatex-ja/luatexja.git] / src / ltj-jfmglue.lua
index 174e0aa..a51dacb 100644 (file)
@@ -3,7 +3,7 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.jfmglue',
-  date = '2016/04/03',
+  date = '2017/05/05',
   description = 'Insertion process of JFM glues and kanjiskip',
 })
 module('luatexja.jfmglue', package.seeall)
@@ -207,6 +207,7 @@ local function check_box(box_ptr, box_end)
            if getfield(p, 'shift')==0 then
               last_char = nil
               if check_box(getlist(p), nil) then found_visible_node = true end
+              find_first_char = false
            else
               find_first_char = false; last_char = nil
            end
@@ -832,7 +833,9 @@ do
    end
    
    get_kanjiskip = function()
-      if Np.auto_kspc or Nq.auto_kspc then
+      if Np.auto_kspc==0 or Nq.auto_kspc==0 then
+        return nil 
+      elseif Np.auto_kspc or Nq.auto_kspc then
         local pm, qm = Np.met, Nq.met
         if (pm.char_type==qm.char_type) and (qm.var==pm.var) then
             return get_kanjiskip_low(true, qm, 1, 1, 1)
@@ -841,7 +844,7 @@ do
            local ga = get_kanjiskip_low(true, pm, 1, 1, 1)
            return calc_ja_ja_aux(gb, ga, 0, 1)
         end
-      else
+      else   
         local g = node_new(id_glue)
         set_attr(g, attr_icflag, kanjiskip_jfm_flag and KANJI_SKIP_JFM or KANJI_SKIP)
         return g
@@ -912,7 +915,9 @@ do
    end
    
    get_xkanjiskip = function(Nn)
-      if (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
+      if Np.auto_xspc==0 or Nq.auto_xspc==0 then
+        return nil 
+      elseif (Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc) then
         return get_xkanjiskip_low(true, Nn.met, 1, 1, 1)
       else
         local g = node_new(id_glue)
@@ -924,6 +929,10 @@ end
 
 -------------------- 隣接した「塊」間の処理
 
+local function combine_spc(name)
+   return (Np[name] or Nq[name]) and ((Np[name]~=0) and (Nq[name]~=0))
+end
+
 local function get_OA_skip(is_kanji)
    local pm = Np.met
    local g, _, kn, kp, kh = new_jfm_glue(
@@ -932,9 +941,9 @@ local function get_OA_skip(is_kanji)
       Np.class)
    local k
    if is_kanji==0 then
-      k = (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(false, pm, kn, kp, kh)
+      k = combine_spc('auto_kspc') and get_kanjiskip_low(false, pm, kn, kp, kh)
    elseif is_kanji==1 then
-      k = ((Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc))
+      k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
         and get_xkanjiskip_low(false, pm, kn, kp, kh)
    end
    return g, k
@@ -946,9 +955,9 @@ local function get_OB_skip(is_kanji)
       fast_find_char_class((Np.id == id_math and -1 or'jcharbdd'), qm))
    local k
    if is_kanji==0 then
-      k = (Np.auto_kspc or Nq.auto_kspc) and get_kanjiskip_low(false, qm, kn, kp, kh)
+      k = combine_spc('auto_kspc') and get_kanjiskip_low(false, qm, kn, kp, kh)
    elseif is_kanji==1 then
-      k = ((Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc))
+      k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
         and get_xkanjiskip_low(false, qm, kn, kp, kh)
    end
    return g, k
@@ -1180,6 +1189,8 @@ end
 -- main interface
 function main(ahead, mode, dir)
    if not ahead then return ahead end
+   --luatexja.ext_show_node_list(to_node(ahead ), '>B ', print)
+   --print()
    head = ahead;
    local lp, last, par_indented, TEMP = init_var(mode,dir)
    lp = calc_np(last, lp)
@@ -1203,6 +1214,8 @@ function main(ahead, mode, dir)
       end
       handle_list_tail(mode, last)
    end
+   --luatexja.ext_show_node_list(to_node(ahead ), '>A ', print)
+   --print()
    return cleanup(mode, TEMP)
 end
 end
@@ -1210,6 +1223,7 @@ end
 do
    local IHB  = luatexja.userid_table.IHB
    local BPAR = luatexja.userid_table.BPAR
+   local BOXB = luatexja.userid_table.BOXB
    local node_prev = node.direct.getprev
    local node_write = node.direct.write
 
@@ -1232,11 +1246,32 @@ do
       node_write(tn)
    end
 
+   -- Node for indicating a head/end of a box
+   function create_boxbdd_node()
+      local tn = node_new(id_whatsit, sid_user)
+      setfield(tn, 'user_id', BOXB)
+      setfield(tn, 'type', 100)
+      setfield(tn, 'value', 1)
+      node_write(tn)
+   end
+
    local function whatsit_callback(Np, lp, Nq)
       if Np and Np.nuc then return Np
       elseif Np and getfield(lp, 'user_id') == BPAR then
          Np.first = lp; Np.nuc = lp; Np.last = lp
          return Np
+      elseif Np and getfield(lp, 'user_id') == BOXB then
+        Np.first = lp; Np.nuc = lp; Np.last = lp
+        if Nq then
+           if Nq.met then
+              Np.class = fast_find_char_class('boxbdd', Nq.met)
+            end
+            Np.met = Nq.met; Np.pre = 0; Np.post = 0; Np.xspc = 0
+            Np.auto_xspc, Np.auto_kspc = 0, 0
+         end    
+         return Np
+      else
+        return Np
       end
    end
 
@@ -1249,7 +1284,19 @@ do
                Nq.class = fast_find_char_class('parbdd', Np.met)
             end
             Nq.met = Np.met; Nq.pre = 0; Nq.post = 0; Nq.xspc = 0
-            Nq.auto_xspc = false
+            Nq.auto_xspc, Nq.auto_kspc = 0, 0
+         end
+         head = node_remove(head, y)
+         node_free(y)
+       elseif not s and getfield(Nq.nuc, 'user_id') == BOXB then
+         local x, y = node_prev(Nq.nuc), Nq.nuc
+         Nq.first, Nq.nuc, Nq.last = x, x, x
+         if Np then
+            if Np.met then
+               Nq.class = fast_find_char_class('boxbdd', Np.met)
+            end
+            Nq.met = Np.met; Nq.pre = 0; Nq.post = 0; Nq.xspc = 0
+            Nq.auto_xspc, Nq.auto_kspc = 0, 0
          end
          head = node_remove(head, y)
         node_free(y)