Don't use strings for nod subtyps
This commit is contained in:
parent
f9a23ca0b4
commit
562f9b1248
@ -11,7 +11,30 @@ local radical_t, fraction_t, fence_t = node.id'radical', node.id'fraction', node
|
|||||||
|
|
||||||
local math_char_t, sub_box_t, sub_mlist_t = node.id'math_char', node.id'sub_box', node.id'sub_mlist'
|
local math_char_t, sub_box_t, sub_mlist_t = node.id'math_char', node.id'sub_box', node.id'sub_mlist'
|
||||||
|
|
||||||
local noad_sub = node.subtypes'noad'
|
local function invert_table(t)
|
||||||
|
local t_inv = {}
|
||||||
|
for k, v in next, t do
|
||||||
|
t_inv[v] = k
|
||||||
|
end
|
||||||
|
return t_inv
|
||||||
|
end
|
||||||
|
|
||||||
|
local noad_names = node.subtypes'noad'
|
||||||
|
local noad_sub = invert_table(noad_names)
|
||||||
|
local noad_ord = noad_sub.ord
|
||||||
|
local noad_op = noad_sub.opdisplaylimits
|
||||||
|
local noad_oplimits = noad_sub.oplimits
|
||||||
|
local noad_opnolimits = noad_sub.opnolimits
|
||||||
|
local noad_bin = noad_sub.bin
|
||||||
|
local noad_rel = noad_sub.rel
|
||||||
|
local noad_open = noad_sub.open
|
||||||
|
local noad_close = noad_sub.close
|
||||||
|
local noad_punct = noad_sub.punct
|
||||||
|
local noad_inner = noad_sub.inner
|
||||||
|
local noad_under = noad_sub.under
|
||||||
|
local noad_over = noad_sub.over
|
||||||
|
local noad_vcenter = noad_sub.vcenter
|
||||||
|
|
||||||
local radical_sub = node.subtypes'radical'
|
local radical_sub = node.subtypes'radical'
|
||||||
local fence_sub = node.subtypes'fence'
|
local fence_sub = node.subtypes'fence'
|
||||||
|
|
||||||
@ -125,7 +148,7 @@ local function maybe_to_mn(noad, core)
|
|||||||
local after = noad.next
|
local after = noad.next
|
||||||
if not after then return end
|
if not after then return end
|
||||||
if after.id ~= noad_t then return end
|
if after.id ~= noad_t then return end
|
||||||
if noad_sub[after.subtype] ~= 'ord' then return end
|
if after.subtype ~= noad_ord then return end
|
||||||
after = after.nucleus
|
after = after.nucleus
|
||||||
if not after then return end
|
if not after then return end
|
||||||
if after.id ~= math_char_t then return end
|
if after.id ~= math_char_t then return end
|
||||||
@ -134,9 +157,8 @@ local function maybe_to_mn(noad, core)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function noad_to_table(noad, sub, cur_style, mn)
|
local function noad_to_table(noad, sub, cur_style, mn)
|
||||||
local class = noad_sub[sub]
|
local nucleus, core = kernel_to_table(noad.nucleus, sub == noad_over and cur_style//2*2+1 or cur_style)
|
||||||
local nucleus, core = kernel_to_table(noad.nucleus, class == 'over' and cur_style//2*2+1 or cur_style)
|
if sub == noad_ord then
|
||||||
if class == 'ord' then
|
|
||||||
if core and core[0] == 'mo' then
|
if core and core[0] == 'mo' then
|
||||||
core[0] = 'mi'
|
core[0] = 'mi'
|
||||||
core.stretchy, core.mathvariant = nil, #core == 1 and type(core[0]) == 'string' and utf8.len(core[0]) == 1 and utf8.codepoint(core[0]) < -0x10000 and 'normal' or nil
|
core.stretchy, core.mathvariant = nil, #core == 1 and type(core[0]) == 'string' and utf8.len(core[0]) == 1 and utf8.codepoint(core[0]) < -0x10000 and 'normal' or nil
|
||||||
@ -157,8 +179,8 @@ local function noad_to_table(noad, sub, cur_style, mn)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif class == 'opdisplaylimits' or class == 'oplimits' or class == 'opnolimits' or class == 'bin' or class == 'rel' or class == 'open'
|
elseif sub == noad_op or sub == noad_oplimits or sub == noad_opnolimits or sub == noad_bin or sub == noad_rel or sub == noad_open
|
||||||
or class == 'close' or class == 'punct' or class == 'inner' then
|
or sub == noad_close or sub == noad_punct or sub == noad_inner then
|
||||||
if not core or not core[0] then
|
if not core or not core[0] then
|
||||||
-- TODO
|
-- TODO
|
||||||
else
|
else
|
||||||
@ -166,10 +188,10 @@ local function noad_to_table(noad, sub, cur_style, mn)
|
|||||||
if stretchy[core[1]] then core.stretchy = false end
|
if stretchy[core[1]] then core.stretchy = false end
|
||||||
if core.mathvariant == 'normal' then core.mathvariant = nil end
|
if core.mathvariant == 'normal' then core.mathvariant = nil end
|
||||||
end
|
end
|
||||||
nucleus['tex:class'] = class
|
nucleus['tex:class'] = noad_names[sub]
|
||||||
|
|
||||||
if (noad.sup or noad.sub) and (class == 'opdisplaylimits' or class == 'oplimits') then
|
if (noad.sup or noad.sub) and (sub == noad_op or sub == noad_oplimits) then
|
||||||
nucleus.movablelimits = class == 'opdisplaylimits'
|
nucleus.movablelimits = sub == noad_op
|
||||||
local sub = kernel_to_table(noad.sub, sub_style(cur_style))
|
local sub = kernel_to_table(noad.sub, sub_style(cur_style))
|
||||||
local sup = kernel_to_table(noad.sup, sup_style(cur_style))
|
local sup = kernel_to_table(noad.sup, sup_style(cur_style))
|
||||||
return {[0] = sup and (sub and 'munderover' or 'mover') or 'munder',
|
return {[0] = sup and (sub and 'munderover' or 'mover') or 'munder',
|
||||||
@ -178,17 +200,17 @@ local function noad_to_table(noad, sub, cur_style, mn)
|
|||||||
sub and sup,
|
sub and sup,
|
||||||
}, core
|
}, core
|
||||||
end
|
end
|
||||||
elseif class == 'under' then
|
elseif sub == noad_under then
|
||||||
return {[0] = 'munder',
|
return {[0] = 'munder',
|
||||||
nucleus,
|
nucleus,
|
||||||
{[0] = 'mo', '_',},
|
{[0] = 'mo', '_',},
|
||||||
}, core
|
}, core
|
||||||
elseif class == 'over' then
|
elseif sub == noad_over then
|
||||||
return {[0] = 'mover',
|
return {[0] = 'mover',
|
||||||
nucleus,
|
nucleus,
|
||||||
{[0] = 'mo', '\u{203E}',},
|
{[0] = 'mo', '\u{203E}',},
|
||||||
}, core
|
}, core
|
||||||
elseif class == 'vcenter' then -- Ignored. Nucleus will need special handling anyway
|
elseif sub == noad_vcenter then -- Ignored. Nucleus will need special handling anyway
|
||||||
else
|
else
|
||||||
error[[confusion]]
|
error[[confusion]]
|
||||||
end
|
end
|
||||||
@ -313,37 +335,36 @@ local function cleanup_mathbin(head)
|
|||||||
local last = 'open' -- last sub if id was noad_t, left fence acts fakes being a open noad, bin are themselves. Every other noad is ord
|
local last = 'open' -- last sub if id was noad_t, left fence acts fakes being a open noad, bin are themselves. Every other noad is ord
|
||||||
for n, id, sub in node.traverse(head) do
|
for n, id, sub in node.traverse(head) do
|
||||||
if id == noad_t then
|
if id == noad_t then
|
||||||
sub = noad_sub[sub]
|
if sub == noad_bin then
|
||||||
if sub == 'bin' then
|
if node.is_node(last) or last == noad_opdisplaylimits
|
||||||
if node.is_node(last) or last == 'opdisplaylimits'
|
or last == noad_oplimits or last == noad_opnolimits
|
||||||
or last == 'oplimits' or last == 'opnolimits' or last == 'rel'
|
or last == noad_rel or last == noad_open or last == noad_punct then
|
||||||
or last == 'open' or last == 'punct' then
|
n.subtype, last = noad_ord, noad_ord
|
||||||
n.subtype, last = noad_sub.ord, 'ord'
|
|
||||||
else
|
else
|
||||||
last = n
|
last = n
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if (sub == 'rel' or sub == 'close' or sub == 'punct')
|
if (sub == noad_rel or sub == noad_close or sub == noad_punct)
|
||||||
and node.is_node(last) then
|
and node.is_node(last) then
|
||||||
last.subtype = 'ord'
|
last.subtype = noad_ord
|
||||||
end
|
end
|
||||||
last = sub
|
last = sub
|
||||||
end
|
end
|
||||||
elseif id == fence_t then
|
elseif id == fence_t then
|
||||||
if sub == fence_sub.left then
|
if sub == fence_sub.left then
|
||||||
last = 'open'
|
last = noad_open
|
||||||
else
|
else
|
||||||
if node.is_node(last) then
|
if node.is_node(last) then
|
||||||
last.subtype = noad_sub.ord, 'ord'
|
last.subtype = noad_ord, noad_ord
|
||||||
end
|
end
|
||||||
last = 'ord'
|
last = noad_ord
|
||||||
end
|
end
|
||||||
elseif id == fraction_t or id == radical_t or id == accent_t then
|
elseif id == fraction_t or id == radical_t or id == accent_t then
|
||||||
last = 'ord'
|
last = noad_ord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if node.is_node(last) then
|
if node.is_node(last) then
|
||||||
last.subtype = noad_sub.ord
|
last.subtype = noad_ord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user