summaryrefslogtreecommitdiff
path: root/tex/context/base/data-res.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/data-res.lua')
-rw-r--r--tex/context/base/data-res.lua149
1 files changed, 80 insertions, 69 deletions
diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua
index 8e3428b2f..d45597093 100644
--- a/tex/context/base/data-res.lua
+++ b/tex/context/base/data-res.lua
@@ -56,7 +56,6 @@ local formats = resolvers.formats
local suffixes = resolvers.suffixes
local dangerous = resolvers.dangerous
local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
@@ -68,7 +67,6 @@ function resolvers.newinstance()
local newinstance = {
progname = 'context',
engine = 'luatex',
- format = '',
environment = allocate(),
variables = allocate(),
expansions = allocate(),
@@ -88,7 +86,6 @@ function resolvers.newinstance()
renewcache = false,
loaderror = false,
savelists = true,
- allresults = false,
pattern = nil, -- lists
force_suffixes = true,
}
@@ -175,7 +172,8 @@ end
local function entry(entries,name)
if name and name ~= "" then
name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
+ -- local result = entries[name..'.'..instance.progname] or entries[name]
+ local result = entries[instance.progname .. '.' .. name] or entries[name]
if result then
return result
else
@@ -193,7 +191,8 @@ end
local function is_entry(entries,name)
if name and name ~= "" then
name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+ -- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+ return (entries[instance.progname .. '.' .. name] or entries[name]) ~= nil
else
return false
end
@@ -254,19 +253,28 @@ local function load_configuration_files()
end
-- flattening is easier to deal with as we need to collapse
local t = { }
- for k, v in next, data do -- v = progname
+ for k, v in next, data do -- k = progname or setter or variables
if v ~= unset_variable then
local kind = type(v)
if kind == "string" then
+ -- still supported, but preferably use the variables subtable
t[k] = v
elseif kind == "table" then
- -- this operates on the table directly
- initializesetter(filename,k,v)
- -- this doesn't (maybe metatables some day)
- for kk, vv in next, v do -- vv = variable
- if vv ~= unset_variable then
- if type(vv) == "string" then
- t[kk.."."..k] = vv
+ if initializesetter(filename,k,v) then
+ -- directives, experiments, trackers, ...
+ else
+ for kk, vv in next, v do -- vv = variable
+ if vv ~= unset_variable then
+ if type(vv) == "string" then
+ -- t[kk.."."..k] = vv
+ if k == "variables" then
+ -- special table, shared variables can be grouped
+ t[kk] = vv
+ else
+ -- category.variable (progname)
+ t[k .. "." .. kk] = vv
+ end
+ end
end
end
end
@@ -536,12 +544,12 @@ function resolvers.expandvariables()
if engine ~= "" then environment['engine'] = engine end
if progname ~= "" then environment['progname'] = progname end
for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
+ -- local a, b = match(k,"^(%a+)%_(.*)%s*$") -- too many vars have an _ in the name
+ -- if a and b then -- so let's forget about it; it was a
+ -- expansions[a..'.'..b] = v -- hack anyway for linux and not needed
+ -- else -- anymore as we now have directives
expansions[k] = v
- end
+ -- end
end
for k,v in next, environment do -- move environment to expansions (variables are already in there)
if not expansions[k] then expansions[k] = v end
@@ -595,7 +603,7 @@ function resolvers.unexpandedpathlist(str)
end
function resolvers.unexpandedpath(str)
- return file.joinpath(resolvers.unexpandedpath_list(str))
+ return file.joinpath(resolvers.unexpandedpathlist(str))
end
local done = { }
@@ -856,13 +864,14 @@ local function can_be_dir(name) -- can become local
return fakepaths[name] == 1
end
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
+local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc)
+ local result = { }
local stamp = nil
+ askedformat = askedformat or ""
filename = collapsepath(filename)
-- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.remember and not allresults then
+ stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. askedformat
if instance.found[stamp] then
if trace_locating then
report_resolvers("remembering file '%s'",filename)
@@ -871,12 +880,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
return instance.found[stamp]
end
end
- if not dangerous[instance.format or "?"] then
+ if not dangerous[askedformat] then
if resolvers.isreadable.file(filename) then
if trace_detail then
report_resolvers("file '%s' found directly",filename)
end
- instance.found[stamp] = { filename }
+ if stamp then
+ instance.found[stamp] = { filename }
+ end
return { filename }
end
end
@@ -884,7 +895,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if trace_locating then
report_resolvers("checking wildcard '%s'", filename)
end
- result = resolvers.findwildcardfiles(filename)
+ result = resolvers.findwildcardfiles(filename) -- we can use th elocal
elseif file.is_qualified_path(filename) then
if resolvers.isreadable.file(filename) then
if trace_locating then
@@ -894,7 +905,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
else
local forcedname, ok, suffix = "", false, fileextname(filename)
if suffix == "" then -- why
- local format_suffixes = instance.format == "" and resolvers.defaultsuffixes or suffixes[instance.format]
+ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
local s = format_suffixes[i]
@@ -914,21 +925,22 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
-- matching last part of the name
local basename = filebasename(filename)
local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
+ -- messy .. to be sorted out
+ local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- instance.format = resolvers.formatofsuffix(suffix)
+ askedformat = resolvers.formatofsuffix(suffix)
end
if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ askedformat = "othertextfiles" -- kind of everything, maybe texinput is better
end
--
if basename ~= filename then
- local resolved = collect_instance_files(basename)
+ local resolved = collect_instance_files(basename,askedformat,allresults)
if #result == 0 then
local lowered = lower(basename)
if filename ~= lowered then
- resolved = collect_instance_files(lowered)
+ resolved = collect_instance_files(lowered,askedformat,allresults)
end
end
resolvers.format = savedformat
@@ -970,7 +982,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
else
wantedfiles[#wantedfiles+1] = filename
end
- if instance.format == "" then
+ if askedformat == "" then
if ext == "" or not suffixmap[ext] then
local defaultsuffixes = resolvers.defaultsuffixes
for i=1,#defaultsuffixes do
@@ -989,14 +1001,14 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
else
if ext == "" or not suffixmap[ext] then
- local format_suffixes = suffixes[instance.format]
+ local format_suffixes = suffixes[askedformat]
if format_suffixes then
for i=1,#format_suffixes do
wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
end
end
end
- filetype = instance.format
+ filetype = askedformat
if trace_locating then
report_resolvers("using given filetype '%s'",filetype)
end
@@ -1067,7 +1079,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
--- todo, test for readable
result[#result+1] = fl[3]
done = true
- if instance.allresults then
+ if allresults then
if trace_detail then
report_resolvers("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
end
@@ -1098,7 +1110,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
result[#result+1] = fname
done = true
- if not instance.allresults then break end
+ if not allresults then break end
end
end
else
@@ -1110,7 +1122,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if not done and doscan then
-- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
end
- if done and not instance.allresults then break end
+ if done and not allresults then break end
end
end
end
@@ -1119,7 +1131,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
result[k] = rk
resolvers.registerintrees(rk) -- for tracing used files
end
- if instance.remember then
+ if stamp then
instance.found[stamp] = result
end
return result
@@ -1128,37 +1140,30 @@ end
resolvers.concatinators.tex = filejoin
resolvers.concatinators.file = resolvers.concatinators.tex
-function resolvers.findfiles(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
+local function findfiles(filename,filetype,allresults)
+ local result = collect_instance_files(filename,filetype or "",allresults)
if #result == 0 then
local lowered = lower(filename)
if filename ~= lowered then
- return collect_instance_files(lowered)
+ return collect_instance_files(lowered,filetype or "",allresults)
end
end
- instance.format = ''
return result
end
-function resolvers.findfile(filename,filetype,mustexist)
- return (resolvers.findfiles(filename,filetype,mustexist)[1] or "")
+function resolvers.findfiles(filename,filetype)
+ return findfiles(filename,filetype,true)
+end
+
+function resolvers.findfile(filename,filetype)
+ return findfiles(filename,filetype,false)[1] or ""
end
function resolvers.findpath(filename,filetype)
- local path = resolvers.findfiles(filename,filetype)[1] or ""
- -- todo return current path
- return file.dirname(path)
+ return file.dirname(findfiles(filename,filetype,false)[1] or "")
end
-function resolvers.findgivenfiles(filename)
+local function findgivenfiles(filename,allresults)
local bname, result = filebasename(filename), { }
local hashes = instance.hashes
for k=1,#hashes do
@@ -1176,12 +1181,12 @@ function resolvers.findgivenfiles(filename)
if blist then
if type(blist) == 'string' then
result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
+ if not allresults then break end
else
for kk=1,#blist do
local vv = blist[kk]
result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
+ if not allresults then break end
end
end
end
@@ -1189,8 +1194,12 @@ function resolvers.findgivenfiles(filename)
return result
end
+function resolvers.findgivenfiles(filename)
+ return findgivenfiles(filename,true)
+end
+
function resolvers.findgivenfile(filename)
- return (resolvers.findgivenfiles(filename)[1] or "")
+ return findgivenfiles(filename,false)[1] or ""
end
local function doit(path,blist,bname,tag,kind,result,allresults)
@@ -1216,7 +1225,7 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
-function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg
+local function findwildcardfiles(filename,allresults) -- todo: remap: and lpeg
local result = { }
local bname, dname = filebasename(filename), filedirname(filename)
local path = gsub(dname,"^*/","")
@@ -1230,7 +1239,7 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg
name = gsub(name,"-","%%-")
path = lower(path)
name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
+ local files, done = instance.files, false
if find(name,"%*") then
local hashes = instance.hashes
for k=1,#hashes do
@@ -1259,8 +1268,12 @@ function resolvers.findwildcardfiles(filename) -- todo: remap: and lpeg
return result
end
+function resolvers.findwildcardfiles(filename)
+ return findwildcardfiles(filename,true)
+end
+
function resolvers.findwildcardfile(filename)
- return (resolvers.findwildcardfiles(filename)[1] or "")
+ return findwildcardfiles(filename,false)[1] or ""
end
-- main user functions
@@ -1292,14 +1305,14 @@ local function report(str)
end
end
-function resolvers.dowithfilesandreport(command, files, filetype, mustexist)
+function resolvers.dowithfilesandreport(command, files, ...)
if files and #files > 0 then
if trace_locating then
report('') -- ?
end
for f=1,#files do
local file = files[f]
- local result = command(file,filetype,mustexist)
+ local result = command(file,...)
if type(result) == 'string' then
report(result)
else
@@ -1321,9 +1334,7 @@ function resolvers.showpath(str) -- output search path for file type NAME
end
-- resolvers.findfile(filename)
--- resolvers.findfile(filename, filetype, mustexist)
--- resolvers.findfile(filename, mustexist)
--- resolvers.findfile(filename, filetype)
+-- resolvers.findfile(filename, f.iletype)
function resolvers.registerfile(files, name, path)
if files[name] then
@@ -1352,7 +1363,7 @@ function resolvers.locateformat(name)
local barename = gsub(name,"%.%a+$","")
local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or ""
if fmtname == "" then
- fmtname = resolvers.findfiles(barename..".fmt")[1] or ""
+ fmtname = resolvers.findfile(barename..".fmt")
fmtname = resolvers.cleanpath(fmtname)
end
if fmtname ~= "" then