if not modules then modules = { } end modules ['supp-fil'] = { version = 1.001, comment = "companion to supp-fil.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } local format = string.format local isfile = lfs.isfile local trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end) local report_files = logs.reporter("files","readfile") resolvers.maxreadlevel = 2 directives.register("resolvers.maxreadlevel", function(v) resolvers.maxreadlevel = tonumber(v) or resolvers.maxreadlevel end) local finders, loaders, openers = resolvers.finders, resolvers.loaders, resolvers.openers local found = { } -- can best be done in the resolver itself local function readfilename(specification,backtrack,treetoo) local name = specification.filename local fnd = name and found[name] if not fnd then if isfile(name) then if trace_files then report_files("found local: %s",name) end fnd = name end if not fnd and backtrack then local fname = name for i=1,backtrack,1 do fname = "../" .. fname if isfile(fname) then if trace_files then report_files("found by backtracking: %s",fname) end fnd = fname break elseif trace_files then report_files("not found by backtracking: %s",fname) end end end if not fnd and treetoo then fnd = resolvers.findtexfile(name) or "" if trace_files then if fnd ~= "" then report_files("found by tree lookup: %s",fnd) else report_files("not found by tree lookup: %s",name) end end end found[name] = fnd elseif trace_files then if fnd ~= "" then report_files("already found: %s",fnd) else report_files("already not found: %s",name) end end return fnd or "" end --~ resolvers.readfilename = readfilename -- bonus use getreadfilename instead function finders.job(specification) return readfilename(specification,false, false) end -- current path, no backtracking function finders.loc(specification) return readfilename(specification,resolvers.maxreadlevel,false) end -- current path, backtracking function finders.sys(specification) return readfilename(specification,false, true ) end -- current path, obeys tex search function finders.fix(specification) return readfilename(specification,resolvers.maxreadlevel,false) end -- specified path, backtracking function finders.set(specification) return readfilename(specification,false, false) end -- specified path, no backtracking function finders.any(specification) return readfilename(specification,resolvers.maxreadlevel,true ) end -- loc job sys openers.job = openers.file loaders.job = loaders.file -- default anyway openers.loc = openers.file loaders.loc = loaders.file openers.sys = openers.file loaders.sys = loaders.file openers.fix = openers.file loaders.fix = loaders.file openers.set = openers.file loaders.set = loaders.file openers.any = openers.file loaders.any = loaders.file function getreadfilename(scheme,path,name) -- better do a split and then pass table local fullname if url.hasscheme(name) then fullname = name else fullname = ((path == "") and format("%s:///%s",scheme,name)) or format("%s:///%s/%s",scheme,path,name) end --~ print(">>>",fullname) return resolvers.findtexfile(fullname) or "" -- can be more direct end resolvers.getreadfilename = getreadfilename function commands.getreadfilename(scheme,path,name) context(getreadfilename(scheme,path,name)) end -- a name belonging to the run but also honoring qualified function commands.locfilename(name) context(getreadfilename("loc",".",name)) end function commands.doiflocfileelse(name) commands.doifelse(isfile(getreadfilename("loc",".",name))) end