summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-lst.lua
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2010-12-14 00:20:12 +0200
committerMarius <mariausol@gmail.com>2010-12-14 00:20:12 +0200
commitb809b01d48419c1cb3459db64b1252515c520705 (patch)
tree480da2554423a0bd58c37be714d9f41cde3a9c26 /tex/context/base/strc-lst.lua
parent7c318ca9064f51e8b438791b98dd552327bb7a00 (diff)
downloadcontext-b809b01d48419c1cb3459db64b1252515c520705.tar.gz
beta 2010.12.13 22:59
Diffstat (limited to 'tex/context/base/strc-lst.lua')
-rw-r--r--tex/context/base/strc-lst.lua53
1 files changed, 45 insertions, 8 deletions
diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua
index 5e154b1d6..8278a66d9 100644
--- a/tex/context/base/strc-lst.lua
+++ b/tex/context/base/strc-lst.lua
@@ -196,7 +196,22 @@ local splitter = lpeg.splitat(":")
-- this will become filtercollected(specification) and then we'll also have sectionblock as key
-local function filtercollected(names, criterium, number, collected, forced, nested) -- names is hash or string
+local sorters = {
+ [variables.command] = function(a,b)
+ if a.metadata.kind == "command" or b.metadata.kind == "command" then
+ return a.references.internal < b.references.internal
+ else
+ return a.references.order < b.references.order
+ end
+ end,
+ [variables.all] = function(a,b)
+ return a.references.internal < b.references.internal
+ end,
+}
+
+-- some day soon we will pass a table
+
+local function filtercollected(names, criterium, number, collected, forced, nested, sortorder) -- names is hash or string
local numbers, depth = documents.data.numbers, documents.data.depth
local result, nofresult, detail = { }, 0, nil
local block = false -- all
@@ -252,7 +267,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest
end
elseif criterium == variables.current then
if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced)
+ return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
for i=1,#collected do
local v = collected[i]
@@ -285,7 +300,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest
elseif criterium == variables.here then
-- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers
if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced)
+ return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
for i=1,#collected do
local v = collected[i]
@@ -318,7 +333,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest
end
elseif criterium == variables.previous then
if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced)
+ return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
for i=1,#collected do
local v = collected[i]
@@ -351,11 +366,11 @@ local function filtercollected(names, criterium, number, collected, forced, nest
elseif criterium == variables["local"] then -- not yet ok
local nested = nesting[#nesting]
if nested then
- return filtercollected(names,nested.name,nested.number,collected,forced,nested)
+ return filtercollected(names,nested.name,nested.number,collected,forced,nested,sortorder)
elseif sections.autodepth(documents.data.numbers) == 0 then
- return filtercollected(names,variables.all,number,collected,forced)
+ return filtercollected(names,variables.all,number,collected,forced,false,sortorder)
else
- return filtercollected(names,variables.current,number,collected,forced)
+ return filtercollected(names,variables.current,number,collected,forced,false,sortorder)
end
else -- sectionname, number
-- not the same as register
@@ -393,13 +408,35 @@ local function filtercollected(names, criterium, number, collected, forced, nest
report_lists("criterium: %s, block: %s, found: %s",criterium,block or "*",#result)
end
end
+
+ if sortorder then -- experiment
+ local sorter = sorters[sortorder]
+ if sorter then
+ if trace_lists then
+ report_lists("sorting list using method %s",sortorder)
+ end
+ for i=1,#result do
+ result[i].references.order = i
+ end
+ table.sort(result,sorter)
+ end
+ end
+
return result
end
lists.filtercollected = filtercollected
function lists.filter(specification)
- return filtercollected(specification.names, specification.criterium, specification.number, lists.collected, specification.forced)
+ return filtercollected(
+ specification.names,
+ specification.criterium,
+ specification.number,
+ lists.collected,
+ specification.forced,
+ false,
+ specification.order
+ )
end
lists.result = { }