summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/texdoc/functions.tlu
blob: f1ff54eca0b4a069889d56565260b052ea18ea8c (plain)
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,
}