diff options
Diffstat (limited to 'tex/context/base/file-res.lua')
-rw-r--r-- | tex/context/base/file-res.lua | 310 |
1 files changed, 155 insertions, 155 deletions
diff --git a/tex/context/base/file-res.lua b/tex/context/base/file-res.lua index 8e65ba4c7..6eb8667d6 100644 --- a/tex/context/base/file-res.lua +++ b/tex/context/base/file-res.lua @@ -1,155 +1,155 @@ -if not modules then modules = { } end modules ['file-res'] = { - 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 is_qualified_path = file.is_qualified_path -local hasscheme = url.hasscheme - -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 - local names - local suffix = file.suffix(name) - if suffix ~= "" then - names = { name } - else - local defaultsuffixes = resolvers.defaultsuffixes - names = { } - for i=1,#defaultsuffixes do - names[i] = name .. "." .. defaultsuffixes[i] - end - if trace_files then - report_files("locating: %s, using default suffixes: %a",name,defaultsuffixes) - end - end - for i=1,#names do - local fname = names[i] - if isfile(fname) then - if trace_files then - report_files("found local: %s",name) - end - fnd = fname - break - end - end - if not fnd and backtrack then - for i=1,#names do - local fname = names[i] - 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 - if fnd then - break - end - end - end - if not fnd then - local paths = resolvers.instance.extra_paths - if paths then - for i=1,#paths do - for i=1,#names do - local fname = paths[i] .. "/" .. names[i] - if isfile(fname) then - if trace_files then - report_files("found on extra path: %s",fname) - end - fnd = fname - break - end - end - if fnd then - break - end - 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 hasscheme(name) or is_qualified_path(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 +if not modules then modules = { } end modules ['file-res'] = {
+ 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 is_qualified_path = file.is_qualified_path
+local hasscheme = url.hasscheme
+
+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
+ local names
+ local suffix = file.suffix(name)
+ if suffix ~= "" then
+ names = { name }
+ else
+ local defaultsuffixes = resolvers.defaultsuffixes
+ names = { }
+ for i=1,#defaultsuffixes do
+ names[i] = name .. "." .. defaultsuffixes[i]
+ end
+ if trace_files then
+ report_files("locating: %s, using default suffixes: %a",name,defaultsuffixes)
+ end
+ end
+ for i=1,#names do
+ local fname = names[i]
+ if isfile(fname) then
+ if trace_files then
+ report_files("found local: %s",name)
+ end
+ fnd = fname
+ break
+ end
+ end
+ if not fnd and backtrack then
+ for i=1,#names do
+ local fname = names[i]
+ 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
+ if fnd then
+ break
+ end
+ end
+ end
+ if not fnd then
+ local paths = resolvers.instance.extra_paths
+ if paths then
+ for i=1,#paths do
+ for i=1,#names do
+ local fname = paths[i] .. "/" .. names[i]
+ if isfile(fname) then
+ if trace_files then
+ report_files("found on extra path: %s",fname)
+ end
+ fnd = fname
+ break
+ end
+ end
+ if fnd then
+ break
+ end
+ 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 hasscheme(name) or is_qualified_path(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
|