data-env.lua /size: 9501 b    last modification: 2021-10-28 13:50
1if not modules then modules = { } end modules ['data-env'] = {
2    version   = 1.001,
3    comment   = "companion to luat-lib.mkiv",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files",
7}
8
9local lower, gsub = string.lower, string.gsub
10local next, rawget = next, rawget
11
12local resolvers = resolvers
13
14local allocate          = utilities.storage.allocate
15local setmetatableindex = table.setmetatableindex
16local suffixonly        = file.suffixonly
17
18local formats           = allocate()
19local suffixes          = allocate()
20local dangerous         = allocate()
21local suffixmap         = allocate()
22local usertypes         = allocate()
23
24resolvers.formats       = formats
25resolvers.suffixes      = suffixes
26resolvers.dangerous     = dangerous
27resolvers.suffixmap     = suffixmap
28resolvers.usertypes     = usertypes
29
30local luasuffixes       = utilities.lua.suffixes
31
32local relations = allocate { -- todo: handlers also here
33    core = {
34        ofm = { -- will become obsolete
35            names    = { "ofm", "omega font metric", "omega font metrics" },
36            variable = 'OFMFONTS',
37            suffixes = { 'ofm', 'tfm' },
38        },
39        ovf = { -- will become obsolete
40            names    = { "ovf", "omega virtual font", "omega virtual fonts" },
41            variable = 'OVFFONTS',
42            suffixes = { 'ovf', 'vf' },
43        },
44        tfm = {
45            names    = { "tfm", "tex font metric", "tex font metrics" },
46            variable = 'TFMFONTS',
47            suffixes = { 'tfm' },
48        },
49        vf = {
50            names    = { "vf", "virtual font", "virtual fonts" },
51            variable = 'VFFONTS',
52            suffixes = { 'vf' },
53        },
54        otf = {
55            names    = { "otf", "opentype", "opentype font", "opentype fonts"},
56            variable = 'OPENTYPEFONTS',
57            suffixes = { 'otf' },
58        },
59        ttf = {
60            names    = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" },
61            variable = 'TTFONTS',
62            suffixes = { 'ttf', 'ttc', 'dfont' },
63        },
64        afm = {
65            names    = { "afm", "adobe font metric", "adobe font metrics" },
66            variable = "AFMFONTS",
67            suffixes = { "afm" },
68        },
69        pfb = {
70            names    = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" },
71            variable = 'T1FONTS',
72            suffixes = { 'pfb', 'pfa' },
73        },
74        fea = {
75            names    = { "fea", "font feature", "font features", "font feature file", "font feature files" },
76            variable = 'FONTFEATURES',
77            suffixes = { 'fea' },
78        },
79        cid = {
80            names    = { "cid", "cid map", "cid maps", "cid file", "cid files" },
81            variable = 'FONTCIDMAPS',
82            suffixes = { 'cid', 'cidmap' },
83        },
84        fmt = {
85            names    = { "fmt", "format", "tex format" },
86            variable = 'TEXFORMATS',
87            suffixes = { 'fmt' },
88        },
89        mem = { -- will become obsolete
90            names    = { 'mem', "metapost format" },
91            variable = 'MPMEMS',
92            suffixes = { 'mem' },
93        },
94        mp = {
95            names    = { "mp" },
96            variable = 'MPINPUTS',
97            suffixes = CONTEXTLMTXMODE > 0
98                and { 'mp', 'mpxl', 'mpvi', 'mpiv', 'mpii' }
99                or  { 'mp',         'mpvi', 'mpiv', 'mpii' },
100            usertype = true,
101        },
102        tex = {
103            names    = { "tex" },
104            variable = 'TEXINPUTS',
105            suffixes = { "tex", "mkiv", "mkvi", "mkxl", "mklx", "mkii", "cld", "lfg", "xml" }, -- known suffixes have less lookups
106            usertype = true,
107        },
108        icc = {
109            names    = { "icc", "icc profile", "icc profiles" },
110            variable = 'ICCPROFILES',
111            suffixes = { 'icc' },
112        },
113        texmfscripts = {
114            names    = { "texmfscript", "texmfscripts", "script", "scripts" },
115            variable = 'TEXMFSCRIPTS',
116            suffixes = { 'lua', 'rb', 'pl', 'py' },
117        },
118        lua = {
119            names    = { "lua" },
120            variable = 'LUAINPUTS',
121            suffixes = { luasuffixes.lua, luasuffixes.luc, luasuffixes.tma, luasuffixes.tmc },
122            usertype = true,
123        },
124        lib = {
125            names    = { "lib" },
126            variable = 'CLUAINPUTS',
127            suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' },
128        },
129        bib = {
130            names    = { 'bib' },
131            variable = 'BIBINPUTS',
132            suffixes = { 'bib' },
133            usertype = true,
134        },
135        bst = {
136            names    = { 'bst' },
137            variable = 'BSTINPUTS',
138            suffixes = { 'bst' },
139            usertype = true,
140        },
141        fontconfig = {
142            names    = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
143            variable = 'FONTCONFIG_PATH',
144        },
145        pk = {
146            names    = { "pk" },
147            variable = 'PKFONTS',
148            suffixes = { 'pk' },
149        },
150    },
151    obsolete = {
152        enc = {
153            names    = { "enc", "enc files", "enc file", "encoding files", "encoding file" },
154            variable = 'ENCFONTS',
155            suffixes = { 'enc' },
156        },
157        map = {
158            names    = { "map", "map files", "map file" },
159            variable = 'TEXFONTMAPS',
160            suffixes = { 'map' },
161        },
162        lig = {
163            names    = { "lig files", "lig file", "ligature file", "ligature files" },
164            variable = 'LIGFONTS',
165            suffixes = { 'lig' },
166        },
167        opl = {
168            names    = { "opl" },
169            variable = 'OPLFONTS',
170            suffixes = { 'opl' },
171        },
172        ovp = {
173            names    = { "ovp" },
174            variable = 'OVPFONTS',
175            suffixes = { 'ovp' },
176        },
177    },
178    kpse = { -- subset
179        base = {
180            names    = { 'base', "metafont format" },
181            variable = 'MFBASES',
182            suffixes = { 'base', 'bas' },
183        },
184        cmap = {
185            names    = { 'cmap', 'cmap files', 'cmap file' },
186            variable = 'CMAPFONTS',
187            suffixes = { 'cmap' },
188        },
189        cnf = {
190            names    = { 'cnf' },
191            suffixes = { 'cnf' },
192        },
193        web = {
194            names    = { 'web' },
195            suffixes = { 'web', 'ch' }
196        },
197        cweb = {
198            names    = { 'cweb' },
199            suffixes = { 'w', 'web', 'ch' },
200        },
201        gf = {
202            names    = { 'gf' },
203            suffixes = { '<resolution>gf' },
204        },
205        mf = {
206            names    = { 'mf' },
207            variable = 'MFINPUTS',
208            suffixes = { 'mf' },
209        },
210        mft = {
211            names    = { 'mft' },
212            suffixes = { 'mft' },
213        },
214        pk = {
215            names    = { 'pk' },
216            suffixes = { '<resolution>pk' },
217        },
218    },
219}
220
221resolvers.relations = relations
222
223-- formats: maps a format onto a variable
224
225function resolvers.updaterelations()
226    for category, categories in next, relations do
227        for name, relation in next, categories do
228            local rn = relation.names
229            local rv = relation.variable
230            if rn and rv then
231                local rs = relation.suffixes
232                local ru = relation.usertype
233                for i=1,#rn do
234                    local rni = lower(gsub(rn[i]," ",""))
235                    formats[rni] = rv
236                    if rs then
237                        suffixes[rni] = rs
238                        for i=1,#rs do
239                            local rsi = rs[i]
240                            suffixmap[rsi] = rni
241                        end
242                    end
243                end
244                if ru then
245                    usertypes[name] = true
246                end
247            end
248        end
249    end
250end
251
252resolvers.updaterelations() -- push this in the metatable -> newindex
253
254local function simplified(t,k)
255    return k and rawget(t,lower(gsub(k," ",""))) or nil
256end
257
258setmetatableindex(formats,   simplified)
259setmetatableindex(suffixes,  simplified)
260setmetatableindex(suffixmap, simplified)
261
262-- A few accessors, mostly for command line tool.
263
264function resolvers.suffixofformat(str)
265    local s = suffixes[str]
266    return s and s[1] or ""
267end
268
269function resolvers.suffixofformat(str)
270    return suffixes[str] or { }
271end
272
273for name, format in next, formats do
274    dangerous[name] = true -- still needed ?
275end
276
277-- because vf searching is somewhat dangerous, we want to prevent
278-- too liberal searching esp because we do a lookup on the current
279-- path anyway; only tex (or any) is safe
280
281dangerous.tex = nil
282
283--~ print(table.serialize(dangerous))
284
285-- more helpers
286
287function resolvers.formatofvariable(str)
288    return formats[str] or ''
289end
290
291function resolvers.formatofsuffix(str) -- of file
292    return suffixmap[suffixonly(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc)
293end
294
295function resolvers.variableofformat(str)
296    return formats[str] or ''
297end
298
299function resolvers.variableofformatorsuffix(str)
300    local v = formats[str]
301    if v then
302        return v
303    end
304    v = suffixmap[suffixonly(str)]
305    if v then
306        return formats[v]
307    end
308    return ''
309end
310
311