diff options
author | Hans Hagen <pragma@wxs.nl> | 2012-12-04 16:56:00 +0100 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2012-12-04 16:56:00 +0100 |
commit | bdcabe6a278c35dd450221cb8f316a889b8685d2 (patch) | |
tree | 16b5bfeecb37a58466699c9eec740a7ffe35d6f8 /tex/context/base/strc-lst.lua | |
parent | 285b43a5386d2559e44b19434eb61773ed9dcfe1 (diff) | |
download | context-bdcabe6a278c35dd450221cb8f316a889b8685d2.tar.gz |
beta 2012.12.04 16:56
Diffstat (limited to 'tex/context/base/strc-lst.lua')
-rw-r--r-- | tex/context/base/strc-lst.lua | 129 |
1 files changed, 106 insertions, 23 deletions
diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua index 424e9e05b..0c13e28b2 100644 --- a/tex/context/base/strc-lst.lua +++ b/tex/context/base/strc-lst.lua @@ -122,7 +122,7 @@ function lists.addto(t) end local m = t.metadata local r = t.references - local i = (r and r.internal) or 0 -- brrr + local i = r and r.internal or 0 -- brrr local p = pushed[i] if not p then p = #cached + 1 @@ -130,7 +130,6 @@ function lists.addto(t) pushed[i] = p r.listindex = p end - -- local setcomponent = references.setcomponent if setcomponent then setcomponent(t) -- might move to the tex end @@ -192,26 +191,6 @@ function lists.enhance(n) end end ---~ function lists.enforce(n) ---~ -- todo: symbolic names for counters ---~ local l = cached[n] ---~ if l then ---~ -- ---~ l.directives = nil -- might change ---~ -- save in the right order (happens at shipout) ---~ lists.tobesaved[#lists.tobesaved+1] = l ---~ -- default enhancer (cross referencing) ---~ l.references.realpage = texcount.realpageno ---~ -- specific enhancer (kind of obsolete) ---~ local kind = l.metadata.kind ---~ local enhancer = kind and lists.enhancers[kind] ---~ if enhancer then ---~ enhancer(l) ---~ end ---~ return l ---~ end ---~ end - -- we can use level instead but we can also decide to remove level from the metadata local nesting = { } @@ -730,10 +709,27 @@ function commands.savedlisttitle(name,n,tag) end end +-- function commands.savedlistprefixednumber(name,n) +-- local data = cached[tonumber(n)] +-- if data then +-- local numberdata = data.numberdata +-- if numberdata then +-- helpers.prefix(data,data.prefixdata) +-- sections.typesetnumber(numberdata,"number",numberdata or false) +-- end +-- end +-- end + +if not lists.reordered then + function lists.reordered(data) + return data.numberdata + end +end + function commands.savedlistprefixednumber(name,n) local data = cached[tonumber(n)] if data then - local numberdata = data.numberdata + local numberdata = lists.reordered(data) if numberdata then helpers.prefix(data,data.prefixdata) sections.typesetnumber(numberdata,"number",numberdata or false) @@ -742,3 +738,90 @@ function commands.savedlistprefixednumber(name,n) end commands.discardfromlist = lists.discard + +-- new and experimental and therefore off by default + +local sort, setmetatableindex = table.sort, table.setmetatableindex + +lists.autoreorder = false -- true + +local function addlevel(t,k) + local v = { } + setmetatableindex(v,function(t,k) + local v = { } + t[k] = v + return v + end) + t[k] = v + return v +end + +local internals = setmetatableindex({ }, function(t,k) + + local sublists = setmetatableindex({ },addlevel) + + local collected = lists.collected or { } + + for i=1,#collected do + local entry = collected[i] + local numberdata = entry.numberdata + if numberdata then + local metadata = entry.metadata + if metadata then + local references = entry.references + if references then + local kind = metadata.kind + local name = metadata.name + local internal = references.internal + if kind and name and internal then + local sublist = sublists[kind][name] + sublist[#sublist + 1] = { internal, numberdata } + end + end + end + end + end + + for k, v in next, sublists do + for k, v in next, v do + local tmp = { } + for i=1,#v do + tmp[i] = v[i] + end + sort(v,function(a,b) return a[1] < b[1] end) + for i=1,#v do + t[v[i][1]] = tmp[i][2] + end + end + end + + setmetatableindex(t,nil) + + return t[k] + +end) + +function lists.reordered(entry) + local numberdata = entry.numberdata + if lists.autoreorder then + if numberdata then + local metadata = entry.metadata + if metadata then + local references = entry.references + if references then + local kind = metadata.kind + local name = metadata.name + local internal = references.internal + if kind and name and internal then + return internals[internal] or numberdata + end + end + end + end + else + function lists.reordered(entry) + return entry.numberdata + end + end + return numberdata +end |