diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua | 138 |
1 files changed, 38 insertions, 100 deletions
diff --git a/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua b/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua index 4b2ac04b7f3..2de26ac64d1 100644 --- a/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua +++ b/Master/texmf-dist/tex/context/base/mkiv/strc-doc.lua @@ -18,7 +18,6 @@ if not modules then modules = { } end modules ['strc-doc'] = { local next, type, tonumber, select = next, type, tonumber, select local find, match = string.find, string.match local concat, fastcopy, insert, remove = table.concat, table.fastcopy, table.insert, table.remove -local sortedhash, sortedkeys = table.sortedhash, table.sortedkeys local max, min = math.max, math.min local allocate, mark, accesstable = utilities.storage.allocate, utilities.storage.mark, utilities.tables.accesstable local setmetatableindex = table.setmetatableindex @@ -38,13 +37,11 @@ local v_auto = variables.auto local v_strict = variables.strict local v_all = variables.all local v_positive = variables.positive -local v_current = variables.current local trace_sectioning = false trackers.register("structures.sectioning", function(v) trace_sectioning = v end) local trace_detail = false trackers.register("structures.detail", function(v) trace_detail = v end) local report_structure = logs.reporter("structure","sectioning") -local report_used = logs.reporter("structure") local context = context local commands = commands @@ -125,16 +122,12 @@ local tobesaved = allocate() sections.collected = collected sections.tobesaved = tobesaved --- We have to save this mostly redundant list because we can have (rare) --- cases with own numbers that don't end up in the list so we get out of --- sync when we use (*). - -local function initializer() - collected = sections.collected - tobesaved = sections.tobesaved -end - -job.register('structures.sections.collected', tobesaved, initializer) +-- local function initializer() +-- collected = sections.collected +-- tobesaved = sections.tobesaved +-- end +-- +-- job.register('structures.sections.collected', tobesaved, initializer) local registered = sections.registered or allocate() sections.registered = registered @@ -165,7 +158,7 @@ end local lastsaved = 0 function sections.save(sectiondata) -local sectiondata = helpers.simplify(sectiondata) -- maybe done earlier +-- local sectionnumber = helpers.simplify(section.sectiondata) -- maybe done earlier local numberdata = sectiondata.numberdata local ntobesaved = #tobesaved if not numberdata or sectiondata.metadata.nolist then @@ -185,28 +178,28 @@ function sections.currentsectionindex() return lastsaved -- only for special controlled situations end --- See comment above (*). We cannot use the following space optimization: --- --- function sections.load() --- setmetatableindex(collected,nil) --- local lists = lists.collected --- for i=1,#lists do --- local list = lists[i] --- local metadata = list.metadata --- if metadata and metadata.kind == "section" and not metadata.nolist then --- local numberdata = list.numberdata --- if numberdata then --- collected[#collected+1] = numberdata --- end --- end --- end --- sections.load = functions.dummy --- end +function sections.load() + setmetatableindex(collected,nil) + local lists = lists.collected + for i=1,#lists do + local list = lists[i] + local metadata = list.metadata + if metadata and metadata.kind == "section" and not metadata.nolist then + local numberdata = list.numberdata + if numberdata then + collected[#collected+1] = numberdata + end + end + end + sections.load = functions.dummy +end + +table.setmetatableindex(collected, function(t,i) + sections.load() + return collected[i] or { } +end) + -- --- table.setmetatableindex(collected, function(t,i) --- sections.load() --- return collected[i] or { } --- end) sections.verbose = true @@ -389,9 +382,8 @@ function sections.setentry(given) -- new number olddepth = newdepth if metadata.increment then - local oldn = numbers[newdepth] or 0 - local newn = 0 - local fd = forced[newdepth] + local oldn, newn = numbers[newdepth] or 0, 0 + local fd = forced[newdepth] if fd then if fd[1] == "add" then newn = oldn + fd[2] + 1 @@ -446,10 +438,7 @@ end function sections.reportstructure() if sections.verbose then - local numbers = data.numbers - local ownnumbers = data.ownnumbers - local status = data.status - local depth = data.depth + local numbers, ownnumbers, status, depth = data.numbers, data.ownnumbers, data.status, data.depth local d = status[depth] local o = concat(ownnumbers,".",1,depth) local n = (numbers and concat(numbers,".",1,min(depth,#numbers))) or 0 @@ -722,12 +711,8 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref criterium = 0 end -- - local firstprefix = 0 - local lastprefix = 16 -- too much, could max found level - if segments == v_current then - firstprefix = data.depth - lastprefix = firstprefix - elseif segments then + local firstprefix, lastprefix = 0, 16 -- too much, could max found level + if segments then local f, l = match(tostring(segments),"^(.-):(.+)$") if l == "*" or l == v_all then l = 100 -- new @@ -746,11 +731,9 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref end end -- - local numbers = entry.numbers - local ownnumbers = entry.ownnumbers + local numbers, ownnumbers = entry.numbers, entry.ownnumbers if numbers then - local done = false - local preceding = false + local done, preceding = false, false -- local result = kind == "direct" and { } if result then @@ -768,14 +751,11 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref if prefixlist and (kind == "section" or kind == "prefix" or kind == "direct") then -- find valid set (problem: for sectionnumber we should pass the level) -- no holes - local b = 1 - local e = #prefixlist - local bb = 0 - local ee = 0 + local b, e, bb, ee = 1, #prefixlist, 0, 0 -- find last valid number for k=e,b,-1 do local prefix = prefixlist[k] - local index = sections.getlevel(prefix) or k + local index = sections.getlevel(prefix) or k if index >= firstprefix and index <= lastprefix then local number = numbers and numbers[index] if number then @@ -791,7 +771,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref -- find valid range for k=b,e do local prefix = prefixlist[k] - local index = sections.getlevel(prefix) or k + local index = sections.getlevel(prefix) or k if index >= firstprefix and index <= lastprefix then local number = numbers and numbers[index] if number then @@ -992,47 +972,6 @@ function sections.getnumber(depth,what) -- redefined here context(askednumber) end --- maybe handy - -function sections.showstructure() - - local tobesaved = structures.lists.tobesaved - - if not tobesaved then - return - end - - local levels = setmetatableindex("table") - local names = setmetatableindex("table") - - report_used() - report_used("sections") - for i=1,#tobesaved do - local si = tobesaved[i] - local md = si.metadata - if md and md.kind == "section" then - local level = md.level - local name = md.name - local numbers = si.numberdata.numbers - local title = si.titledata.title - report_used(" %i : %-10s %-20s %s",level,concat(numbers,"."),name,title) - levels[level][name] = true - names[name][level] = true - end - end - report_used() - report_used("levels") - for level, list in sortedhash(levels) do - report_used(" %s : % t",level,sortedkeys(list)) - end - report_used() - report_used("names") - for name, list in sortedhash(names) do - report_used(" %-10s : % t",name,sortedkeys(list)) - end - report_used() -end - -- experimental local levels = { } @@ -1103,7 +1042,6 @@ implement { name = "getsomefullstructurenumber", actions = sections.fullnumber, implement { name = "getspecificstructuretitle", actions = sections.structuredata, arguments = { "string", "'titledata.title'",false,"string" } } implement { name = "reportstructure", actions = sections.reportstructure } -implement { name = "showstructure", actions = sections.showstructure } implement { name = "registersection", |