summaryrefslogtreecommitdiff
path: root/tex/context/base/file-lib.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/file-lib.lua')
-rw-r--r--tex/context/base/file-lib.lua89
1 files changed, 37 insertions, 52 deletions
diff --git a/tex/context/base/file-lib.lua b/tex/context/base/file-lib.lua
index 409559cd3..7489a317b 100644
--- a/tex/context/base/file-lib.lua
+++ b/tex/context/base/file-lib.lua
@@ -11,8 +11,16 @@ if not modules then modules = { } end modules ['file-lib'] = {
local format = string.format
-local trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end)
-local report_files = logs.reporter("files","readfile")
+local trace_libraries = false trackers.register("resolvers.libraries", function(v) trace_libraries = v end)
+----- trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end)
+
+local report_library = logs.reporter("files","library")
+----- report_files = logs.reporter("files","readfile")
+
+local suffixonly = file.suffix
+local removesuffix = file.removesuffix
+
+local getreadfilename = resolvers.getreadfilename
local loaded = { }
local defaultpatterns = { "%s" }
@@ -25,45 +33,6 @@ local function defaultfailure(name)
report_files("asked name %a, not found",name)
end
--- function commands.uselibrary(specification) -- todo; reporter
--- local name = specification.name
--- if name and name ~= "" then
--- local patterns = specification.patterns or defaultpatterns
--- local action = specification.action or defaultaction
--- local failure = specification.failure or defaultfailure
--- local onlyonce = specification.onlyonce
--- local files = utilities.parsers.settings_to_array(name)
--- local truename = environment.truefilename
--- local done = false
--- for i=1,#files do
--- local filename = files[i]
--- if not loaded[filename] then
--- if onlyonce then
--- loaded[filename] = true -- todo: base this on return value
--- end
--- for i=1,#patterns do
--- local somename = format(patterns[i],filename)
--- if truename then
--- somename = truename(somename)
--- end
--- local foundname = resolvers.getreadfilename("any",".",somename) or ""
--- if foundname ~= "" then
--- action(name,foundname)
--- done = true
--- break
--- end
--- end
--- if done then
--- break
--- end
--- end
--- end
--- if failure and not done then
--- failure(name)
--- end
--- end
--- end
-
function commands.uselibrary(specification) -- todo: reporter
local name = specification.name
if name and name ~= "" then
@@ -73,6 +42,11 @@ function commands.uselibrary(specification) -- todo: reporter
local onlyonce = specification.onlyonce
local files = utilities.parsers.settings_to_array(name)
local truename = environment.truefilename
+ local function found(filename)
+ local somename = truename and truename(filename) or filename
+ local foundname = getreadfilename("any",".",somename)
+ return foundname ~= "" and foundname
+ end
for i=1,#files do
local filename = files[i]
if loaded[filename] then
@@ -81,20 +55,31 @@ function commands.uselibrary(specification) -- todo: reporter
if onlyonce then
loaded[filename] = true -- todo: base this on return value
end
- local done = false
- for i=1,#patterns do
- local somename = format(patterns[i],filename)
- if truename then
- somename = truename(somename)
+ local foundname = nil
+ local barename = removesuffix(filename)
+ -- direct search (we have an explicit suffix)
+ if barename ~= filename then
+ foundname = found(filename)
+ if trace_libraries then
+ report_library("checking %a: %s",filename,foundname or "not found")
end
- local foundname = resolvers.getreadfilename("any",".",somename) or ""
- if foundname ~= "" then
- action(name,foundname)
- done = true
- break
+ end
+ if not foundname then
+ -- pattern based search
+ for i=1,#patterns do
+ local wanted = format(patterns[i],barename)
+ foundname = found(wanted)
+ if trace_libraries then
+ report_library("checking %a as %a: %s",filename,wanted,foundname or "not found")
+ end
+ if foundname then
+ break
+ end
end
end
- if failure and not done then
+ if foundname then
+ action(name,foundname)
+ elseif failure then
failure(name)
end
end