Skip to content

Commit e2eae51

Browse files
committed
Added "post_execute" callback
1 parent 257f81a commit e2eae51

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

pyluatex.lua

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ local parent_env = nil
4242
local last_code = nil
4343
local last_output = nil
4444

45+
local callback_handlers = {
46+
post_execute = {}
47+
}
48+
4549
local function get_tex_file_folder()
4650
for _, v in ipairs(arg) do
4751
if v:sub(1, 1) ~= "-" then
@@ -145,6 +149,17 @@ function pyluatex.execute(code, auto_print, write, repl_mode, store)
145149
last_output = output_lines
146150
end
147151

152+
for _, handler in pairs(callback_handlers["post_execute"]) do
153+
handler({
154+
session = pyluatex.session,
155+
success = resp.success,
156+
code = code_lines,
157+
output = output_lines,
158+
log_message = resp.log_msg,
159+
repl_mode = repl_mode
160+
})
161+
end
162+
148163
if pyluatex.verbose or not resp.success then
149164
texio.write_nl('PyLuaTeX input for session "' .. pyluatex.session ..
150165
'": ' .. full_code)
@@ -222,6 +237,38 @@ function pyluatex.get_last_output()
222237
return last_output
223238
end
224239

240+
function pyluatex.register_event_handler(event, name, handler)
241+
local handlers = callback_handlers[event]
242+
if handlers ~= nil then
243+
if handlers[name] ~= nil then
244+
show_err(
245+
'Event handler "' .. name .. '" already registered' ..
246+
' for event "' .. event .. '"'
247+
)
248+
return
249+
end
250+
handlers[name] = handler
251+
else
252+
show_err('Unknown event "' .. event .. '"')
253+
end
254+
end
255+
256+
function pyluatex.unregister_event_handler(event, name)
257+
local handlers = callback_handlers[event]
258+
if handlers ~= nil then
259+
if handlers[name] == nil then
260+
show_err(
261+
'Event handler "' .. name .. '" not registered' ..
262+
' for event "' .. event .. '"'
263+
)
264+
return
265+
end
266+
handlers[name] = nil
267+
else
268+
show_err('Unknown event "' .. event .. '"')
269+
end
270+
end
271+
225272
local function parse_bool(name, value)
226273
value = value:fullstrip()
227274
if value == "true" then

test/test-cases/callback.yaml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
tests:
2+
- code: |
3+
\directlua{
4+
pyluatex.register_event_handler(
5+
"post_execute",
6+
"handler_name",
7+
function() texio.write("CALLBACK TEST") end
8+
)
9+
}
10+
\py{1}
11+
log: CALLBACK TEST
12+
pdf: 1
13+
- success: false
14+
code: |
15+
\directlua{
16+
pyluatex.register_event_handler(
17+
"unknown_event",
18+
"handler_name",
19+
function() texio.write("CALLBACK TEST") end
20+
)
21+
}
22+
log: |
23+
! Package PyLuaTeX Error: Unknown event "unknown_event".
24+
- success: false
25+
code: |
26+
\directlua{
27+
pyluatex.register_event_handler(
28+
"post_execute",
29+
"handler_name",
30+
function() texio.write("CALLBACK TEST") end
31+
)
32+
pyluatex.register_event_handler(
33+
"post_execute",
34+
"handler_name",
35+
function() texio.write("CALLBACK TEST") end
36+
)
37+
}
38+
log: |
39+
! Package PyLuaTeX Error: Event handler "handler_name" already registered for e
40+
vent "post_execute".
41+
- code: |
42+
\directlua{
43+
pyluatex.register_event_handler(
44+
"post_execute",
45+
"handler_name",
46+
function() texio.write("CALLBACK TEST") end
47+
)
48+
pyluatex.unregister_event_handler("post_execute", "handler_name")
49+
}
50+
not_log: CALLBACK TEST
51+
- success: false
52+
code: |
53+
\directlua{
54+
pyluatex.unregister_event_handler("post_execute", "handler_name")
55+
}
56+
log: |
57+
! Package PyLuaTeX Error: Event handler "handler_name" not registered for event
58+
"post_execute".
59+
- success: false
60+
code: |
61+
\directlua{
62+
pyluatex.unregister_event_handler("unknown_event", "handler_name")
63+
}
64+
log: |
65+
! Package PyLuaTeX Error: Unknown event "unknown_event".
66+
- code: |
67+
\directlua{
68+
function handler(info)
69+
texio.write_nl("TEST")
70+
texio.write_nl("Code: " .. table.concat(info.code))
71+
end
72+
73+
pyluatex.register_event_handler("post_execute", "handler_name", handler)
74+
}
75+
\py{1}
76+
log: |
77+
TEST
78+
Code: 1
79+
pdf: 1

0 commit comments

Comments
 (0)