summaryrefslogtreecommitdiff
path: root/tex/context/base/attr-lay.lua
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2010-11-12 20:00:14 +0200
committerMarius <mariausol@gmail.com>2010-11-12 20:00:14 +0200
commit7fc9b91bca833ba04496e8f819fb60dafd77f6e0 (patch)
treef0fe826eeeb9ae48bac1ffba9c09a3cf3a538f2f /tex/context/base/attr-lay.lua
parenta14e30f10a3fa9a8657aef179359847fca0dbd01 (diff)
downloadcontext-7fc9b91bca833ba04496e8f819fb60dafd77f6e0.tar.gz
beta 2010.11.12 18:22
Diffstat (limited to 'tex/context/base/attr-lay.lua')
-rw-r--r--tex/context/base/attr-lay.lua69
1 files changed, 63 insertions, 6 deletions
diff --git a/tex/context/base/attr-lay.lua b/tex/context/base/attr-lay.lua
index df7a4e6bb..1c13762c4 100644
--- a/tex/context/base/attr-lay.lua
+++ b/tex/context/base/attr-lay.lua
@@ -12,6 +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 allocate = utilities.storage.allocate
@@ -26,21 +27,28 @@ local report_viewerlayers = logs.new("viewerlayers")
local attributes, nodes = attributes, nodes
attributes.viewerlayers = attributes.viewerlayers or { }
+local viewerlayers = attributes.viewerlayers
-local viewerlayers = attributes.viewerlayers
+local a_viewerlayer = attributes.private("viewerlayer")
viewerlayers = viewerlayers or { }
viewerlayers.data = allocate()
viewerlayers.registered = viewerlayers.registered or { }
viewerlayers.values = viewerlayers.values or { }
viewerlayers.listwise = allocate()
-viewerlayers.attribute = attributes.private("viewerlayer")
+viewerlayers.attribute = a_viewerlayer
viewerlayers.supported = true
viewerlayers.hasorder = true
-local states = attributes.states
-local tasks = nodes.tasks
-local nodeinjections = backends.nodeinjections
+local states = attributes.states
+local tasks = nodes.tasks
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+
+local texsetattribute = tex.setattribute
+local texgetattribute = tex.getattribute
+local texsettokenlist = tex.settoks
+local unsetvalue = attributes.unsetvalue
storage.register("attributes/viewerlayers/registered", viewerlayers.registered, "attributes.viewerlayers.registered")
storage.register("attributes/viewerlayers/values", viewerlayers.values, "attributes.viewerlayers.values")
@@ -81,7 +89,7 @@ local function initializer(...)
return states.initialize(...)
end
-viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in first call
+local function register(name,lw) -- if not inimode redefine data[n] in first call
local stamp = format(template,name)
local n = registered[stamp]
if not n then
@@ -93,6 +101,8 @@ viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in
return registered[stamp] -- == n
end
+viewerlayers.register = register
+
attributes.viewerlayers.handler = nodes.installattributehandler {
name = "viewerlayer",
namespace = viewerlayers,
@@ -118,3 +128,50 @@ end
function viewerlayers.setfeatures(hasorder)
viewerlayers.hasorder = hasorder
end
+
+local stack, enabled, global = { }, false, false
+
+function viewerlayers.start(name)
+ if not enabled then
+ viewerlayers.enable(true)
+ end
+ insert(stack,texgetattribute(a_viewerlayer))
+ if global then
+ texsetattribute("global",a_viewerlayer,register(name) or unsetvalue)
+ else
+ texsetattribute(a_viewerlayer,register(name) or unsetvalue)
+ end
+ texsettokenlist("currentviewerlayertoks",name)
+end
+
+function viewerlayers.stop()
+ local a = remove(stack)
+ if a >= 0 then
+ if global then
+ texsetattribute("global",a_viewerlayer,a)
+ else
+ texsetattribute(a_viewerlayer,a)
+ end
+ texsettokenlist("currentviewerlayertoks",values[a])
+ else
+ if global then
+ texsetattribute("global",a_viewerlayer,unsetvalue)
+ else
+ texsetattribute(a_viewerlayer,unsetvalue)
+ end
+ texsettokenlist("currentviewerlayertoks","")
+ end
+end
+
+function viewerlayers.define(settings)
+ local tag = settings.tag
+ if not tag or tag == "" then
+ -- error
+ else
+ local title = settings.title
+ if not title or title == "" then
+ settings.title = tag
+ end
+ codeinjections.defineviewerlayer(settings)
+ end
+end