--
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
+
+-- NA, NB: alchar or math
+local function get_NA_skip()
+ local pm = Np.met
+ local g, _, kn, kp, kh = new_jfm_glue(
+ pm.char_type,
+ fast_find_char_class(
+ (Nq.id == id_math and -1 or (Nq.xspc>=2 and 'alchar' or 'nox_alchar')), pm),
+ Np.class)
+ local k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
+ and get_xkanjiskip_low(false, pm, kn, kp, kh)
+ return g, k
+end
+local function get_NB_skip()
+ local qm = Nq.met
+ local g, _, kn, kp, kh = new_jfm_glue(
+ qm.char_type, Nq.class,
+ fast_find_char_class(
+ (Np.id == id_math and -1 or (Np.xspc%2==1 and 'alchar' or 'nox_alchar')), qm)
+ )
+ local k = ((Nq.xspc>=2) and (Np.xspc%2==1) and combine_spc('auto_xspc'))
+ and get_xkanjiskip_low(false, qm, kn, kp, kh)
+ return g, k
+end
+
local function get_OA_skip(is_kanji)
local pm = Np.met
local g, _, kn, kp, kh = new_jfm_glue(
pm.char_type,
- fast_find_char_class((Nq.id == id_math and -1 or 'jcharbdd'), pm),
+ fast_find_char_class(
+ (((Nq.id==id_glue)or(Nq.id==id_kern)) and 'glue' or 'jcharbdd'), pm),
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)
- elseif is_kanji==1 then
- k = ((Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc))
- and get_xkanjiskip_low(false, pm, kn, kp, kh)
+ k = combine_spc('auto_kspc') and get_kanjiskip_low(false, pm, kn, kp, kh)
end
return g, k
end
local qm = Nq.met
local g, _, kn, kp, kh = new_jfm_glue(
qm.char_type, Nq.class,
- fast_find_char_class((Np.id == id_math and -1 or'jcharbdd'), qm))
+ fast_find_char_class(
+ (((Np.id==id_glue)or(Np.id==id_kern)) and 'glue' 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)
- elseif is_kanji==1 then
- k = ((Nq.xspc>=2) and (Np.xspc%2==1) and (Nq.auto_xspc or Np.auto_xspc))
- and get_xkanjiskip_low(false, qm, kn, kp, kh)
+ k = combine_spc('auto_kspc') and get_kanjiskip_low(false, qm, kn, kp, kh)
end
return g, k
end
handle_penalty_normal(0, Np.pre, g); real_insert(g); real_insert(k)
elseif Nq.pre then
local g, k
- if non_ihb_flag then g, k = get_OA_skip(1) end -- O_A->X
+ if non_ihb_flag then g, k = get_NA_skip() end -- N_A->X
if not g then g = get_xkanjiskip(Np) end
handle_penalty_normal((qid==id_hlist and 0 or Nq.post), Np.pre, g);
real_insert(g); real_insert(k)
-- jachar .. (anything)
local function handle_nq_jachar()
if Np.pre then
- local g = non_ihb_flag and get_OB_skip(1) or get_xkanjiskip(Nq) -- O_B->X
+ local g = non_ihb_flag and get_NB_skip() or get_xkanjiskip(Nq) -- N_B->X
handle_penalty_normal(Nq.post, (Np.id==id_hlist and 0 or Np.pre), g); real_insert(g)
else
local g =non_ihb_flag and (get_OB_skip()) -- O_B
-- (anything) .. (和文文字で始まる hlist)
local function handle_np_ja_hlist()
local qid = Nq.id
- if qid==id_jglyph or ((qid==id_pbox or Nq.id == id_pbox_w) and Nq.met) then
+ if qid==id_jglyph or ((qid==id_pbox or qid == id_pbox_w) and Nq.met) then
local g = non_ihb_flag and get_OB_skip(0) or get_kanjiskip() -- O_B->K
handle_penalty_normal(Nq.post, 0, g); real_insert(g)
elseif Nq.met then -- Nq.id==id_hlist
-- 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)