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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
if not modules then modules = { } end modules ['back-ini'] = {
version = 1.001,
comment = "companion to back-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
local next, type = next, type
local format = string.format
backends = backends or { }
local backends = backends
local context = context
local trace = false trackers.register("backend", function(v) trace = v end)
local report = logs.reporter("backend")
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
local setaction = nodes.tasks.setaction
local implement = interfaces.implement
local variables = interfaces.variables
local texset = tex.set
local nodeinjections = { }
local codeinjections = { }
local registrations = { }
local tables = allocate()
local function nothing()
return nil
end
backends.nothing = nothing
local function donothing(t,k)
t[k] = nothing
return nothing
end
setmetatableindex(nodeinjections, donothing)
setmetatableindex(codeinjections, donothing)
setmetatableindex(registrations, donothing)
local defaults = {
nodeinjections = nodeinjections,
codeinjections = codeinjections,
registrations = registrations,
tables = tables,
}
backends.defaults = defaults
backends.nodeinjections = { } setmetatableindex(backends.nodeinjections, nodeinjections)
backends.codeinjections = { } setmetatableindex(backends.codeinjections, codeinjections)
backends.registrations = { } setmetatableindex(backends.registrations, registrations)
backends.tables = { } setmetatableindex(backends.tables, tables)
backends.current = "unknown"
function backends.install(what)
if type(what) == "string" then
local backend = backends[what]
if backend then
if trace then
if backend.comment then
report("initializing backend %a, %a",what,backend.comment)
else
report("initializing backend %a",what)
end
end
backends.current = what
for category, default in next, defaults do
local target = backends[category]
local plugin = backend [category]
setmetatableindex(plugin, default)
setmetatableindex(target, plugin)
end
elseif trace then
report("no backend named %a",what)
end
end
end
statistics.register("used backend", function()
local bc = backends.current
if bc ~= "unknown" then
return format("%s (%s)",bc,backends[bc].comment or "no comment")
else
return nil
end
end)
-- can best be here
interfaces.implement {
name = "setrealspaces",
arguments = "string",
actions = function(v)
setaction("shipouts","nodes.handlers.accessibility",v == variables.yes)
end
}
-- moved to here
local included = table.setmetatableindex( {
context = true,
id = true,
metadata = true,
date = true,
id = true,
pdf = true,
}, function(t,k)
return true
end)
backends.included = included
-- could also be codeinjections
function backends.getcallbackstate()
return { count = status.late_callbacks or 0 }
end
|