1if not modules then modules = { } end modules ['data-met'] = {
2 version = 1.100,
3 comment = "companion to luat-lib.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9local type = type
10local find = string.find
11local addurlscheme, urlhashed = url.addscheme, url.hashed
12local collapsepath, joinfile = file.collapsepath, file.join
13
14local report_methods = logs.reporter("resolvers","methods")
15
16local trace_locating = false
17local trace_methods = false
18
19trackers.register("resolvers.locating", function(v) trace_methods = v end)
20trackers.register("resolvers.methods", function(v) trace_methods = v end)
21
22local allocate = utilities.storage.allocate
23local resolvers = resolvers
24
25local registered = { }
26
27local function splitmethod(filename)
28 if not filename then
29 return {
30 scheme = "unknown",
31 original = filename,
32 }
33 end
34 if type(filename) == "table" then
35 return filename
36 end
37 filename = collapsepath(filename,".")
38 if not find(filename,"://",1,true) then
39 return {
40 scheme = "file",
41 path = filename,
42 original = filename,
43 filename = filename,
44 }
45 end
46 local specification = urlhashed(filename)
47 if not specification.scheme or specification.scheme == "" then
48 return {
49 scheme = "file",
50 path = filename,
51 original = filename,
52 filename = filename,
53 }
54 else
55 return specification
56 end
57end
58
59
60
61
62
63
64
65
66
67
68
69resolvers.splitmethod = splitmethod
70
71
72
73
74local function methodhandler(what,first,...)
75 local method = registered[what]
76 if method then
77 local how = method.how
78 local namespace = method.namespace
79 if how == "uri" or how == "url" then
80 local specification = splitmethod(first)
81 local scheme = specification.scheme
82 local resolver = namespace and namespace[scheme]
83 if resolver then
84 if trace_methods then
85 report_methods("resolving, method %a, how %a, handler %a, argument %a",what,how,scheme,first)
86 end
87 return resolver(specification,...)
88 else
89 resolver = namespace.default or namespace.file
90 if resolver then
91 if trace_methods then
92 report_methods("resolving, method %a, how %a, handler %a, argument %a",what,how,"default",first)
93 end
94 return resolver(specification,...)
95 elseif trace_methods then
96 report_methods("resolving, method %a, how %a, handler %a, argument %a",what,how,"unset")
97 end
98 end
99 elseif how == "tag" then
100 local resolver = namespace and namespace[first]
101 if resolver then
102 if trace_methods then
103 report_methods("resolving, method %a, how %a, tag %a",what,how,first)
104 end
105 return resolver(...)
106 else
107 resolver = namespace.default or namespace.file
108 if resolver then
109 if trace_methods then
110 report_methods("resolving, method %a, how %a, tag %a",what,how,"default")
111 end
112 return resolver(...)
113 elseif trace_methods then
114 report_methods("resolving, method %a, how %a, tag %a",what,how,"unset")
115 end
116 end
117 end
118 else
119 report_methods("resolving, invalid method %a")
120 end
121end
122
123resolvers.methodhandler = methodhandler
124
125function resolvers.registermethod(name,namespace,how)
126 registered[name] = {
127 how = how or "tag",
128 namespace = namespace
129 }
130 namespace["byscheme"] = function(scheme,filename,...)
131 if scheme == "file" then
132 return methodhandler(name,filename,...)
133 else
134 return methodhandler(name,addurlscheme(filename,scheme),...)
135 end
136 end
137end
138
139local concatinators = allocate { notfound = joinfile }
140local locators = allocate { notfound = function() end }
141local hashers = allocate { notfound = function() end }
142local generators = allocate { notfound = function() end }
143
144resolvers.concatinators = concatinators
145resolvers.locators = locators
146resolvers.hashers = hashers
147resolvers.generators = generators
148
149local registermethod = resolvers.registermethod
150
151registermethod("concatinators",concatinators,"tag")
152registermethod("locators", locators, "uri")
153registermethod("hashers", hashers, "uri")
154registermethod("generators", generators, "uri")
155 |