diff options
Diffstat (limited to 'tex/context/base/mkiv/page-pst.lua')
-rw-r--r-- | tex/context/base/mkiv/page-pst.lua | 105 |
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" +} + |