diff options
Diffstat (limited to 'tex/context/base/strc-pag.lua')
-rw-r--r-- | tex/context/base/strc-pag.lua | 626 |
1 files changed, 313 insertions, 313 deletions
diff --git a/tex/context/base/strc-pag.lua b/tex/context/base/strc-pag.lua index 63c77c1e6..f70d37d63 100644 --- a/tex/context/base/strc-pag.lua +++ b/tex/context/base/strc-pag.lua @@ -1,313 +1,313 @@ -if not modules then modules = { } end modules ['strc-pag'] = {
- version = 1.001,
- comment = "companion to strc-pag.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local texcount = tex.count
-
-local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-
-local trace_pages = false trackers.register("structures.pages", function(v) trace_pages = v end)
-
-local report_pages = logs.reporter("structure","pages")
-
-local structures = structures
-
-local helpers = structures.helpers
-local sections = structures.sections
-local pages = structures.pages
-local sets = structures.sets
-local counters = structures.counters
-
-local counterdata = counters.data
-
-local variables = interfaces.variables
-local context = context
-
-local processors = typesetters.processors
-local applyprocessor = processors.apply
-local startapplyprocessor = processors.startapply
-local stopapplyprocessor = processors.stopapply
-
--- storage
-
-local collected, tobesaved = allocate(), allocate()
-
-pages.collected = collected
-pages.tobesaved = tobesaved
-
-local function initializer()
- collected = pages.collected
- tobesaved = pages.tobesaved
-end
-
-job.register('structures.pages.collected', tobesaved, initializer)
-
-local specification = { } -- to be checked
-
-function pages.save(prefixdata,numberdata)
- local realpage, userpage = texcount.realpageno, texcount.userpageno
- if realpage > 0 then
- if trace_pages then
- report_pages("saving page %s.%s",realpage,userpage)
- end
- local data = {
- number = userpage,
- block = sections.currentblock(),
- prefixdata = prefixdata and helpers.simplify(prefixdata),
- numberdata = numberdata and helpers.simplify(numberdata),
- }
- tobesaved[realpage] = data
- if not collected[realpage] then
- collected[realpage] = data
- end
- elseif trace_pages then
- report_pages("not saving page %s.%s",realpage,userpage)
- end
-end
-
--- We can set the pagenumber but as it only get incremented in the page
--- builder we have to make sure it starts at least at 1.
-
-function counters.specials.userpage()
- local r = texcount.realpageno
- if r > 0 then
- local t = tobesaved[r]
- if t then
- t.number = texcount.userpageno
- if trace_pages then
- report_pages("forcing pagenumber of realpage %s to %s",r,t.number)
- end
- return
- end
- end
- local u = texcount.userpageno
- if u == 0 then
- if trace_pages then
- report_pages("forcing pagenumber of realpage %s to %s (probably a bug)",r,1)
- end
- counters.setvalue("userpage",1)
- texcount.userpageno = 1
- end
-end
-
-local f_convert = string.formatters["\\convertnumber{%s}{%s}"]
-
-local function convertnumber(str,n)
- return f_convert(str or "numbers",n)
-end
-
-function pages.number(realdata,pagespec)
- local userpage, block = realdata.number, realdata.block or "" -- sections.currentblock()
- local numberspec = realdata.numberdata
- local conversionset = (pagespec and pagespec.conversionset ~= "" and pagespec.conversionset) or (numberspec and numberspec.conversionset ~= "" and numberspec.conversionset) or ""
- local conversion = (pagespec and pagespec.conversion ~= "" and pagespec.conversion ) or (numberspec and numberspec.conversion ~= "" and numberspec.conversion ) or ""
- local starter = (pagespec and pagespec.starter ~= "" and pagespec.starter ) or (numberspec and numberspec.starter ~= "" and numberspec.starter ) or ""
- local stopper = (pagespec and pagespec.stopper ~= "" and pagespec.stopper ) or (numberspec and numberspec.stopper ~= "" and numberspec.stopper ) or ""
- if starter ~= "" then
- applyprocessor(starter)
- end
- if conversion ~= "" then
- context.convertnumber(conversion,userpage)
- else
- if conversionset == "" then conversionset = "default" end
- local theconversion = sets.get("structure:conversions",block,conversionset,1,"numbers") -- to be checked: 1
- local data = startapplyprocessor(theconversion)
- context.convertnumber(data or "number",userpage)
- stopapplyprocessor()
- end
- if stopper ~= "" then
- applyprocessors(stopper)
- end
-end
-
--- (pagespec.prefix == yes|unset) and (pages.prefix == yes) => prefix
-
-function pages.analyze(entry,pagespecification)
- -- safeguard
- if not entry then
- return false, false, "no entry"
- end
- local references = entry.references
- if not references then
- return false, false, "no references"
- end
- local pagedata = references.pagedata -- sometimes resolved (external)
- if not pagedata then
- local realpage = references.realpage
- if realpage then
- pagedata = collected[realpage]
- else
- return false, false, "no realpage"
- end
- end
- if not pagedata then
- return false, false, "no pagedata"
- end
- local sectiondata = references.sectiondata -- sometimes resolved (external)
- if not sectiondata then
- local section = references.section
- if section then
- sectiondata = sections.collected[section]
- else
- return pagedata, false, "no section"
- end
- end
- if not sectiondata then
- return pagedata, false, "no sectiondata"
- end
- local no = variables.no
- -- local preferences
- if pagespecification and pagespecification.prefix == no then
- return pagedata, false, "current spec blocks prefix"
- end
- -- stored preferences
- -- if entry.prefix == no then
- -- return pagedata, false, "entry blocks prefix"
- -- end
- -- stored page state
- pagespecification = pagedata.prefixdata
- if pagespecification and pagespecification.prefix == no then
- return pagedata, false, "pagedata blocks prefix"
- end
- -- final verdict
- return pagedata, sectiondata, "okay"
-end
-
-function helpers.page(data,pagespec)
- if data then
- local pagedata = pages.analyze(data,pagespec)
- if pagedata then
- pages.number(pagedata,pagespec)
- end
- end
-end
-
-function helpers.prefixpage(data,prefixspec,pagespec)
- if data then
- local pagedata, prefixdata, e = pages.analyze(data,pagespec)
- if pagedata then
- if prefixdata then
- sections.typesetnumber(prefixdata,"prefix",prefixspec or false,prefixdata or false,pagedata.prefixdata or false)
- end
- pages.number(pagedata,pagespec)
- end
- end
-end
-
-function helpers.prefixlastpage(data,prefixspec,pagespec)
- if data then
- local r = data.references
- local ls, lr = r.section, r.realpage
- r.section, r.realpage = r.lastsection or r.section, r.lastrealpage or r.realpage
- helpers.prefixpage(data,prefixspec,pagespec)
- r.section, r.realpage = ls, lr
- end
-end
-
---
-
-function helpers.analyze(entry,specification)
- -- safeguard
- if not entry then
- return false, false, "no entry"
- end
- local yes, no = variables.yes, variables.no
- -- section data
- local references = entry.references
- if not references then
- return entry, false, "no references"
- end
- local section = references.section
- if not section then
- return entry, false, "no section"
- end
- local sectiondata = sections.collected[references.section]
- if not sectiondata then
- return entry, false, "no section data"
- end
- -- local preferences
- if specification and specification.prefix == no then
- return entry, false, "current spec blocks prefix"
- end
- -- stored preferences (not used)
- local prefixdata = entry.prefixdata
- if prefixdata and prefixdata.prefix == no then
- return entry, false, "entry blocks prefix"
- end
- -- final verdict
- return entry, sectiondata, "okay"
-end
-
-function helpers.prefix(data,prefixspec)
- if data then
- local _, prefixdata, status = helpers.analyze(data,prefixspec)
- if prefixdata then
- sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false)
- end
- end
-end
-
-function pages.is_odd(n)
- n = n or texcount.realpageno
- if texcount.pagenoshift % 2 == 0 then
- return n % 2 == 0
- else
- return n % 2 ~= 0
- end
-end
-
--- move to strc-pag.lua
-
-function counters.analyze(name,counterspecification)
- local cd = counterdata[name]
- -- safeguard
- if not cd then
- return false, false, "no counter data"
- end
- -- section data
- local sectiondata = sections.current()
- if not sectiondata then
- return cd, false, "not in section"
- end
- local references = sectiondata.references
- if not references then
- return cd, false, "no references"
- end
- local section = references.section
- if not section then
- return cd, false, "no section"
- end
- sectiondata = sections.collected[references.section]
- if not sectiondata then
- return cd, false, "no section data"
- end
- -- local preferences
- local no = variables.no
- if counterspecification and counterspecification.prefix == no then
- return cd, false, "current spec blocks prefix"
- end
- -- stored preferences (not used)
- if cd.prefix == no then
- return cd, false, "entry blocks prefix"
- end
- -- sectioning
- -- if sectiondata.prefix == no then
- -- return false, false, "sectiondata blocks prefix"
- -- end
- -- final verdict
- return cd, sectiondata, "okay"
-end
-
-function sections.prefixedconverted(name,prefixspec,numberspec)
- local cd, prefixdata, result = counters.analyze(name,prefixspec)
- if cd then
- if prefixdata then
- sections.typesetnumber(prefixdata,"prefix",prefixspec or false,cd or false)
- end
- counters.converted(name,numberspec)
- end
-end
+if not modules then modules = { } end modules ['strc-pag'] = { + version = 1.001, + comment = "companion to strc-pag.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local texcount = tex.count + +local allocate, mark = utilities.storage.allocate, utilities.storage.mark + +local trace_pages = false trackers.register("structures.pages", function(v) trace_pages = v end) + +local report_pages = logs.reporter("structure","pages") + +local structures = structures + +local helpers = structures.helpers +local sections = structures.sections +local pages = structures.pages +local sets = structures.sets +local counters = structures.counters + +local counterdata = counters.data + +local variables = interfaces.variables +local context = context + +local processors = typesetters.processors +local applyprocessor = processors.apply +local startapplyprocessor = processors.startapply +local stopapplyprocessor = processors.stopapply + +-- storage + +local collected, tobesaved = allocate(), allocate() + +pages.collected = collected +pages.tobesaved = tobesaved + +local function initializer() + collected = pages.collected + tobesaved = pages.tobesaved +end + +job.register('structures.pages.collected', tobesaved, initializer) + +local specification = { } -- to be checked + +function pages.save(prefixdata,numberdata) + local realpage, userpage = texcount.realpageno, texcount.userpageno + if realpage > 0 then + if trace_pages then + report_pages("saving page %s.%s",realpage,userpage) + end + local data = { + number = userpage, + block = sections.currentblock(), + prefixdata = prefixdata and helpers.simplify(prefixdata), + numberdata = numberdata and helpers.simplify(numberdata), + } + tobesaved[realpage] = data + if not collected[realpage] then + collected[realpage] = data + end + elseif trace_pages then + report_pages("not saving page %s.%s",realpage,userpage) + end +end + +-- We can set the pagenumber but as it only get incremented in the page +-- builder we have to make sure it starts at least at 1. + +function counters.specials.userpage() + local r = texcount.realpageno + if r > 0 then + local t = tobesaved[r] + if t then + t.number = texcount.userpageno + if trace_pages then + report_pages("forcing pagenumber of realpage %s to %s",r,t.number) + end + return + end + end + local u = texcount.userpageno + if u == 0 then + if trace_pages then + report_pages("forcing pagenumber of realpage %s to %s (probably a bug)",r,1) + end + counters.setvalue("userpage",1) + texcount.userpageno = 1 + end +end + +local f_convert = string.formatters["\\convertnumber{%s}{%s}"] + +local function convertnumber(str,n) + return f_convert(str or "numbers",n) +end + +function pages.number(realdata,pagespec) + local userpage, block = realdata.number, realdata.block or "" -- sections.currentblock() + local numberspec = realdata.numberdata + local conversionset = (pagespec and pagespec.conversionset ~= "" and pagespec.conversionset) or (numberspec and numberspec.conversionset ~= "" and numberspec.conversionset) or "" + local conversion = (pagespec and pagespec.conversion ~= "" and pagespec.conversion ) or (numberspec and numberspec.conversion ~= "" and numberspec.conversion ) or "" + local starter = (pagespec and pagespec.starter ~= "" and pagespec.starter ) or (numberspec and numberspec.starter ~= "" and numberspec.starter ) or "" + local stopper = (pagespec and pagespec.stopper ~= "" and pagespec.stopper ) or (numberspec and numberspec.stopper ~= "" and numberspec.stopper ) or "" + if starter ~= "" then + applyprocessor(starter) + end + if conversion ~= "" then + context.convertnumber(conversion,userpage) + else + if conversionset == "" then conversionset = "default" end + local theconversion = sets.get("structure:conversions",block,conversionset,1,"numbers") -- to be checked: 1 + local data = startapplyprocessor(theconversion) + context.convertnumber(data or "number",userpage) + stopapplyprocessor() + end + if stopper ~= "" then + applyprocessors(stopper) + end +end + +-- (pagespec.prefix == yes|unset) and (pages.prefix == yes) => prefix + +function pages.analyze(entry,pagespecification) + -- safeguard + if not entry then + return false, false, "no entry" + end + local references = entry.references + if not references then + return false, false, "no references" + end + local pagedata = references.pagedata -- sometimes resolved (external) + if not pagedata then + local realpage = references.realpage + if realpage then + pagedata = collected[realpage] + else + return false, false, "no realpage" + end + end + if not pagedata then + return false, false, "no pagedata" + end + local sectiondata = references.sectiondata -- sometimes resolved (external) + if not sectiondata then + local section = references.section + if section then + sectiondata = sections.collected[section] + else + return pagedata, false, "no section" + end + end + if not sectiondata then + return pagedata, false, "no sectiondata" + end + local no = variables.no + -- local preferences + if pagespecification and pagespecification.prefix == no then + return pagedata, false, "current spec blocks prefix" + end + -- stored preferences + -- if entry.prefix == no then + -- return pagedata, false, "entry blocks prefix" + -- end + -- stored page state + pagespecification = pagedata.prefixdata + if pagespecification and pagespecification.prefix == no then + return pagedata, false, "pagedata blocks prefix" + end + -- final verdict + return pagedata, sectiondata, "okay" +end + +function helpers.page(data,pagespec) + if data then + local pagedata = pages.analyze(data,pagespec) + if pagedata then + pages.number(pagedata,pagespec) + end + end +end + +function helpers.prefixpage(data,prefixspec,pagespec) + if data then + local pagedata, prefixdata, e = pages.analyze(data,pagespec) + if pagedata then + if prefixdata then + sections.typesetnumber(prefixdata,"prefix",prefixspec or false,prefixdata or false,pagedata.prefixdata or false) + end + pages.number(pagedata,pagespec) + end + end +end + +function helpers.prefixlastpage(data,prefixspec,pagespec) + if data then + local r = data.references + local ls, lr = r.section, r.realpage + r.section, r.realpage = r.lastsection or r.section, r.lastrealpage or r.realpage + helpers.prefixpage(data,prefixspec,pagespec) + r.section, r.realpage = ls, lr + end +end + +-- + +function helpers.analyze(entry,specification) + -- safeguard + if not entry then + return false, false, "no entry" + end + local yes, no = variables.yes, variables.no + -- section data + local references = entry.references + if not references then + return entry, false, "no references" + end + local section = references.section + if not section then + return entry, false, "no section" + end + local sectiondata = sections.collected[references.section] + if not sectiondata then + return entry, false, "no section data" + end + -- local preferences + if specification and specification.prefix == no then + return entry, false, "current spec blocks prefix" + end + -- stored preferences (not used) + local prefixdata = entry.prefixdata + if prefixdata and prefixdata.prefix == no then + return entry, false, "entry blocks prefix" + end + -- final verdict + return entry, sectiondata, "okay" +end + +function helpers.prefix(data,prefixspec) + if data then + local _, prefixdata, status = helpers.analyze(data,prefixspec) + if prefixdata then + sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false) + end + end +end + +function pages.is_odd(n) + n = n or texcount.realpageno + if texcount.pagenoshift % 2 == 0 then + return n % 2 == 0 + else + return n % 2 ~= 0 + end +end + +-- move to strc-pag.lua + +function counters.analyze(name,counterspecification) + local cd = counterdata[name] + -- safeguard + if not cd then + return false, false, "no counter data" + end + -- section data + local sectiondata = sections.current() + if not sectiondata then + return cd, false, "not in section" + end + local references = sectiondata.references + if not references then + return cd, false, "no references" + end + local section = references.section + if not section then + return cd, false, "no section" + end + sectiondata = sections.collected[references.section] + if not sectiondata then + return cd, false, "no section data" + end + -- local preferences + local no = variables.no + if counterspecification and counterspecification.prefix == no then + return cd, false, "current spec blocks prefix" + end + -- stored preferences (not used) + if cd.prefix == no then + return cd, false, "entry blocks prefix" + end + -- sectioning + -- if sectiondata.prefix == no then + -- return false, false, "sectiondata blocks prefix" + -- end + -- final verdict + return cd, sectiondata, "okay" +end + +function sections.prefixedconverted(name,prefixspec,numberspec) + local cd, prefixdata, result = counters.analyze(name,prefixspec) + if cd then + if prefixdata then + sections.typesetnumber(prefixdata,"prefix",prefixspec or false,cd or false) + end + counters.converted(name,numberspec) + end +end |