--
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
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
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)
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));
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
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
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
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
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)
-- 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
do
local KANJI_SKIP = luatexja.icflag_table.KANJI_SKIP
local XKANJI_SKIP = luatexja.icflag_table.XKANJI_SKIP
+ local KSK = luatexja.stack_table_index.KSK
+ local XSK = luatexja.stack_table_index.XSK
init_var = function (mode)
-- 1073741823: max_dimen
Bp, widow_Bp, widow_Np = {}, {}, {first = nil}
table_current_stack = ltjs.table_current_stack
kanji_skip = node_new(id_glue)
- setfield(kanji_skip, 'spec', skip_table_to_spec('kanjiskip'))
+ setfield(kanji_skip, 'spec', skip_table_to_spec(KSK))
set_attr(kanji_skip, attr_icflag, KANJI_SKIP)
get_kanjiskip = (getfield(getfield(kanji_skip, 'spec'), 'width') == 1073741823)
and get_kanjiskip_jfm or get_kanjiskip_normal
xkanji_skip = node_new(id_glue)
- setfield(xkanji_skip, 'spec', skip_table_to_spec('xkanjiskip'))
+ setfield(xkanji_skip, 'spec', skip_table_to_spec(XSK))
set_attr(xkanji_skip, attr_icflag, XKANJI_SKIP)
get_xkanjiskip = (getfield(getfield(xkanji_skip, 'spec'), 'width') == 1073741823)
and get_xkanjiskip_jfm or get_xkanjiskip_normal
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
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();
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)
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