file-syn.lmt /size: 2194 b    last modification: 2024-01-16 10:22
1if not modules then modules = { } end modules ['file-syn'] = {
2    version   = 1.001,
3    comment   = "companion to file-syn.mkvi",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files"
7}
8
9
10environment.filesynonyms = environment.filesynonyms or { }
11local filesynonyms       = environment.filesynonyms
12
13local settings_to_array  = utilities.parsers.settings_to_array
14local findfile           = resolvers.findfile
15
16local implement          = interfaces.implement
17
18storage.register("environment/filesynonyms", filesynonyms, "environment.filesynonyms")
19
20local function truefilename(name)
21    local realname = filesynonyms[name] or name
22    if realname ~= name then
23        return truefilename(realname)
24    else
25        return realname
26    end
27end
28
29environment.truefilename = truefilename
30
31function environment.definefilesynonym(name,realname)
32    if name and realname then
33        local names = settings_to_array(name)
34        for i=1,#names do
35            local name    = names[i]
36            local synonym = filesynonyms[name]
37            if synonym then
38                interfaces.showmessage("files",1,{ name or "?", realname or "?", synonym or "?" })
39            end
40            filesynonyms[name] = realname
41        end
42    end
43end
44
45function environment.definefilefallback(name,alternatives)
46    if name and alternatives then
47        local names = settings_to_array(alternatives)
48        for i=1,#names do
49            local realname = findfile(names[i])
50            if realname ~= "" then
51                filesynonyms[name] = realname
52                break
53            end
54        end
55    end
56end
57
58implement {
59    name      = "truefilename",
60    public    = true,
61    actions   = { truefilename, context },
62    arguments = "argument"
63}
64
65implement {
66    name      = "definefilesynonym",
67    public    = true,
68    protected = true,
69    actions   = environment.definefilesynonym,
70    arguments = "2 optionals"
71}
72
73implement {
74    name      = "definefilefallback",
75    public    = true,
76    protected = true,
77    actions   = environment,definefilefallback,
78    arguments = "2 optionals"
79}
80