X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fltj-direction.lua;h=42f1cb095f0677b8866a93f076fd0b7bcae24976;hb=ab23049deb6fb90ca689fdf4924b3783f08f8f2e;hp=c05d0ed6c35550f64022505ac5e97242fdc7c5a3;hpb=b5ae2980b79b069dd439c80b784c10e1b4f86d2f;p=luatex-ja%2Fluatexja.git diff --git a/src/ltj-direction.lua b/src/ltj-direction.lua index c05d0ed..42f1cb0 100644 --- a/src/ltj-direction.lua +++ b/src/ltj-direction.lua @@ -10,26 +10,24 @@ local attr_dir = luatexbase.attributes['ltj@dir'] local attr_icflag = luatexbase.attributes['ltj@icflag'] local cat_lp = luatexbase.catcodetables['latex-package'] -local Dnode = node.direct or node -local nullfunc = function (n) return n end -local to_node = (Dnode ~= node) and Dnode.tonode or nullfunc -local to_direct = (Dnode ~= node) and Dnode.todirect or nullfunc -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 getid = (Dnode ~= node) and Dnode.getid or function(n) return n.id end -local getsubtype = (Dnode ~= node) and Dnode.getsubtype or function(n) return n.subtype end -local getlist = (Dnode ~= node) and Dnode.getlist or function(n) return n.head end -local setfield = (Dnode ~= node) and Dnode.setfield or function(n, i, c) n[i] = c end -local getfield = (Dnode ~= node) and Dnode.getfield or function(n, i) return n[i] end -local node_new = Dnode.new -local node_tail = Dnode.tail -local node_free = Dnode.free -local node_remove = Dnode.remove -local node_next = (Dnode ~= node) and Dnode.getnext or node.next -local traverse = Dnode.traverse -local traverse_id = Dnode.traverse_id +local to_node = node.direct.tonode +local to_direct = node.direct.todirect +local has_attr = node.direct.has_attribute +local set_attr = node.direct.set_attribute +local insert_before = node.direct.insert_before +local insert_after = node.direct.insert_after +local getid = node.direct.getid +local getsubtype = node.direct.getsubtype +local getlist = node.direct.getlist +local setfield = node.direct.setfield +local getfield = node.direct.getfield +local node_new = node.direct.new +local node_tail = node.direct.tail +local node_free = node.direct.free +local node_remove = node.direct.remove +local node_next = node.direct.getnext +local traverse = node.direct.traverse +local traverse_id = node.direct.traverse_id local start_time_measure, stop_time_measure = ltjb.start_time_measure, ltjb.stop_time_measure local abs = math.abs @@ -65,7 +63,7 @@ local page_direction -- local dir_pool do - local node_copy = Dnode.copy + local node_copy = node.direct.copy dir_pool = {} for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do local w = node_new(id_whatsit, sid_user) @@ -140,6 +138,8 @@ do local node_traverse = node.traverse local STCK = luatexja.userid_table.STCK local IHB = luatexja.userid_table.IHB + local sid_local = node.subtype('local_par') + local id_local = node.id('local_par') local function test_list(h, lv) if not h then @@ -149,17 +149,18 @@ do local w for p in node_traverse(h) do if p.id==id_whatsit then - if p.subtype==sid_user then + local ps = p.subtype + if ps==sid_user then local uid= p.user_id if uid==DIR then flag = 1; w = w or p -- found elseif not(uid==IHB or uid==STCK) then flag = 0; break -- error end - else + elseif ps~=sid_local then flag = 0; break end - else + elseif p.id~=id_local then flag = 0; break end end @@ -272,7 +273,7 @@ do end end - luatexbase.add_to_callback('hpack_filter', + ltjb.add_to_callback('hpack_filter', create_dir_whatsit_hpack, 'ltj.create_dir_whatsit', 10000) end @@ -287,7 +288,7 @@ do ensure_tex_attr(attr_dir, 0) return h end - luatexbase.add_to_callback('post_linebreak_filter', + ltjb.add_to_callback('post_linebreak_filter', create_dir_whatsit_parbox, 'ltj.create_dir_whatsit', 10000) end @@ -487,10 +488,12 @@ local function get_box_dir(b, default) local bh = getfield(b,'head') -- b は insert node となりうるので getlist() は使えない local c - for bh in traverse_id(id_whatsit, bh) do - if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then - c = bh - dir = (dir==0) and has_attr(bh, attr_dir) or dir + if bh~=0 then -- bh != nil + for bh in traverse_id(id_whatsit, bh) do + if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then + c = bh + dir = (dir==0) and has_attr(bh, attr_dir) or dir + end end end -- for i=1,2 do @@ -576,7 +579,7 @@ local function unwrap_dir_node(b, head, box_dir) end local shift_old, b_dir, wh = nil, get_box_dir(bh, 0) if wh then - Dnode.flush_list(getfield(wh, 'value')) + node.direct.flush_list(getfield(wh, 'value')) setfield(wh, 'value', nil) end return nh, nb, bh, b_dir @@ -621,7 +624,7 @@ do -- dir_node としてカプセル化されている local _, dnc = get_box_dir(b, 0) if dnc then -- free all other dir_node - Dnode.flush_list(getfield(dnc, 'value')) + node.direct.flush_list(getfield(dnc, 'value')) setfield(dnc, 'value', nil) end set_attr(b, attr_dir, box_dir%dir_math_mod + dir_node_auto) @@ -651,7 +654,7 @@ do db=x; break end end - Dnode.flush_list(getfield(dn, 'value')) + node.direct.flush_list(getfield(dn, 'value')) setfield(dn, 'value', nil) db = db or create_dir_node(b, box_dir, new_dir, false) local w = getfield(b, 'width') @@ -682,7 +685,7 @@ do end -- lastbox - local node_prev = (Dnode~=node) and Dnode.getprev or node.prev + local node_prev = (node.direct~=node) and node.direct.getprev or node.prev local function lastbox_hook() start_time_measure('box_primitive_hook') local bn = tex_nest[tex_nest.ptr].tail @@ -700,7 +703,7 @@ do end local _, wh = get_box_dir(b, 0) -- clean dir_node attached to the box if wh then - Dnode.flush_list(getfield('value', wh)) + node.direct.flush_list(getfield('value', wh)) setfield(wh, 'value', nil) end end @@ -761,6 +764,8 @@ do luatexja.direction.get_box_dim = get_box_dim -- return value: (changed dimen of box itself?) + local scan_dimen, scan_int = luatexja.token.scan_dimen, luatexja.token.scan_int + local scan_keyword = luatexja.token.scan_keyword local function set_box_dim_common(key, s, l_dir) local s_dir, wh = get_box_dir(s, dir_yoko) s_dir = s_dir%dir_math_mod @@ -781,10 +786,10 @@ do setfield(db, 'next', dnh) setfield(wh, 'value',to_node(db)) end - setfield(db, key, tex.getdimen('ltj@tempdima')) + setfield(db, key, scan_dimen()) return false else - setfield(s, key, tex.getdimen('ltj@tempdima')) + setfield(s, key, scan_dimen()) if wh then -- change dimension of dir_nodes which are created "automatically" local bw, bh, bd @@ -803,8 +808,7 @@ do end end local function set_box_dim(key) - local n = tex_getcount('ltj@tempcnta') - local s = getbox(n) + local s = getbox(scan_int()); scan_keyword('=') if s then local l_dir = (get_dir_count())%dir_math_mod s = to_direct(s) @@ -813,7 +817,7 @@ do set_box_dim_common(key, s, l_dir) elseif b_dir%dir_math_mod == l_dir then -- s is dir_node - setfield(s, key, tex.getdimen('ltj@tempdima')) + setfield(s, key, scan_dimen()) if b_dir