summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/strc-reg.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-04-25 14:10:48 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-04-25 14:10:48 +0200
commit4668b7323a6bc1b01e72418fb646b697d68bbcb7 (patch)
tree926785b550bed158e0489d209edbab366c6997c2 /tex/context/base/mkiv/strc-reg.lua
parent55666205c2c1a7287105e23f58e2047c1e0dbc5a (diff)
downloadcontext-4668b7323a6bc1b01e72418fb646b697d68bbcb7.tar.gz
2016-04-25 13:34:00
Diffstat (limited to 'tex/context/base/mkiv/strc-reg.lua')
-rw-r--r--tex/context/base/mkiv/strc-reg.lua105
1 files changed, 103 insertions, 2 deletions
diff --git a/tex/context/base/mkiv/strc-reg.lua b/tex/context/base/mkiv/strc-reg.lua
index 4efbe038b..66c264a49 100644
--- a/tex/context/base/mkiv/strc-reg.lua
+++ b/tex/context/base/mkiv/strc-reg.lua
@@ -40,8 +40,12 @@ local variables = interfaces.variables
local v_forward = variables.forward
local v_all = variables.all
local v_yes = variables.yes
+local v_packed = variables.packed
local v_current = variables.current
local v_previous = variables.previous
+local v_next = variables.next
+local v_first = variables.first
+local v_last = variables.last
local v_text = variables.text
local context = context
@@ -86,6 +90,7 @@ local ctx_registerentry = context.registerentry
local ctx_registerseeword = context.registerseeword
local ctx_registerpagerange = context.registerpagerange
local ctx_registeronepage = context.registeronepage
+local ctx_registerpacked = context.registerpacked
-- possible export, but ugly code (overloads)
--
@@ -995,6 +1000,14 @@ local function pagenumber(entry,prefixspec,pagespec)
)
end
+local function packed(f_entry,t_entry)
+ local fer, ter = f_entry.references, t_entry.references
+ ctx_registerpacked(
+ fer.internal or 0,
+ ter.internal or 0
+ )
+end
+
local function collapsedpage(pages)
for i=2,#pages do
local first, second = pages[i-1], pages[i]
@@ -1059,8 +1072,10 @@ local function collapsepages(pages)
end
function registers.flush(data,options,prefixspec,pagespec)
- local collapse_singles = options.compress == v_yes
- local collapse_ranges = options.compress == v_all
+ local compress = options.compress
+ local collapse_singles = compress == v_yes
+ local collapse_ranges = compress == v_all
+ local collapse_packed = compress == v_packed
local show_page_number = options.pagenumber ~= false -- true or false
local result = data.result
local maxlevel = 0
@@ -1237,6 +1252,28 @@ function registers.flush(data,options,prefixspec,pagespec)
else
pagenumber(entry,prefixspec,pagespec)
end
+ elseif collapse_packed then
+ local first = nil
+ local last = nil
+ while true do
+ if not first then
+ first = entry
+ end
+ last = entry
+ if d == #data then
+ break
+ else
+ d = d + 1
+ local next = data[d]
+ if next.metadata.kind == "see" or not equal(entry.list,next.list) then
+ d = d - 1
+ break
+ else
+ entry = next
+ end
+ end
+ end
+ packed(first,last) -- returns internals
else
while true do
if entry.references.lastrealpage then
@@ -1352,3 +1389,67 @@ implement {
}
}
}
+
+-- linked registers
+
+function registers.findinternal(tag,where,n)
+ -- local collected = registers.collected
+ local current = collected[tag]
+ if not current then
+ return 0
+ end
+ local entries = current.entries
+ if not entries then
+ return 0
+ end
+ local entry = entries[n]
+ if not entry then
+ return 0
+ end
+ local list = entry.list
+ local size = #list
+ --
+ local start, stop, step
+ if where == v_previous then
+ start = n - 1
+ stop = 1
+ step = -1
+ elseif where == v_first then
+ start = 1
+ stop = #entries
+ step = 1
+ elseif where == v_last then
+ start = #entries
+ stop = 1
+ step = -1
+ else
+ start = n + 1
+ stop = #entries
+ step = 1
+ end
+ --
+ for i=start,stop,step do
+ local r = entries[i]
+ local l = r.list
+ local s = #l
+ if s == size then
+ local ok = true
+ for i=1,size do
+ if list[i][1] ~= l[i][1] then
+ ok = false
+ break
+ end
+ end
+ if ok then
+ return r.references.internal or 0
+ end
+ end
+ end
+ return 0
+end
+
+interfaces.implement {
+ name = "findregisterinternal",
+ arguments = { "string", "string", "integer" },
+ actions = { registers.findinternal, context },
+}