Don't hardcode \immediate flag value and move custom functions into table

This commit is contained in:
Marcel Fabian Krüger 2021-11-06 13:23:29 +01:00
parent d61bb927a3
commit 32c5de7db7
7 changed files with 79 additions and 66 deletions

View File

@ -1,3 +1,5 @@
local lmlt = luametalatex
local scan_int = token.scan_int
local scan_token = token.scan_token
local scan_keyword = token.scan_keyword
@ -22,6 +24,8 @@ local utils = require'luametalatex-pdf-utils'
local strip_floats = utils.strip_floats
local to_bp = utils.to_bp
local immediate_flag = lmlt.flag.immediate
local pdfname, pfile
local fontdirs = setmetatable({}, {__index=function(t, k)t[k] = pfile:getobj() return t[k] end})
local nodefont_meta = {}
@ -65,15 +69,15 @@ end
local properties = node.direct.properties
local reset_deadcycles do
local tokens = {
token.primitive_tokens.global,
token.primitive_tokens.deadcycles,token.create(0x30),
token.primitive_tokens.relax,
lmlt.primitive_tokens.global,
lmlt.primitive_tokens.deadcycles,token.create(0x30),
lmlt.primitive_tokens.relax,
}
function reset_deadcycles()
token.put_next(tokens)
end
end
token.luacmd("shipout", function()
lmlt.luacmd("shipout", function()
local pfile = get_pfile()
local total_voffset, total_hoffset = tex.voffset + pdfvariable.vorigin, tex.hoffset + pdfvariable.horigin
local voff = node.new'kern'
@ -247,7 +251,7 @@ function callbacks.stop_run()
end
callbacks.__freeze('stop_run', true)
token.luacmd("pdfvariable", function()
lmlt.luacmd("pdfvariable", function()
for _, n in ipairs(pdf.variable_names) do
if scan_keyword(n) then
return token.put_next(token.create('pdfvariable ' .. n))
@ -637,7 +641,7 @@ local function maybe_gobble_cmd(cmd)
token.put_next(t)
end
end
token.luacmd("pdffeedback", function()
lmlt.luacmd("pdffeedback", function()
if scan_keyword"colorstackinit" then
local page = scan_keyword'page'
or (scan_keyword'nopage' and false) -- If you want to pass "page" as mode
@ -656,10 +660,10 @@ token.luacmd("pdffeedback", function()
error(string.format("Unknown PDF feedback %s", scan_word()))
end
end)
token.luacmd("pdfextension", function(_, immediate)
lmlt.luacmd("pdfextension", function(_, immediate)
if immediate == "value" then return end
if immediate and immediate & 0x7 ~= 0 then
immediate = immediate & 0x8
if immediate and immediate & ~immediate_flag ~= 0 then
immediate = immediate & immediate_flag
tex.error("Unexpected prefix", "You used \\pdfextension with a prefix that doesn't belong there. I will ignore it for now.")
end
if scan_keyword"colorstack" then
@ -727,7 +731,7 @@ token.luacmd("pdfextension", function(_, immediate)
local attr = scan_keyword'stream' and (scan_keyword'attr' and scan_string() or '')
local isfile = scan_keyword'file'
local content = scan_string()
if immediate == 8 then
if immediate == immediate_flag then
if attr then
pfile:stream(num, attr, content, isfile)
else
@ -850,11 +854,10 @@ local lastimage = -1
local lastimagepages = -1
-- These are very minimal right now but LaTeX isn't using the scaling etc. stuff anyway.
token.luacmd("saveimageresource", function(_, immediate)
lmlt.luacmd("saveimageresource", function(_, immediate)
if immediate == "value" then return end
if immediate and immediate & 0x7 ~= 0 then
print(immediate)
immediate = immediate & 0x8
if immediate and immediate & ~immediate_flag ~= 0 then
immediate = immediate & immediate_flag
tex.error("Unexpected prefix", "You used \\saveimageresource with a prefix that doesn't belong there. I will ignore it for now.")
end
local attr = scan_keyword'attr' and scan_string() or nil
@ -880,24 +883,24 @@ token.luacmd("saveimageresource", function(_, immediate)
local pfile = get_pfile()
lastimage = imglib.get_num(pfile, img)
lastimagepages = img.pages or 1
if immediate == 8 then
if immediate == immediate_flag then
imglib_immediatewrite(pfile, img)
end
end, "value")
token.luacmd("useimageresource", function()
lmlt.luacmd("useimageresource", function()
local pfile = get_pfile()
local img = assert(imglib.from_num(scan_int()))
imglib_write(pfile, img)
end, "protected")
local integer_code = token.value.integer
local integer_code = lmlt.value.integer
token.luacmd("lastsavedimageresourceindex", function()
lmlt.luacmd("lastsavedimageresourceindex", function()
return integer_code, lastimage
end, "value")
token.luacmd("lastsavedimageresourcepages", function()
lmlt.luacmd("lastsavedimageresourcepages", function()
return integer_code, lastimagepages
end, "value")
@ -919,10 +922,10 @@ tex.useboxresource = savedbox.use
local lastbox = -1
token.luacmd("saveboxresource", function(_, immediate)
lmlt.luacmd("saveboxresource", function(_, immediate)
if immediate == "value" then return end
if immediate and immediate & 0x7 ~= 0 then
immediate = immediate & 0x8
if immediate and immediate & ~immediate_flag ~= 0 then
immediate = immediate & immediate_flag
tex.error("Unexpected prefix", "You used \\saveboxresource with a prefix that doesn't belong there. I will ignore it for now.")
end
local type
@ -935,11 +938,11 @@ token.luacmd("saveboxresource", function(_, immediate)
local margin = scan_keyword'margin' and scan_dimen() or nil
local box = scan_int()
local index = tex.saveboxresource(box, attr, resources, immediate == 8, type, margin)
local index = tex.saveboxresource(box, attr, resources, immediate == immediate_flag, type, margin)
lastbox = index
end, "value")
token.luacmd("useboxresource", function()
lmlt.luacmd("useboxresource", function()
local width, height, depth
while true do
if scan_keyword'width' then
@ -956,7 +959,7 @@ token.luacmd("useboxresource", function()
node.write((tex.useboxresource(index, width, height, depth)))
end, "protected")
token.luacmd("lastsavedboxresourceindex", function()
lmlt.luacmd("lastsavedboxresourceindex", function()
return integer_code, lastbox
end, "value")
@ -964,15 +967,15 @@ local saved_pos_x, saved_pos_y = -1, -1
local save_pos_whatsit = declare_whatsit('save_pos', function(_, _, _, x, y)
saved_pos_x, saved_pos_y = assert(math.tointeger(x)), assert(math.tointeger(y))
end)
token.luacmd("savepos", function() -- \savepos
lmlt.luacmd("savepos", function() -- \savepos
return node.direct.write(node.direct.new(whatsit_id, save_pos_whatsit))
end, "protected")
token.luacmd("lastxpos", function()
lmlt.luacmd("lastxpos", function()
return integer_code, (saved_pos_x+.5)//1
end, "value")
token.luacmd("lastypos", function()
lmlt.luacmd("lastypos", function()
return integer_code, (saved_pos_y+.5)//1
end, "value")

View File

@ -1,9 +1,11 @@
local lmlt = luametalatex
local scan_dimen = token.scan_dimen
local scan_int = token.scan_int
local scan_keyword = token.scan_keyword
local count_code = token.value.integer
local dimen_code = token.value.dimension
local count_code = lmlt.value.integer
local dimen_code = lmlt.value.dimension
local set_local = require'luametalatex-local'
@ -26,7 +28,7 @@ function texmeta.__newindex(t, k, v)
end
local function tex_variable(value, scanner, name, default)
token.luacmd(name, function(_, scanning)
lmlt.luacmd(name, function(_, scanning)
if scanning == 'value' then
return value, tex_variables[name]
else
@ -95,7 +97,7 @@ end
local function pdf_variable(value, scanner, name, default, force_default)
pdf_variable_names[#pdf_variable_names+1] = name
token.luacmd('pdfvariable ' .. name, function(_, scanning)
lmlt.luacmd('pdfvariable ' .. name, function(_, scanning)
if scanning == 'value' then
return value, real_pdf_variables[name]
elseif force_default then

View File

@ -10,7 +10,7 @@ function tex.gettextdir() return tex.textdirection end
function tex.getlinedir() return tex.linedirection end
function tex.getmathdir() return tex.mathdirection end
function tex.getpardir() return tex.pardirection end
local integer_code = token.value.integer
local integer_code = luametalatex.value.integer
local function set_xdir(id, scanning)
if scanning == 'value' then
return integer_code, getters[id]()
@ -30,7 +30,7 @@ return function(name)
local getter = tex["get" .. name]
local setter = tex["set" .. name]
assert(getter and setter, "direction parameter undefined")
local idx = token.luacmd(name, set_xdir, "protected", "global", "value")
local idx = luametalatex.luacmd(name, set_xdir, "protected", "global", "value")
getters[idx] = getter
setters[idx] = setter
return idx

View File

@ -1,3 +1,5 @@
local lmlt = luametalatex
local scan_int = token.scan_int
token.scan_int = scan_int -- For compatibility with LuaTeX packages
local scan_token = token.scan_token
@ -61,6 +63,8 @@ if status.ini_version then
setcatcode('global', 2, 32, 10)
end
local immediate_flag = lmlt.flag.immediate
local l = lpeg or require'lpeg'
local add_file_extension = l.Cs((1-('.' * (1-l.S'./\\')^0) * -1)^0 * (l.P(1)^1+l.Cc'.tex'))
local ofiles, ifiles = {}, {}
@ -75,17 +79,17 @@ local function do_openout(p)
end
end
local open_whatsit = new_whatsit('open', do_openout)
token.luacmd("openout", function(_, immediate) -- \openout
lmlt.luacmd("openout", function(_, immediate) -- \openout
if immediate == "value" then return end
if immediate and immediate & ~0x2000 ~= 0 then
immediate = immediate & 0x2000
if immediate and immediate & ~immediate_flag ~= 0 then
immediate = immediate & immediate_flag
tex.error("Unexpected prefix", "You used \\openout with a prefix that doesn't belong there. I will ignore it for now.")
end
local file = scan_int()
scan_keyword'='
local name = scan_filename()
local props = {file = file, name = name}
if immediate and immediate == 0x2000 then
if immediate and immediate == immediate_flag then
do_openout(props)
else
local whatsit = node.direct.new(whatsit_id, open_whatsit)
@ -93,7 +97,7 @@ token.luacmd("openout", function(_, immediate) -- \openout
node.direct.write(whatsit)
end
end, "value")
token.luacmd("openin", function(_, prefix)
lmlt.luacmd("openin", function(_, prefix)
if prefix == "value" then return end
local file = scan_int()
scan_keyword'='
@ -112,15 +116,15 @@ local function do_closeout(p)
end
end
local close_whatsit = new_whatsit('close', do_closeout)
token.luacmd("closeout", function(_, immediate) -- \closeout
lmlt.luacmd("closeout", function(_, immediate) -- \closeout
if immediate == "value" then return end
if immediate and immediate & ~0x2000 ~= 0 then
immediate = immediate & 0x2000
if immediate and immediate & ~immediate_flag ~= 0 then
immediate = immediate & immediate_flag
tex.error("Unexpected prefix", "You used \\closeout with a prefix that doesn't belong there. I will ignore it for now.")
end
local file = scan_int()
local props = {file = file}
if immediate == 0x2000 then
if immediate == immediate_flag then
do_closeout(props)
else
local whatsit = node.direct.new(whatsit_id, close_whatsit)
@ -128,7 +132,7 @@ token.luacmd("closeout", function(_, immediate) -- \closeout
node.direct.write(whatsit)
end
end, "value")
token.luacmd("closein", function(_, prefix)
lmlt.luacmd("closein", function(_, prefix)
if prefix == "value" then return end
local file = scan_int()
if ifiles[file] then
@ -148,16 +152,16 @@ local function do_write(p)
end
end
local write_whatsit = new_whatsit('write', do_write)
token.luacmd("write", function(_, immediate, ...) -- \write
lmlt.luacmd("write", function(_, immediate, ...) -- \write
if immediate == "value" then return end
if immediate and immediate & ~0x2000 ~= 0 then
immediate = immediate & 0x2000
if immediate and immediate & ~immediate_flag ~= 0 then
immediate = immediate & immediate_flag
tex.error("Unexpected prefix", "You used \\write with a prefix that doesn't belong there. I will ignore it for now.")
end
local file = scan_int()
local content = scan_tokenlist()
local props = {file = file, data = content}
if immediate == 0x2000 then
if immediate == immediate_flag then
do_write(props)
else
local whatsit = node.direct.new(whatsit_id, write_whatsit)
@ -176,13 +180,13 @@ local function prefix_to_tokens(prefix)
end
end
end
local expand_after = token.primitive_tokens.expandafter
local input_tok = token.primitive_tokens.input
local endlocalcontrol = token.primitive_tokens.endlocalcontrol
local afterassignment = token.primitive_tokens.afterassignment
local expand_after = lmlt.primitive_tokens.expandafter
local input_tok = lmlt.primitive_tokens.input
local endlocalcontrol = lmlt.primitive_tokens.endlocalcontrol
local afterassignment = lmlt.primitive_tokens.afterassignment
local lbrace = token.new(0, 1)
local rbrace = token.new(0, 2)
token.luacmd("read", function(_, prefix)
lmlt.luacmd("read", function(_, prefix)
if immediate == "value" then return end
local id = scan_int()
if not scan_keyword'to' then
@ -224,12 +228,12 @@ token.luacmd("read", function(_, prefix)
tex.runlocal(function()
tokens[#tokens+1] = rbrace
token.put_next(tokens)
token.put_next(token.primitive_tokens.def, token.create(macro), lbrace)
token.put_next(lmlt.primitive_tokens.def, token.create(macro), lbrace)
prefix_to_tokens(prefix)
end)
end, "value")
token.luacmd("readline", function(_, prefix)
lmlt.luacmd("readline", function(_, prefix)
if immediate == "value" then return end
local id = scan_int()
if not scan_keyword'to' then
@ -266,7 +270,7 @@ local integer_code, boolean_code do
end
end
token.luacmd("ifeof", function(_)
lmlt.luacmd("ifeof", function(_)
local id = scan_int()
return boolean_code, not ifiles[id]
end, "condition")
@ -283,7 +287,7 @@ local late_lua_whatsit = new_whatsit('late_lua', function(p, pfile, n, x, y)
end
return pdf._latelua(pfile, x, y, code)
end)
token.luacmd("latelua", function() -- \latelua
lmlt.luacmd("latelua", function() -- \latelua
local content = scan_tokenlist()
local props = {token = content}
local whatsit = node.direct.new(whatsit_id, late_lua_whatsit)
@ -298,7 +302,7 @@ require'luametalatex-baseregisters'
require'luametalatex-back-pdf'
require'luametalatex-node-luaotfload'
token.luacmd("Umathcodenum", function(_, scanning)
lmlt.luacmd("Umathcodenum", function(_, scanning)
if scanning then
local class, family, char = tex.getmathcodes (scan_int())
return integer_code, char | (class | family << 3) << 21

View File

@ -1,3 +1,5 @@
luametalatex = luametalatex or {}
local lmlt = luametalatex
local initex = status.ini_version
if initex then
@ -34,13 +36,14 @@ do
primitives[prim[3]] = token_new(prim[2], prim[1])
end
end
token.primitive_tokens = primitives
lmlt.primitive_tokens = primitives
do
local command_id = swap_table(token.getcommandvalues())
function token.command_id(name) return command_id[name] end
end
token.value = swap_table(token.getfunctionvalues())
lmlt.value = swap_table(token.getfunctionvalues())
lmlt.flag = swap_table(tex.getflagvalues())
local functions = lua.getfunctionstable()
-- I am not sure why this is necessary, but otherwise LuaMetaTeX resets
@ -71,7 +74,7 @@ local lua_call_cmd = token.command_id'lua_call'
local lua_value_cmd = token.command_id'lua_value'
local lua_protected_call_cmd = token.command_id'lua_protected_call'
local if_test_cmd = token.command_id'if_test'
function token.luacmd(name, func, ...)
function lmlt.luacmd(name, func, ...)
local idx
local tok = token.create(name)
local cmd = tok.command

View File

@ -12,7 +12,7 @@ lua.get_functions_table()[restore_func] = function()
end
end
end
local restore_toks = {token.primitive_tokens.atendofgroup , token.new(restore_func, token.command_id'lua_call')}
local restore_toks = {luametalatex.primitive_tokens.atendofgroup , token.new(restore_func, token.command_id'lua_call')}
local put_next = token.put_next
local runlocal = tex.runlocal
local function put_restore_toks()

View File

@ -4,12 +4,13 @@
-- Necessary especially for etoolbox's patching commands
local lmlt = luametalatex
local primitive_meaning = {
token.primitive_tokens.expandafter,
token.primitive_tokens.relax,
token.primitive_tokens.meaning,
lmlt.primitive_tokens.expandafter,
lmlt.primitive_tokens.relax,
lmlt.primitive_tokens.meaning,
}
token.luacmd("meaning", function()
lmlt.luacmd("meaning", function()
local peeked = token.peeknext()
token.put_next(primitive_meaning)
token.skipnextexpanded()