---library for lua-open
---@module open
---@copyright 2025
---@diagnostic disable: undefined-field
-- luacheck: ignore 143
local lfs = require 'lfs'
local texrocks = require 'texrocks'
local M = {}
---get file path according to `lux.toml`
---@param file string PDF file name
---@return string file PDF file path
function M.get_path(file)
if lfs.isfile(file) then
return file
end
if not lfs.isfile('lux.toml') then
error(string.format("%s cannot be found", file))
os.exit(1)
end
local f = io.open("lux.toml")
if f == nil then
os.exit(1)
end
local text = f:read("*a")
f:close()
local data = require 'toml'.parse(text)
local cwd
if data.package == nil or data.version == nil then
os.exit(1)
end
local pkg = string.format("%s@%s", data.package, data.version)
if data.version:match("-") == nil then
pkg = pkg .. "-1"
end
for path in package.path:gmatch("[^;]+") do
if path:match("%-" .. pkg:gsub("%-", "%%-")) then
cwd = path:gsub("/%?.*", ""):gsub("/src$", "/etc/conf")
break
end
end
if cwd == nil then
error(string.format("%s cannot be found", pkg))
os.exit(2)
end
local path
for dst, src in pairs(data.build.install.conf) do
if src == file then
path = dst
break
end
end
if path == nil then
error(string.format("%s's %s still cannot be found", pkg, file))
os.exit(3)
end
return table.concat({ cwd, path }, '/')
end
---escape and concatenate command line arguments for printing
---@param args string[] command line arguments
---@return string cmd command line
function M.get_cmd(args)
local cmd = {}
for _, v in ipairs(args) do
v = v:gsub(" ", "\\ ")
table.insert(cmd, v)
end
return table.concat(cmd, " ")
end
---use correct system tool to open PDF
---@param file string PDF file path
---@return string[] args command line arguments
function M.get_cmd_args(file)
if os.name == 'macosx' then
return { "open", file }
elseif os.name == 'windows' or os.name == 'cygwin' then
return { "start", file }
elseif os.getenv "PREFIX" then
return { "termux-open", file }
elseif file:gsub(".*%.", "") == "pdf" and os.getenv "DISPLAY" == nil then
return { "pdftotext", file, "-" }
else
return { "xdg-open", file }
end
end
---**entry for lua-open**
---@param args string[] command line arguments
function M.main(args)
local file = M.get_path(args[1])
local cmd_args = M.get_cmd_args(file)
if file ~= args[1] then
print('$ ' .. M.get_cmd(cmd_args))
end
texrocks.exec(cmd_args)
end