if not modules then modules = { } end modules ['anch-pos'] = {
version = 1.001,
comment = "companion to anch-pos.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
--[[ldx--
We save positional information in the main utility table. Not only
can we store much more information in but it's also
more efficient.
--ldx]]--
local concat, format = table.concat, string.format
local lpegmatch = lpeg.match
local allocate, mark = utilities.storage.allocate, utilities.storage.mark
local collected, tobesaved = allocate(), allocate()
local jobpositions = {
collected = collected,
tobesaved = tobesaved,
}
job.positions = jobpositions
_ptbs_, _pcol_ = tobesaved, collected -- global
local dx, dy = "0pt", "0pt"
local function initializer()
tobesaved = mark(jobpositions.tobesaved)
collected = mark(jobpositions.collected)
_ptbs_, _pcol_ = tobesaved, collected -- global
local p = collected["page:0"] -- page:1
if p then
-- to be checked !
--~ dx, dy = p[2] or "0pt", p[3] or "0pt"
end
end
job.register('job.positions.collected', tobesaved, initializer)
function jobpositions.copy(target,source)
collected[target] = collected[source] or tobesaved[source]
end
function jobpositions.replace(name,...)
collected[name] = {...}
end
function jobpositions.page(id)
local jpi = collected[id] or tobesaved[id]
context(jpi and jpi[1] or '0')
end
function jobpositions.width(id)
local jpi = collected[id] or tobesaved[id]
context(jpi and jpi[4] or '0pt')
end
function jobpositions.height(id)
local jpi = collected[id] or tobesaved[id]
context(jpi and jpi[5] or '0pt')
end
function jobpositions.depth(id)
local jpi = collected[id] or tobesaved[id]
context(jpi and jpi[6] or '0pt')
end
function jobpositions.x(id)
local jpi = collected[id] or tobesaved[id]
local x = jpi and jpi[2]
if x then
context('\\the\\dimexpr%s-%s\\relax',x,dx)
else
context('0pt')
end
end
function jobpositions.y(id)
local jpi = collected[id] or tobesaved[id]
local y = jpi and jpi[3]
if y then
context('\\the\\dimexpr%s-%s\\relax',y,dy)
else
context('0pt')
end
end
-- the following are only for MP so there we can leave out the pt
-- can be writes and no format needed any more
function jobpositions.xy(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
context('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy)
else
context('(0,0)')
end
end
function jobpositions.lowerleft(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
context('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy)
else
context('(0,0)')
end
end
function jobpositions.lowerright(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
context('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy)
else
context('(0,0)')
end
end
function jobpositions.upperright(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
context('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy)
else
context('(0,0)')
end
end
function jobpositions.upperleft(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
context('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy)
else
context('(0,0)')
end
end
function jobpositions.position(id)
local jpi = collected[id] or tobesaved[id]
if jpi then
context(concat(jpi,',',1,6))
else
context('0,0,0,0,0,0')
end
end
local splitter = lpeg.Ct(lpeg.splitat(","))
function jobpositions.pardata(id,n,default)
local jpi = collected[id] or tobesaved[id]
if not jpi then
context(default)
else
local split = jpi[0]
if not split then
split = lpegmatch(splitter,jpi[7])
jpi[0] = split
end
context(split[n] or default)
end
end
function jobpositions.extradata(id,default)
local jpi = collected[id] or tobesaved[id]
context(jpi and jpi[7] or default)
end
-- interface
commands.replacepospxywhd = jobpositions.replace
commands.copyposition = jobpositions.copy
commands.MPp = jobpositions.page
commands.MPx = jobpositions.x
commands.MPy = jobpositions.y
commands.MPw = jobpositions.width
commands.MPh = jobpositions.height
commands.MPd = jobpositions.depth
commands.MPxy = jobpositions.xy
commands.MPll = jobpositions.lowerleft
commands.MPlr = jobpositions.lowerright
commands.MPur = jobpositions.upperright
commands.MPul = jobpositions.upperleft
commands.MPpos = jobpositions.position
commands.MPplus = jobpositions.pardata
commands.MPrest = jobpositions.extradata
function commands.doifelse(name)
commands.testcase(collected[name] or tobesaved[name])
end