1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
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
|