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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
%D \module
%D [ file=s-system-tokens.mkxl,
%D version=2020.06.02,
%D title=\CONTEXT\ Style File,
%D subtitle=System Tokens Checking,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
%D This file is for Wolfgang and Hans and it's used in the transition from \MKIV\
%D to the more robust \LMTX.
% todo: \permanent\protected\let\select\directselect : same value (add ref)
% todo: when mutable, remove immutable
\startmodule[system-macros]
\continueifinputfile{s-system-macros.mkxl}
\usemodule[article-basic] \setuplayout[tight] \setupbodyfont[7pt,tt]
\setuppapersize
[A4,landscape]
[A4,landscape]
\starttext
\startluacode
local context = context
local ctx_NC = context.NC
local ctx_NR = context.NR
local ctx_bold = context.bold
local find = string.find
local gsub = string.gsub
local create = token.create
local crap = "[$>%|%&%#" .. string.char(0xEF) .. "]"
local basefile = resolvers.findfile("context.mkxl")
local swapnames = { }
local pattern = file.join(file.pathpart(basefile),"/*.mk*")
local filenames = dir.glob(pattern)
for i=1,#filenames do
swapnames[file.basename(filenames[i])] = true
end
local pattern = file.join(file.pathpart(basefile),"/*.l**")
local filenames = dir.glob(pattern)
for i=1,#filenames do
swapnames[file.basename(filenames[i])] = true
end
local hashnames = table.setmetatableindex(function(t,k)
local s = file.suffix(k)
local v = k
if s == "mkiv" then
local n = file.replacesuffix(k,"mkxl")
if swapnames[n] then
v = n
end
elseif s == "mkvi" then
local n = file.replacesuffix(k,"mklx")
if swapnames[n] then
v = n
end
elseif s == "lua" then
local n = file.replacesuffix(k,"lmt")
if swapnames[n] then
v = n
end
end
t[k] = v
return v
end)
require("mtx-interface")
local data = scripts.interface.editor("data")
local files = data and data.common and data.common.filenames or { }
local okay = 0
local list = tex.hashtokens()
table.sort(list)
local function show(check)
-- context.starttabulate { "|l|l|l|lj2|l|l|l|l|l|l|l|l|" }
context.starttabulate { "|l|l|l|lj2|l|l|l|l|l|l|l|" }
for i=1,#list do
local k = list[i]
if check(k) then
local v = create(k)
local frozen = v.frozen and "frozen"
local permanent = v.permanent and "permanent"
local immutable = v.immutable and "immutable"
local primitive = v.primitive and "primitive"
local mutable = v.mutable and "mutable"
-- local tolerant = v.tolerant and "tolerant"
local noaligned = v.noaligned and "noaligned"
local instance = v.instance and "instance"
local parameters = v.parameters or 0
local dealtwith = mutable or immutable or frozen or permanent or primitive -- beware: we can have combinations
local cscommand = gsub(v.cmdname or "","_"," ")
local whatever = find(k,"^[a-z][a-z][a-z]+_")
local filename = files[k]
local csname = context.escape(k)
ctx_NC() if dealtwith then context("+") elseif whatever then context("-") elseif instance then context("!")end
ctx_NC() if primitive then ctx_bold(csname) else context(csname) end
ctx_NC() if parameters > 0 then context(parameters) end
ctx_NC() context(cscommand)
-- ctx_NC() if tolerant then context(tolerant) end
ctx_NC() if primitive then context(primitive) end
ctx_NC() if permanent then context(permanent) end
ctx_NC() if frozen then context(frozen) end
ctx_NC() if immutable then context(immutable) end
ctx_NC() if mutable then context(mutable) end
ctx_NC() if noaligned then context(noaligned) end
ctx_NC() if filename then context(hashnames[filename]) end
ctx_NC() ctx_NR()
end
end
context.stoptabulate()
end
show(function(k) return find(k,"^[a-zA-Z]+$") end)
context.page()
show(function(k) return not find(k,"^[a-zA-Z]+$") and not find(k,crap) end)
\stopluacode
\page
\starttabulate[|c|l|]
\HL
\NC \type {+} \NC mutable, immutable, frozen, permanent, primitive \NC \NR
\NC \type {-} \NC protected by obscurity (underscores) \NC \NR
\NC \type {!} \NC instance (can be frozen) \NC \NR
\NC \type {0-9} \NC the number of arguments (argument grabbing can be delegated) \NC \NR
\HL
\stoptabulate
Often frozen commands are redefined on demand and they can be overloaded. Mutable
doesn't mean that a user can change it without consequences, for instance the
\type {\current...} ones. Primitives come with the engine, permanent macros are
the core of \CONTEXT. Noaligned macros are special and dealt deep down when
scanning for alignment specific primitives.
\stoptext
\stopmodule
|