if not modules then modules = { } end modules ['node-ini'] = {
version = 1.001,
comment = "companion to node-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
--[[ldx--
Most of the code that had accumulated here is now separated in modules.
--ldx]]--
local next, type, tostring = next, type, tostring
local gsub = string.gsub
local concat, remove = table.concat, table.remove
local sortedhash, sortedkeys, swapped = table.sortedhash, table.sortedkeys, table.swapped
--[[ldx--
Access to nodes is what gives its power. Here we implement a
few helper functions. These functions are rather optimized.
--ldx]]--
nodes = nodes or { }
local nodes = nodes
nodes.handlers = nodes.handlers or { }
local mark = utilities.storage.mark
local allocate = utilities.storage.allocate
local formatcolumns = utilities.formatters.formatcolumns
local getsubtypes = node.subtypes
local getvalues = node.values
tex.magicconstants = { -- we use tex.constants for something else
running = -1073741824, -- null_flag
maxdimen = 1073741823, -- max_dimen
trueinch = 4736286,
}
local listcodes = mark(getsubtypes("list"))
local rulecodes = mark(getsubtypes("rule"))
local dircodes = mark(getsubtypes("dir"))
local glyphcodes = mark(getsubtypes("glyph"))
local disccodes = mark(getsubtypes("disc"))
local gluecodes = mark(getsubtypes("glue"))
local boundarycodes = mark(getsubtypes("boundary"))
local penaltycodes = mark(getsubtypes("penalty"))
local kerncodes = mark(getsubtypes("kern"))
local mathcodes = mark(getsubtypes("math"))
local noadcodes = mark(getsubtypes("noad"))
local radicalcodes = mark(getsubtypes("radical"))
local accentcodes = mark(getsubtypes("accent"))
local fencecodes = mark(getsubtypes("fence"))
----- fractioncodes = mark(getsubtypes("fraction"))
local parcodes = mark(getsubtypes("par"))
local fillvalues = mark(getvalues("fill"))
local dirvalues = mark(getvalues("dir"))
local function simplified(t)
local r = { }
for k, v in next, t do
r[k] = gsub(v,"_","")
end
return r
end
local nodecodes = simplified(node.types())
local whatcodes = allocate {
literal = 0x1, [0x1] = "literal",
latelua = 0x2, [0x2] = "latelua",
userdefined = 0x3, [0x3] = "userdefined",
savepos = 0x4, [0x4] = "savepos",
save = 0x5, [0x5] = "save",
restore = 0x6, [0x6] = "restore",
setmatrix = 0x7, [0x7] = "setmatrix",
open = 0x8, [0x8] = "open",
close = 0x9, [0x9] = "close",
write = 0xA, [0xA] = "write",
}
local usercodes = allocate {
[ 97] = "attribute", -- a
[100] = "number", -- d
[102] = "float", -- f
[108] = "lua", -- l
[110] = "node", -- n
[115] = "string", -- s
[116] = "token" -- t
}
local noadoptions = allocate {
set = 0x08,
unused_1 = 0x00 + 0x08,
unused_2 = 0x01 + 0x08,
axis = 0x02 + 0x08,
no_axis = 0x04 + 0x08,
exact = 0x10 + 0x08,
left = 0x11 + 0x08,
middle = 0x12 + 0x08,
right = 0x14 + 0x08,
}
local literalvalues = allocate {
[0] = "origin",
[1] = "page",
[2] = "always",
[3] = "raw",
[4] = "text",
[5] = "font",
[6] = "special",
}
gluecodes = allocate(swapped(gluecodes,gluecodes))
dircodes = allocate(swapped(dircodes,dircodes))
boundarycodes = allocate(swapped(boundarycodes,boundarycodes))
noadcodes = allocate(swapped(noadcodes,noadcodes))
radicalcodes = allocate(swapped(radicalcodes,radicalcodes))
nodecodes = allocate(swapped(nodecodes,nodecodes))
whatcodes = allocate(swapped(whatcodes,whatcodes))
listcodes = allocate(swapped(listcodes,listcodes))
glyphcodes = allocate(swapped(glyphcodes,glyphcodes))
kerncodes = allocate(swapped(kerncodes,kerncodes))
penaltycodes = allocate(swapped(penaltycodes,penaltycodes))
mathcodes = allocate(swapped(mathcodes,mathcodes))
disccodes = allocate(swapped(disccodes,disccodes))
accentcodes = allocate(swapped(accentcodes,accentcodes))
fencecodes = allocate(swapped(fencecodes,fencecodes))
parcodes = allocate(swapped(parcodes,parcodes))
rulecodes = allocate(swapped(rulecodes,rulecodes))
usercodes = allocate(swapped(usercodes,usercodes))
noadoptions = allocate(swapped(noadoptions,noadoptions))
dirvalues = allocate(swapped(dirvalues,dirvalues))
literalvalues = allocate(swapped(literalvalues,literalvalues))
fillvalues = allocate(swapped(fillvalues,fillvalues))
nodes.gluecodes = gluecodes
nodes.dircodes = dircodes
nodes.boundarycodes = boundarycodes
nodes.noadcodes = noadcodes
nodes.whatcodes = whatcodes
nodes.listcodes = listcodes
nodes.glyphcodes = glyphcodes
nodes.kerncodes = kerncodes
nodes.penaltycodes = penaltycodes
nodes.mathcodes = mathcodes
nodes.disccodes = disccodes
nodes.accentcodes = accentcodes
nodes.radicalcodes = radicalcodes
nodes.fencecodes = fencecodes
nodes.parcodes = parcodes
nodes.rulecodes = rulecodes
nodes.usercodes = usercodes
nodes.noadoptions = noadoptions
nodes.fillvalues = fillvalues
nodes.fillcodes = fillvalues -- for now
nodes.dirvalues = dirvalues
nodes.literalvalues = literalvalues
nodes.nodecodes = nodecodes
-- local subtypes = allocate {
-- [nodecodes.glue] = gluecodes,
-- [nodecodes.dir] = dircodes,
-- [nodecodes.boundary] = boundarycodes,
-- [nodecodes.noad] = noadcodes,
-- [nodecodes.whatsit] = whatcodes,
-- [nodecodes.glyph] = glyphcodes,
-- [nodecodes.kern] = kerncodes,
-- [nodecodes.penalty] = penaltycodes,
-- [nodecodes.math] = mathcodes,
-- [nodecodes.disc] = disccodes,
-- [nodecodes.accent] = accentcodes,
-- [nodecodes.radical] = radicalcodes,
-- [nodecodes.fence] = fencecodes,
-- [nodecodes.par] = parcodes,
-- [nodecodes.rule] = rulecodes,
-- [nodecodes.vlist] = listcodes,
-- [nodecodes.hlist] = listcodes,
-- -- [nodecodes.list] = listcodes,
-- -- [nodecodes.parameter] = parametercodes,
-- -- [nodecodes.user] = usercodes,
-- }
-- for k in next, table.sortedkeys(subtypes) do
-- local v = nodecodes[k]
-- print(k,v)
-- if k and subtypes[k] then
-- subtypes[v] = subtypes[k]
-- end
-- end
local subtypes = allocate {
glue = gluecodes,
dir = dircodes,
boundary = boundarycodes,
noad = noadcodes,
whatsit = whatcodes,
glyph = glyphcodes,
kern = kerncodes,
penalty = penaltycodes,
math = mathcodes,
disc = disccodes,
accent = accentcodes,
radical = radicalcodes,
fence = fencecodes,
par = parcodes,
rule = rulecodes,
vlist = listcodes,
hlist = listcodes,
-- list = listcodes,
-- parameter = parametercodes,
-- user = usercodes,
}
for k, v in table.sortedhash(subtypes) do
local i = nodecodes[k]
if i and not subtypes[i] then
subtypes[i] = v
end
end
nodes.subtypes = subtypes
-- a few more friendly aliases:
nodes.skipcodes = gluecodes
nodes.directioncodes = dircodes
nodes.whatsitcodes = whatcodes
nodes.discretionarycodes = disccodes
nodes.directionvalues = dirvalues
nodes.literalvalues = literalvalues
glyphcodes.glyph = glyphcodes.character
gluecodes.parfillrightskip = gluecodes.parfillrightskip or gluecodes.parfillskip
gluecodes.parfillskip = gluecodes.parfillskip or gluecodes.parfillrightskip
listcodes.row = listcodes.alignment
listcodes.column = listcodes.alignment
kerncodes.kerning = kerncodes.fontkern
kerncodes.italiccorrection = kerncodes.italiccorrection or 1 -- new
literalvalues.direct = literalvalues.always
nodes.noadoptions = {
set = 0x08,
unused_1 = 0x00 + 0x08,
unused_2 = 0x01 + 0x08,
axis = 0x02 + 0x08,
no_axis = 0x04 + 0x08,
exact = 0x10 + 0x08,
left = 0x11 + 0x08,
middle = 0x12 + 0x08,
right = 0x14 + 0x08,
}
-- We use the real node code numbers.
local texsetintegervalue = tex.setintegervalue
for i=0,nodecodes.glyph do
texsetintegervalue(nodecodes[i] .. "nodecode",i,"immutable")
end
for i=0,#gluecodes do
texsetintegervalue(gluecodes[i] .. "subtypecode",i,"immutable")
end
-- tex.set("internalcodesmode",1) -- obsolete