summaryrefslogtreecommitdiff
path: root/tex/context/base/file-res.lua
blob: d0db95f597350942b7c865c6d5b840fc11e6a9c9 (plain)
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
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 = 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

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