diff options
author | Karl Berry <karl@freefriends.org> | 2013-04-08 00:43:40 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-04-08 00:43:40 +0000 |
commit | 824f7b0903de8ad7f6ee3d7656005e4c59155e06 (patch) | |
tree | abfc8673ef9916f3ab7074e811207384c301492b /Master/texmf-dist/tex/context/base/strc-lst.lua | |
parent | 689aefb0727676ed3cddf331337b4be226495e72 (diff) |
context import for TL13, from www.pragma-ade.com/context/beta/cont-tmf.zip
git-svn-id: svn://tug.org/texlive/trunk@29731 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/strc-lst.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/strc-lst.lua | 156 |
1 files changed, 116 insertions, 40 deletions
diff --git a/Master/texmf-dist/tex/context/base/strc-lst.lua b/Master/texmf-dist/tex/context/base/strc-lst.lua index 48aab78dbfe..95f5e675ecd 100644 --- a/Master/texmf-dist/tex/context/base/strc-lst.lua +++ b/Master/texmf-dist/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 = { } @@ -260,17 +239,17 @@ local function filtercollected(names, criterium, number, collected, forced, nest criterium = gsub(criterium or ""," ","") -- not needed -- new, will be applied stepwise local wantedblock, wantedcriterium = lpegmatch(splitter,criterium) -- block:criterium - if not wantedcriterium then - block = documents.data.block - elseif wantedblock == "" or wantedblock == variables.all or wantedblock == variables.text then + if wantedblock == "" or wantedblock == variables.all or wantedblock == variables.text then criterium = wantedcriterium ~= "" and wantedcriterium or criterium + elseif not wantedcriterium then + block = documents.data.block else block, criterium = wantedblock, wantedcriterium end if block == "" then block = false end ---~ print(">>",block,criterium) +-- print(">>",block,criterium) -- forced = forced or { } -- todo: also on other branched, for the moment only needed for bookmarks if type(names) == "string" then @@ -278,8 +257,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest end local all = not next(names) or names[variables.all] or false if trace_lists then - report_lists("filtering names: %s, criterium: %s, block: %s, number: %s", - simple_hash_to_string(names),criterium,block or "*", number or "-") + report_lists("filtering names %a, criterium %a, block %a, number %a",names,criterium,block or "*",number) end if criterium == variables.intro then -- special case, no structure yet @@ -295,7 +273,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest for i=1,#collected do local v = collected[i] local r = v.references - if r then + if r and (not block or not r.block or block == r.block) then local metadata = v.metadata if metadata then local name = metadata.name or false @@ -353,7 +331,6 @@ local function filtercollected(names, criterium, number, collected, forced, nest local cnumbers = sectionnumber.numbers local metadata = v.metadata if cnumbers then ---~ print(#cnumbers, depth, concat(cnumbers)) if metadata and not metadata.nolist and (all or names[metadata.name or false]) and #cnumbers >= depth then local ok = true for d=1,depth do @@ -434,7 +411,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest local number = tonumber(number) or numberatdepth(depth) or 0 if trace_lists then local t = sections.numbers() - detail = format("depth: %s, number: %s, numbers: %s, startset: %s",depth,number,(#t>0 and concat(t,".",1,depth)) or "?",#collected) + detail = format("depth %s, number %s, numbers %s, startset %s",depth,number,(#t>0 and concat(t,".",1,depth)) or "?",#collected) end if number > 0 then local pnumbers = nil @@ -464,18 +441,14 @@ local function filtercollected(names, criterium, number, collected, forced, nest end end if trace_lists then - if detail then - report_lists("criterium: %s, block: %s, %s, found: %s",criterium,block or "*",detail,#result) - else - report_lists("criterium: %s, block: %s, found: %s",criterium,block or "*",#result) - end + report_lists("criterium %a, block %a, found %a, detail %a",criterium,block or "*",#result,detail) end if sortorder then -- experiment local sorter = sorters[sortorder] if sorter then if trace_lists then - report_lists("sorting list using method %s",sortorder) + report_lists("sorting list using method %a",sortorder) end for i=1,#result do result[i].references.order = i @@ -597,7 +570,7 @@ function lists.hasnumberdata(name,n) local data = lists.result[n] if data then local numberdata = data.numberdata - if numberdata then + if numberdata and not numberdata.hidenumber then -- th ehide number is true return true end end @@ -644,7 +617,6 @@ function lists.prefixednumber(name,n,prefixspec,numberspec) helpers.prefix(data,prefixspec) local numberdata = data.numberdata if numberdata then ---~ print(table.serialize(numberspec)) sections.typesetnumber(numberdata,"number",numberspec or false,numberdata or false) end end @@ -731,10 +703,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) @@ -743,3 +732,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 = numberdata.counter or 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 = numberdata.counter or 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 |