summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/page-pst.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/page-pst.lua')
-rw-r--r--tex/context/base/mkiv/page-pst.lua105
1 files changed, 105 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/page-pst.lua b/tex/context/base/mkiv/page-pst.lua
new file mode 100644
index 000000000..472bdbabe
--- /dev/null
+++ b/tex/context/base/mkiv/page-pst.lua
@@ -0,0 +1,105 @@
+if not modules then modules = { } end modules ['page-pst'] = {
+ version = 1.001,
+ comment = "companion to page-pst.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: adapt message
+
+local tonumber, next, type = tonumber, next, type
+local find, validstring = string.find, string.valid
+
+local context = context
+local implement = interfaces.implement
+
+local texgetcount = tex.getcount
+local texsetcount = tex.setcount
+
+local sortedkeys = table.sortedkeys
+local formatters = string.formatters
+
+local cache = { }
+
+local function flush(page)
+ local c = cache[page]
+ if c then
+ for i=1,#c do
+ -- characters.showstring(c[i])
+ context.viafile(c[i],formatters["page.%s"](validstring(page,"nopage")))
+ end
+ cache[page] = nil
+ end
+end
+
+local function setnextpage()
+ local n = next(cache) and sortedkeys(cache)[1]
+ if not n then
+ n = 0 -- nothing in the cache
+ elseif n == 0 then
+ n = -1 -- generic buffer (0)
+ elseif n > 0 then
+ -- upcoming page (realpageno)
+ end
+ texsetcount("global","c_page_postponed_blocks_next_page",n)
+end
+
+local function flushpostponedblocks(specification)
+ -- we need to flush previously pending pages as well and the zero
+ -- slot is the generic one so that one is always flushed
+ local t = sortedkeys(cache)
+ local p = tonumber(specification.page) or texgetcount("realpageno") or 0
+ for i=1,#t do
+ local ti = t[i]
+ if ti <= p then
+ flush(ti)
+ else
+ break
+ end
+ end
+ setnextpage()
+end
+
+implement {
+ name = "flushpostponedblocks",
+ actions = flushpostponedblocks,
+ arguments = {
+ {
+ { "page" }
+ }
+ }
+}
+
+local function registerpostponedblock(page)
+ if type(page) == "string" then
+ if find(page,"^+") then
+ page = texgetcount("realpageno") + (tonumber(page) or 1) -- future delta page
+ else
+ page = tonumber(page) or 0 -- preferred page or otherwise first possible occasion
+ end
+ end
+ if not page then
+ page = 0
+ end
+ local c = cache[page]
+ if not c then
+ c = { }
+ cache[page] = c
+ end
+ c[#c+1] = buffers.raw("postponedblock")
+ buffers.erase("postponedblock")
+ if page == 0 then
+ interfaces.showmessage("layouts",3,#c)
+ else
+ interfaces.showmessage("layouts",3,formatters["%s (realpage: %s)"](#c,page))
+ end
+ setnextpage()
+end
+
+implement {
+ name = "registerpostponedblock",
+ actions = registerpostponedblock,
+ arguments = "string"
+}
+