diff options
author | Karl Berry <karl@freefriends.org> | 2016-04-22 22:14:39 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-04-22 22:14:39 +0000 |
commit | fc4466b32ed330a956ac603b00fd145524cff49a (patch) | |
tree | 2c50e2b8de13aa9233b2c76dffe201558f169e86 /Master/texmf-dist/tex/context/base/mkiv/page-inj.lua | |
parent | 50e2368597d5f6fe2057195d0ae6a9f2044923e4 (diff) |
context (22apr16)
git-svn-id: svn://tug.org/texlive/trunk@40691 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/page-inj.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/page-inj.lua | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/page-inj.lua b/Master/texmf-dist/tex/context/base/mkiv/page-inj.lua new file mode 100644 index 00000000000..fd66ead08d1 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/mkiv/page-inj.lua @@ -0,0 +1,125 @@ +if not modules then modules = { } end modules ["page-inj"] = { + version = 1.000, + comment = "Page injections", + author = "Wolfgang Schuster & Hans Hagen", + copyright = "Wolfgang Schuster & Hans Hagen", + license = "see context related readme files", +} + +-- Adapted a bit by HH: numbered states, tracking, delayed, order, etc. + +local type, tonumber = type, tonumber + +local injections = pagebuilders.injections or { } +pagebuilders.injections = injections + +local report = logs.reporter("pagebuilder","injections") +local trace = false trackers.register("pagebuilder.injections",function(v) trace = v end) + +local context = context +local implement = interfaces.implement +local variables = interfaces.variables + +local texsetcount = tex.setcount + +local v_yes = variables.yes +local v_previous = variables.previous +local v_next = variables.next + +local order = 0 +local cache = { } + +function injections.save(specification) -- maybe not public, just commands.* + order = order + 1 + cache[#cache+1] = { + order = order, + name = specification.name, + state = tonumber(specification.state) or specification.state, + parameters = specification.userdata, + } + texsetcount("global","c_page_boxes_flush_n",#cache) +end + +function injections.flushbefore() -- maybe not public, just commands.* + if #cache > 0 then + local delayed = { } + context.unprotect() + for i=1,#cache do + local c = cache[i] + local oldstate = c.state + if oldstate == v_previous then + if trace then + report("entry %a, order %a, flushing due to state %a",i,c.order,oldstate) + end + context.page_injections_flush_saved(c.name,c.parameters) + elseif type(oldstate) == "number" and oldstate < 0 then + local newstate = oldstate + 1 + if newstate >= 0 then + newstate = v_previous + end + if trace then + report("entry %a, order %a, changing state from %a to %a",i,c.order,oldstate,newstate) + end + c.state = newstate + delayed[#delayed+1] = c + else + delayed[#delayed+1] = c + end + end + context.unprotect() + cache = delayed + texsetcount("global","c_page_boxes_flush_n",#cache) + end +end + +function injections.flushafter() -- maybe not public, just commands.* + if #cache > 0 then + local delayed = { } + context.unprotect() + for i=1,#cache do + local c = cache[i] + local oldstate = c.state + if oldstate == v_next then + if trace then + report("entry %a, order %a, flushing due to state %a",i,c.order,oldstate) + end + context.page_injections_flush_saved(c.name,c.parameters) + elseif type(oldstate) == "number" and oldstate> 0 then + local newstate = oldstate- 1 + if newstate <= 0 then + newstate = v_next + end + if trace then + report("entry %a, order %a, changing state from %a to %a",i,c.order,oldstate,newstate) + end + c.state = newstate + delayed[#delayed+1] = c + end + end + context.protect() + cache = delayed + texsetcount("global","c_page_boxes_flush_n",#cache) + end +end + +implement { + name = "savepageinjections", + actions = injections.save, + arguments = { + { + { "name" }, + { "state" }, + { "userdata" } + } + } +} + +implement { + name = "flushpageinjectionsbefore", + actions = injections.flushbefore +} + +implement { + name = "flushpageinjectionsafter", + actions = injections.flushafter +} |