mathml/luamml-lr.lua

88 lines
2.6 KiB
Lua
Raw Normal View History

2021-04-30 19:52:32 +02:00
local properties = node.get_properties_table()
local function to_unicode(head, tail)
2021-05-01 08:27:52 +02:00
local result, subresult, i = {[0] = 'mrow'}, {}, 0
2021-04-30 19:52:32 +02:00
local characters, last_fid
local iter, state, n = node.traverse(head)
while true do
local id, sub n, id, sub = iter(state, n)
if not n or n == tail then break end
local props = properties[n]
if props and props.glyph_info then
i = i+1
2021-05-01 08:27:52 +02:00
subresult[i] = glyph_info
2021-04-30 19:52:32 +02:00
else
local char, fid = node.is_glyph(n)
if char then
if fid ~= last_fid then
local fontdir = font.getfont(fid)
characters, last_fid = fontdir.characters, fid
end
local uni = characters[char]
local uni = uni and uni.unicode
i = i+1
if uni then
if type(uni) == 'number' then
2021-05-01 08:27:52 +02:00
subresult[i] = utf.char(uni)
2021-04-30 19:52:32 +02:00
else
2021-05-01 08:27:52 +02:00
subresult[i] = utf.char(table.unpack(uni))
2021-04-30 19:52:32 +02:00
end
else
if char < 0x110000 then
2021-05-01 08:27:52 +02:00
subresult[i] = utf.char(char)
2021-04-30 19:52:32 +02:00
else
2021-05-01 08:27:52 +02:00
subresult[i] = '\u{FFFD}'
2021-04-30 19:52:32 +02:00
end
end
-- elseif node.id'math' == id then
-- n = node.end_of_math(n) -- Not sure yet
-- elseif node.id'whatsit' == id then
-- TODO(?)
elseif node.id'glue' == id then
if n.width > 1000 then -- FIXME: Coordinate constant with tagpdf
i = i+1
2021-05-01 08:27:52 +02:00
subresult[i] = ' '
2021-04-30 19:52:32 +02:00
end
elseif node.id'hlist' == id then
2021-05-01 08:27:52 +02:00
local nested = to_unicode(n.head)
if nested[0] == 'mtext' and #nested == 1 and type(nested[1]) == 'string' then
i=i+1
subresult[i] = nested[1]
else
if i ~= 0 then
i = 0
result[#result+1] = {[0] = 'mtext', table.concat(subresult)}
end
if nested[0] == 'mrow' then
table.move(nested, 1, #nested, #result+1, result)
else -- should be unreachable
result[#result+1] = nested
end
end
2021-04-30 19:52:32 +02:00
elseif node.id'vlist' == id then
i = i+1
2021-05-01 08:27:52 +02:00
subresult[i] = '\u{FFFD}'
2021-04-30 19:52:32 +02:00
elseif node.id'rule' == id then
if n.width ~= 0 then
i = i+1
2021-05-01 08:27:52 +02:00
subresult[i] = '\u{FFFD}'
2021-04-30 19:52:32 +02:00
end
end -- CHECK: Everything else can probably be ignored, otherwise shout at me
end
end
2021-05-01 08:27:52 +02:00
if i ~= 0 then
i = 0
result[#result+1] = {[0] = 'mtext', table.concat(subresult)}
end
if #result == 0 then
local r = {[0] = 'mtext', ''}
return r, r
elseif #result == 1 then
result = result[1]
if result[1] == 'mtext' then return result, result end
end
return result
2021-04-30 19:52:32 +02:00
end
return to_unicode