diff options
author | Karl Berry <karl@freefriends.org> | 2021-07-27 20:36:31 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-07-27 20:36:31 +0000 |
commit | c5b5e3fd195d647f3107171ca73a29b83bf4d7b3 (patch) | |
tree | 01eb2e0fef4c2aea7fcd43dab80ee549d89851fb /Master/texmf-dist/tex | |
parent | d94a4be7eef3b68410940ceebbd4bd2401aebbce (diff) |
pyluatex (27jul21)
git-svn-id: svn://tug.org/texlive/trunk@60095 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua | 85 | ||||
-rw-r--r-- | Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty | 19 |
2 files changed, 68 insertions, 36 deletions
diff --git a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua index 4f904afe157..506b8bf9cf8 100644 --- a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua +++ b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua @@ -35,10 +35,11 @@ local folder = file.pathpart(file.collapsepath(status.filename, true)) local script = file.join(folder, "pyluatex-interpreter.py") local tcp = nil -local python_lines = {} -local python_output = nil +local env_end = nil +local env_lines = nil -local env_end = "\\end{python}" +local last_code = nil +local last_output = nil local function err_cmd(message) return "\\PackageError{PyLuaTeX}{" .. message .. "}{}" @@ -80,74 +81,100 @@ local function log_output(code) texio.write_nl("PyLuaTeX output: " .. code) end -local function print_lines(str) - for s in str:gmatch("[^\r\n]+") do - tex.sprint(s) +local function split_lines(str) + if str:sub(-1) ~= "\n" then + str = str .. "\n" end + + local t = {} + for s in str:gmatch("(.-)\r?\n") do + table.insert(t, s) + end + return t end -function pyluatex.execute(code, write) - if pyluatex.verbose then log_input(code) end +function pyluatex.execute(code, auto_print, write) + local full_code + if auto_print then + full_code = "print(str(" .. code .. "), end='')" + else + full_code = code + end + + if pyluatex.verbose then log_input(full_code) end + + local success, output = request({ session = pyluatex.session, code = full_code }) + last_code = split_lines(code) + last_output = split_lines(output) - local success, output = request({ session = pyluatex.session, code = code }) if success then if pyluatex.verbose then log_output(output) end + if write then - print_lines(output) - else - return output + tex.print(last_output) end else - if not pyluatex.verbose then log_input(code) end + if not pyluatex.verbose then log_input(full_code) end log_output(output) if write then tex.sprint(err_cmd("Python error (see above)")) end end - return nil + + return success end function pyluatex.print_env() - if python_output ~= nil then - print_lines(python_output) - python_output = nil + if last_output ~= nil then + tex.print(last_output) end end local function record_line(line) - local s, e = line:find(env_end) + local s, e = line:find(env_end, 1, true) if s ~= nil then luatexbase.remove_from_callback("process_input_buffer", "pyluatex_record_line") - table.insert(python_lines, line:sub(1, s - 1)) - local code = table.concat(python_lines, "\n") - local output = pyluatex.execute(code, false) - if output ~= nil then - python_output = output + table.insert(env_lines, line:sub(1, s - 1)) + local code = table.concat(env_lines, "\n") + local success = pyluatex.execute(code, false, false) + if success then return line:sub(s) else return env_end .. err_cmd("Python error (see above)") .. line:sub(e + 1) end else - table.insert(python_lines, line) + table.insert(env_lines, line) return "" end end -function pyluatex.record_env() - python_lines = {} - python_output = nil +function pyluatex.record_env(quiet) + if quiet then + env_end = "\\end{pythonq}" + else + env_end = "\\end{python}" + end + env_lines = {} luatexbase.add_to_callback("process_input_buffer", record_line, "pyluatex_record_line") end -function pyluatex.run_file(path) +function pyluatex.run_file(path, write) local f = io.open(path, "r") if f then local code = f:read("*a") f:close() - pyluatex.execute(code, true) + pyluatex.execute(code, false, write) else tex.sprint(err_cmd("File not found: " .. path)) end end +function pyluatex.get_last_code() + return last_code +end + +function pyluatex.get_last_output() + return last_output +end + return pyluatex diff --git a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty index b9ce3f97179..0709ba76000 100644 --- a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty +++ b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty @@ -9,7 +9,7 @@ %% version 2005/12/01 or later. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{pyluatex}[2021/07/15 v0.1.3 Execute Python code on the fly] +\ProvidesPackage{pyluatex}[2021/07/26 v0.2.0 Execute Python code on the fly] \RequirePackage{expl3} \ExplSyntaxOn @@ -30,17 +30,22 @@ \directlua{pyluatex.start([==[\pyluatex@executable]==])} -\newenvironment{python}{\directlua{pyluatex.record_env()}}% +\newenvironment{python}{\directlua{pyluatex.record_env(false)}}% {\directlua{pyluatex.print_env()}} -\newcommand*{\py}[1]{% -\directlua{pyluatex.execute([==[print(str(#1), end='')]==], true)}% -} +\newenvironment{pythonq}{\directlua{pyluatex.record_env(true)}}{} + +\newcommand*{\python@inline}[3]{\directlua{pyluatex.execute([==[#1]==], #2, #3)}} + +\newcommand*{\py}[1]{\python@inline{#1}{true}{true}} +\newcommand*{\pyq}[1]{\python@inline{#1}{true}{false}} -\newcommand*{\pyc}[1]{\directlua{pyluatex.execute([==[#1]==], true)}} +\newcommand*{\pyc}[1]{\python@inline{#1}{false}{true}} +\newcommand*{\pycq}[1]{\python@inline{#1}{false}{false}} \newcommand*{\pysession}[1]{\directlua{pyluatex.session = [==[#1]==]}} -\newcommand*{\pyfile}[1]{\directlua{pyluatex.run_file([==[#1]==])}} +\newcommand*{\pyfile}[1]{\directlua{pyluatex.run_file([==[#1]==], true)}} +\newcommand*{\pyfileq}[1]{\directlua{pyluatex.run_file([==[#1]==], false)}} \endinput |