diff options
Diffstat (limited to 'tex/context/base/mkxl/tabl-ntb.lmt')
-rw-r--r-- | tex/context/base/mkxl/tabl-ntb.lmt | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/tabl-ntb.lmt b/tex/context/base/mkxl/tabl-ntb.lmt new file mode 100644 index 000000000..a307d046a --- /dev/null +++ b/tex/context/base/mkxl/tabl-ntb.lmt @@ -0,0 +1,143 @@ +if not modules then modules = { } end modules ['tabl-ntb'] = { + version = 1.001, + comment = "companion to tabl-ntb.mkxl", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local context = context + +local a_tablesection = attributes.system("tablesection") + +local hlist_code = nodes.nodecodes.hlist + +local nuts = nodes.nuts +local tonode = nuts.tonode +local getbox = nuts.getbox +local getlist = nuts.getlist +local getid = nuts.getid +local getnext = nuts.getnext +local setnext = nuts.setnext +local getattr = nuts.getattr +local copylist = nuts.copylist +local flushlist = nuts.flushlist + +local integer_value = tokens.values.integer + +local implement = interfaces.implement + +local list = { } +local sections = { } + +local function check(b) + local c = getbox(b) + local l = c and getlist(c) + local d = false + local n = 0 + while l do + if getid(l) == hlist_code then + local line = getattr(l,a_tablesection) + if line and line ~= d then + local s = sections[line] + if s then + local count = s[2] + local last = l + local next = getnext(l) + while next and count > 0 do + last = next + next = getnext(next) + count = count - 1 + end + setnext(last) + list[line] = { l, copylist(l) } + if next then + setnext(last,next) + end + d = line + end + end + n = n + 1 + end + l = getnext(l) + end +end + +local function reset(b) + for k, v in next, list do + flushlist(v[2]) + end + list = { } + sections = { } +end + +local function locate(b) + local c = getbox(b) + local l = c and getlist(c) + while l do + if getid(l) == hlist_code then + local line = getattr(l,a_tablesection) + if line then + local v = list[line] + if v and v[1] ~= l then + return line + end + end + return 0 + end + l = getnext(l) + end + return 0 +end + +local function fetch(n) + local b = list[n] + if b then + b = copylist(b[2]) + return tonode(b) + end +end + +implement { + name = "tabl_ntb_set_sec", + public = true, + arguments = { "integer", "integer", "integer" }, + actions = function(n,m,count) + sections[n] = { m, count } + end, +} + +implement { + name = "tabl_ntb_get_sec", + public = true, + arguments = "integer", + usage = "value", + actions = function(n) + local s = sections[n] + return integer_value, s and s[1] or 0 + end, +} + +implement { + name = "ntb_split_section_check", + arguments = "integer", + actions = check, +} + +implement { + name = "ntb_split_section_reset", + arguments = "integer", + actions = reset, +} + +implement { + name = "ntb_split_section_locate", + arguments = "integer", + actions = { locate, context }, +} + +implement { + name = "ntb_split_section_fetch", + arguments = "integer", + actions = { fetch, context }, +} |