summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-lst.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2012-12-04 16:56:00 +0100
committerHans Hagen <pragma@wxs.nl>2012-12-04 16:56:00 +0100
commitbdcabe6a278c35dd450221cb8f316a889b8685d2 (patch)
tree16b5bfeecb37a58466699c9eec740a7ffe35d6f8 /tex/context/base/strc-lst.lua
parent285b43a5386d2559e44b19434eb61773ed9dcfe1 (diff)
downloadcontext-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.lua129
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