--
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)
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
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)
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
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)
-------------------- 隣接した「塊」間の処理
+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(
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
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
-- 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)
end
handle_list_tail(mode, last)
end
+ --luatexja.ext_show_node_list(to_node(ahead ), '>A ', print)
+ --print()
return cleanup(mode, TEMP)
end
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
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
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)