summaryrefslogtreecommitdiff
path: root/tex/context/base/strc-ini.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
commit8d8d528d2ad52599f11250cfc567fea4f37f2a8b (patch)
tree94286bc131ef7d994f9432febaf03fe23d10eef8 /tex/context/base/strc-ini.lua
parentf5aed2e51223c36c84c5f25a6cad238b2af59087 (diff)
downloadcontext-8d8d528d2ad52599f11250cfc567fea4f37f2a8b.tar.gz
2016-01-12 16:26:00
Diffstat (limited to 'tex/context/base/strc-ini.lua')
-rw-r--r--tex/context/base/strc-ini.lua383
1 files changed, 0 insertions, 383 deletions
diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua
deleted file mode 100644
index 7a6153096..000000000
--- a/tex/context/base/strc-ini.lua
+++ /dev/null
@@ -1,383 +0,0 @@
-if not modules then modules = { } end modules ['strc-ini'] = {
- version = 1.001,
- comment = "companion to strc-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[
-The restructuring is the (intermediate) result of quite some experiments. I started
-with the basic structure, followed by lists, numbers, enumerations, itemgroups
-and floats. All these have something in common, like pagenumbers and section
-prefixes. I played with some generic datastructure (in order to save space) but
-the code at both the lua and tex end then quickly becomes messy due to the fact
-that access to variables is too different. So, eventually I ended up with
-dedicated structures combined with sharing data. In lua this is quite efficient
-because tables are referenced. However, some precautions are to be taken in
-order to keep the utility file small. Utility data and process data share much
-but it does not make sense to store all processdata.
-
-]]--
-
-local lpegmatch = lpeg.match
-local type, next, tonumber, select = type, next, tonumber, select
-
-local formatters = string.formatters
-local settings_to_array = utilities.parsers.settings_to_array
-local settings_to_hash = utilities.parsers.settings_to_hash
-local allocate = utilities.storage.allocate
-
-local catcodenumbers = catcodes.numbers -- better use the context(...) way to switch
-
-local ctxcatcodes = catcodenumbers.ctxcatcodes
-local xmlcatcodes = catcodenumbers.xmlcatcodes
-local notcatcodes = catcodenumbers.notcatcodes
-local txtcatcodes = catcodenumbers.txtcatcodes
-
-local context = context
-local commands = commands
-
-local trace_processors = false
-local report_processors = logs.reporter("processors","structure")
-
-trackers.register("typesetters.processors", function(v) trace_processors = v end)
-
-local xmlconvert = lxml.convert
-local xmlstore = lxml.store
-
-local ctx_pushcatcodes = context.pushcatcodes
-local ctx_popcatcodes = context.popcatcodes
-local ctx_xmlsetup = context.xmlsetup
-local ctx_xmlprocessbuffer = context.xmlprocessbuffer
-
--- -- -- namespace -- -- --
-
--- This is tricky: we have stored and initialized already some of
--- the job.registered tables so we have a forward reference!
-
-structures = structures or { }
-local structures = structures
-
-structures.blocks = structures.blocks or { }
-structures.sections = structures.sections or { }
-structures.pages = structures.pages or { }
-structures.registers = structures.registers or { }
-structures.references = structures.references or { }
-structures.lists = structures.lists or { }
-structures.helpers = structures.helpers or { }
-structures.documents = structures.documents or { }
-structures.notes = structures.notes or { }
-structures.descriptions = structures.descriptions or { }
-structures.itemgroups = structures.itemgroups or { }
-structures.specials = structures.specials or { }
-structures.counters = structures.counters or { }
-structures.tags = structures.tags or { }
-structures.formulas = structures.formulas or { } -- not used but reserved
-structures.sets = structures.sets or { }
-structures.marks = structures.marks or { }
-structures.floats = structures.floats or { }
-structures.synonyms = structures.synonyms or { }
-
---~ table.print(structures)
-
-local processors = typesetters.processors
-
--- -- -- specials -- -- --
-
--- we can store information and get back a reference; this permits
--- us to store rather raw data in references
-
-local specials = structures.specials
-
-local collected = allocate()
-local tobesaved = allocate()
-
-specials.collected = collected
-specials.tobesaved = tobesaved
-
-local function initializer()
- collected = specials.collected
- tobesaved = specials.tobesaved
-end
-
-if job then
- job.register('structures.specials.collected', tobesaved, initializer)
-end
-
-function specials.store(class,data)
- if class and data then
- local s = tobesaved[class]
- if not s then
- s = { }
- tobesaved[class] = s
- end
- s[#s+1] = data
- context(#s)
- else
- context(0)
- end
-end
-
-function specials.retrieve(class,n)
- if class and n then
- local c = collected[class]
- return c and c[n]
- end
-end
-
--- -- -- helpers -- -- --
-
-local helpers = structures.helpers
-
--- function helpers.touserdata(str)
--- local hash = str and str ~= "" and settings_to_hash(str)
--- if hash and next(hash) then
--- return hash
--- end
--- end
-
-function helpers.touserdata(data)
- if type(data) == "string" then
- if data == "" then
- return nil
- else
- data = settings_to_hash(data)
- end
- end
- if data and next(data) then
- return data
- end
-end
-
-local function simplify(d,nodefault)
- if d then
- local t = { }
- for k, v in next, d do
- local tv = type(v)
- if tv == "table" then
- if next(v) then
- t[k] = simplify(v)
- end
- elseif tv == "string" then
- if v ~= "" then
- t[k] = v
- end
- elseif tv == "boolean" then
- if v then
- t[k] = v
- end
- else
- t[k] = v
- end
- end
- return next(t) and t
- elseif nodefault then
- return nil
- else
- return { }
- end
-end
-
--- we only care about the tuc file so this would do too:
---
--- local function simplify(d,nodefault)
--- if d then
--- for k, v in next, d do
--- local tv = type(v)
--- if tv == "string" then
--- if v == "" or v == "default" then
--- d[k] = nil
--- end
--- elseif tv == "table" then
--- if next(v) then
--- simplify(v)
--- end
--- elseif tv == "boolean" then
--- if not v then
--- d[k] = nil
--- end
--- end
--- end
--- return d
--- elseif nodefault then
--- return nil
--- else
--- return { }
--- end
--- end
-
-helpers.simplify = simplify
-
-function helpers.merged(...)
- local t = { }
- for k=1, select("#",...) do
- local v = select(k,...)
- if v and v ~= "" and not t[k] then
- t[k] = v
- end
- end
- return t
-end
-
-local tags = {
- generic = "ctx:genericentry",
- section = "ctx:sectionentry",
- entry = "ctx:registerentry",
-}
-
--- We had the following but it overloads the main document so it's a no-go as we
--- no longer push and pop. So now we use the tag as buffername, namespace and also
--- (optionally) as a setups to be applied but keep in mind that document setups
--- also get applied (when they use #1's).
---
--- local command = formatters["\\xmlprocessbuffer{%s}{%s}{}"](metadata.xmlroot or "main",tag)
-
-local experiment = true
-
-function helpers.title(title,metadata) -- coding is xml is rather old and not that much needed now
- if title and title ~= "" then -- so it might disappear
- if metadata then
- local xmlsetup = metadata.xmlsetup
- if metadata.coding == "xml" then
- -- title can contain raw xml
- local tag = tags[metadata.kind] or tags.generic
- local xmldata = formatters["<?xml version='1.0'?><%s>%s</%s>"](tag,title,tag)
- if not experiment then
- buffers.assign(tag,xmldata)
- end
- if trace_processors then
- report_processors("putting xml data in buffer: %s",xmldata)
- report_processors("processing buffer with setup %a and tag %a",xmlsetup,tag)
- end
- if experiment then
- -- the question is: will this be forgotten ... better store in a via file
- local xmltable = xmlconvert("temp",xmldata or "")
- xmlstore("temp",xmltable)
- ctx_xmlsetup("temp",xmlsetup or "")
- else
- ctx_xmlprocessbuffer("dummy",tag,xmlsetup or "")
- end
- elseif xmlsetup then -- title is reference to node (so \xmlraw should have been used)
- if trace_processors then
- report_processors("feeding xmlsetup %a using node %a",xmlsetup,title)
- end
- ctx_xmlsetup(title,metadata.xmlsetup)
- else
- local catcodes = metadata.catcodes
- if catcodes == notcatcodes or catcodes == xmlcatcodes then
- if trace_processors then
- report_processors("catcodetable %a, overloads %a, text %a",ctxcatcodes,catcodes,title)
- end
- context(title) -- nasty
- else
- if trace_processors then
- report_processors("catcodetable %a, text %a",catcodes,title)
- end
- --
- -- context.sprint(catcodes,title)
- --
- -- doesn't work when a newline is in there \section{Test\ A} so we do
- -- it this way:
- --
- ctx_pushcatcodes(catcodes)
- context(title)
- ctx_popcatcodes()
- end
- end
- else
- context(title) -- no catcode switch, was: texsprint(title)
- end
- end
-end
-
--- -- -- sets -- -- --
-
-local sets = structures.sets
-
-sets.setlist = sets.setlist or { }
-
-storage.register("structures/sets/setlist", structures.sets.setlist, "structures.sets.setlist")
-
-local setlist = sets.setlist
-
-function sets.define(namespace,name,values,default,numbers)
- local dn = setlist[namespace]
- if not dn then
- dn = { }
- setlist[namespace] = dn
- end
- if values == "" then
- dn[name] = { { }, default }
- else
- local split = settings_to_array(values)
- if numbers then
- -- convert to numbers (e.g. for reset)
- for i=1,#split do
- split[i] = tonumber(split[i]) or 0
- end
- end
- dn[name] = { split, default }
- end
-end
-
-function sets.getall(namespace,block,name)
- local ds = setlist[namespace]
- if not ds then
- return { }
- else
- local dn
- if block and block ~= "" then
- dn = ds[block..":"..name] or ds[name] or ds[block] or ds.default
- else
- dn = ds[name] or ds.default
- end
- return (dn and dn[1]) or { }
- end
-end
-
--- messy (will be another keyword, fixedconversion) .. needs to be documented too
--- maybe we should cache
-
-local splitter = lpeg.splitat("::")
-
-function sets.get(namespace,block,name,level,default) -- check if name is passed
- --fixed::R:a: ...
- local kind, rest = lpegmatch(splitter,name)
- if rest and kind == "fixed" then -- fixed::n,a,i
- local s = settings_to_array(rest)
- return s[level] or s[#s] or default
- end
- --
- local ds = setlist[namespace]
- if not ds then
- return default
- end
- local dn
- if name and name ~= "" then
- if block and block ~= "" then
- dn = ds[block..":"..name] or ds[name] or ds[block] or ds.default
- else
- dn = ds[name] or ds.default
- end
- else
- if block and block ~= "" then
- dn = ds[block] or ds[block..":default"] or ds.default
- else
- dn = ds.default
- end
- end
- if not dn then
- return default
- end
- local dl = dn[1][level]
- return dl or dn[2] or default
-end
-
--- interface
-
-interfaces.implement {
- name = "definestructureset",
- actions = sets.define,
- arguments = { "string", "string", "string", "string", "boolean" }
-}