1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
-- functions.tlu: general-use functions for texdoc
--
-- Manuel Pégourié-Gonnard, GPLv3, see texdoclib.tlu for details
-- change '/' to '\' on windows
-- Use: internal representation of files always use forward slashes.
-- This function should be called only before displaying a file name.
if os.type == "windows" then
function w32_path (path)
return (string.gsub (path, '/', '\\'))
end
else
function w32_path (path)
return path
end
end
-- remove the last direcory component of a path
if os.type == 'windows' then
function path_parent(path)
return string.match(path, '^(.*)[\\/]')
end
else
function path_parent(path)
return string.match(path, '^(.*)/')
end
end
-- generic error display function (see the error_priority constant)
function err_print (lvl, msg)
-- be careful: maybe config.verbosity_level is not set yet
local verbosity_level = config.verbosity_level or tonumber(C.def_verbosity)
if C.err_priority[lvl] <= verbosity_level then
io.stderr:write ("texdoc "..lvl..": "..msg.."\n")
end
end
do --scope of active_debugs
local active_debugs
-- generic debug function
function deb_print(cat, msg)
-- make sure active_debugs is set
if not active_debugs then set_active_debugs() end
-- print message it belongs to an active category
if active_debugs and active_debugs[cat] or cat == 'XXX' then
io.stderr:write ("texdoc debug-"..cat..": "..msg.."\n")
end
end
-- set active_debugs
function set_active_debugs()
if not config.debug_list then return end
active_debugs = {}
-- all debug options imply version info
if config.debug_list[1] then
active_debugs.version = true
else
return
end
-- if 'all' is the first keyword, just activate all categories
if config.debug_list[1] == 'all' then
for deb in pairs(C.known_debugs) do
active_debugs[deb] = true end
return
end
-- activate options from the list
for _, deb in ipairs(config.debug_list) do
local deps = C.known_debugs[deb]
if deps then
active_debugs[deb] = true
for _, d in ipairs(deps) do active_debugs[d] = true end
else
err_print('warning', "Unknown debug category '"..deb.."'.")
end
end
end
end -- scope of active_debugs
-- if file is base..'.'..zip with zip in zipext_list, return: base, zip
-- otherwise, return: file, nil
function parse_zip(file)
local zip
for _, zip in ipairs(config.zipext_list) do
local l = #zip + 1
if string.sub(file, -l, -1) == '.'..zip then
return string.sub(file, 1, -l - 1), zip
end
end
return file, nil
end
-- print a usage message, with the proper 'active values' line
function print_usage(actions)
local usage_msg = C.usage_msg
-- get current settings
local default, files = {}, {}
for _, param in ipairs(C.usage_settings) do
local display = param[config[param.name]]
if config[param.name..'_src'] == 'def' then
table.insert(default, display)
elseif config[param.name..'_src'] == 'file' then
table.insert(files, display)
end
end
-- format and include them
def = table.concat(default, ', ')
conf = table.concat(files, ', ')
if not (def == '') then def = def..' (default)' end
if not (conf == '') then conf = conf..' (user config)' end
local sep = (def == '' or conf == '') and '' or '; '
local settings = C.usage_settings_ph..' '..def..sep..conf..'.'
usage_msg = usage_msg:gsub(C.usage_settings_ph, settings)
-- include actions if any
if actions then
usage_msg = usage_msg:gsub(C.actions_ph,
C.actions_ph .. actions .. '\n\n')
else
usage_msg = usage_msg:gsub(C.actions_ph, '')
end
-- finally print it
print(usage_msg)
end
return {
err_print = err_print,
deb_print = deb_print,
w32_path = w32_path,
parse_zip = parse_zip,
print_usage = print_usage,
path_parent = path_parent,
}
|