diff options
Diffstat (limited to 'macros/luatex/generic/luatexja/src/ltj-charrange.lua')
-rw-r--r-- | macros/luatex/generic/luatexja/src/ltj-charrange.lua | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/macros/luatex/generic/luatexja/src/ltj-charrange.lua b/macros/luatex/generic/luatexja/src/ltj-charrange.lua index 46075b2166..074ba3ce05 100644 --- a/macros/luatex/generic/luatexja/src/ltj-charrange.lua +++ b/macros/luatex/generic/luatexja/src/ltj-charrange.lua @@ -3,17 +3,18 @@ -- luatexbase.provides_module({ name = 'luatexja.charrange', - date = '2020-07-30', + date = '2022-08-19', description = 'Handling the range of Japanese characters', }) luatexja.charrange = {} luatexja.load_module 'base'; local ltjb = luatexja.base local getchar = node.direct.getchar -local has_attr = node.direct.has_attribute -local has_attr_node = node.has_attribute +local get_attr = node.direct.get_attribute +local get_attr_node = node.get_attribute local tex_getattr = tex.getattribute +local UNSET = -0x7FFFFFFF local ATTR_RANGE = 7 luatexja.charrange.ATTR_RANGE = ATTR_RANGE local jcr_cjk, jcr_noncjk = 0, 1 @@ -22,16 +23,22 @@ local kcat_attr_table = {} local pow_table = {} local fn_table = {} -- used in is_ucs_in_japanese_char_direct local nfn_table = {} -- used in is_ucs_in_japanese_char_node -for i = 0, 31*ATTR_RANGE-1 do - local ka, pw = luatexbase.attributes['ltj@kcat'..floor(i/31)], 1/(2^(i%31)) - local jcr_noncjk = jcr_noncjk - kcat_attr_table[i], pow_table[i] = ka, 2^(i%31) - fn_table[i] = function(p) return floor(has_attr(p, ka)*pw)%2 ~= jcr_noncjk end - nfn_table[i] = function(p) return floor(has_attr_node(p, ka)*pw)%2 ~= jcr_noncjk end +do + local ka = luatexbase.attributes['ltj@kcat0'] + for i = 0, 30 do + local pw = 2^i; kcat_attr_table[i], pow_table[i] = ka, pw + fn_table[i] = function(p) return get_attr(p, ka)&pw==0 end + nfn_table[i] = function(p) return get_attr_node(p, ka)&pw==0 end + end +end +for i = 31, 31*ATTR_RANGE-1 do + local ka, pw = luatexbase.attributes['ltj@kcat'..floor(i/31)], 2^(i%31) + kcat_attr_table[i], pow_table[i] = ka, pw + fn_table[i] = function(p) return (get_attr(p, ka) or 0)&pw==0 end + nfn_table[i] = function(p) return (get_attr_node(p, ka) or 0)&pw==0 end end fn_table[-1] = function() return false end -- for char --U+007F nfn_table[-1] = function() return false end -- for char --U+007F -pow_table[31*ATTR_RANGE] = 2^31 -- jcr_table_main[chr_code] = index -- index : internal 0, 1, 2, ..., 216 0: 'other' @@ -71,7 +78,8 @@ function luatexja.charrange.char_to_range(c) -- return the external range number end local function get_range_setting(i) -- i: internal range number - return floor(tex_getattr(kcat_attr_table[i])/pow_table[i])%2 + local a = tex_getattr(kcat_attr_table[i]) + return (a==UNSET and 0 or a)&pow_table[i] end -- glyph_node p は和文文字か? @@ -84,7 +92,7 @@ function luatexja.charrange.is_ucs_in_japanese_char_direct(p ,c) end function luatexja.charrange.is_japanese_char_curlist(c) -- assume that c>=0x80 - return get_range_setting(jcr_table_main[c])~= jcr_noncjk + return get_range_setting(jcr_table_main[c])==0 end -- EXT @@ -96,12 +104,11 @@ function luatexja.charrange.toggle_char_range(g, i) -- i: external range number elseif i==0 then return else local kc - if i>0 then kc=0 else kc=1; i=-i end - if i>=31*ATTR_RANGE then i=0 end - local attr = kcat_attr_table[i] - local a = tex_getattr(attr) - tex.setattribute(g, attr, - (floor(a/pow_table[i+1])*2+kc)*pow_table[i]+a%pow_table[i]) + if i>0 then kc=0 else kc=1; i=-i end; if i>=31*ATTR_RANGE then i=0 end + local attr, p = kcat_attr_table[i], pow_table[i] + local a = tex_getattr(attr); if a==UNSET then a=0 end + a = (a&~p)+kc*p; if a==0 and i>30 then a=UNSET end + tex.setattribute(g, attr, a) end end |