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,
}
|