OSDN Git Service

Dnode -> node.direct (WIP)
[luatex-ja/luatexja.git] / src / ltj-direction.lua
index c05d0ed..42f1cb0 100644 (file)
@@ -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<dir_node_manual then
               set_attr(s, attr_dir, b_dir%dir_node_auto + dir_node_manual)
            end
@@ -860,7 +864,7 @@ do
 end
 
 do
-   local getbox, setbox, copy_list = tex.getbox, tex.setbox, Dnode.copy_list
+   local getbox, setbox, copy_list = tex.getbox, tex.setbox, node.direct.copy_list
    -- raise, lower
    function luatexja.direction.raise_box()
       start_time_measure('box_primitive_hook')
@@ -907,7 +911,7 @@ do
               'luatexja',
               'Direction Incompatible',
               "\\vadjust's argument and outer vlist must have same direction.")
-           Dnode.last_node()
+           node.direct.last_node()
         end
       end
       stop_time_measure('box_primitive_hook')
@@ -981,7 +985,7 @@ do
       stop_time_measure('direction_vpack')
       return to_node(hd)
    end
-   luatexbase.add_to_callback('vpack_filter',
+   ltjb.add_to_callback('vpack_filter',
                              dir_adjust_vpack,
                              'ltj.direction', 10000)
 end
@@ -991,7 +995,7 @@ do
    local function dir_adjust_pre_output(h, gc)
       return to_node(create_dir_whatsit_vbox(to_direct(h), gc))
    end
-   luatexbase.add_to_callback('pre_output_filter',
+   ltjb.add_to_callback('pre_output_filter',
                              dir_adjust_pre_output,
                              'ltj.direction', 10000)
 
@@ -1020,7 +1024,7 @@ do
         end
       end
    end
-   luatexbase.add_to_callback('buildpage_filter',
+   ltjb.add_to_callback('buildpage_filter',
                              dir_adjust_buildpage,
                              'ltj.direction', 10000)
 end
@@ -1082,7 +1086,7 @@ do
       end
    end
    local getbox = tex.getbox
-   local setbox, copy = Dnode.setbox, Dnode.copy
+   local setbox, copy = node.direct.setbox, node.direct.copy
    local lua_mem_kb = 0
    function luatexja.direction.finalize()
       local a = to_direct(tex.getbox("AtBeginShipoutBox"))