summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/core-two.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/core-two.lua')
-rw-r--r--tex/context/base/mkiv/core-two.lua179
1 files changed, 179 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/core-two.lua b/tex/context/base/mkiv/core-two.lua
new file mode 100644
index 000000000..bb1afa7db
--- /dev/null
+++ b/tex/context/base/mkiv/core-two.lua
@@ -0,0 +1,179 @@
+if not modules then modules = { } end modules ['core-two'] = {
+ version = 1.001,
+ comment = "companion to core-two.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local remove, concat = table.remove, table.concat
+local allocate = utilities.storage.allocate
+
+--[[ldx--
+<p>We save multi-pass information in the main utility table. This is a
+bit of a mess because we support old and new methods.</p>
+--ldx]]--
+
+local collected = allocate()
+local tobesaved = allocate()
+
+local jobpasses = {
+ collected = collected,
+ tobesaved = tobesaved,
+}
+
+job.passes = jobpasses
+
+local function initializer()
+ collected = jobpasses.collected
+ tobesaved = jobpasses.tobesaved
+end
+
+job.register('job.passes.collected', tobesaved, initializer, nil)
+
+local function allocate(id)
+ local p = tobesaved[id]
+ if not p then
+ p = { }
+ tobesaved[id] = p
+ end
+ return p
+end
+
+jobpasses.define = allocate
+
+function jobpasses.save(id,str,index)
+ local jti = allocate(id)
+ if index then
+ jti[index] = str
+ else
+ jti[#jti+1] = str
+ end
+end
+
+function jobpasses.savetagged(id,tag,str)
+ local jti = allocate(id)
+ jti[tag] = str
+end
+
+function jobpasses.getdata(id,index,default)
+ local jti = collected[id]
+ local value = jti and jti[index]
+ return value ~= "" and value or default or ""
+end
+
+function jobpasses.getfield(id,index,tag,default)
+ local jti = collected[id]
+ jti = jti and jti[index]
+ local value = jti and jti[tag]
+ return value ~= "" and value or default or ""
+end
+
+function jobpasses.getcollected(id)
+ return collected[id] or { }
+end
+
+function jobpasses.gettobesaved(id)
+ return allocate(id)
+end
+
+local function get(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ return remove(jti,1)
+ end
+end
+
+local function first(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ return jti[1]
+ end
+end
+
+local function last(id)
+ local jti = collected[id]
+ if jti and #jti > 0 then
+ return jti[#jti]
+ end
+end
+
+local function find(id,n)
+ local jti = collected[id]
+ if jti and jti[n] then
+ return jti[n]
+ end
+end
+
+local function count(id)
+ local jti = collected[id]
+ return jti and #jti or 0
+end
+
+local function list(id)
+ local jti = collected[id]
+ if jti then
+ return concat(jti,',')
+ end
+end
+
+local function inlist(id,str)
+ local jti = collected[id]
+ if jti then
+ for _, v in next, jti do
+ if v == str then
+ return true
+ end
+ end
+ end
+ return false
+end
+
+local check = first
+
+--
+
+jobpasses.get = get
+jobpasses.first = first
+jobpasses.last = last
+jobpasses.find = find
+jobpasses.list = list
+jobpasses.count = count
+jobpasses.check = check
+jobpasses.inlist = inlist
+
+-- interface
+
+local implement = interfaces.implement
+
+implement { name = "gettwopassdata", actions = { get , context }, arguments = "string" }
+implement { name = "getfirsttwopassdata",actions = { first, context }, arguments = "string" }
+implement { name = "getlasttwopassdata", actions = { last , context }, arguments = "string" }
+implement { name = "findtwopassdata", actions = { find , context }, arguments = { "string", "string" } }
+implement { name = "gettwopassdatalist", actions = { list , context }, arguments = "string" }
+implement { name = "counttwopassdata", actions = { count, context }, arguments = "string" }
+implement { name = "checktwopassdata", actions = { check, context }, arguments = "string" }
+
+implement {
+ name = "definetwopasslist",
+ actions = jobpasses.define,
+ arguments = "string"
+}
+
+implement {
+ name = "savetwopassdata",
+ actions = jobpasses.save,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "savetaggedtwopassdata",
+ actions = jobpasses.savetagged,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "doifelseintwopassdata",
+ actions = { inlist, commands.doifelse },
+ arguments = { "string", "string" }
+}