diff options
author | Karl Berry <karl@freefriends.org> | 2016-04-27 21:54:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-04-27 21:54:13 +0000 |
commit | 4ca0e50699e2f4fc4dbe8b1dc4fe528a51b5429d (patch) | |
tree | 15c515e279a70c47939a7451b70ebfec6bbcb579 /Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua | |
parent | 92b16675f5d3c1e9819112e099165b4dbc5f8a52 (diff) |
context (27apr16)
git-svn-id: svn://tug.org/texlive/trunk@40787 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua | 105 |
1 files changed, 103 insertions, 2 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua index 4efbe038b3d..66c264a49d8 100644 --- a/Master/texmf-dist/tex/context/base/mkiv/strc-reg.lua +++ b/Master/texmf-dist/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 }, +} |