summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luatexja/src/ltj-charrange.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/luatexja/src/ltj-charrange.lua')
-rw-r--r--macros/luatex/generic/luatexja/src/ltj-charrange.lua43
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