diff options
author | Hans Hagen <pragma@wxs.nl> | 2023-03-06 15:17:09 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2023-03-06 15:17:09 +0100 |
commit | e12b4fabeb0ce3ce6d256b54250cf38a8f940561 (patch) | |
tree | b574cb45fe8a416e60c912a8e2d754abdad3b63c /tex/context/base/mkxl/strc-reg.lmt | |
parent | 23b5ef45e7939a00addff726d02d6c29243177af (diff) | |
download | context-e12b4fabeb0ce3ce6d256b54250cf38a8f940561.tar.gz |
2023-03-06 14:47:00
Diffstat (limited to 'tex/context/base/mkxl/strc-reg.lmt')
-rw-r--r-- | tex/context/base/mkxl/strc-reg.lmt | 148 |
1 files changed, 113 insertions, 35 deletions
diff --git a/tex/context/base/mkxl/strc-reg.lmt b/tex/context/base/mkxl/strc-reg.lmt index a3a7dae6c..e2c4fdf02 100644 --- a/tex/context/base/mkxl/strc-reg.lmt +++ b/tex/context/base/mkxl/strc-reg.lmt @@ -1037,38 +1037,68 @@ function registers.finalize(data,options) -- maps character to index (order) data.result = split end --- local function analyzeregister(class,options) --- local data = collected[class] --- if data and data.entries then --- options = options or { } --- sorters.setlanguage(options.language,options.method,options.numberorder) --- registers.filter(data,options) -- filter entries into results (criteria) --- registers.prepare(data,options) -- adds split table parallel to list table --- registers.sort(data,options) -- sorts results --- registers.unique(data,options) -- get rid of duplicates --- registers.finalize(data,options) -- split result in ranges --- data.metadata.sorted = true --- return data.metadata.nofsorted or 0 --- else --- return 0 --- end --- end +local used = { } + +function registers.use(tag,filename,class,prefix) + used[tag] = { + class = class, + filename = filename, + data = job.loadother(filename), + prefix = prefix or class, + } +end + +implement { + name = "useregister", + arguments = "4 strings", + actions = registers.use, +} + +implement { + name = "registerprefix", + arguments = "string", + actions = function(tag) + local u = used[tag] + if u then + context(u.prefix) + end + end +} local function analyzeregister(class,options) local data = rawget(collected,class) if not data then - local list = utilities.parsers.settings_to_array(class) - local entries = { } - local metadata = false + local list = utilities.parsers.settings_to_array(class) + local entries = { } + local nofentries = 0 + local metadata = false for i=1,#list do local l = list[i] + local u = used[l] local d = collected[l] - local e = d.entries - for i=1,#e do - entries[#entries+1] = e[i] + if u then + local collected = u.data.structures.registers.collected + local class = u.class + if collected and class then + d = collected[class] + end end - if not metadata then - metadata = d.metadata + if d then + local e = d.entries + local u = u and { u.prefix } or nil + for i=1,#e do + local ei = e[i] + nofentries = nofentries + 1 + entries[nofentries] = ei + if u then + local eil = ei.list + eil[#eil+1] = u + ei.external = l -- this is the (current) abstract tag, used for prefix + end + end + if not metadata then + metadata = d.metadata + end end end data = { @@ -1080,11 +1110,11 @@ local function analyzeregister(class,options) if data and data.entries then options = options or { } sorters.setlanguage(options.language,options.method,options.numberorder) - registers.filter(data,options) -- filter entries into results (criteria) - registers.prepare(data,options) -- adds split table parallel to list table - registers.sort(data,options) -- sorts results - registers.unique(data,options) -- get rid of duplicates - registers.finalize(data,options) -- split result in ranges + registers.filter(data,options) -- filter entries into results (criteria) + registers.prepare(data,options) -- adds split table parallel to list table + registers.sort(data,options) -- sorts results + registers.unique(data,options) -- get rid of duplicates + registers.finalize(data,options) -- split result in ranges data.metadata.sorted = true return data.metadata.nofsorted or 0 else @@ -1131,12 +1161,12 @@ local function pagerange(f_entry,t_entry,is_last,prefixspec,pagespec) ctx_registerpagerange( f_entry.metadata.name or "", f_entry.processors and f_entry.processors[2] or "", - fer.internal or 0, + f_entry.external or fer.internal or 0, fer.realpage or 0, function() h_prefixpage(f_entry,prefixspec,pagespec) end, - ter.internal or 0, + t_entry.external or ter.internal or 0, ter.lastrealpage or ter.realpage or 0, function() if is_last then @@ -1153,7 +1183,7 @@ local function pagenumber(entry,prefixspec,pagespec) ctx_registeronepage( entry.metadata.name or "", entry.processors and entry.processors[2] or "", - er.internal or 0, + entry.external or er.internal or 0, er.realpage or 0, function() h_prefixpage(entry,prefixspec,pagespec) end ) @@ -1162,9 +1192,10 @@ end local function packed(f_entry,t_entry) local fer = f_entry.references local ter = t_entry.references +-- todo: make sure we don't end up here with external ctx_registerpacked( - fer.internal or 0, - ter.internal or 0 + f_entry.external or fer.internal or 0, + t_entry.external or ter.internal or 0 ) end @@ -1286,6 +1317,10 @@ function registers.flush(data,options,prefixspec,pagespec) -- report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1]) end end + if entry.external then + local list = entry.list + list[#list] = nil + end end -- ok, this is tricky: we use e[i] delayed so we need it to be local -- but we don't want to allocate too many entries so there we go @@ -1497,7 +1532,7 @@ function registers.flush(data,options,prefixspec,pagespec) local seeword = entry.seeword local seetext = seeword.text or "" local processor = seeword.processor or (entry.processors and entry.processors[1]) or "" - local seeindex = entry.references.seeindex or "" + local seeindex = entry.external or entry.references.seeindex or "" ctx_registerseeword( metadata.name or "", i, @@ -1696,3 +1731,46 @@ interfaces.implement { arguments = { "string", "string", "integer" }, actions = { registers.findinternal, context }, } + +-- external data + +function registers.integrate(utilitydata) + local filename = utilitydata.comment.file + if filename then + local structures = utilitydata.structures + if structures then + local registers = structures.registers.collected or { } + if registers then + local sections = structures.sections.collected or { } + local pages = structures.pages .collected or { } + for class, register in next, registers do + local entries = register.entries + if entries then + for i=1,#entries do + local entry = entries[i] + local references = entry.references + if references then + local section = references.section + local realpage = references.realpage + -- maybe entry.* instead: + references.sectiondata = section and sections[section] + references.pagedata = realpage and pages[realpage] + -- get rid of these, maybe even crash as these are bogus + -- references.internal = nil -- or 0 + -- references.realpage = nil -- or 0 + -- references.section = nil -- or 0 + if references.x then + references.x = nil + end + if references.y then + references.y = nil + end + references.external = filename -- not really needed + end + end + end + end + end + end + end +end |