summaryrefslogtreecommitdiff
path: root/tex/context/modules/mkxl/s-system-tokens.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/modules/mkxl/s-system-tokens.lmt')
-rw-r--r--tex/context/modules/mkxl/s-system-tokens.lmt247
1 files changed, 247 insertions, 0 deletions
diff --git a/tex/context/modules/mkxl/s-system-tokens.lmt b/tex/context/modules/mkxl/s-system-tokens.lmt
new file mode 100644
index 000000000..39258d637
--- /dev/null
+++ b/tex/context/modules/mkxl/s-system-tokens.lmt
@@ -0,0 +1,247 @@
+if not modules then modules = { } end modules['s-system-tokens'] = {
+ version = 1.001,
+ comment = "companion to s-system-tokens.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local context = context
+local ctx_NC = context.NC
+local ctx_BC = context.BC
+local ctx_NR = context.NR
+local ctx_FL = context.FL
+local ctx_ML = context.ML
+local ctx_LL = context.LL
+local gsub = string.gsub
+local find = string.find
+local concat = table.concat
+
+moduledata.system = moduledata.system or { }
+moduledata.system.tokens = moduledata.system.tokens or { }
+
+local getrange = token.get_range
+local getcmdchrcs = token.get_cmdchrcs
+local whatever = { [1] = true, [4] = true, [8] = true }
+
+local collected = nil -- at some point we might have this one preloaded
+
+function moduledata.system.tokens.collect()
+
+ if not collected then
+
+ local allcommands = tokens.commands
+ local primitives = tex.primitives()
+ collected = { }
+
+ for i=0,#allcommands do
+ local codes = { }
+ local kind, min, max, fixedvalue = getrange(i)
+ if min and whatever[kind] and max >= 0 and max <= 256 then
+ for i=min,max do
+ codes[i] = false
+ end
+ end
+ collected[i] = codes
+ collected[allcommands[i]] = codes
+ end
+
+ for i=1,#primitives do
+ local prm = primitives[i]
+ local cmd, chr = getcmdchrcs("normal"..prm)
+ local codes = collected[cmd]
+ if codes and codes[chr] == false then
+ codes[chr] = prm
+ codes[prm] = chr
+ else
+ -- print(cmd,chr)
+ end
+ end
+
+ collected.undefined_cs = nil
+
+ -- table.save("whatever.lua",collected)
+ -- local p = token.getprimitives()
+ -- table.sort(p,function(a,b) if a[1] == b[1] then return a[2] < b[2] else return a[1] < b[1] end end)
+ -- table.save("moreever.lua",p)
+
+ -- local p = token.getprimitives()
+ -- for i=1,#p do
+ -- local t = p[i]
+ -- pi[i] = { t[1], t[2], t[3], getrange(t[1]) }
+ -- end
+
+ -- inspect(collected)
+
+ end
+
+ return collected
+
+end
+
+function moduledata.system.tokens.showlist()
+
+ local l = tokens.commands
+ local t = moduledata.system.tokens.collect()
+
+ context.starttabulate { "|cT|rT|lT|rT|rT|pTA{flushleft,verytolerant,stretch}|" }
+ ctx_FL()
+ ctx_BC() context("")
+ ctx_BC() context("cmd")
+ ctx_BC() context("name")
+ ctx_BC() context("min")
+ ctx_BC() context("max")
+ ctx_BC() context("default or subcommands")
+ ctx_BC() ctx_NR()
+ ctx_ML()
+ for i=0,#l do
+ local kind, min, max, fixedvalue = getrange(i)
+ local what = whatever[kind]
+ ctx_NC() context(kind)
+ ctx_NC() context(i)
+ ctx_NC() context(l[i])
+ ctx_NC() if min then if what or min == 0 then context(min) else context("-0x%X",-min) end end
+ ctx_NC() if max then if what or max == 0 then context(max) else context("0x%X",max) end end
+ ctx_NC()
+ if min and what and max >= 0 and max <= 256 then
+ local l = { }
+ local c = t[i]
+ if c then
+ for j=min, max do
+ local s = c[j]
+ if s == " " then
+ s = "<space>"
+ elseif not s then
+ s = "<unavailable>"
+ end
+ l[#l+1] = j .. "=" .. s
+ end
+ if (#l > 0) then
+ context(table.concat(l," "))
+ elseif fixedvalue ~= 0 then
+ context("0x%X",fixedvalue)
+ end
+ else
+ print("weird")
+ end
+ elseif fixedvalue and fixedvalue ~= 0 then
+ context("0x%X",fixedvalue)
+ end
+ ctx_NC() ctx_NR()
+ end
+ ctx_LL()
+ context.stoptabulate()
+
+end
+
+function moduledata.system.tokens.table(t)
+ local t = t or token.peek_next() -- local t = token.scan_next() token.put_back(t)
+ local n = ""
+ local w = ""
+ local c = t.cmdname
+ if c == "left_brace" then
+ w = "given token list"
+ t = token.scan_toks(false)
+ elseif c == "register_toks" then
+ token.scan_next()
+ w = "token register"
+ n = t.csname or t.index
+ t = tex.gettoks(n,true)
+ elseif c == "internal_toks" then
+ token.scan_next()
+ w = "internal token variable"
+ n = t.csname or t.index
+ t = tex.gettoks(n,true)
+ else
+ n = token.scan_csname()
+ local r = { }
+ local m = token.get_meaning(n,true)
+ if t.frozen then r[#r+1] = "frozen" end
+ if t.permanent then r[#r+1] = "permanent" end
+ if t.immutable then r[#r+1] = "immutable" end
+ if t.primitive then r[#r+1] = "primitive" end
+ if t.mutable then r[#r+1] = "mutable" end
+ if t.noaligned then r[#r+1] = "noaligned" end
+ if t.instance then r[#r+1] = "instance" end
+ if t.tolerant then r[#r+1] = "tolerant" end
+ if t.protected then r[#r+1] = "protected" end
+ r[#r+1] = "control sequence"
+ if type(m) == "table" then
+ t = m
+ else
+ t = { t }
+ end
+ w = concat(r, " ")
+ end
+ if type(t) == "table" then
+ context.starttabulate { "|l|r|r|l|c|l|l|" }
+ ctx_FL()
+ ctx_NC() context.formatted.rlap("\\bold %s: %s",w,n)
+ ctx_NC() ctx_NC() ctx_NC() ctx_NC() ctx_NC() ctx_NC() ctx_NC()
+ ctx_NC() ctx_NR()
+ ctx_ML()
+ for i=1,#t do
+ local ti = t[i]
+ local cs = ti.csname
+ local id = ti.id
+ local ix = ti.index
+ local cd = ti.command
+ local cn = gsub(ti.cmdname,"_"," ")
+ ctx_NC() context(id)
+ ctx_NC() context(cd)
+ ctx_NC() context("%3i",ix)
+ ctx_NC() context(cn)
+ if cs then
+ ctx_NC()
+ ctx_NC()
+ ctx_NC() context(cs)
+ ctx_NC() ctx_NR()
+ elseif cn == "letter" or cn == "other char" then
+ ctx_NC() context.char(ix)
+ ctx_NC() context("%U",ix)
+ ctx_NC()
+ ctx_NC() ctx_NR()
+ elseif cn == "match" then
+ ctx_NC()
+ ctx_NC()
+ if ix == 32 then context("optional spacer") -- space
+ elseif ix == 43 then context("keep braces") -- "+"
+ elseif ix == 45 then context("thrash") -- "-"
+ elseif ix == 61 then context("mandate braces") -- "="
+ elseif ix == 94 then context("keep spaces") -- "^"
+ elseif ix == 95 then context("keep mandate braces") -- "_"
+ else context("argument %c",ix)
+ end
+ ctx_NC()
+ ctx_NC() ctx_NR()
+ else
+ ctx_NC()
+ ctx_NC()
+ ctx_NC()
+ ctx_NC() ctx_NR()
+ if cn == "end match" then
+ context.ML()
+ end
+ end
+ end
+ context.LL()
+ context.stoptabulate()
+ else
+ context.starttabulate { "|l|" }
+ ctx_FL()
+ ctx_NC() context("%s: %s",w,n)
+ ctx_NC() ctx_NR()
+ ctx_ML()
+ ctx_NC() context("<no tokens>")
+ ctx_NC() ctx_NR()
+ ctx_LL()
+ context.stoptabulate()
+ end
+end
+
+interfaces.implement {
+ name = "luatokentable",
+ public = true,
+ protected = true,
+ actions = moduledata.system.tokens.table,
+}