OSDN Git Service

Merge branch 'kitagawa_test' into kitagawa_nfss
[luatex-ja/luatexja.git] / src / luatexja.lua
index 1f62c2b..5ad31b3 100644 (file)
@@ -1,16 +1,8 @@
 
 require('lualibs')
-tableunpack = table.unpack
 
 ------------------------------------------------------------------------
--- naming:
---    ext_... : called from \directlua{}
---    int_... : called from other Lua codes, but not from \directlua{}
---    (other)     : only called from this file
-function luatexja.load_module(name)
-   require('ltj-' .. name.. '.lua')
-end
-function luatexja.load_lua(fn)
+local function load_lua(fn)
    local found = kpse.find_file(fn, 'tex')
    if not found then
       tex.error("LuaTeX-ja error: File `" .. fn .. "' not found")
@@ -19,6 +11,10 @@ function luatexja.load_lua(fn)
       dofile(found)
    end
 end
+luatexja.load_lua = load_lua
+function luatexja.load_module(name)
+   require('ltj-' .. name.. '.lua')
+end
 
 do
     local setfield = node.direct.setfield
@@ -47,18 +43,18 @@ luatexja.icflag_table = icflag_table
 icflag_table.ITALIC          = 1
 icflag_table.PACKED          = 2
 icflag_table.KINSOKU         = 3
-icflag_table.FROM_JFM        = 6
+icflag_table.FROM_JFM        = 4
 -- FROM_JFM: 4, 5, 6, 7, 8 →優先度高(伸びやすく,縮みやすい)
 -- 6 が標準
-icflag_table.KANJI_SKIP      = 9
-icflag_table.KANJI_SKIP_JFM  = 10
-icflag_table.XKANJI_SKIP     = 11
-icflag_table.XKANJI_SKIP_JFM = 12
-icflag_table.LINEEND         = 13
-icflag_table.PROCESSED       = 14
-icflag_table.IC_PROCESSED    = 15
-icflag_table.BOXBDD          = 16
-icflag_table.PROCESSED_BEGIN_FLAG = 128
+icflag_table.KANJI_SKIP      = 68 -- = 4+64
+icflag_table.KANJI_SKIP_JFM  = 69
+icflag_table.XKANJI_SKIP     = 70
+icflag_table.XKANJI_SKIP_JFM = 71
+icflag_table.LINEEND         = 72
+icflag_table.PROCESSED       = 73
+icflag_table.IC_PROCESSED    = 74
+icflag_table.BOXBDD          = 75
+icflag_table.PROCESSED_BEGIN_FLAG = 4096 -- sufficiently large power of 2
 
 local stack_table_index = {}
 luatexja.stack_table_index = stack_table_index
@@ -82,6 +78,8 @@ userid_table.IHB  = luatexbase.newuserwhatsitid('inhibitglue',  'luatexja') -- \
 userid_table.STCK = luatexbase.newuserwhatsitid('stack_marker', 'luatexja') -- スタック管理
 userid_table.BPAR = luatexbase.newuserwhatsitid('begin_par',    'luatexja') -- 「段落始め」
 userid_table.DIR  = luatexbase.newuserwhatsitid('direction',    'luatexja') -- 組方向
+userid_table.BOXB = luatexbase.newuserwhatsitid('box_boundary', 'luatexja') -- 「ボックス始め・終わり」
+userid_table.JA_AL_BDD = luatexbase.newuserwhatsitid('ja_al_boundary', 'luatexja')
 
 local dir_table = {}
 luatexja.dir_table = dir_table
@@ -101,16 +99,18 @@ load_module('rmlgbm');    local ltjr = luatexja.rmlgbm -- must be 1st
 
 if luatexja_debug then load_module('debug') end
 
+load_module('lotf_aux');  local ltju = luatexja.lotf_aux
 load_module('charrange'); local ltjc = luatexja.charrange
 load_module('stack');     local ltjs = luatexja.stack
 load_module('direction'); local ltjd = luatexja.direction -- +1 hlist +1 attr_list
+load_module('lineskip');  local ltjl = luatexja.lineskip -- +1 hlist +1 attr_list
 load_module('jfont');     local ltjf = luatexja.jfont
 load_module('inputbuf');  local ltji = luatexja.inputbuf
 load_module('pretreat');  local ltjp = luatexja.pretreat
 load_module('setwidth');  local ltjw = luatexja.setwidth
 load_module('jfmglue');   local ltjj = luatexja.jfmglue -- +1 glue +1 gs +1 attr_list
 load_module('math');      local ltjm = luatexja.math
-load_module('tangle');    local ltjb = luatexja.base
+load_module('base');      local ltjb = luatexja.base
 
 
 local attr_jchar_class = luatexbase.attributes['ltj@charclass']
@@ -176,18 +176,23 @@ end
 
 -- EXT: print parameters that don't need arguments
 do
+   local tex_getattr = tex.getattribute
+   local function getattr(a)
+      local r = tex.getattribute(a)
+      return (r==-0x7FFFFFFF) and 0 or r
+   end 
    luatexja.unary_pars = {
       yalbaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@yablshift'))..'pt'
+        return print_scaled(getattr('ltj@yablshift'))..'pt'
       end,
       yjabaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@ykblshift'))..'pt'
+        return print_scaled(getattr('ltj@ykblshift'))..'pt'
       end,
       talbaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@tablshift'))..'pt'
+        return print_scaled(getattr('ltj@tablshift'))..'pt'
       end,
       tjabaselineshift = function(t)
-        return print_scaled(tex.getattribute('ltj@tkblshift'))..'pt'
+        return print_scaled(getattr('ltj@tkblshift'))..'pt'
       end,
       kanjiskip = function(t)
         return print_spec(ltjs.get_stack_skip(stack_table_index.KSK, t))
@@ -199,10 +204,10 @@ do
         return ltjs.get_stack_table(stack_table_index.JWP, 0, t)
       end,
       autospacing = function(t)
-        return tex.getattribute('ltj@autospc')
+        return getattr('ltj@autospc')
       end,
       autoxspacing = function(t)
-        return tex.getattribute('ltj@autoxspc')
+        return getattr('ltj@autoxspc')
       end,
       differentjfm = function(t)
         local f, r = luatexja.jfmglue.diffmet_rule, '???'
@@ -396,7 +401,7 @@ local function get_attr_icflag(p)
 end
 
 local prefix, inner_depth
-
+local utfchar = utf.char
 local function debug_show_node_X(p,print_fn, limit)
    local k = prefix
    local s
@@ -404,11 +409,15 @@ local function debug_show_node_X(p,print_fn, limit)
    local base = prefix .. string.format('%X', get_attr_icflag(p))
    .. ' ' .. pt .. ' ' .. tostring(p.subtype) .. ' '
    if pt == 'glyph' then
-      s = base .. ' ' .. utf.char(p.char) .. ' '
-         .. tostring(p.font)
-         .. ' (' .. print_scaled(p.height) .. '+'
+      s = base .. ' ' .. 
+         (p.char<0xF0000 and utfchar(p.char) or '') 
+         .. string.format(' (U+%X) ', p.char)
+         .. tostring(p.font) .. ' (' .. print_scaled(p.height) .. '+'
          .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
-         .. ' xoff: ' .. print_scaled(p.xoffset)
+      if p.xoffset~=0 or p.yoffset~=0 then
+         s = s .. ' off: (' .. print_scaled(p.xoffset)
+               .. ',' .. print_scaled(p.yoffset) .. ')'
+      end
       print_fn(s)
    elseif pt=='hlist' or pt=='vlist' or pt=='unset'or pt=='ins' then
       if pt=='ins' then
@@ -451,6 +460,24 @@ local function debug_show_node_X(p,print_fn, limit)
          .. print_scaled(p.depth) .. ')x' .. print_scaled(p.width)
         .. ', dir=' .. tostring(node.has_attribute(p, attr_dir))
       print_fn(s)
+   elseif pt=='disc' then
+      print_fn(s)
+      local bid = inner_depth
+      if inner_depth < limit then
+         prefix, inner_depth = k.. 'p.', inner_depth + 1
+        for q in node.traverse(p.pre) do
+           debug_show_node_X(q, print_fn, limit)
+        end
+         prefix = k.. 'P.'
+        for q in node.traverse(p.post) do
+           debug_show_node_X(q, print_fn, limit)
+        end
+         prefix = k.. 'R.'
+        for q in node.traverse(p.replace) do
+           debug_show_node_X(q, print_fn, limit)
+        end
+      end
+      prefix=k
    elseif pt == 'glue' then
       s = base .. ' ' ..  print_spec(p)
       if get_attr_icflag(p)>icflag_table.KINSOKU
@@ -526,17 +553,17 @@ local function debug_show_node_X(p,print_fn, limit)
    elseif pt=='noad' then
       s = base ; print_fn(s)
       if p.nucleus then
-         prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn);
+         prefix = k .. 'N'; debug_show_node_X(p.nucleus, print_fn, limit);
       end
       if p.sup then
-         prefix = k .. '^'; debug_show_node_X(p.sup, print_fn);
+         prefix = k .. '^'; debug_show_node_X(p.sup, print_fn, limit);
       end
       if p.sub then
-         prefix = k .. '_'; debug_show_node_X(p.sub, print_fn);
+         prefix = k .. '_'; debug_show_node_X(p.sub, print_fn, limit);
       end
       prefix = k;
    elseif pt=='math_char' then
-      s = base .. ' fam: ' .. p.fam .. ' , char = ' .. utf.char(p.char)
+      s = base .. ' fam: ' .. p.fam .. ' , char = ' .. utfchar(p.char)
       print_fn(s)
    elseif pt=='sub_box' or pt=='sub_mlist' then
       print_fn(base)