diff options
author | Marius <mariausol@gmail.com> | 2013-05-20 03:20:28 +0300 |
---|---|---|
committer | Marius <mariausol@gmail.com> | 2013-05-20 03:20:28 +0300 |
commit | 5fc5cfb5014ddcc2942e13a559f4082fb66aa6e7 (patch) | |
tree | 53f81e99fac8c80ddd2fb70e233a7e5d5735722f /tex/context/base/attr-lay.lua | |
parent | 13ec4b540e0d46c97fd7b089e0b7413da81e0a9f (diff) | |
download | context-5fc5cfb5014ddcc2942e13a559f4082fb66aa6e7.tar.gz |
beta 2013.05.20 02:00
Diffstat (limited to 'tex/context/base/attr-lay.lua')
-rw-r--r-- | tex/context/base/attr-lay.lua | 506 |
1 files changed, 253 insertions, 253 deletions
diff --git a/tex/context/base/attr-lay.lua b/tex/context/base/attr-lay.lua index 60907bdf3..4bcc70b0c 100644 --- a/tex/context/base/attr-lay.lua +++ b/tex/context/base/attr-lay.lua @@ -1,253 +1,253 @@ -if not modules then modules = { } end modules ['attr-lay'] = {
- version = 1.001,
- comment = "companion to attr-lay.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- layers (ugly code, due to no grouping and such); currently we use exclusive layers
--- but when we need it stacked layers might show up too; the next function based
--- approach can be replaced by static (metatable driven) resolvers
-
--- maybe use backends.registrations here too
-
-local type = type
-local insert, remove = table.insert, table.remove
-
-local attributes, nodes, utilities, logs, backends = attributes, nodes, utilities, logs, backends
-local commands, context, interfaces = commands, context, interfaces
-local tex = tex
-
-local allocate = utilities.storage.allocate
-local setmetatableindex = table.setmetatableindex
-local formatters = string.formatters
-
-local report_viewerlayers = logs.reporter("viewerlayers")
-
--- todo: document this but first reimplement this as it reflects the early
--- days of luatex / mkiv and we have better ways now
-
--- nb: attributes: color etc is much slower than normal (marks + literals) but ...
--- nb. too many "0 g"s
--- nb: more local tables
-
-attributes.viewerlayers = attributes.viewerlayers or { }
-local viewerlayers = attributes.viewerlayers
-
-local variables = interfaces.variables
-local v_local = variables["local"]
-local v_global = variables["global"]
-
-local a_viewerlayer = attributes.private("viewerlayer")
-
-viewerlayers = viewerlayers or { }
-viewerlayers.data = allocate()
-viewerlayers.registered = viewerlayers.registered or { }
-viewerlayers.values = viewerlayers.values or { }
-viewerlayers.scopes = viewerlayers.scopes or { }
-viewerlayers.listwise = allocate()
-viewerlayers.attribute = a_viewerlayer
-viewerlayers.supported = true
-viewerlayers.hasorder = true
-
-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
-
-local nodepool = nodes.pool
-
-local data = viewerlayers.data
-local values = viewerlayers.values
-local listwise = viewerlayers.listwise
-local registered = viewerlayers.registered
-local scopes = viewerlayers.scopes
-
-local f_stamp = formatters["%s"]
-
-storage.register("attributes/viewerlayers/registered", registered, "attributes.viewerlayers.registered")
-storage.register("attributes/viewerlayers/values", values, "attributes.viewerlayers.values")
-storage.register("attributes/viewerlayers/scopes", scopes, "attributes.viewerlayers.scopes")
-
-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
-
-local function startlayer(...) startlayer = nodeinjections.startlayer return startlayer(...) end
-local function stoplayer (...) stoplayer = nodeinjections.stoplayer return stoplayer (...) end
-
-local function extender(viewerlayers,key)
- if viewerlayers.supported and key == "none" then
- local d = stoplayer()
- viewerlayers.none = d
- return d
- end
-end
-
-local function reviver(data,n)
- if viewerlayers.supported then
- local v = values[n]
- if v then
- local d = startlayer(v)
- data[n] = d
- return d
- else
- report_viewerlayers("error: unknown reference %a",tostring(n))
- end
- end
-end
-
-setmetatableindex(viewerlayers,extender)
-setmetatableindex(viewerlayers.data,reviver)
-
--- !!!! TEST CODE !!!!
-
-layerstacker.start = function(...) local f = nodeinjections.startstackedlayer layerstacker.start = f return f(...) end
-layerstacker.stop = function(...) local f = nodeinjections.stopstackedlayer layerstacker.stop = f return f(...) end
-layerstacker.change = function(...) local f = nodeinjections.changestackedlayer layerstacker.change = f return f(...) end
-
-local function initializer(...)
- return states.initialize(...)
-end
-
-attributes.viewerlayers.handler = nodes.installattributehandler {
- name = "viewerlayer",
- namespace = viewerlayers,
- initializer = initializer,
- finalizer = states.finalize,
- -- processor = states.stacked,
- processor = states.stacker,
-}
-
-local stack, enabled, global = { }, false, false
-
-function viewerlayers.enable(value)
- if value == false or not viewerlayers.supported then
- if enabled then
- tasks.disableaction("shipouts","attributes.viewerlayers.handler")
- end
- enabled = false
- else
- if not enabled then
- tasks.enableaction("shipouts","attributes.viewerlayers.handler")
- end
- enabled = true
- end
-end
-
-function viewerlayers.forcesupport(value)
- viewerlayers.supported = value
- report_viewerlayers("viewerlayers are %ssupported",value and "" or "not ")
- viewerlayers.enable(value)
-end
-
-local function register(name,lw) -- if not inimode redefine data[n] in first call
- if not enabled then
- viewerlayers.enable(true)
- end
- local stamp = f_stamp(name)
- local n = registered[stamp]
- if not n then
- n = #values + 1
- values[n] = name
- registered[stamp] = n
- listwise[n] = lw or false -- lw forces a used
- end
- return registered[stamp] -- == n
-end
-
-viewerlayers.register = register
-
-function viewerlayers.setfeatures(hasorder)
- viewerlayers.hasorder = hasorder
-end
-
-local usestacker = true -- new, experimental
-
-function viewerlayers.start(name)
- 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)
- else
- texsetattribute(a_viewerlayer,a)
- end
- texsettokenlist("currentviewerlayertoks",name)
-end
-
-function viewerlayers.stop()
- local a
- if usestacker then
- a = layerstacker.pop()
- else
- a = remove(stack)
- end
- if not a then
- -- error
- elseif a >= 0 then
- if global or scopes[a] == v_global then
- texsetattribute("global",a_viewerlayer,a)
- else
- texsetattribute(a_viewerlayer,a)
- end
- texsettokenlist("currentviewerlayertoks",values[a] or "")
- else
- if global or scopes[a] == v_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
- elseif not scopes[tag] then -- prevent duplicates
- local title = settings.title
- if not title or title == "" then
- settings.title = tag
- end
- scopes[tag] = settings.scope or v_local
- codeinjections.defineviewerlayer(settings)
- end
-end
-
-commands.defineviewerlayer = viewerlayers.define
-commands.startviewerlayer = viewerlayers.start
-commands.stopviewerlayer = viewerlayers.stop
-
-function commands.definedviewerlayer(settings)
- viewerlayers.define(settings)
- context(register(settings.tag,true)) -- true forces a use
-end
-
-function commands.registeredviewerlayer(name)
- context(register(name,true)) -- true forces a use
-end
+if not modules then modules = { } end modules ['attr-lay'] = { + version = 1.001, + comment = "companion to attr-lay.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- layers (ugly code, due to no grouping and such); currently we use exclusive layers +-- but when we need it stacked layers might show up too; the next function based +-- approach can be replaced by static (metatable driven) resolvers + +-- maybe use backends.registrations here too + +local type = type +local insert, remove = table.insert, table.remove + +local attributes, nodes, utilities, logs, backends = attributes, nodes, utilities, logs, backends +local commands, context, interfaces = commands, context, interfaces +local tex = tex + +local allocate = utilities.storage.allocate +local setmetatableindex = table.setmetatableindex +local formatters = string.formatters + +local report_viewerlayers = logs.reporter("viewerlayers") + +-- todo: document this but first reimplement this as it reflects the early +-- days of luatex / mkiv and we have better ways now + +-- nb: attributes: color etc is much slower than normal (marks + literals) but ... +-- nb. too many "0 g"s +-- nb: more local tables + +attributes.viewerlayers = attributes.viewerlayers or { } +local viewerlayers = attributes.viewerlayers + +local variables = interfaces.variables +local v_local = variables["local"] +local v_global = variables["global"] + +local a_viewerlayer = attributes.private("viewerlayer") + +viewerlayers = viewerlayers or { } +viewerlayers.data = allocate() +viewerlayers.registered = viewerlayers.registered or { } +viewerlayers.values = viewerlayers.values or { } +viewerlayers.scopes = viewerlayers.scopes or { } +viewerlayers.listwise = allocate() +viewerlayers.attribute = a_viewerlayer +viewerlayers.supported = true +viewerlayers.hasorder = true + +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 + +local nodepool = nodes.pool + +local data = viewerlayers.data +local values = viewerlayers.values +local listwise = viewerlayers.listwise +local registered = viewerlayers.registered +local scopes = viewerlayers.scopes + +local f_stamp = formatters["%s"] + +storage.register("attributes/viewerlayers/registered", registered, "attributes.viewerlayers.registered") +storage.register("attributes/viewerlayers/values", values, "attributes.viewerlayers.values") +storage.register("attributes/viewerlayers/scopes", scopes, "attributes.viewerlayers.scopes") + +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 + +local function startlayer(...) startlayer = nodeinjections.startlayer return startlayer(...) end +local function stoplayer (...) stoplayer = nodeinjections.stoplayer return stoplayer (...) end + +local function extender(viewerlayers,key) + if viewerlayers.supported and key == "none" then + local d = stoplayer() + viewerlayers.none = d + return d + end +end + +local function reviver(data,n) + if viewerlayers.supported then + local v = values[n] + if v then + local d = startlayer(v) + data[n] = d + return d + else + report_viewerlayers("error: unknown reference %a",tostring(n)) + end + end +end + +setmetatableindex(viewerlayers,extender) +setmetatableindex(viewerlayers.data,reviver) + +-- !!!! TEST CODE !!!! + +layerstacker.start = function(...) local f = nodeinjections.startstackedlayer layerstacker.start = f return f(...) end +layerstacker.stop = function(...) local f = nodeinjections.stopstackedlayer layerstacker.stop = f return f(...) end +layerstacker.change = function(...) local f = nodeinjections.changestackedlayer layerstacker.change = f return f(...) end + +local function initializer(...) + return states.initialize(...) +end + +attributes.viewerlayers.handler = nodes.installattributehandler { + name = "viewerlayer", + namespace = viewerlayers, + initializer = initializer, + finalizer = states.finalize, + -- processor = states.stacked, + processor = states.stacker, +} + +local stack, enabled, global = { }, false, false + +function viewerlayers.enable(value) + if value == false or not viewerlayers.supported then + if enabled then + tasks.disableaction("shipouts","attributes.viewerlayers.handler") + end + enabled = false + else + if not enabled then + tasks.enableaction("shipouts","attributes.viewerlayers.handler") + end + enabled = true + end +end + +function viewerlayers.forcesupport(value) + viewerlayers.supported = value + report_viewerlayers("viewerlayers are %ssupported",value and "" or "not ") + viewerlayers.enable(value) +end + +local function register(name,lw) -- if not inimode redefine data[n] in first call + if not enabled then + viewerlayers.enable(true) + end + local stamp = f_stamp(name) + local n = registered[stamp] + if not n then + n = #values + 1 + values[n] = name + registered[stamp] = n + listwise[n] = lw or false -- lw forces a used + end + return registered[stamp] -- == n +end + +viewerlayers.register = register + +function viewerlayers.setfeatures(hasorder) + viewerlayers.hasorder = hasorder +end + +local usestacker = true -- new, experimental + +function viewerlayers.start(name) + 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) + else + texsetattribute(a_viewerlayer,a) + end + texsettokenlist("currentviewerlayertoks",name) +end + +function viewerlayers.stop() + local a + if usestacker then + a = layerstacker.pop() + else + a = remove(stack) + end + if not a then + -- error + elseif a >= 0 then + if global or scopes[a] == v_global then + texsetattribute("global",a_viewerlayer,a) + else + texsetattribute(a_viewerlayer,a) + end + texsettokenlist("currentviewerlayertoks",values[a] or "") + else + if global or scopes[a] == v_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 + elseif not scopes[tag] then -- prevent duplicates + local title = settings.title + if not title or title == "" then + settings.title = tag + end + scopes[tag] = settings.scope or v_local + codeinjections.defineviewerlayer(settings) + end +end + +commands.defineviewerlayer = viewerlayers.define +commands.startviewerlayer = viewerlayers.start +commands.stopviewerlayer = viewerlayers.stop + +function commands.definedviewerlayer(settings) + viewerlayers.define(settings) + context(register(settings.tag,true)) -- true forces a use +end + +function commands.registeredviewerlayer(name) + context(register(name,true)) -- true forces a use +end |