OSDN Git Service

Merge branch 'kmaeda_fontspec' into kitagawa_test
[luatex-ja/luatexja.git] / src / ltj-jfmglue.lua
index d78c971..9486c32 100644 (file)
@@ -3,12 +3,13 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.jfmglue',
-  date = '2014/1/21',
+  date = '2014/02/02',
   description = 'Insertion process of JFM glues and kanjiskip',
 })
 module('luatexja.jfmglue', package.seeall)
 local err, warn, info, log = luatexbase .errwarinf(_NAME)
 
+luatexja.load_module('base');      local ltjb = luatexja.base
 luatexja.load_module('stack');     local ltjs = luatexja.stack
 luatexja.load_module('jfont');     local ltjf = luatexja.jfont
 local pairs = pairs
@@ -31,13 +32,13 @@ local has_attr = Dnode.has_attribute
 local set_attr = Dnode.set_attribute
 local insert_before = Dnode.insert_before
 local insert_after = Dnode.insert_after
-local node_next = Dnode.getnext
+local node_next = (Dnode ~= node) and Dnode.getnext or node.next
 local round = tex.round
 local ltjf_font_metric_table = ltjf.font_metric_table
 local ltjf_find_char_class = ltjf.find_char_class
 local node_new = Dnode.new
 local node_copy = Dnode.copy
-local node_remove = Dnode.remove
+local node_remove = luatexja.Dnode_remove -- Dnode.remove
 local node_tail = Dnode.tail
 local node_free = Dnode.free
 local node_end_of_math = Dnode.end_of_math
@@ -100,11 +101,16 @@ local function fast_find_char_class(c,m)
 end
 
 -- 文字クラスの決定
-local function slow_find_char_class(c, m, oc)
-   local xc = c or oc
-   local cls = ltjf_find_char_class(oc, m)
-   if xc ~= oc and  cls==0 then cls = ltjf_find_char_class(-xc, m) end
-   return cls, xc
+local slow_find_char_class
+do
+   slow_find_char_class = function (c, m, oc)
+      local cls = ltjf_find_char_class(oc, m)
+      if not c and  cls==0 then 
+        return ltjf_find_char_class(-c, m), oc
+      else
+        return cls, oc
+      end
+   end
 end
 
 local zero_glue = node_new(id_glue)
@@ -189,7 +195,9 @@ local function check_box(box_ptr, box_end)
         pid = getid(p) -- p must be non-nil
       end
       if pid==id_kern then
-        if get_attr_icflag(p)==IC_PROCESSED then
+        local pa = get_attr_icflag(p)
+        --if pa==IC_PROCESSED or pa == PACKED then
+        if pa==IC_PROCESSED then
            -- do nothing
         elseif getsubtype(p)==2 then
            p = node_next(node_next(p)); 
@@ -216,6 +224,7 @@ local function check_box(box_ptr, box_end)
            first_char = p; find_first_char = false
         end
         last_char = p; found_visible_node = true
+        --elseif pid==id_rule and get_attr_icflag(p)==PACKED then -- do nothing
       elseif not (pid==id_ins   or pid==id_mark
                  or pid==id_adjust or pid==id_whatsit
                  or pid==id_penalty) then
@@ -268,7 +277,7 @@ local function set_attr_icflag_processed(p)
 end
 
 local function check_next_ickern(lp)
-   if getid(lp) == id_kern and ITALIC == get_attr_icflag(lp) then
+   if lp and getid(lp) == id_kern and ITALIC == get_attr_icflag(lp) then
       set_attr(lp, attr_icflag, IC_PROCESSED)
       Np.last = lp; return node_next(lp)
    else 
@@ -276,12 +285,12 @@ local function check_next_ickern(lp)
    end
 end
 
-local function calc_np_pbox(lp)
+local function calc_np_pbox(lp, last)
    Np.first = Np.first or lp; Np.id = id_pbox
    local lpa, nc = KINSOKU, nil
    set_attr(lp, attr_icflag, get_attr_icflag(lp));
-   while lp and (lpa>=PACKED) and (lpa<BOXBDD) do
-      nc, lp = lp, node_next(lp); lpa = has_attr(lp, attr_icflag) or 0
+   while lp ~=last and (lpa>=PACKED) and (lpa<BOXBDD) do
+      nc, lp = lp, node_next(lp); lpa = lp and has_attr(lp, attr_icflag) or 0
      -- get_attr_icflag() ではいけない!
    end
    Np.nuc = nc
@@ -381,7 +390,7 @@ calc_np_auxtable[id_adjust] = calc_np_auxtable.skip
 calc_np_auxtable[id_disc]   = calc_np_auxtable.discglue
 calc_np_auxtable[id_glue]   = calc_np_auxtable.discglue
 
-function calc_np(lp)
+function calc_np(lp, last)
    local k
    -- We assume lp = node_next(Np.last)
    Np, Nq, ihb_flag = Nq, Np, nil
@@ -393,14 +402,14 @@ function calc_np(lp)
    for k in pairs(Np) do Np[k] = nil end
 
    for k = 1,#Bp do Bp[k] = nil end
-   while lp  do
+   while lp ~= last  do
       local lpa = has_attr(lp, attr_icflag) or 0
        -- unbox 由来ノードの検出
       if lpa>=PACKED then
          if lpa%PROCESSED_BEGIN_FLAG == BOXBDD then
            local lq = node_next(lp) 
             head = node_remove(head, lp); node_free(lp); lp = lq
-         else return calc_np_pbox(lp)
+         else return calc_np_pbox(lp, last)
          end -- id_pbox
       else
         k, lp = calc_np_auxtable[getid(lp)](lp)
@@ -417,7 +426,8 @@ local calc_np = calc_np
 -- We think that "Np is a Japanese character" if Np.met~=nil,
 --            "Np is an alphabetic character" if Np.pre~=nil,
 --            "Np is not a character" otherwise.
-local after_hlist, after_alchar, extract_np
+after_hlist = nil -- global
+local after_alchar, extract_np
 do
   local PRE  = luatexja.stack_table_index.PRE
   local POST = luatexja.stack_table_index.POST
@@ -937,11 +947,14 @@ do
         local lp, par_indented, lpi, lps  = head, 'boxbdd', getid(head), getsubtype(head)
         while lp and ((lpi==id_whatsit and lps~=sid_user) 
                       or ((lpi==id_hlist) and (lps==3))) do
-           if (lpi==id_hlist) and (lps==3) then par_indented = 'parbdd' end
+           if (lpi==id_hlist) and (lps==3) then 
+               Np.char, par_indented = 'parbdd', 'parbdd'
+               Np.width = getfield(lp, 'width')
+            end
            lp=node_next(lp); lpi, lps = getid(lp), getsubtype(lp) end
-        return lp, par_indented
-      else 
-        return head, 'boxbdd'
+        return lp, node_tail(head), par_indented
+      else
+        return head, nil, 'boxbdd'
       end
    end
 end
@@ -971,14 +984,14 @@ end
 function main(ahead, mode)
    if not ahead then return ahead end
    head = ahead;
-   local lp, par_indented = init_var(mode); 
+   local lp, last, par_indented = init_var(mode)
    lp = calc_np(lp, last)
    if Np then 
       extract_np(); handle_list_head(par_indented)
    else
-      return cleanup(mode, last)
+      return cleanup(mode)
    end
-   lp = calc_np(lp)
+   lp = calc_np(lp, last)
    while Np do
       extract_np();
       adjust_nq(); 
@@ -993,7 +1006,7 @@ function main(ahead, mode)
          if Nq.id==id_hlist then handle_nq_ja_hlist()
          else handle_nq_jachar() end
       end
-      lp = calc_np(lp)
+      lp = calc_np(lp, last)
    end
    handle_list_tail(mode)
    return cleanup(mode)
@@ -1003,7 +1016,7 @@ end
 do
    local IHB  = luatexja.userid_table.IHB
    local BPAR = luatexja.userid_table.BPAR
-   local node_prev = Dnode.getprev
+   local node_prev = (Dnode ~= node) and Dnode.getprev or node.prev
    local node_write = Dnode.write
 
    -- \inhibitglue