OSDN Git Service

Merge branch 'master' into kitagawa_test
[luatex-ja/luatexja.git] / src / ltj-ruby.lua
index 85f7568..060b322 100644 (file)
@@ -3,13 +3,12 @@
 --
 luatexbase.provides_module({
   name = 'luatexja.ruby',
-  date = '2015/09/18',
+  date = '2018/09/29',
   description = 'Ruby annotation',
 })
-module('luatexja.ruby', package.seeall)
-local err, warn, info, log = luatexbase.errwarinf(_NAME)
-
+luatexja.ruby = {}
 luatexja.load_module('stack');     local ltjs = luatexja.stack
+luatexja.load_module('base');      local ltjb = luatexja.base
 
 local to_node =  node.direct.tonode
 local to_direct =  node.direct.todirect
@@ -68,13 +67,14 @@ luatexja.userid_table.RUBY_PRE = luatexbase.newuserwhatsitid('ruby_pre',  'luate
 luatexja.userid_table.RUBY_POST = luatexbase.newuserwhatsitid('ruby_post',  'luatexja')
 local RUBY_PRE  = luatexja.userid_table.RUBY_PRE
 local RUBY_POST = luatexja.userid_table.RUBY_POST
+local PROCESSED_BEGIN_FLAG = luatexja.icflag_table.PROCESSED_BEGIN_FLAG
 
 ----------------------------------------------------------------
 -- TeX interface 0
 ----------------------------------------------------------------
 do
    local getbox = node.direct.getbox
-   function cpbox() return node_copy(getbox(0)) end
+   function luatexja.ruby.cpbox() return node_copy(getbox(0)) end
 end
 
 ----------------------------------------------------------------
@@ -119,9 +119,10 @@ end
 
 
 -- 実行回数 + ルビ中身 から uniq_id を作る関数
-old_break_info = {} -- public, 前 run 時の分割情報
+luatexja.ruby.old_break_info = {} -- public, 前 run 時の分割情報
+local old_break_info = luatexja.ruby.old_break_info
 local cache_handle
-function read_old_break_info()
+function luatexja.ruby.read_old_break_info()
    if  tex.jobname then
       local fname = tex.jobname .. '.ltjruby'
       local real_file = kpse.find_file(fname)
@@ -144,6 +145,9 @@ end
 local concat
 do
    local node_prev = node.direct.getprev
+   local function get_attr_icflag(p)
+      return (has_attr(p, attr_icflag) or 0) % PROCESSED_BEGIN_FLAG
+   end
    function concat(f, b)
       if f then
         if b then
@@ -151,6 +155,8 @@ do
            if getid(nh)==id_whatsit and getsubtype(nh)==sid_user then
               nh=node_next(nh); node_free(node_prev(nh))
            end
+            set_attr(nh, attr_icflag,
+             get_attr_icflag(nh) + PROCESSED_BEGIN_FLAG)
            setfield(node_tail(h), 'next', nh)
            setfield(f, 'head', nil); node_free(f)
            setfield(b, 'head', nil); node_free(b)
@@ -202,7 +208,7 @@ do
       local hh, hd = getfield(box, 'height'), getfield(box, 'depth')
       local hx = h
       while hx do
-         local hic = has_attr(hx, attr_icflag)
+        local hic = has_attr(hx, attr_icflag) or 0
         if (hic == KANJI_SKIP) or (hic == KANJI_SKIP_JFM)
             or (hic == XKANJI_SKIP) or (hic == XKANJI_SKIP_JFM)
             or ((hic<=FROM_JFM+63) and (hic>=FROM_JFM)) then
@@ -252,6 +258,7 @@ local function texiface_low(rst, rtlr, rtlp)
    setfield(w, 'value', to_node(wv))
    setfield(wv, 'type', 100)
    setfield(wv, 'value', floor(#rtlr))
+   setfield(wv, 'user_id', RUBY_PRE) -- dummy
    set_attr(wv, attr_ruby, rst.rubyzw)
    set_attr(wv, attr_ruby_maxmargin, rst.maxmargin)
    set_attr(wv, attr_ruby_maxprep, rst.pre)
@@ -269,11 +276,11 @@ local function texiface_low(rst, rtlr, rtlp)
 end
 
 -- rst: table
-function texiface(rst, rtlr, rtlp)
+function luatexja.ruby.texiface(rst, rtlr, rtlp)
    if #rtlr ~= #rtlp then
       for i=1, #rtlr do node_free(rtlr[i]) end
       for i=1, #rtlp do node_free(rtlp[i]) end
-      luatexja.base.package_error('luatexja-ruby',
+      ltjb.package_error('luatexja-ruby',
                                  'Group count mismatch between the ruby and\n' ..
                                     'the body (' .. #rtlr .. ' != ' .. #rtlp .. ').',
                                  '')
@@ -673,9 +680,9 @@ luatexbase.add_to_callback('hpack_filter', post_high_hbox, 'ltj.ruby.post_hbox',
 ----------------------------------------------------------------
 do
    local RIPRE  = luatexja.stack_table_index.RIPRE
-   local function whatsit_callback(Np, lp, Nq, bsl)
+   local function whatsit_callback(Np, lp, Nq)
       if Np.nuc then return Np
-      elseif getfield(lp, 'user_id') == RUBY_PRE then
+      elseif  getfield(lp, 'user_id') == RUBY_PRE then
          Np.first, Np.nuc, Np.last = lp, lp, lp
          local lpv = getfield(lp, 'value')
          local x = node_next(node_next(lpv))
@@ -711,6 +718,8 @@ do
             set_attr(lpv, attr_ruby_maxprep, 0)
          end
          return Np
+      else
+        return Np
       end
    end
    luatexbase.add_to_callback("luatexja.jfmglue.whatsit_getinfo", whatsit_callback,