OSDN Git Service

get rid of attr_orig_char
[luatex-ja/luatexja.git] / src / ltj-direction.lua
index a9bdfbd..e29503b 100644 (file)
@@ -483,14 +483,20 @@ local function get_box_dir(b, default)
    local bh = getfield(b,'head')
    -- b は insert node となりうるので getlist() は使えない
    local c
-   for i=1,2 do
-      if bh and getid(bh)==id_whatsit
-      and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then
+   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
+        dir = (dir==0) and has_attr(bh, attr_dir) or dir
       end
-      bh = node_next(bh)
    end
+   -- for i=1,2 do
+   --    if bh and getid(bh)==id_whatsit
+   --    and 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
+   --    bh = node_next(bh)
+   -- end
    stop_time_measure('get_box_dir')
    return (dir==0 and default or dir), c
 end
@@ -876,29 +882,64 @@ do
    local function glyph_from_packed(h)
       local b = getlist(h)
       return (getid(b)==id_kern or (getid(b)==id_whatsit and getsubtype(b)==sid_save) )
-        and node_next(node_next(node_next(node_next(b)))) or b
+        and node_next(node_next(node_next(b))) or b
    end
    luatexja.direction.glyph_from_packed = glyph_from_packed
 end
 
--- adjust and insertion
-local id_adjust = node.id('adjust')
-function luatexja.direction.check_adjust_direction()
-   start_time_measure('box_primitive_hook')
-   local list_dir = get_adjust_dir_count()
-   local a = tex_nest[tex_nest.ptr].tail
-   local ad = to_direct(a)
-   if a and getid(ad)==id_adjust then
-      local adj_dir = get_box_dir(ad)
-      if list_dir~=adj_dir then
-         ltjb.package_error(
-                 'luatexja',
-                 'Direction Incompatible',
-                 "\\vadjust's argument and outer vlist must have same direction.")
-         Dnode.last_node()
+-- adjust
+do
+   local id_adjust = node.id('adjust')
+   function luatexja.direction.check_adjust_direction()
+      start_time_measure('box_primitive_hook')
+      local list_dir = get_adjust_dir_count()
+      local a = tex_nest[tex_nest.ptr].tail
+      local ad = to_direct(a)
+      if a and getid(ad)==id_adjust then
+        local adj_dir = get_box_dir(ad)
+        if list_dir~=adj_dir then
+           ltjb.package_error(
+              'luatexja',
+              'Direction Incompatible',
+              "\\vadjust's argument and outer vlist must have same direction.")
+           Dnode.last_node()
+        end
+      end
+      stop_time_measure('box_primitive_hook')
+   end
+end
+
+-- insert
+do
+   local id_ins = node.id('ins')
+   local id_rule = node.id('rule')
+   function luatexja.direction.populate_insertion_dir_whatsit()
+      start_time_measure('box_primitive_hook')
+      local list_dir = get_dir_count()
+      local a = tex_nest[tex_nest.ptr].tail
+      local ad = to_direct(a)
+      if a and getid(ad)==id_ins then
+        local h = getfield(ad, 'head')
+        if getid(h)==id_whatsit and
+           getsubtype(h)==sid_user and getfield(h, 'user_id')==DIR then
+              local n = h; h = node_remove(h,h)
+              node_free(n)
+        end
+        for box_rule in traverse(h) do
+           if getid(box_rule)<id_rule then
+              local w = node_new(id_whatsit, sid_user)
+              setfield(w, 'next', nil)
+              setfield(w, 'user_id', DIR)
+              setfield(w, 'type', 110)
+              set_attr(w, attr_dir, list_dir)
+              h = insert_before(h, box_rule, w)
+           end
+        end
+        tex_set_attr('global', attr_dir, 0)
+        setfield(ad, 'head', h)
       end
+      stop_time_measure('box_primitive_hook')
    end
-   stop_time_measure('box_primitive_hook')
 end
 
 -- vsplit
@@ -912,14 +953,19 @@ do
         hd = create_dir_whatsit_vbox(hd, gc)
         split_dir_whatsit = hd
       elseif gc=='split_off'  then
-        local bh=hd
-        for i=1,2 do
-           if bh and getid(bh)==id_whatsit
-           and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then
+        for  bh in traverse_id(id_whatsit, hd) do
+           if getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then
               ltjs.list_dir  = has_attr(bh, attr_dir); break
            end
-           bh = node_next(bh)
         end
+        -- local bh=hd
+        -- for i=1,2 do
+        --    if bh and getid(bh)==id_whatsit
+        --    and getsubtype(bh)==sid_user and getfield(bh, 'user_id')==DIR then
+        --       ltjs.list_dir  = has_attr(bh, attr_dir); break
+        --    end
+        --    bh = node_next(bh)
+        -- end
         if split_dir_whatsit then
            -- adjust direction of 'split_keep'
            set_attr(split_dir_whatsit, attr_dir, ltjs.list_dir)
@@ -1020,6 +1066,11 @@ do
          setfield(db, 'head', db_head)
       end
    end
+
+   local shipout_temp =  node_new(id_hlist)
+   set_attr(shipout_temp, attr_dir, dir_yoko)
+   tex_set_attr('global', attr_dir, 0)
+
    finalize_inner = function (box)
       for n in traverse(getlist(box)) do
          local nid = getid(n)
@@ -1030,11 +1081,21 @@ do
             else
                finalize_inner(n)
             end
-         end
+        end
       end
    end
    local getbox = tex.getbox
+   local setbox, copy = Dnode.setbox, Dnode.copy
    function luatexja.direction.finalize()
-      finalize_inner(to_direct(tex.getbox("AtBeginShipoutBox")))
+      local a = to_direct(tex.getbox("AtBeginShipoutBox"))
+      local a_dir = get_box_dir(a, dir_yoko)
+      if a_dir~=dir_yoko then
+         local b = create_dir_node(a, a_dir, dir_yoko, false)
+         setfield(b, 'head', a); a = b
+      end
+      setfield(shipout_temp, 'head', a)
+      finalize_inner(shipout_temp)
+      setbox('global', "AtBeginShipoutBox", copy(getlist(shipout_temp)))
+      setfield(shipout_temp, 'head',nil)
    end
 end