summaryrefslogtreecommitdiff
path: root/tex/context/base/attr-lay.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2012-06-22 10:09:00 +0200
committerHans Hagen <pragma@wxs.nl>2012-06-22 10:09:00 +0200
commitba559fc2d68ccb7e6fa68bb3a208544d68c3e389 (patch)
tree75a173bda995c2b398b7f6153987736b7a76fc6a /tex/context/base/attr-lay.lua
parentd1c9e7b5527ffea5ca8c9a71288afddd27ddec7e (diff)
downloadcontext-ba559fc2d68ccb7e6fa68bb3a208544d68c3e389.tar.gz
beta 2012.06.22 10:09
Diffstat (limited to 'tex/context/base/attr-lay.lua')
-rw-r--r--tex/context/base/attr-lay.lua84
1 files changed, 72 insertions, 12 deletions
diff --git a/tex/context/base/attr-lay.lua b/tex/context/base/attr-lay.lua
index 75505d4c4..e154ee90d 100644
--- a/tex/context/base/attr-lay.lua
+++ b/tex/context/base/attr-lay.lua
@@ -12,7 +12,7 @@ if not modules then modules = { } end modules ['attr-lay'] = {
local type = type
local format = string.format
-local insert, remove = table.insert, table.remove
+local insert, remove, concat = table.insert, table.remove, table.concat
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -61,12 +61,26 @@ storage.register("attributes/viewerlayers/registered", viewerlayers.registered,
storage.register("attributes/viewerlayers/values", viewerlayers.values, "attributes.viewerlayers.values")
storage.register("attributes/viewerlayers/scopes", viewerlayers.scopes, "attributes.viewerlayers.scopes")
-local data = viewerlayers.data
-local values = viewerlayers.values
-local listwise = viewerlayers.listwise
-local registered = viewerlayers.registered
-local scopes = viewerlayers.scopes
-local template = "%s"
+local data = viewerlayers.data
+local values = viewerlayers.values
+local listwise = viewerlayers.listwise
+local registered = viewerlayers.registered
+local scopes = viewerlayers.scopes
+local template = "%s"
+
+local layerstacker = utilities.stacker.new("layers") -- experiment
+
+layerstacker.mode = "stack"
+layerstacker.unset = attributes.unsetvalue
+
+viewerlayers.resolve_begin = layerstacker.resolve_begin
+viewerlayers.resolve_step = layerstacker.resolve_step
+viewerlayers.resolve_end = layerstacker.resolve_end
+
+function commands.cleanuplayers()
+ layerstacker.clean()
+ -- todo
+end
-- stacked
@@ -94,6 +108,39 @@ end
setmetatableindex(viewerlayers, extender)
setmetatableindex(viewerlayers.data, reviver)
+function layerstacker.start(s,t,first,last) -- move to lpdf-ren.lua
+ local r = { }
+ for i=first,last do
+ r[#r+1] = codeinjections.startlayer(values[t[i]])
+ end
+ r = concat(r," ")
+-- print("start",r)
+ return nodes.pool.pdfliteral(r)
+end
+
+function layerstacker.stop(s,t,first,last) -- move to lpdf-ren.lua
+ local r = { }
+ for i=last,first,-1 do
+ r[#r+1] = codeinjections.stoplayer()
+ end
+ r = concat(r," ")
+-- print("stop",r)
+ return nodes.pool.pdfliteral(r)
+end
+
+function layerstacker.change(s,t1,first1,last1,t2,first2,last2) -- move to lpdf-ren.lua
+ local r = { }
+ for i=last1,first1,-1 do
+ r[#r+1] = codeinjections.stoplayer()
+ end
+ for i=first2,last2 do
+ r[#r+1] = codeinjections.startlayer(values[t2[i]])
+ end
+ r = concat(r," ")
+-- print("change",r)
+ return nodes.pool.pdfliteral(r)
+end
+
local function initializer(...)
return states.initialize(...)
end
@@ -103,7 +150,8 @@ attributes.viewerlayers.handler = nodes.installattributehandler {
namespace = viewerlayers,
initializer = initializer,
finalizer = states.finalize,
- processor = states.stacked,
+-- processor = states.stacked,
+ processor = states.stacker,
}
local stack, enabled, global = { }, false, false
@@ -149,9 +197,16 @@ function viewerlayers.setfeatures(hasorder)
viewerlayers.hasorder = hasorder
end
+local usestacker = true -- new, experimental
+
function viewerlayers.start(name)
- insert(stack,texgetattribute(a_viewerlayer))
- local a = register(name) or unsetvalue
+ local a
+ if usestacker then
+ a = layerstacker.push(register(name) or unsetvalue)
+ else
+ insert(stack,texgetattribute(a_viewerlayer))
+ a = register(name) or unsetvalue
+ end
if global or scopes[name] == v_global then
scopes[a] = v_global -- messy but we don't know the attributes yet
texsetattribute("global",a_viewerlayer,a)
@@ -162,7 +217,12 @@ function viewerlayers.start(name)
end
function viewerlayers.stop()
- local a = remove(stack)
+ local a
+ if usestacker then
+ a = layerstacker.pop()
+ else
+ a = remove(stack)
+ end
if not a then
-- error
elseif a >= 0 then
@@ -171,7 +231,7 @@ function viewerlayers.stop()
else
texsetattribute(a_viewerlayer,a)
end
- texsettokenlist("currentviewerlayertoks",values[a])
+ texsettokenlist("currentviewerlayertoks",values[a] or "")
else
if global or scopes[a] == v_global then
texsetattribute("global",a_viewerlayer,unsetvalue)