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 {
33 core = {
34 ofm = {
35 names = { "ofm", "omega font metric", "omega font metrics" },
36 variable = 'OFMFONTS',
37 suffixes = { 'ofm', 'tfm' },
38 },
39 ovf = {
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 = {
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" },
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 = {
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
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()
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
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
275end
276
277
278
279
280
281dangerous.tex = nil
282
283
284
285
286
287function resolvers.formatofvariable(str)
288 return formats[str] or ''
289end
290
291function resolvers.formatofsuffix(str)
292 return suffixmap[suffixonly(str)] or 'tex'
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 |