summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-doc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/strc-doc.lua')
-rw-r--r--tex/context/base/strc-doc.lua284
1 files changed, 144 insertions, 140 deletions
diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua
index 660dd61f3..d1048972b 100644
--- a/tex/context/base/strc-doc.lua
+++ b/tex/context/base/strc-doc.lua
@@ -15,6 +15,7 @@ local format, gsub, find, concat, gmatch, match = string.format, string.gsub, st
local texsprint, texwrite = tex.sprint, tex.write
local concat = table.concat
local max, min = math.max, math.min
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
local ctxcatcodes = tex.ctxcatcodes
local variables = interfaces.variables
@@ -34,6 +35,7 @@ local sections = structures.sections
local lists = structures.lists
local counters = structures.counters
local sets = structures.sets
+local tags = structures.tags
local processors = structures.processors
local sprintprocessor = processors.sprint
@@ -70,16 +72,18 @@ documents.initialize()
-- -- -- sections -- -- --
-sections.collected = sections.collected or { }
-sections.tobesaved = sections.tobesaved or { }
-local collected, tobesaved = sections.collected, sections.tobesaved
+local collected, tobesaved = allocate(), allocate()
+
+sections.collected = collected
+sections.tobesaved = tobesaved
--~ local function initializer()
---~ collected, tobesaved = sections.collected, sections.tobesaved
+--~ collected = mark(sections.collected)
+--~ tobesaved = mark(sections.tobesaved)
--~ end
---~ job.register('structures.sections.collected', sections.tobesaved, initializer)
+--~ job.register('structures.sections.collected', tobesaved, initializer)
function sections.currentid()
return #tobesaved
@@ -311,6 +315,9 @@ function sections.somelevel(given)
if trace_detail then
report_structure("name '%s', numbers '%s', own numbers '%s'",givenname,concat(numberdata.numbers, " "),concat(numberdata.ownnumbers, " "))
end
+
+ given.references.tag = tags.last and tags.last("section") -- (metadata.kind) sort of forward usage (section -> structure)
+
given.references.section = sections.save(given)
-- given.numberdata = nil
end
@@ -472,48 +479,51 @@ end
--~ todo: test this
--~
---~ local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,preceding,done) -- todo: result
---~ -- todo: too much (100 steps)
---~ local number = numbers and (numbers[index] or 0)
---~ local ownnumber = ownnumbers and ownnumbers[index] or ""
---~ if number > criterium or (ownnumber ~= "") then
---~ local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
---~ if preceding then
---~ local separator = sets.get("structure:separators",block,separatorset,preceding,".")
---~ if result then
---~ result[#result+1] = ignoreprocessor(separator)
---~ else
---~ sprintprocessor(ctxcatcodes,separator)
---~ end
---~ preceding = false
---~ end
---~ if result then
---~ if ownnumber ~= "" then
---~ result[#result+1] = ownnumber
---~ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
---~ result[#result+1] = converters.convert(conversion,number,true)
---~ else
---~ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
---~ result[#result+1] = converters.convert(theconversion,number,true)
---~ end
---~ else
---~ if ownnumber ~= "" then
---~ sprintprocessor(ctxcatcodes,ownnumber)
---~ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
---~ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
---~ -- context.convertnumber(conversion,number)
---~ else
---~ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
---~ sprintprocessor(ctxcatcodes,theconversion,function(str)
---~ return format("\\convertnumber{%s}{%s}",str or "numbers",number)
---~ end)
---~ end
---~ end
---~ return index, true -- preceding, done
---~ else
---~ return preceding or false, done
---~ end
---~ end
+
+local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
+ -- todo: too much (100 steps)
+ local number = numbers and (numbers[index] or 0)
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > criterium or (ownnumber ~= "") then
+ local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
+ if preceding then
+ local separator = sets.get("structure:separators",block,separatorset,preceding,".")
+ if separator then
+ if result then
+ result[#result+1] = ignoreprocessor(separator)
+ else
+ sprintprocessor(ctxcatcodes,separator)
+ end
+ end
+ preceding = false
+ end
+ if result then
+ if ownnumber ~= "" then
+ result[#result+1] = ownnumber
+ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups) .. inherited!
+ result[#result+1] = converters.convert(conversion,number,true)
+ else
+ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ result[#result+1] = converters.convert(theconversion,number,true)
+ end
+ else
+ if ownnumber ~= "" then
+ sprintprocessor(ctxcatcodes,ownnumber)
+ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
+ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
+ -- context.convertnumber(conversion,number)
+ else
+ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ sprintprocessor(ctxcatcodes,theconversion,function(str)
+ return format("\\convertnumber{%s}{%s}",str or "numbers",number)
+ end)
+ end
+ end
+ return index, true
+ else
+ return preceding or false, done
+ end
+end
function sections.typesetnumber(entry,kind,...) -- kind='section','number','prefix'
if entry and entry.hidenumber ~= true then -- can be nil
@@ -579,50 +589,6 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
local numbers, ownnumbers = entry.numbers, entry.ownnumbers
if numbers then
local done, preceding = false, false
- local function process(index,result) -- move to outer
- -- todo: too much (100 steps)
- local number = numbers and (numbers[index] or 0)
- local ownnumber = ownnumbers and ownnumbers[index] or ""
- if number > criterium or (ownnumber ~= "") then
- local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
- if preceding then
- local separator = sets.get("structure:separators",block,separatorset,preceding,".")
- if separator then
- if result then
- result[#result+1] = ignoreprocessor(separator)
- else
- sprintprocessor(ctxcatcodes,separator)
- end
- end
- preceding = false
- end
- if result then
- if ownnumber ~= "" then
- result[#result+1] = ownnumber
- elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
- result[#result+1] = converters.convert(conversion,number,true)
- else
- local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
- result[#result+1] = converters.convert(theconversion,number,true)
- end
- else
- if ownnumber ~= "" then
- sprintprocessor(ctxcatcodes,ownnumber)
- elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
- texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
- --~ context.convertnumber(conversion,number)
- else
- local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
- sprintprocessor(ctxcatcodes,theconversion,function(str)
- return format("\\convertnumber{%s}{%s}",str or "numbers",number)
- end)
- end
- end
- preceding, done = index, true
- else
- preceding = preceding or false
- end
- end
--
local result = kind == "direct" and { }
if result then
@@ -639,65 +605,57 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
end
if prefixlist and (kind == 'section' or kind == 'prefix' or kind == 'direct') then
-- find valid set (problem: for sectionnumber we should pass the level)
- -- if kind == "section" then
- -- no holes
- 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
- if index >= firstprefix and index <= lastprefix then
- local number = numbers and numbers[index]
- if number then
- local ownnumber = ownnumbers and ownnumbers[index] or ""
- if number > 0 or (ownnumber ~= "") then
- break
- else
- e = k -1
- end
+ -- no holes
+ 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
+ if index >= firstprefix and index <= lastprefix then
+ local number = numbers and numbers[index]
+ if number then
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > 0 or (ownnumber ~= "") then
+ break
+ else
+ e = k -1
end
end
end
- -- find valid range
- for k=b,e do
- local prefix = prefixlist[k]
- local index = sections.getlevel(prefix) or k
- if index >= firstprefix and index <= lastprefix then
- local number = numbers and numbers[index]
- if number then
- local ownnumber = ownnumbers and ownnumbers[index] or ""
- if number > 0 or (ownnumber ~= "") then
- if bb == 0 then bb = k end
- ee = k
- else
- bb, ee = 0, 0
- end
+ end
+ -- find valid range
+ for k=b,e do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ local number = numbers and numbers[index]
+ if number then
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > 0 or (ownnumber ~= "") then
+ if bb == 0 then bb = k end
+ ee = k
else
- break
+ bb, ee = 0, 0
end
+ else
+ break
end
end
- -- print valid range
- for k=bb,ee do
- local prefix = prefixlist[k]
- local index = sections.getlevel(prefix) or k
- if index >= firstprefix and index <= lastprefix then
- process(index,result)
- end
+ end
+ -- print valid range
+ for k=bb,ee do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ -- process(index,result)
+ preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
end
- -- else
- -- for k=1,#prefixlist do
- -- local prefix = prefixlist[k]
- -- local index = sections.getlevel(prefix) or k
- -- if index >= firstprefix and index <= lastprefix then
- -- process(index)
- -- end
- -- end
- -- end
+ end
else
-- also holes check
- for prefix=firstprefix,lastprefix do
- process(prefix,result)
+ for index=firstprefix,lastprefix do
+ -- process(index,result)
+ preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
end
end
--
@@ -777,3 +735,49 @@ function sections.getnumber(depth,what) -- redefined here
local sectiondata = sections.findnumber(depth,what)
texwrite((sectiondata and sectiondata.numbers[depth]) or 0)
end
+
+--~ local done, preceding = false, false
+--~ local function process(index,result) -- move to outer
+--~ -- todo: too much (100 steps)
+--~ local number = numbers and (numbers[index] or 0)
+--~ local ownnumber = ownnumbers and ownnumbers[index] or ""
+--~ if number > criterium or (ownnumber ~= "") then
+--~ local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
+--~ if preceding then
+--~ local separator = sets.get("structure:separators",block,separatorset,preceding,".")
+--~ if separator then
+--~ if result then
+--~ result[#result+1] = ignoreprocessor(separator)
+--~ else
+--~ sprintprocessor(ctxcatcodes,separator)
+--~ end
+--~ end
+--~ preceding = false
+--~ end
+--~ if result then
+--~ if ownnumber ~= "" then
+--~ result[#result+1] = ownnumber
+--~ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
+--~ result[#result+1] = converters.convert(conversion,number,true)
+--~ else
+--~ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+--~ result[#result+1] = converters.convert(theconversion,number,true)
+--~ end
+--~ else
+--~ if ownnumber ~= "" then
+--~ sprintprocessor(ctxcatcodes,ownnumber)
+--~ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
+--~ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
+--~ --~ context.convertnumber(conversion,number)
+--~ else
+--~ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+--~ sprintprocessor(ctxcatcodes,theconversion,function(str)
+--~ return format("\\convertnumber{%s}{%s}",str or "numbers",number)
+--~ end)
+--~ end
+--~ end
+--~ preceding, done = index, true
+--~ else
+--~ preceding = preceding or false
+--~ end
+--~ end