summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2015-03-31 00:15:04 +0200
committerContext Git Mirror Bot <phg42.2a@gmail.com>2015-03-31 00:15:04 +0200
commit859ed31b143659de2ed45291cb5b121c41cecede (patch)
tree46e26547e894355e36f6bf40d989641d793a9561
parentbda5ef0ab2fad99c51a767cfa51c569422dd4313 (diff)
downloadcontext-859ed31b143659de2ed45291cb5b121c41cecede.tar.gz
2015-03-30 23:36:00
-rw-r--r--tex/context/base/anch-pgr.mkiv21
-rw-r--r--tex/context/base/anch-pos.lua54
-rw-r--r--tex/context/base/anch-pos.mkiv2
-rw-r--r--tex/context/base/attr-col.lua26
-rw-r--r--tex/context/base/attr-eff.lua41
-rw-r--r--tex/context/base/attr-eff.mkiv12
-rw-r--r--tex/context/base/attr-ini.lua46
-rw-r--r--tex/context/base/attr-ini.mkiv33
-rw-r--r--tex/context/base/attr-lay.lua87
-rw-r--r--tex/context/base/attr-lay.mkiv36
-rw-r--r--tex/context/base/back-exp.lua130
-rw-r--r--tex/context/base/back-exp.mkiv117
-rw-r--r--tex/context/base/blob-ini.lua10
-rw-r--r--tex/context/base/blob-ini.mkiv8
-rw-r--r--tex/context/base/buff-ver.mkiv2
-rw-r--r--tex/context/base/chem-ini.lua37
-rw-r--r--tex/context/base/chem-ini.mkiv2
-rw-r--r--tex/context/base/chem-str.lua73
-rw-r--r--tex/context/base/chem-str.mkiv70
-rw-r--r--tex/context/base/cldf-scn.lua28
-rw-r--r--tex/context/base/colo-ext.mkiv4
-rw-r--r--tex/context/base/colo-ini.lua191
-rw-r--r--tex/context/base/colo-ini.mkiv13
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context-version.pdfbin4327 -> 4323 bytes
-rw-r--r--tex/context/base/context.mkiv2
-rw-r--r--tex/context/base/core-con.lua208
-rw-r--r--tex/context/base/core-con.mkiv106
-rw-r--r--tex/context/base/core-sys.lua18
-rw-r--r--tex/context/base/core-two.lua48
-rw-r--r--tex/context/base/core-two.mkiv26
-rw-r--r--tex/context/base/core-uti.lua15
-rw-r--r--tex/context/base/core-uti.mkiv14
-rw-r--r--tex/context/base/file-job.lua375
-rw-r--r--tex/context/base/file-job.mkvi115
-rw-r--r--tex/context/base/file-lib.lua6
-rw-r--r--tex/context/base/file-mod.lua47
-rw-r--r--tex/context/base/file-mod.mkvi43
-rw-r--r--tex/context/base/file-syn.lua35
-rw-r--r--tex/context/base/file-syn.mkvi6
-rw-r--r--tex/context/base/font-col.lua43
-rw-r--r--tex/context/base/font-col.mkvi12
-rw-r--r--tex/context/base/font-ctx.lua12
-rw-r--r--tex/context/base/font-fea.mkvi2
-rw-r--r--tex/context/base/font-gds.lua27
-rw-r--r--tex/context/base/font-gds.mkvi4
-rw-r--r--tex/context/base/font-ini.mkvi2
-rw-r--r--tex/context/base/font-sel.lua99
-rw-r--r--tex/context/base/font-sel.mkvi94
-rw-r--r--tex/context/base/font-sol.lua56
-rw-r--r--tex/context/base/font-sol.mkvi32
-rw-r--r--tex/context/base/font-sym.mkvi4
-rw-r--r--tex/context/base/lpdf-col.lua22
-rw-r--r--tex/context/base/luat-ini.mkiv29
-rw-r--r--tex/context/base/lxml-ini.lua8
-rw-r--r--tex/context/base/lxml-ini.mkiv249
-rw-r--r--tex/context/base/lxml-tex.lua4
-rw-r--r--tex/context/base/math-frc.lua2
-rw-r--r--tex/context/base/math-frc.mkiv4
-rw-r--r--tex/context/base/math-ini.mkiv24
-rw-r--r--tex/context/base/meta-ini.mkiv37
-rw-r--r--tex/context/base/mlib-ctx.lua266
-rw-r--r--tex/context/base/mult-aux.mkiv4
-rw-r--r--tex/context/base/mult-ini.lua3
-rw-r--r--tex/context/base/node-ref.lua40
-rw-r--r--tex/context/base/pack-com.mkiv2
-rw-r--r--tex/context/base/page-lin.mkvi2
-rw-r--r--tex/context/base/page-mix.lua138
-rw-r--r--tex/context/base/page-mix.mkiv58
-rw-r--r--tex/context/base/publ-imp-apa.mkvi34
-rw-r--r--tex/context/base/publ-imp-aps.lua78
-rw-r--r--tex/context/base/publ-imp-aps.mkvi156
-rw-r--r--tex/context/base/publ-imp-default.mkvi2
-rw-r--r--tex/context/base/spac-ali.lua6
-rw-r--r--tex/context/base/spac-ali.mkiv4
-rw-r--r--tex/context/base/spac-hor.lua23
-rw-r--r--tex/context/base/spac-hor.mkiv2
-rw-r--r--tex/context/base/status-files.pdfbin24605 -> 24455 bytes
-rw-r--r--tex/context/base/status-lua.pdfbin403032 -> 408741 bytes
-rw-r--r--tex/context/base/strc-blk.lua11
-rw-r--r--tex/context/base/strc-blk.mkiv10
-rw-r--r--tex/context/base/strc-con.mkvi2
-rw-r--r--tex/context/base/strc-enu.mkvi2
-rw-r--r--tex/context/base/strc-ini.lua6
-rw-r--r--tex/context/base/strc-ini.mkvi10
-rw-r--r--tex/context/base/strc-itm.lua18
-rw-r--r--tex/context/base/strc-itm.mkvi82
-rw-r--r--tex/context/base/strc-lev.lua43
-rw-r--r--tex/context/base/strc-lev.mkvi10
-rw-r--r--tex/context/base/strc-num.mkiv31
-rw-r--r--tex/context/base/strc-ref.lua465
-rw-r--r--tex/context/base/strc-ref.mkvi413
-rw-r--r--tex/context/base/strc-reg.lua32
-rw-r--r--tex/context/base/strc-reg.mkiv6
-rw-r--r--tex/context/base/strc-tag.lua15
-rw-r--r--tex/context/base/strc-tag.mkiv13
-rw-r--r--tex/context/base/syst-aux.mkiv18
-rw-r--r--tex/context/base/syst-con.lua86
-rw-r--r--tex/context/base/syst-con.mkiv37
-rw-r--r--tex/context/base/syst-lua.lua20
-rw-r--r--tex/context/base/toks-scn.lua85
-rw-r--r--tex/context/base/trac-ctx.lua42
-rw-r--r--tex/context/base/trac-ctx.mkiv8
-rw-r--r--tex/context/base/type-ini.lua121
-rw-r--r--tex/context/base/type-ini.mkvi10
-rw-r--r--tex/context/base/typo-prc.lua6
-rw-r--r--tex/context/base/typo-prc.mkvi2
-rw-r--r--tex/context/base/typo-spa.lua30
-rw-r--r--tex/context/base/typo-spa.mkiv18
-rw-r--r--tex/context/base/x-asciimath.lua46
-rw-r--r--tex/generic/context/luatex/luatex-fonts-merged.lua2
111 files changed, 3243 insertions, 2150 deletions
diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv
index 9b0151a81..50574e3ab 100644
--- a/tex/context/base/anch-pgr.mkiv
+++ b/tex/context/base/anch-pgr.mkiv
@@ -127,23 +127,26 @@
%D the head and tail anchors from this one. We set these
%D anchors before and after each page.
+\newdimen\c_anch_page_width
+\newdimen\c_anch_page_height
+
\unexpanded\def\anch_positions_register_page#1% this one is flushed first ! ... can't we avoid this one
{\ifpositioning\ifcase\realpageno\or
- \ifdim\printpaperheight=\paperheight
- \ifdim\printpaperwidth=\paperwidth
- % not needed,
+ \ifdim\c_anch_page_height=\paperheight
+ \ifdim\c_anch_page_width=\paperwidth
+ % no change
\else
- \anch_positions_register_page_indeed{#1}%
+ \c_anch_page_width \paperwidth
+ \c_anch_page_height\paperheight
+ \anch_make_page_box{#1}% \ifvbox#1\setbox#1\hbox{\box#1}\fi
\fi
\else
- \anch_positions_register_page_indeed{#1}%
+ \c_anch_page_width \paperwidth
+ \c_anch_page_height\paperheight
+ \anch_make_page_box{#1}% \ifvbox#1\setbox#1\hbox{\box#1}\fi
\fi
\fi\fi}
-\def\anch_positions_register_page_indeed#1% maybe like text
- {\ifvbox#1\setbox#1\hbox{\box#1}\fi
- \anch_make_page_box{#1}}
-
\unexpanded\def\anch_positions_place_anchors
{\ifpositioning
\anch_positions_place_anchors_yes
diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua
index f9c061e92..059da81e2 100644
--- a/tex/context/base/anch-pos.lua
+++ b/tex/context/base/anch-pos.lua
@@ -135,6 +135,21 @@ jobpositions.used = false
local function initializer()
tobesaved = jobpositions.tobesaved
collected = jobpositions.collected
+ -- add sparse regions
+ local pages = structures.pages.collected
+ if pages then
+ local last = nil
+ for p=1,#pages do
+ local region = "page:" .. p
+ local data = collected[region]
+ if data then
+ last = data
+ last.p = nil -- no need for a page
+ elseif last then
+ collected[region] = last
+ end
+ end
+ end
-- enhance regions with paragraphs
for tag, data in next, collected do
local region = data.r
@@ -401,7 +416,7 @@ function jobpositions.e_region(correct)
region = regions[#regions]
end
-local function markregionbox(n,tag,correct)
+local function setregionbox(n,tag)
if not tag or tag == "" then
nofregions = nofregions + 1
tag = f_region(nofregions)
@@ -418,6 +433,11 @@ local function markregionbox(n,tag,correct)
h = h ~= 0 and h or nil,
d = d ~= 0 and d or nil,
}
+ return tag, box
+end
+
+local function markregionbox(n,tag,correct)
+ local tag, box = setregionbox(n,tag)
local push = new_latelua(f_b_region(tag))
local pop = new_latelua(f_e_region(tostring(correct))) -- todo: check if tostring is needed with formatter
-- maybe we should construct a hbox first (needs experimenting) so that we can avoid some at the tex end
@@ -436,6 +456,7 @@ local function markregionbox(n,tag,correct)
end
jobpositions.markregionbox = markregionbox
+jobpositions.setregionbox = setregionbox
function jobpositions.enhance(name)
enhance(tobesaved[name])
@@ -602,7 +623,17 @@ end
function jobpositions.region(id)
local jpi = collected[id]
- return jpi and jpi.r or false
+ if jpi then
+ local r = jpi.r
+ if r then
+ return r
+ end
+ local p = jpi.p
+ if p then
+ return "page:" .. p
+ end
+ end
+ return false
end
function jobpositions.column(id)
@@ -994,21 +1025,24 @@ scanners.MPc = function() -- name
local jpi = collected[scanstring()]
if jpi then
local c = jpi.c
- if c and p ~= true then
+ if c and c ~= true then
context(c)
return
end
end
- context(c) -- number
+ context('0') -- okay ?
end
scanners.MPr = function() -- name
local jpi = collected[scanstring()]
if jpi then
local r = jpi.r
- if r and p ~= true then
+ if r and r ~= true then
context(r)
- return
+ end
+ local p = jpi.p
+ if p then
+ context("page:" .. p)
end
end
end
@@ -1143,10 +1177,18 @@ scanners.markregionbox = function() -- box
markregionbox(scaninteger())
end
+scanners.setregionbox = function() -- box
+ setregionbox(scaninteger())
+end
+
scanners.markregionboxtagged = function() -- box tag
markregionbox(scaninteger(),scanstring())
end
+scanners.setregionboxtagged = function() -- box tag
+ setregionbox(scaninteger(),scanstring())
+end
+
scanners.markregionboxcorrected = function() -- box tag
markregionbox(scaninteger(),scanstring(),true)
end
diff --git a/tex/context/base/anch-pos.mkiv b/tex/context/base/anch-pos.mkiv
index ef47da594..f35261742 100644
--- a/tex/context/base/anch-pos.mkiv
+++ b/tex/context/base/anch-pos.mkiv
@@ -288,7 +288,7 @@
\clf_markregionboxcorrected#1{textarea:\the\c_anch_text}}
\unexpanded\def\anch_make_page_box#1% maybe like text
- {\clf_markregionboxtagged#1{page:\the\realpageno}} % needs an hbox
+ {\clf_setregionboxtagged#1{page:\the\realpageno}}
\unexpanded\def\anch_mark_text_box#1%
{\clf_markregionboxtagged#1{text:\the\realpageno}} % needs an hbox
diff --git a/tex/context/base/attr-col.lua b/tex/context/base/attr-col.lua
index 9dcc991ac..1b9a65520 100644
--- a/tex/context/base/attr-col.lua
+++ b/tex/context/base/attr-col.lua
@@ -17,9 +17,14 @@ local format = string.format
local concat = table.concat
local min, max, floor = math.min, math.max, math.floor
-local attributes, nodes, utilities, logs, backends, storage = attributes, nodes, utilities, logs, backends, storage
-local commands, context, interfaces = commands, context, interfaces
-local tex = tex
+local attributes = attributes
+local nodes = nodes
+local utilities = utilities
+local logs = logs
+local backends = backends
+local storage = storage
+local context = context
+local tex = tex
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -43,6 +48,9 @@ local unsetvalue = attributes.unsetvalue
local registerstorage = storage.register
local formatters = string.formatters
+local interfaces = interfaces
+local implement = interfaces.implement
+
-- We can distinguish between rules and glyphs but it's not worth the trouble. A
-- first implementation did that and while it saves a bit for glyphs and rules, it
-- costs more resourses for transparencies. So why bother.
@@ -560,10 +568,10 @@ end
-- interface
-commands.enablecolor = colors.enable
-commands.enabletransparency = transparencies.enable
-commands.enablecolorintents = colorintents.enable
+implement { name = "enablecolor", actions = colors.enable }
+implement { name = "enabletransparency", actions = transparencies.enable }
+implement { name = "enablecolorintents", actions = colorintents.enable }
-function commands.registercolor (...) context(colors .register(...)) end
-function commands.registertransparency(...) context(transparencies.register(...)) end
-function commands.registercolorintent (...) context(colorintents .register(...)) end
+--------- { name = "registercolor", actions = { colors .register, context }, arguments = "string" }
+--------- { name = "registertransparency", actions = { transparencies.register, context }, arguments = { ... } }
+implement { name = "registercolorintent", actions = { colorintents .register, context }, arguments = { ... } }
diff --git a/tex/context/base/attr-eff.lua b/tex/context/base/attr-eff.lua
index b187b64c7..ff41e12de 100644
--- a/tex/context/base/attr-eff.lua
+++ b/tex/context/base/attr-eff.lua
@@ -6,7 +6,6 @@ if not modules then modules = { } end modules ['attr-eff'] = {
license = "see context related readme files"
}
-local commands, interfaces = commands, interfaces
local attributes, nodes, backends, utilities = attributes, nodes, backends, utilities
local tex = tex
@@ -18,6 +17,9 @@ local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
+local interfaces = interfaces
+local implement = interfaces.implement
+
local variables = interfaces.variables
local v_normal = variables.normal
@@ -91,8 +93,13 @@ local function register(specification)
return n
end
+local enabled = false
+
local function enable()
- tasks.enableaction("shipouts","attributes.effects.handler")
+ if not enabled then
+ tasks.enableaction("shipouts","attributes.effects.handler")
+ enabled = true
+ end
end
effects.register = register
@@ -100,12 +107,28 @@ effects.enable = enable
-- interface
-local enabled = false
+implement {
+ name = "seteffect",
+ actions = function(specification)
+ if not enabled then
+ enable()
+ end
+ texsetattribute(a_effect,register(specification))
+ end,
+ arguments = {
+ {
+ { "alternative", "string" },
+ { "stretch", "integer" },
+ { "rulethickness", "dimen" }
+ }
+ }
+}
-function commands.triggereffect(specification)
- if not enabled then
- enable()
- enabled = true
+implement {
+ name = "reseteffect",
+ actions = function()
+ if enabled then
+ texsetattribute(a_effect,register())
+ end
end
- texsetattribute(a_effect,register(specification))
-end
+}
diff --git a/tex/context/base/attr-eff.mkiv b/tex/context/base/attr-eff.mkiv
index 43f575a7a..bec8687ea 100644
--- a/tex/context/base/attr-eff.mkiv
+++ b/tex/context/base/attr-eff.mkiv
@@ -36,14 +36,14 @@
\to \everydefineeffect
\unexpanded\def\starteffect[#1]%
- {\ctxcommand{triggereffect{
- alternative = "\namedeffectparameter{#1}\c!alternative",
- stretch = \number\namedeffectparameter{#1}\c!stretch,
- rulethickness = \number\dimexpr\namedeffectparameter{#1}\c!rulethickness\relax
- }}}
+ {\clf_seteffect
+ alternative {\namedeffectparameter{#1}\c!alternative}
+ stretch \numexpr\namedeffectparameter{#1}\c!stretch\relax
+ rulethickness \dimexpr\namedeffectparameter{#1}\c!rulethickness\relax
+ \relax}
\unexpanded\def\stopeffect % can be special
- {\ctxcommand{triggereffect()}} % v!normal 0 0
+ {\clf_reseteffect} % v!normal 0 0
\unexpanded\def\effect[#1]%
{\groupedcommand{\starteffect[#1]}{\stopeffect}}
diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua
index 177eb30eb..df7404d11 100644
--- a/tex/context/base/attr-ini.lua
+++ b/tex/context/base/attr-ini.lua
@@ -6,8 +6,6 @@ if not modules then modules = { } end modules ['attr-ini'] = {
license = "see context related readme files"
}
-local commands, context, nodes, storage = commands, context, nodes, storage
-
local next, type = next, type
--[[ldx--
@@ -15,6 +13,13 @@ local next, type = next, type
symbolic names later on.</p>
--ldx]]--
+local nodes = nodes
+local context = context
+local storage = storage
+local commands = commands
+
+local implement = interfaces.implement
+
attributes = attributes or { }
local attributes = attributes
@@ -126,19 +131,11 @@ function attributes.ofnode(n)
showlist(n,n.attr)
end
--- interface
-
-commands.showattributes = attributes.showcurrent
-
-function commands.defineattribute(name,category)
- context(attributes.define(name,category))
-end
-
-- rather special
local store = { }
-function commands.savecurrentattributes(name)
+function attributes.save(name)
name = name or ""
local n = node.current_attr()
n = n and n.next
@@ -153,7 +150,7 @@ function commands.savecurrentattributes(name)
}
end
-function commands.restorecurrentattributes(name)
+function attributes.restore(name)
name = name or ""
local t = store[name]
if t then
@@ -171,3 +168,28 @@ function commands.restorecurrentattributes(name)
end
-- store[name] = nil
end
+
+implement {
+ name = "defineattribute",
+ arguments = { "string", "string" },
+ actions = { attributes.define, context }
+}
+
+-- interface
+
+implement {
+ name = "showattributes",
+ actions = attributes.showcurrent
+}
+
+implement {
+ name = "savecurrentattributes",
+ arguments = "string",
+ actions = attributes.save
+}
+
+implement {
+ name = "restorecurrentattributes",
+ arguments = "string",
+ actions = attributes.restore
+}
diff --git a/tex/context/base/attr-ini.mkiv b/tex/context/base/attr-ini.mkiv
index d4912ed65..f351a6800 100644
--- a/tex/context/base/attr-ini.mkiv
+++ b/tex/context/base/attr-ini.mkiv
@@ -44,31 +44,6 @@
\ifdefined \s!public \else \def\s!public {public} \fi % for metatex % or hard check later
\ifdefined \s!attribute \else \def\s!attribute{attribute} \fi % for metatex % or hard check later
-% \unexpanded\def\defineattribute
-% {\dodoubleempty\attr_basics_define}
-%
-% \unexpanded\def\definesystemattribute
-% {\dodoubleempty\attr_basics_define_system}
-%
-% \def\attr_basics_define[#1]%
-% {\expandafter\newattribute\csname\??attributecount#1\endcsname
-% \expandafter\newconstant \csname\??attributeid#1\endcsname
-% \csname\??attributeid#1\endcsname\c_syst_last_allocated_attribute
-% \ctxcommand{defineattribute("#1",\number\csname\??attributeid#1\endcsname)}%
-% \attr_basics_define_properties[#1]}
-%
-% \def\attr_basics_define_system[#1]%
-% {\scratchcounter\ctxcommand{getprivateattribute("#1")}\relax
-% \expandafter\attributedef\csname\??attributecount#1\endcsname\scratchcounter
-% \expandafter\newconstant \csname\??attributeid#1\endcsname
-% \csname\??attributeid#1\endcsname\scratchcounter
-% %\writestatus\m!system{defining system attribute #1 with number \number\scratchcounter}%
-% \attr_basics_define_properties[#1]}
-%
-% \def\attr_basics_define_properties[#1][#2]%
-% {\doifnotinset\s!global{#2}{\appendetoks\csname\??attributecount#1\endcsname\attributeunsetvalue\to\attributesresetlist}%
-% \doifinset \s!public{#2}{\expandafter\let\csname#1\s!attribute\expandafter\endcsname\csname\??attributeid#1\endcsname}}
-
\unexpanded\def\defineattribute {\dodoubleempty\attr_basics_define}
\unexpanded\def\definesystemattribute{\dodoubleempty\attr_basics_define_system}
@@ -76,7 +51,7 @@
\def\attr_basics_define_system{\attr_basics_define_indeed{private}}
\def\attr_basics_define_indeed#1[#2][#3]%
- {\scratchcounter\ctxcommand{defineattribute("#2","#1")}\relax
+ {\scratchcounter\clf_defineattribute{#2}{#1}\relax
%\writestatus\m!system{defining #1 attribute #2 with number \number\scratchcounter}%
\expandafter\attributedef\csname\??attributecount#2\endcsname\scratchcounter
\expandafter\newconstant \csname\??attributeid#2\endcsname
@@ -101,8 +76,8 @@
%D Rather special.
-\unexpanded\def\savecurrentattributes #1{\ctxcommand{savecurrentattributes ("#1")}}
-\unexpanded\def\restorecurrentattributes#1{\ctxcommand{restorecurrentattributes("#1")}}
+\unexpanded\def\savecurrentattributes #1{\clf_savecurrentattributes {#1}}
+\unexpanded\def\restorecurrentattributes#1{\clf_restorecurrentattributes{#1}}
%D For the moment we put this here (later it will move to where it's used):
@@ -127,6 +102,6 @@
\definesystemattribute [checkedbreak] [public]
\definesystemattribute [vboxtohboxseparator] [public]
-\unexpanded\def\showattributes{\ctxcommand{showattributes()}}
+\unexpanded\def\showattributes{\clf_showattributes}
\protect \endinput
diff --git a/tex/context/base/attr-lay.lua b/tex/context/base/attr-lay.lua
index e7d532237..0d43979c8 100644
--- a/tex/context/base/attr-lay.lua
+++ b/tex/context/base/attr-lay.lua
@@ -15,9 +15,17 @@ if not modules then modules = { } end modules ['attr-lay'] = {
local type = type
local insert, remove = table.insert, table.remove
-local attributes, nodes, utilities, logs, backends = attributes, nodes, utilities, logs, backends
-local commands, context, interfaces = commands, context, interfaces
-local tex = tex
+local attributes = attributes
+local nodes = nodes
+local utilities = utilities
+local logs = logs
+local backends = backends
+
+local context = context
+local interfaces = interfaces
+local tex = tex
+
+local implement = interfaces.implement
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
@@ -38,6 +46,8 @@ local viewerlayers = attributes.viewerlayers
local variables = interfaces.variables
local v_local = variables["local"]
local v_global = variables["global"]
+local v_start = variables["start"]
+local v_yes = variables["yes"]
local a_viewerlayer = attributes.private("viewerlayer")
@@ -85,11 +95,6 @@ viewerlayers.resolve_begin = layerstacker.resolve_begin
viewerlayers.resolve_step = layerstacker.resolve_step
viewerlayers.resolve_end = layerstacker.resolve_end
-function commands.cleanuplayers()
- layerstacker.clean()
- -- todo
-end
-
-- stacked
local function startlayer(...) startlayer = nodeinjections.startlayer return startlayer(...) end
@@ -240,15 +245,63 @@ function viewerlayers.define(settings)
end
end
-commands.defineviewerlayer = viewerlayers.define
-commands.startviewerlayer = viewerlayers.start
-commands.stopviewerlayer = viewerlayers.stop
-
-function commands.definedviewerlayer(settings)
- viewerlayers.define(settings)
- context(register(settings.tag,true)) -- true forces a use
+function viewerlayers.definedlayoutcomponent(tag)
+ viewerlayers.define {
+ tag = tag,
+ title = utilities.strings.nice(tag),
+ visible = v_start,
+ editable = v_yes,
+ printable = v_yes,
+ }
+ return register(tag,true) -- true forces a use
end
-function commands.registeredviewerlayer(name)
- context(register(name,true)) -- true forces a use
+function viewerlayers.cleanup()
+ layerstacker.clean()
+ -- todo
end
+
+implement {
+ name = "cleanuplayers",
+ actions = viewerlayers.cleanup
+}
+
+implement {
+ name = "defineviewerlayer",
+ actions = viewerlayers.define,
+ arguments = {
+ {
+ { "tag" },
+ { "title" },
+ { "visible" },
+ { "editable" },
+ { "export" },
+ { "printable" },
+ { "scope" },
+ },
+ true
+ }
+}
+
+implement {
+ name = "definedlayoutcomponent",
+ actions = { viewerlayers.definedlayoutcomponent, context },
+ arguments = "string"
+}
+
+implement {
+ name = "startviewerlayer",
+ actions = viewerlayers.start,
+ arguments = "string",
+}
+
+implement {
+ name = "stopviewerlayer",
+ actions = viewerlayers.stop
+}
+
+implement {
+ name = "registeredviewerlayer",
+ actions = { register, context },
+ arguments = { "string", true } -- true forces a use
+}
diff --git a/tex/context/base/attr-lay.mkiv b/tex/context/base/attr-lay.mkiv
index 8181417ab..14ef4a6d4 100644
--- a/tex/context/base/attr-lay.mkiv
+++ b/tex/context/base/attr-lay.mkiv
@@ -39,23 +39,25 @@
\c!method=\v!none]
\appendtoks
- \ctxcommand{defineviewerlayer{
- tag = "\currentviewerlayer",
- title = "\viewerlayerparameter\c!title",
- visible = "\viewerlayerparameter\c!state",
- editable = "\v!yes",
- export = "\viewerlayerparameter\c!export",
- printable = "\viewerlayerparameter\c!printable",
- scope = "\viewerlayerparameter\c!scope"
- }}%
+ \clf_defineviewerlayer
+ tag {\currentviewerlayer}%
+ title {\viewerlayerparameter\c!title}%
+ visible {\viewerlayerparameter\c!state}%
+ editable {\v!yes}%
+ export {\viewerlayerparameter\c!export}%
+ printable {\viewerlayerparameter\c!printable}%
+ scope {\viewerlayerparameter\c!scope}%
+ \relax
\doif{\viewerlayerparameter\c!method}\v!command
{\setuxvalue{\e!start#1}{\startviewerlayer[\currentviewerlayer]}%
\setuxvalue{\e!stop #1}{\stopviewerlayer}}%
\to \everydefineviewerlayer
-\unexpanded\def\startviewerlayer[#1]{\ctxcommand{startviewerlayer("#1")}} % not grouped
-\unexpanded\def\stopviewerlayer {\ctxcommand{stopviewerlayer()}} % not grouped
-\unexpanded\def\viewerlayer [#1]{\groupedcommand{\startviewerlayer[#1]}{\stopviewerlayer}} % grouped
+\unexpanded\def\startviewerlayer[#1]{\clf_startviewerlayer{#1}}% not grouped
+\unexpanded\def\stopviewerlayer {\clf_stopviewerlayer} % not grouped
+\unexpanded\def\viewerlayer [#1]{\groupedcommand
+ {\clf_startviewerlayer{#1}}% grouped
+ {\clf_stopviewerlayer}} % grouped
% some day we will keep this at the lua end as the info is only needed there
@@ -72,13 +74,7 @@
\installcorenamespace{layoutcomponentattribute}
\def\attr_layoutcomponent_initialize#1%
- {\edef\layoutcomponentboxattribute{\ctxcommand{definedviewerlayer{%
- tag = "#1",
- title = utilities.strings.nice("#1"), % only here as in steps we have step:<number>
- visible = "\v!start",
- editable = "\v!yes",
- printable = "\v!yes"
- }}}%
+ {\edef\layoutcomponentboxattribute{\clf_definedlayoutcomponent{#1}}%
\edef\layoutcomponentboxattribute{attr \viewerlayerattribute \layoutcomponentboxattribute\relax}%
\expandafter\glet\csname\??layoutcomponentattribute#1\endcsname\layoutcomponentboxattribute}
@@ -100,7 +96,7 @@
\let\resetlayoutcomponentattribute\attr_layoutcomponent_reset}
\unexpanded\def\attr_layoutcomponent_cleanup
- {\ctxcommand{cleanuplayers()}}
+ {\clf_cleanuplayers}
\appendtoks
\attr_layoutcomponent_cleanup
diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua
index 70ed78282..c37a725ac 100644
--- a/tex/context/base/back-exp.lua
+++ b/tex/context/base/back-exp.lua
@@ -73,6 +73,8 @@ local v_flushright = variables.flushright
local v_middle = variables.middle
local v_flushleft = variables.flushleft
+local implement = interfaces.implement
+
local settings_to_array = utilities.parsers.settings_to_array
local setmetatableindex = table.setmetatableindex
@@ -612,6 +614,12 @@ do
}
end
+ function structurestags.setitem(head)
+ itemgroups[locatedtag("item")] = {
+ head = head,
+ }
+ end
+
function extras.itemgroup(di,element,n,fulltag)
local hash = itemgroups[fulltag]
if hash then
@@ -621,6 +629,13 @@ do
end
end
+ function extras.item(di,element,n,fulltag)
+ local hash = itemgroups[fulltag]
+ if hash then
+ setattribute(di,"head",hash.head and "yes" or nil)
+ end
+ end
+
end
do
@@ -3381,7 +3396,7 @@ local htmltemplate = [[
local appendaction = nodes.tasks.appendaction
local enableaction = nodes.tasks.enableaction
- function commands.setupexport(t)
+ function structurestags.setupexport(t)
table.merge(finetuning,t)
keephyphens = finetuning.hyphen == v_yes
exportproperties = finetuning.properties
@@ -3390,6 +3405,8 @@ local htmltemplate = [[
end
end
+
+
local function startexport(v)
if v and not exporting then
report_export("enabling export to xml")
@@ -3417,16 +3434,101 @@ end
-- These are called at the tex end:
-commands.settagsectionlevel = structurestags.setsectionlevel
-commands.settagitemgroup = structurestags.setitemgroup
-commands.settagsynonym = structurestags.setsynonym
-commands.settagsorting = structurestags.setsorting
-commands.settagdescription = structurestags.setdescription
-commands.settagdescriptionsymbol = structurestags.setdescriptionsymbol
-commands.settaghighlight = structurestags.sethighlight
-commands.settagfigure = structurestags.setfigure
-commands.settagcombination = structurestags.setcombination
-commands.settagtablecell = structurestags.settablecell
-commands.settagtabulatecell = structurestags.settabulatecell
-commands.settagregister = structurestags.setregister
-commands.settaglist = structurestags.setlist
+implement {
+ name = "setupexport",
+ actions = structurestags.setupexport,
+ arguments = {
+ {
+ { "align" },
+ { "bodyfont", "dimen" },
+ { "width", "dimen" },
+ { "properties" },
+ { "hyphen" },
+ { "title" },
+ { "subtitle" },
+ { "author" },
+ { "firstpage" },
+ { "lastpage" },
+ { "svgstyle" },
+ { "cssfile" },
+ }
+ }
+}
+
+implement {
+ name = "settagitemgroup",
+ actions = structurestags.setitemgroup,
+ arguments = { "boolean", "integer", "string" }
+}
+
+implement {
+ name = "settagitem",
+ actions = structurestags.setitem,
+ arguments = "boolean"
+}
+
+implement {
+ name = "settagsynonym",
+ actions = structurestags.setsynonym,
+ arguments = "string"
+}
+
+implement {
+ name = "settagsorting",
+ actions = structurestags.setsorting,
+ arguments = "string"
+}
+
+implement {
+ name = "settagdescription",
+ actions = structurestags.setdescription,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settagdescriptionsymbol",
+ actions = structurestags.setdescriptionsymbol,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settaghighlight",
+ actions = structurestags.sethighlight,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settagfigure",
+ actions = structurestags.setfigure,
+ arguments = { "string", "string", "string", "dimen", "dimen" }
+}
+
+implement {
+ name = "settagcombination",
+ actions = structurestags.setcombination,
+ arguments = { "integer", "integer" }
+}
+
+implement {
+ name = "settagtablecell",
+ actions = structurestags.settablecell,
+ arguments = { "integer", "integer", "integer" }
+}
+
+implement {
+ name = "settagtabulatecell",
+ actions = structurestags.settabulatecell,
+ arguments = "integer"
+}
+
+implement {
+ name = "settagregister",
+ actions = structurestags.setregister,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "settaglist",
+ actions = structurestags.setlist,
+ arguments = "string"
+}
diff --git a/tex/context/base/back-exp.mkiv b/tex/context/base/back-exp.mkiv
index c056547b9..3b26e5ace 100644
--- a/tex/context/base/back-exp.mkiv
+++ b/tex/context/base/back-exp.mkiv
@@ -80,63 +80,110 @@
\to \everytabulatepar % tricky, maybe this should be neverypar
\appendtoks
- \unexpanded\def\dotagTABLEcell {\taggedctxcommand{settagtablecell(\number\tablecellrows,\number\tablecellcolumns,\number\raggedstatus)}}%
- \unexpanded\def\dotagTABLEsignal{\char\zerocount}% brrr, we need to tag empty cells (unless we start numbering)
+ \unexpanded\def\dotagTABLEcell
+ {\iftrialtypesetting\else
+ \clf_settagtablecell
+ \numexpr\tablecellrows\relax
+ \numexpr\tablecellcolumns\relax
+ \numexpr\raggedstatus\relax
+ \fi}%
+ % brrr, we need to tag empty cells (unless we start numbering)
+ \unexpanded\def\dotagTABLEsignal
+ {\char\zerocount}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagtabulatecell {\taggedctxcommand{settagtabulatecell(\number\c_tabl_tabulate_align)}}%
- \unexpanded\def\dotagtabulatesignal{\dontleavehmode\char\zerocount\ignorespaces}%
+ \unexpanded\def\dotagtabulatecell
+ {\iftrialtypesetting\else\clf_settagtabulatecell\c_tabl_tabulate_align\fi}%
+ \unexpanded\def\dotagtabulatesignal
+ {\dontleavehmode\char\zerocount\ignorespaces}%
\to \everyenableelements
-% \appendtoks
-% \unexpanded\def\dotagsectionlevel{\taggedctxcommand{settagsectionlevel("\currentheadlevel")}}%
-% \to \everyenableelements
-
\appendtoks
- \unexpanded\def\dotagsynonym{\taggedctxcommand{settagsynonym("\currentsynonymtag")}}%
+ \unexpanded\def\dotagsynonym
+ {\iftrialtypesetting\else\clf_settagsynonym{\currentsynonymtag}\fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsorting{\taggedctxcommand{settagsorting("\currentsortingtag")}}%
+ \unexpanded\def\dotagsorting
+ {\iftrialtypesetting\else\clf_settagsorting{\currentsortingtag}\fi}%
\to \everyenableelements
\appendtoks % frozen and assumed global per highlight class
- \unexpanded\def\dotaghighlight{\taggedctxcommand{settaghighlight(\!!bs\highlightparameter\c!style\!!es,\number\attribute\colorattribute)}}%
+ \unexpanded\def\dotaghighlight
+ {\iftrialtypesetting\else
+ \clf_settaghighlight{\highlightparameter\c!style}\attribute\colorattribute\relax
+ \fi}%
\to \everyenableelements
\appendtoks % we can have differently scaled images
- \unexpanded\def\dotagfigure{\taggedctxcommand{settagfigure("\figurefileoriginal","\figurefullname","\figurefilepage",\number\dimexpr\figurewidth,\number\dimexpr\figureheight)}}%
+ \unexpanded\def\dotagfigure
+ {\iftrialtypesetting\else
+ \clf_settagfigure
+ {\figurefileoriginal}%
+ {\figurefullname}%
+ {\figurefilepage}%
+ \dimexpr\figurewidth\relax
+ \dimexpr\figureheight\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\combinationparameter\c!nx,\combinationparameter\c!ny)}}%
- %\unexpanded\def\dotagcombination{\taggedctxcommand{settagcombination(\number\horcombination,\number\totcombination)}}%
+ \unexpanded\def\dotagcombination
+ {\iftrialtypesetting\else
+ \clf_settagcombination
+ \numexpr\combinationparameter\c!nx\relax
+ \numexpr\combinationparameter\c!ny\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}%
- \unexpanded\def\doresetparcounter {\attribute\taggedparattribute\attributeunsetvalue}%
+ \unexpanded\def\dotagsetparcounter
+ {\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}%
+ \unexpanded\def\doresetparcounter
+ {\attribute\taggedparattribute\attributeunsetvalue}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetitemgroup{\taggedctxcommand{settagitemgroup(\ifconditional\c_strc_itemgroups_pack true\else false\fi,\number\currentitemlevel,"\currentitemgroupsymbol")}}%
+ \unexpanded\def\dotagsetitemgroup
+ {\iftrialtypesetting\else
+ \clf_settagitemgroup
+ \ifconditional\c_strc_itemgroups_pack true\else false\fi\space
+ \numexpr\currentitemlevel\relax
+ {\currentitemgroupsymbol}%
+ \fi}%
+ \unexpanded\def\dotagsetitem
+ {\iftrialtypesetting\else
+ \clf_settagitem\ifconditional\c_strc_itemgroups_head true\else false\fi\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetdescription{\taggedctxcommand{settagdescription("\currentdescription",\currentdescriptionnumberentry)}}%
+ \unexpanded\def\dotagsetdescription
+ {\iftrialtypesetting\else
+ \clf_settagdescription{\currentdescription}\currentdescriptionnumberentry\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagsetnotesymbol{\taggedctxcommand{settagdescriptionsymbol("\currentnote",\currentnotenumber)}}%
+ \unexpanded\def\dotagsetnotesymbol
+ {\iftrialtypesetting\else
+ \clf_settagdescriptionsymbol{\currentnote}\currentnotenumber\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotagregisterlocation{\taggedctxcommand{settagregister("\currentregister",\currentregisternumber)}}%
+ \unexpanded\def\dotagregisterlocation
+ {\iftrialtypesetting\else
+ \clf_settagregister{\currentregister}\currentregisternumber\relax
+ \fi}%
\to \everyenableelements
\appendtoks
- \unexpanded\def\dotaglistlocation{\taggedctxcommand{settaglist(\currentlistindex)}}%
+ \unexpanded\def\dotaglistlocation
+ {\iftrialtypesetting\else
+ \clf_settaglist{\currentlistindex}%
+ \fi}%
\to \everyenableelements
\appendtoks
@@ -174,20 +221,20 @@
\def\dosynchronizeexport
{\let\currentexport\empty
- \ctxcommand{setupexport{
- align = "\exportparameter\c!align",
- bodyfont = \number\dimexpr\exportparameter\c!bodyfont,
- width = \number\dimexpr\exportparameter\c!width,
- properties = "\exportparameter\c!properties",
- hyphen = "\exportparameter\c!hyphen",
- title = \!!bs\exportparameter\c!title\!!es,
- subtitle = \!!bs\exportparameter\c!subtitle\!!es,
- author = \!!bs\exportparameter\c!author\!!es,
- firstpage = "\exportparameter\c!firstpage",
- lastpage = "\exportparameter\c!lastpage",
- svgstyle = "\exportparameter\c!svgstyle",
- cssfile = "\exportparameter\c!cssfile",
- }}}
+ \clf_setupexport
+ align {\exportparameter\c!align}%
+ bodyfont \dimexpr\exportparameter\c!bodyfont\relax
+ width \dimexpr\exportparameter\c!width\relax
+ properties {\exportparameter\c!properties}%
+ hyphen {\exportparameter\c!hyphen}%
+ title {\exportparameter\c!title}%
+ subtitle {\exportparameter\c!subtitle}%
+ author {\exportparameter\c!author}%
+ firstpage {\exportparameter\c!firstpage}%
+ lastpage {\exportparameter\c!lastpage}%
+ svgstyle {\exportparameter\c!svgstyle}%
+ cssfile {\exportparameter\c!cssfile}%
+ \relax}
\appendtoks
\doifsomething{\backendparameter\c!export}\dosynchronizeexport
diff --git a/tex/context/base/blob-ini.lua b/tex/context/base/blob-ini.lua
index 7c30131bc..b837250ce 100644
--- a/tex/context/base/blob-ini.lua
+++ b/tex/context/base/blob-ini.lua
@@ -45,6 +45,8 @@ local tohpackfast = typesetters.tohpackfast
local tovpack = typesetters.tovpack
local tovpackfast = typesetters.tovpackfast
+local implement = interfaces.implement
+
blobs = blobs or { }
-- provide copies here (nicer for manuals)
@@ -195,7 +197,7 @@ blobs.strht = strht
blobs.strdp = strdp
blobs.strhd = strhd
-function commands.strwd(str) context(strwd(str)) end
-function commands.strht(str) context(strht(str)) end
-function commands.strdp(str) context(strdp(str)) end
-function commands.strhd(str) context(strhd(str)) end
+implement { name = "strwd", arguments = "string", actions = { strwd, context } }
+implement { name = "strht", arguments = "string", actions = { strht, context } }
+implement { name = "strdp", arguments = "string", actions = { strdp, context } }
+implement { name = "strhd", arguments = "string", actions = { strhd, context } }
diff --git a/tex/context/base/blob-ini.mkiv b/tex/context/base/blob-ini.mkiv
index 1dfb766f4..64582c0db 100644
--- a/tex/context/base/blob-ini.mkiv
+++ b/tex/context/base/blob-ini.mkiv
@@ -27,10 +27,10 @@
% this one takes simple (utf) strings
-\def\wdofstring#1{\dimexpr\ctxcommand{strwd(\!!bs#1\!!es)}\scaledpoint\relax}
-\def\htofstring#1{\dimexpr\ctxcommand{strht(\!!bs#1\!!es)}\scaledpoint\relax}
-\def\dpofstring#1{\dimexpr\ctxcommand{strdp(\!!bs#1\!!es)}\scaledpoint\relax}
-\def\hdofstring#1{\dimexpr\ctxcommand{strhd(\!!bs#1\!!es)}\scaledpoint\relax}
+\def\wdofstring#1{\dimexpr\clf_strwd{#1}\scaledpoint\relax}
+\def\htofstring#1{\dimexpr\clf_strht{#1}\scaledpoint\relax}
+\def\dpofstring#1{\dimexpr\clf_strdp{#1}\scaledpoint\relax}
+\def\hdofstring#1{\dimexpr\clf_strhd{#1}\scaledpoint\relax}
\def\widthofstring {\the\wdofstring}
\def\heightofstring {\the\htofstring}
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
index c756c57c4..9a1c769d2 100644
--- a/tex/context/base/buff-ver.mkiv
+++ b/tex/context/base/buff-ver.mkiv
@@ -861,7 +861,7 @@
name {#2}%
strip {\typingparameter\c!strip}%
tab {\typingparameter\c!tab}%
- method {\p_buff_option}%
+ % method {\p_buff_option}%
nature {direct}%
\relax}
diff --git a/tex/context/base/chem-ini.lua b/tex/context/base/chem-ini.lua
index 10db1a1e4..f7d10ffa2 100644
--- a/tex/context/base/chem-ini.lua
+++ b/tex/context/base/chem-ini.lua
@@ -32,12 +32,31 @@ function chemistry.molecule(str)
return lpegmatch(moleculeparser,str)
end
-function commands.molecule(str)
- if trace_molecules then
- local rep = lpegmatch(moleculeparser,str)
- report_chemistry("molecule %a becomes %a",str,rep)
- context(rep)
- else
- context(lpegmatch(moleculeparser,str))
- end
-end
+interfaces.implement {
+ name = "molecule",
+ arguments = "string",
+ actions = function(str)
+ if trace_molecules then
+ local rep = lpegmatch(moleculeparser,str)
+ report_chemistry("molecule %a becomes %a",str,rep)
+ context(rep)
+ else
+ context(lpegmatch(moleculeparser,str))
+ end
+ end,
+}
+
+-- interfaces.implement {
+-- name = "molecule",
+-- scope = "private",
+-- action = function()
+-- local str = scanstring()
+-- if trace_molecules then
+-- local rep = lpegmatch(moleculeparser,str)
+-- report_chemistry("molecule %a becomes %a",str,rep)
+-- context(rep)
+-- else
+-- context(lpegmatch(moleculeparser,str))
+-- end
+-- end,
+-- }
diff --git a/tex/context/base/chem-ini.mkiv b/tex/context/base/chem-ini.mkiv
index 357bceefa..9a44b4f1a 100644
--- a/tex/context/base/chem-ini.mkiv
+++ b/tex/context/base/chem-ini.mkiv
@@ -37,7 +37,7 @@
%D \typebuffer \getbuffer
\unexpanded\def\molecule#1%
- {\ctxcommand{molecule(\!!bs#1\!!es)}}
+ {\clf_molecule{#1}}
%D For old times sake:
diff --git a/tex/context/base/chem-str.lua b/tex/context/base/chem-str.lua
index 6c1d3b837..d724394bb 100644
--- a/tex/context/base/chem-str.lua
+++ b/tex/context/base/chem-str.lua
@@ -44,6 +44,8 @@ local P, R, S, C, Cs, Ct, Cc, Cmt = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpe
local variables = interfaces and interfaces.variables
local commands = commands
local context = context
+local implement = interfaces.implement
+
local formatters = string.formatters
local texgetcount = tex.getcount
@@ -67,6 +69,7 @@ local chemistry = chemistry
chemistry.instance = "chemistry"
chemistry.format = "metafun"
+chemistry.method = "double"
chemistry.structures = 0
local common_keys = {
@@ -768,6 +771,7 @@ function chemistry.stop()
metapost.graphic {
instance = chemistry.instance,
format = chemistry.format,
+ method = chemistry.method,
data = mpcode,
definitions = f_initialize,
}
@@ -776,14 +780,12 @@ function chemistry.stop()
end
end
-function chemistry.component(spec,text,settings)
+function chemistry.component(spec,text,rulethickness,rulecolor)
if metacode then
- rulethickness, rulecolor, offset = settings.rulethickness, settings.rulecolor
local spec = settings_to_array_with_repeat(spec,true) -- no lower?
local text = settings_to_array_with_repeat(text,true)
- -- inspect(spec)
metacode[#metacode+1] = f_start_component
- process(1,spec,text,1,rulethickness,rulecolor) -- offset?
+ process(1,spec,text,1,rulethickness,rulecolor)
metacode[#metacode+1] = f_stop_component
end
end
@@ -796,11 +798,52 @@ end)
-- interfaces
-commands.undefinechemical = chemistry.undefine
-commands.definechemical = chemistry.define
-commands.startchemical = chemistry.start
-commands.stopchemical = chemistry.stop
-commands.chemicalcomponent = chemistry.component
+implement {
+ name = "undefinechemical",
+ actions = chemistry.undefine,
+ arguments = "string"
+}
+
+implement {
+ name = "definechemical",
+ actions = chemistry.define,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "startchemical",
+ actions = chemistry.start,
+ arguments = {
+ {
+ { "width" },
+ { "height" },
+ { "left" },
+ { "right" },
+ { "top" },
+ { "bottom" },
+ { "scale" },
+ { "rotation" },
+ { "symalign" },
+ { "axis" },
+ { "framecolor" },
+ { "rulethickness" },
+ { "offset" },
+ { "unit" },
+ { "factor" }
+ }
+ }
+}
+
+implement {
+ name = "stopchemical",
+ actions = chemistry.stop,
+}
+
+implement {
+ name = "chemicalcomponent",
+ actions = chemistry.component,
+ arguments = { "string", "string", "string", "string" }
+}
-- todo: top / bottom
-- maybe add "=" for double and "≡" for triple?
@@ -817,7 +860,9 @@ local inline = {
["space"] = "\\chemicalspace",
}
-function commands.inlinechemical(spec)
+local ctx_chemicalinline = context.chemicalinline
+
+function chemistry.inlinechemical(spec)
local spec = settings_to_array_with_repeat(spec,true)
for i=1,#spec do
local s = spec[i]
@@ -825,7 +870,13 @@ function commands.inlinechemical(spec)
if inl then
context(inl) -- could be a fast context.sprint
else
- context.chemicalinline(molecule(s))
+ ctx_chemicalinline(molecule(s))
end
end
end
+
+implement {
+ name = "inlinechemical",
+ actions = chemistry.inlinechemical,
+ arguments = "string"
+}
diff --git a/tex/context/base/chem-str.mkiv b/tex/context/base/chem-str.mkiv
index 801683cfd..e810977ab 100644
--- a/tex/context/base/chem-str.mkiv
+++ b/tex/context/base/chem-str.mkiv
@@ -62,7 +62,7 @@
%D a historical and practical reason (like shared keys with different meaning
%D that could clash, e.g.\ align).
-\defineMPinstance
+\defineMPinstance % not really needed as we set in lua
[chemistry]
[\s!format=metafun,
%\s!extensions=\v!yes, % Should we add extensions and initializations?
@@ -88,7 +88,7 @@
{\startnointerference
\edef\currentdefinedchemical{#1}%
\let\chemical\chem_chemical_nested
- \ctxcommand{undefinechemical("#1")}%
+ \clf_undefinechemical{#1}%
#2% flush
\stopnointerference}
@@ -96,7 +96,7 @@
{\dodoubleempty\chem_chemical_nested_indeed}
\def\chem_chemical_nested_indeed[#1][#2]%
- {\ctxcommand{definechemical("\currentdefinedchemical",\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es)}}
+ {\clf_definechemical{\currentdefinedchemical}{#1}{\detokenize{#2}}}
% chemical symbols
@@ -160,28 +160,28 @@
\fi\fi
\the\everystructurechemical
\setbox\b_chem_result\hbox\bgroup
- \ctxcommand{startchemical {
- width = "\chemicalparameter\c!width",
- height = "\chemicalparameter\c!height",
- left = "\chemicalparameter\c!left",
- right = "\chemicalparameter\c!right",
- top = "\chemicalparameter\c!top",
- bottom = "\chemicalparameter\c!bottom",
- scale = "\chemicalparameter\c!scale",
- rotation = "\chemicalparameter\c!rotation",
- symalign = "\chemicalparameter\c!symalign",
- axis = "\chemicalparameter\c!axis",
- framecolor = "\MPcolor{\chemicalparameter\c!framecolor}",
- rulethickness = \number\dimexpr\chemicalparameter\c!rulethickness\relax,
- offset = \number\dimexpr\chemicalparameter\c!offset\relax,
- unit = \number\dimexpr\chemicalparameter\c!unit\relax,
- factor = \number\chemicalparameter\c!factor,
- } }%
+ \clf_startchemical
+ width {\chemicalparameter\c!width}%
+ height {\chemicalparameter\c!height}%
+ left {\chemicalparameter\c!left}%
+ right {\chemicalparameter\c!right}%
+ top {\chemicalparameter\c!top}%
+ bottom {\chemicalparameter\c!bottom}%
+ scale {\chemicalparameter\c!scale}%
+ rotation {\chemicalparameter\c!rotation}%
+ symalign {\chemicalparameter\c!symalign}%
+ axis {\chemicalparameter\c!axis}%
+ framecolor {\MPcolor{\chemicalparameter\c!framecolor}}%
+ rulethickness {\number\dimexpr\chemicalparameter\c!rulethickness}%
+ offset {\number\dimexpr\chemicalparameter\c!offset}%
+ unit {\number\dimexpr\chemicalparameter\c!unit}%
+ factor {\number\chemicalparameter\c!factor}%
+ \relax
\startnointerference}
\unexpanded\def\stopchemical
{\stopnointerference
- \ctxcommand{stopchemical()}%
+ \clf_stopchemical
\egroup
\d_chem_width \wd\b_chem_result
\d_chem_height\ht\b_chem_result
@@ -222,17 +222,21 @@
\def\strc_chem_indeed_three[#1][#2][#3]%
{\writestatus\m!chemicals{hyperlinked chemicals not yet supported}% todo reference, for the moment ignored
- \ctxcommand{chemicalcomponent(\!!bs#2\!!es, \!!bs\detokenize{#3}\!!es, { % maybe also pass first two args this way
- rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points
- rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup
- } ) }%
+ \clf_chemicalcomponent
+ {#2}%
+ {\detokenize{#3}}%
+ {\the\dimexpr\chemicalparameter\c!rulethickness}% todo: scaled points
+ {\MPcolor{\chemicalparameter\c!rulecolor}}% % we can precalculate this for speedup
+ \relax
\ignorespaces}
\def\strc_chem_indeed_two[#1][#2]%
- {\ctxcommand{chemicalcomponent(\!!bs#1\!!es,\!!bs\detokenize{#2}\!!es, { % maybe also pass first two args this way
- rulethickness = "\the\dimexpr\chemicalparameter\c!rulethickness\relax", % todo: scaled points
- rulecolor = "\MPcolor{\chemicalparameter\c!rulecolor}" % we can precalculate this for speedup
- } ) }%
+ {\clf_chemicalcomponent
+ {#1}%
+ {\detokenize{#2}}%
+ {\the\dimexpr\chemicalparameter\c!rulethickness}% todo: scaled points
+ {\MPcolor{\chemicalparameter\c!rulecolor}}% % we can precalculate this for speedup
+ \relax
\ignorespaces}
\appendtoks
@@ -311,8 +315,8 @@
\def\chem_arrow_construct#1#2#3%
{\enspace
\mathematics{#1%
- {\strut\hbox \s!spread 2\emwidth{\hss\ctxcommand{inlinechemical(\!!bs#3\!!es)}\hss}}% {\strut\hbox \s!spread 2em{\hss#3\hss}}}%
- {\strut\hbox \s!spread 2\emwidth{\hss\ctxcommand{inlinechemical(\!!bs#2\!!es)}\hss}}}% {\strut\hbox \s!spread 2em{\hss#2\hss}}%
+ {\strut\hbox \s!spread 2\emwidth{\hss\clf_inlinechemical{#3}\hss}}% {\strut\hbox \s!spread 2em{\hss#3\hss}}}%
+ {\strut\hbox \s!spread 2\emwidth{\hss\clf_inlinechemical{#2}\hss}}}% {\strut\hbox \s!spread 2em{\hss#2\hss}}%
\enspace}
% special macros (probably needs some more work)
@@ -505,7 +509,7 @@
\begingroup
\scratchcounter\normalmathstyle
\usechemicalstyleandcolor\c!style\c!color
- \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\ctxcommand{inlinechemical(\!!bs#1\!!es)}}}%
+ \hbox{\mathematics{\tf\triggermathstyle\scratchcounter\clf_inlinechemical{#1}}}%
\endgroup}
\unexpanded\def\displaychemical
@@ -531,7 +535,7 @@
\unexpanded\def\inlinechemical#1%
{\dontleavehmode
- \hbox{\usechemicalstyleandcolor\c!style\c!color\ctxcommand{inlinechemical(\!!bs#1\!!es)}}}
+ \hbox{\usechemicalstyleandcolor\c!style\c!color\clf_inlinechemical{#1}}}
\unexpanded\def\chemicalbondrule
{\hbox{\vrule\s!height.75\exheight\s!depth-\dimexpr.75\exheight-\linewidth\relax\s!width\emwidth\relax}}
diff --git a/tex/context/base/cldf-scn.lua b/tex/context/base/cldf-scn.lua
index 13339c362..5948fdeaf 100644
--- a/tex/context/base/cldf-scn.lua
+++ b/tex/context/base/cldf-scn.lua
@@ -6,14 +6,15 @@ if not modules then modules = { } end modules ['cldf-scn'] = {
license = "see context related readme files"
}
-if not tokens.setters then return end
-
local load, type = load, type
local formatters = string.formatters
local char = string.char
local concat = table.concat
+local lpegmatch = lpeg.match
+local p_unquoted = lpeg.Cs(lpeg.patterns.unquoted)
+
local f_action_f = formatters["action%s(%s)"]
local f_action_s = formatters["local action%s = action[%s]"]
local f_command = formatters["local action = tokens._action\n%\nt\nreturn function(%s) return %s end"]
@@ -51,21 +52,36 @@ function interfaces.implement(specification)
elseif #actions == 1 then
command = actions[1]
else
+ -- this one is not yet complete .. compare tokens
tokens._action = actions
local f = { }
- local a = { }
- local args = ""
- if arguments then
+ local args
+ if not arguments then
+ args = ""
+ elseif type(arguments) == "table" then
+ local a = { }
for i=1,#arguments do
local v = arguments[i]
local t = type(v)
if t == "boolean" then
a[i] = tostring(v)
+ elseif t == "number" then
+ a[i] = tostring(v)
+ elseif t == "string" then
+ local s = lpegmatch(p_unquoted,v)
+ if s and v ~= s then
+ a[i] = v -- a string, given as "'foo'" or '"foo"'
+ else
+ a[i] = char(96+i)
+ end
else
+ -- nothing special for tables
a[i] = char(96+i)
end
end
args = concat(a,",")
+ else
+ args = "a"
end
command = args
for i=1,#actions do
@@ -79,7 +95,7 @@ function interfaces.implement(specification)
end
tokens._action = nil
end
- if scanners[name] then
+ if scanners[name] and not specification.overload then
report("warning: 'scanners.%s' is redefined",name)
end
scanners[name] = scanner
diff --git a/tex/context/base/colo-ext.mkiv b/tex/context/base/colo-ext.mkiv
index 41d60cb0b..c076fda9e 100644
--- a/tex/context/base/colo-ext.mkiv
+++ b/tex/context/base/colo-ext.mkiv
@@ -47,10 +47,10 @@
\installcorenamespace{colorintent}
\unexpanded\def\registercolorintent#1#2%
- {\setevalue{\??colorintent#1}{\attribute\colorintentattribute\ctxcommand{registercolorintent('#2')} }}
+ {\setevalue{\??colorintent#1}{\attribute\colorintentattribute\clf_registercolorintent{#2}}}
\unexpanded\def\colo_intents_set
- {\ctxcommand{enablecolorintents()}%
+ {\clf_enablecolorintents
\unexpanded\gdef\colo_intents_set##1{\csname\??colorintent##1\endcsname}%
\colo_intents_set}
diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua
index 19d0703cf..35c72ef47 100644
--- a/tex/context/base/colo-ini.lua
+++ b/tex/context/base/colo-ini.lua
@@ -17,16 +17,13 @@ local trace_define = false trackers.register("colors.define",function(v) trace_
local report_colors = logs.reporter("colors","defining")
-local attributes, backends, storage = attributes, backends, storage
-local context, commands = context, commands
+local attributes = attributes
+local backends = backends
+local storage = storage
+local context = context
+local commands = commands
-local scanners = tokens.scanners
-local scanstring = scanners.string
-local scanboolean = scanners.boolean
-local scaninteger = scanners.integer
-
-local compilescanner = tokens.compile
-local scanners = interfaces.scanners
+local implement = interfaces.implement
local settings_to_hash_strict = utilities.parsers.settings_to_hash_strict
@@ -65,7 +62,7 @@ local function pushset(name)
end
end
-local function popset(name)
+local function popset()
colorset = remove(stack)
end
@@ -814,7 +811,13 @@ colors.defineintermediatecolor = defineintermediatecolor
-- for the moment downward compatible
-local patterns = { "colo-imp-%s.mkiv", "colo-imp-%s.tex", "colo-%s.mkiv", "colo-%s.tex" }
+local patterns = {
+ "colo-imp-%s.mkiv",
+ "colo-imp-%s.tex",
+ -- obsolete:
+ "colo-%s.mkiv",
+ "colo-%s.tex"
+}
local function action(name,foundname)
-- could be one command
@@ -844,130 +847,120 @@ end
colors.usecolors = usecolors
--- interface (todo: use locals)
+-- backend magic
-local setcolormodel = colors.setmodel
+local currentpagecolormodel
-function commands.setcolormodel(model,weight)
- texsetattribute(a_colorspace,setcolormodel(model,weight))
+function colors.setpagecolormodel(model)
+ currentpagecolormodel = model
end
-scanners.setcolormodel = function()
- texsetattribute(a_colorspace,setcolormodel(scanstring(),scanboolean()))
+function colors.getpagecolormodel()
+ return currentpagecolormodel
end
--- function commands.setrastercolor(name,s)
--- texsetattribute(a_color,colors.definesimplegray(name,s))
--- end
+-- interface
-function commands.registermaintextcolor(a)
- colors.main = a
-end
+local setcolormodel = colors.setmodel
+
+implement {
+ name = "setcolormodel",
+ arguments = { "string", "boolean" },
+ actions = function(model,weight)
+ texsetattribute(a_colorspace,setcolormodel(model,weight))
+ end
+}
-commands.defineprocesscolor = defineprocesscolor
-commands.definespotcolor = definespotcolor
-commands.definemultitonecolor = definemultitonecolor
-commands.definetransparency = definetransparency
-commands.defineintermediatecolor = defineintermediatecolor
+implement {
+ name = "setpagecolormodel",
+ actions = colors.setpagecolormodel,
+ arguments = { "string" },
+}
-scanners.defineprocesscolorlocal = compilescanner {
+implement {
+ name = "defineprocesscolorlocal",
actions = defineprocesscolor,
arguments = { "string", "string", false, "boolean" }
}
-scanners.defineprocesscolorglobal = compilescanner {
+implement {
+ name = "defineprocesscolorglobal",
actions = defineprocesscolor,
arguments = { "string", "string", true, "boolean" }
}
-scanners.defineprocesscolordummy = compilescanner {
+implement {
+ name = "defineprocesscolordummy",
actions = defineprocesscolor,
arguments = { "'d_u_m_m_y'", "string", false, false }
}
-scanners.definespotcolorglobal = compilescanner {
+implement {
+ name = "definespotcolorglobal",
actions = definespotcolor,
arguments = { "string", "string", "string", true }
}
-scanners.definemultitonecolorglobal = compilescanner {
- actions = definespotcolor,
+implement {
+ name = "definemultitonecolorglobal",
+ actions = definemultitonecolor,
arguments = { "string", "string", "string", "string", true }
}
-scanners.registermaintextcolor = function()
- colors.main = scaninteger()
-end
+implement {
+ name = "registermaintextcolor",
+ actions = function(main)
+ colors.main = main
+ end,
+ arguments = { "integer" }
+}
-scanners.definetransparency = compilescanner {
+implement {
+ name = "definetransparency",
actions = definetransparency,
- arguments = { "string", "integer" },
+ arguments = { "string", "integer" }
}
-scanners.defineintermediatecolor = compilescanner {
+implement {
+ name = "defineintermediatecolor",
actions = defineintermediatecolor,
arguments = { "string", "string", "integer", "integer", "integer", "integer", "string", false, "boolean" }
}
-function commands.spotcolorname (a) context(spotcolorname (a)) end
-function commands.spotcolorparent (a) context(spotcolorparent (a)) end
-function commands.spotcolorvalue (a) context(spotcolorvalue (a)) end
-function commands.colorcomponents (a,s) context(colorcomponents (a,s)) end
-function commands.transparencycomponents(a,s) context(transparencycomponents(a,s)) end
-function commands.processcolorcomponents(a,s) context(processcolorcomponents(a,s)) end
-function commands.formatcolor (...) context(formatcolor (...)) end
-function commands.formatgray (...) context(formatgray (...)) end
-
-scanners.spotcolorname = compilescanner { actions = spotcolorname, arguments = "integer" }
-scanners.spotcolorparent = compilescanner { actions = spotcolorparent, arguments = "integer" }
-scanners.spotcolorvalue = compilescanner { actions = spotcolorvalue, arguments = "integer" }
-
-scanners.colorcomponents = compilescanner { actions = colorcomponents, arguments = "integer" }
-scanners.transparencycomponents = compilescanner { actions = transparencycomponents, arguments = "integer" }
-scanners.processcolorcomponents = compilescanner { actions = processcolorcomponents, arguments = { "integer", "','" } }
-
-scanners.formatcolor = compilescanner { actions = formatcolor, arguments = { "integer", "string" } }
-scanners.formatgray = compilescanner { actions = formatgray, arguments = { "integer", "string" } }
-
-function commands.mpcolor(model,ca,ta,default)
- context(mpcolor(model,ca,ta,default))
-end
-
--- scanners.mpcolor = function()
--- context(mpcolor(scaninteger(),scaninteger(),scaninteger()))
--- end
-
-scanners.mpcolor = compilescanner {
+implement { name = "spotcolorname", actions = { spotcolorname, context }, arguments = "integer" }
+implement { name = "spotcolorparent", actions = { spotcolorparent, context }, arguments = "integer" }
+implement { name = "spotcolorvalue", actions = { spotcolorvalue, context }, arguments = "integer" }
+implement { name = "colorcomponents", actions = { colorcomponents, context }, arguments = "integer" }
+implement { name = "transparencycomponents", actions = { transparencycomponents, context }, arguments = "integer" }
+implement { name = "processcolorcomponents", actions = { processcolorcomponents, context }, arguments = "integer" }
+implement { name = "formatcolor", actions = { formatcolor, context }, arguments = { "integer", "string" } }
+implement { name = "formatgray", actions = { formatgray, context }, arguments = { "integer", "string" } }
+
+implement {
+ name = "mpcolor",
actions = { mpcolor, context },
arguments = { "integer", "integer", "integer" }
}
-function commands.mpoptions(model,ca,ta,default)
- context(mpoptions(model,ca,ta,default))
-end
-
-scanners.mpoptions = compilescanner {
+implement {
+ name = "mpoptions",
actions = { mpoptions, context },
arguments = { "integer", "integer", "integer" }
}
local ctx_doifelse = commands.doifelse
-function commands.doifblackelse(a)
- ctx_doifelse(isblack(a))
-end
-
-function commands.doifdrawingblackelse()
- ctx_doifelse(isblack(texgetattribute(a_color)))
-end
+implement {
+ name = "doifdrawingblackelse",
+ actions = function() ctx_doifelse(isblack(texgetattribute(a_color))) end
+}
-scanners.doifblackelse = compilescanner {
+implement {
+ name = "doifblackelse",
actions = { isblack, ctx_doifelse },
arguments = "integer"
}
-scanners.doifdrawingblackelse = commands.doifdrawingblackelse
-
-- function commands.withcolorsinset(name,command)
-- local set
-- if name and name ~= "" then
@@ -986,38 +979,36 @@ scanners.doifdrawingblackelse = commands.doifdrawingblackelse
-- end
-- end
-commands.startcolorset = pushset
-commands.stopcolorset = popset
-commands.usecolors = usecolors
-
-scanners.startcolorset = compilescanner { actions = pushset, arguments = "string" }
-scanners.stopcolorset = popset
-scanners.usecolors = compilescanner { actions = usecolors, arguments = "string" }
+implement { name = "startcolorset", actions = pushset, arguments = "string" }
+implement { name = "stopcolorset", actions = popset }
+implement { name = "usecolors", actions = usecolors, arguments = "string" }
-- bonus
-local function pgfxcolorspec(ca) -- {}{}{colorspace}{list}
+function colors.pgfxcolorspec(ca) -- {}{}{colorspace}{list}
-- local cv = attributes.colors.values[ca]
local cv = colorvalues[ca]
if cv then
local model = cv[1]
if model == 2 then
- context("{gray}{%1.3f}",cv[2])
+ return formatters["{gray}{%1.3f}"](cv[2])
elseif model == 3 then
- context("{rgb}{%1.3f,%1.3f,%1.3f}",cv[3],cv[4],cv[5])
+ return formatters["{rgb}{%1.3f,%1.3f,%1.3f}"](cv[3],cv[4],cv[5])
elseif model == 4 then
- context("{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}",cv[6],cv[7],cv[8],cv[9])
+ return formatters["{cmyk}{%1.3f,%1.3f,%1.3f,%1.3f}"](cv[6],cv[7],cv[8],cv[9])
else
- context("{gray}{%1.3f}",cv[2])
+ return formatters["{gray}{%1.3f}"](cv[2])
end
else
- context("{gray}{0}")
+ return "{gray}{0}"
end
end
-commands.pgfxcolorspec = pgfxcolorspec
-
-scanners.pgfxcolorspec = compilescanner { actions = pgfxcolorspec, arguments = "integer" }
+implement {
+ name = "pgfxcolorspec",
+ actions = { colors.pgfxcolorspec, context },
+ arguments = "integer"
+}
-- function commands.pgfregistercolor(name,attribute)
-- local cv = colorvalues[ca]
diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv
index 217330afc..621b7a303 100644
--- a/tex/context/base/colo-ini.mkiv
+++ b/tex/context/base/colo-ini.mkiv
@@ -255,14 +255,14 @@
\colo_helpers_set_current_model
\ifproductionrun
\edef\p_pagecolormodel{\directcolorsparameter\c!pagecolormodel}%
- \ctxcommand{synchronizecolormodel("\ifx\p_pagecolormodel\v!auto \currentcolormodel \else \p_pagecolormodel \fi")}%
+ \clf_setpagecolormodel{\ifx\p_pagecolormodel\v!auto\currentcolormodel\else\p_pagecolormodel\fi}%
\fi
\to \everysetupcolors
\appendtoks
\setupcolors[\c!state=\v!start]%
- \ctxcommand{enablecolor()}% % this can as well happen when
- \ctxcommand{enabletransparency()}% % the handler is defined in lua
+ \clf_enablecolor % this can as well happen when
+ \clf_enabletransparency % the handler is defined in lua
\let\colo_helpers_show_message\showmessage
\to \everyjob
@@ -1068,7 +1068,7 @@
\def\MPoptions#1%
- {\clfmpoptions
+ {\clf_mpoptions
\attribute\colormodelattribute
\colo_helpers_inherited_current_ca{#1} %
\colo_helpers_inherited_current_ta{#1} }
@@ -1076,16 +1076,15 @@
\def\thecolorattribute #1{\number\csname\??colorattribute \ifcsname\??colorattribute \currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??colorattribute #1\endcsname#1\fi\fi\endcsname}
\def\thetransparencyattribute#1{\number\csname\??transparencyattribute\ifcsname\??transparencyattribute\currentcolorprefix#1\endcsname\currentcolorprefix#1\else\ifcsname\??transparencyattribute#1\endcsname#1\fi\fi\endcsname}
-
\def\thecolormodelattribute {\the\attribute\colormodelattribute}
\def\internalspotcolorname #1{\clf_spotcolorname \thecolorattribute{#1} }
\def\internalspotcolorparent #1{\clf_spotcolorparent\thecolorattribute{#1} }
\def\internalspotcolorsize #1{\clf_spotcolorvalue \thecolorattribute{#1} }
-\def\colorcomponents #1{\clf_colorcomponents \thecolorattribute{#1} }
+\def\colorcomponents #1{\clf_colorcomponents \thecolorattribute {#1} }
\def\transparencycomponents #1{\clf_transparencycomponents\thetransparencyattribute{#1} }
-\def\processcolorcomponents #1{\clf_processcolorcomponents\thecolorattribute{#1} }
+\def\processcolorcomponents #1{\clf_processcolorcomponents\thecolorattribute {#1} }
\def\colorvalue #1{\clf_formatcolor\thecolorattribute{#1}{\colorformatseparator}}
\def\grayvalue #1{\clf_formatgray \thecolorattribute{#1}{\colorformatseparator}}
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index de6e6c573..bb8f9e38c 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2015.03.28 22:37}
+\newcontextversion{2015.03.30 23:33}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf
index b66529ce9..d1915c91d 100644
--- a/tex/context/base/context-version.pdf
+++ b/tex/context/base/context-version.pdf
Binary files differ
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 06723d6c2..50fa0da05 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -28,7 +28,7 @@
%D up and the dependencies are more consistent.
\edef\contextformat {\jobname}
-\edef\contextversion{2015.03.28 22:37}
+\edef\contextversion{2015.03.30 23:33}
\edef\contextkind {beta}
%D For those who want to use this:
diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua
index 9a48255bd..93cf0400e 100644
--- a/tex/context/base/core-con.lua
+++ b/tex/context/base/core-con.lua
@@ -24,6 +24,7 @@ local P, C, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.Cs, lpeg.match
local context = context
local commands = commands
+local implement = interfaces.implement
local settings_to_array = utilities.parsers.settings_to_array
local allocate = utilities.storage.allocate
@@ -39,10 +40,8 @@ local languages = languages
converters.number = tonumber
converters.numbers = tonumber
-commands.number = context
-commands.numbers = context
-
-ctx_doifelse = commands.doifelse
+implement { name = "number", actions = context }
+implement { name = "numbers", actions = context }
-- to be reconsidered ... languages namespace here, might become local plus a register command
@@ -223,8 +222,13 @@ local function do_alphabetic(n,mapping,mapper,t) -- todo: make zero based varian
end
end
-local function alphabetic(n,code) return do_alphabetic(n,code and counters[code] or defaultcounter,lowercharacter) end
-local function Alphabetic(n,code) return do_alphabetic(n,code and counters[code] or defaultcounter,uppercharacter) end
+local function alphabetic(n,code)
+ return do_alphabetic(n,code and code ~= "" and counters[code] or defaultcounter,lowercharacter)
+end
+
+local function Alphabetic(n,code)
+ return do_alphabetic(n,code and code ~= "" and counters[code] or defaultcounter,uppercharacter)
+end
converters.alphabetic = alphabetic
converters.Alphabetic = Alphabetic
@@ -242,12 +246,13 @@ converters['A'] = converters.Characters
converters['AK'] = converters.Characters
converters['KA'] = converters.Characters
-function commands.alphabetic(n,c) context(do_alphabetic(n,c and counters[c] or defaultcounter,lowercharacter)) end
-function commands.Alphabetic(n,c) context(do_alphabetic(n,c and counters[c] or defaultcounter,uppercharacter)) end
-function commands.character (n) context(chr (n,lower_offset)) end
-function commands.Character (n) context(chr (n,upper_offset)) end
-function commands.characters(n) context(chrs(n,lower_offset)) end
-function commands.Characters(n) context(chrs(n,upper_offset)) end
+implement { name = "alphabetic", actions = { alphabetic, context }, arguments = { "integer", "string" } }
+implement { name = "Alphabetic", actions = { Alphabetic, context }, arguments = { "integer", "string" } }
+
+implement { name = "character", actions = { chr, context }, arguments = { "integer", lower_offset } }
+implement { name = "Character", actions = { chr, context }, arguments = { "integer", upper_offset } }
+implement { name = "characters", actions = { chrs, context }, arguments = { "integer", lower_offset } }
+implement { name = "Characters", actions = { chrs, context }, arguments = { "integer", upper_offset } }
local weekday = os.weekday -- moved to l-os
local isleapyear = os.isleapyear -- moved to l-os
@@ -273,20 +278,22 @@ converters.leapyear = leapyear
converters.nofdays = nofdays
converters.textime = textime
-function commands.weekday (day,month,year) context(weekday (day,month,year)) end
-function commands.leapyear(year) context(leapyear(year)) end -- rather useless, only for ifcase
-function commands.nofdays (year,month) context(nofdays (year,month)) end
-
-function commands.year () context(date("%Y")) end
-function commands.month () context(date("%m")) end
-function commands.hour () context(date("%H")) end
-function commands.minute () context(date("%M")) end
-function commands.second () context(date("%S")) end
-function commands.textime() context(textime()) end
-
-function commands.doifleapyearelse(year)
- ctx_doifelse(isleapyear(year))
-end
+implement { name = "weekday", actions = { weekday, context }, arguments = { "integer", "integer", "integer" } }
+implement { name = "leapyear", actions = { leapyear, context }, arguments = { "integer" } }
+implement { name = "nofdays", actions = { nofdays, context }, arguments = { "integer", "integer" } }
+
+implement { name = "year", actions = { date, context }, arguments = "'%Y'" }
+implement { name = "month", actions = { date, context }, arguments = "'%m'" }
+implement { name = "hour", actions = { date, context }, arguments = "'%H'" }
+implement { name = "minute", actions = { date, context }, arguments = "'%M'" }
+implement { name = "second", actions = { date, context }, arguments = "'%S'" }
+implement { name = "textime", actions = { textime, context } }
+
+implement {
+ name = "doifleapyearelse",
+ actions = { isleapyear, commands.doifelse },
+ arguments = "integer"
+}
local roman = {
{ [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' },
@@ -313,8 +320,17 @@ converters['R'] = converters.Romannumerals
converters['KR'] = converters.Romannumerals
converters['RK'] = converters.Romannumerals
-function commands.romannumerals(n) context(lower(toroman(n))) end
-function commands.Romannumerals(n) context( toroman(n)) end
+implement {
+ name = "romannumerals",
+ actions = { toroman, lower, context },
+ arguments = "integer",
+}
+
+implement {
+ name = "Romannumerals",
+ actions = { toroman, context },
+ arguments = "integer",
+}
--~ local small = {
--~ 0x0627, 0x066E, 0x062D, 0x062F, 0x0647, 0x0648, 0x0631
@@ -367,8 +383,17 @@ converters.toabjad = toabjad
function converters.abjadnumerals (n) return toabjad(n,false) end
function converters.abjadnodotnumerals(n) return toabjad(n,true ) end
-function commands.abjadnumerals (n) context(toabjad(n,false)) end
-function commands.abjadnodotnumerals(n) context(toabjad(n,true )) end
+implement {
+ name = "abjadnumerals",
+ actions = { toabjad, context },
+ arguments = { "integer", false }
+}
+
+implement {
+ name = "abjadnodotnumerals",
+ actions = { toabjad, context },
+ arguments = { "integer", true }
+}
local vector = {
normal = {
@@ -510,14 +535,20 @@ end
converters.tochinese = tochinese
-function converters.chinesenumerals (n) return tochinese(n,"normal") end
-function converters.chinesecapnumerals(n) return tochinese(n,"cap" ) end
-function converters.chineseallnumerals(n) return tochinese(n,"all" ) end
+function converters.chinesenumerals (n,how) return tochinese(n,how or "normal") end
+function converters.chinesecapnumerals(n) return tochinese(n,"cap") end
+function converters.chineseallnumerals(n) return tochinese(n,"all") end
converters['cn'] = converters.chinesenumerals
converters['cn-c'] = converters.chinesecapnumerals
converters['cn-a'] = converters.chineseallnumerals
+implement {
+ name = "chinesenumerals",
+ actions = { tochinese, context },
+ arguments = { "integer", "string" }
+}
+
-- this is a temporary solution: we need a better solution when we have
-- more languages
@@ -532,10 +563,6 @@ converters['characters:sl'] = converters.sloveniannumerals
converters['Characters:es'] = converters.Spanishnumerals
converters['Characters:sl'] = converters.Sloveniannumerals
-function commands.chinesenumerals (n) context(tochinese(n,"normal")) end
-function commands.chinesecapnumerals(n) context(tochinese(n,"cap" )) end
-function commands.chineseallnumerals(n) context(tochinese(n,"all" )) end
-
converters.sequences = converters.sequences or { }
local sequences = converters.sequences
@@ -548,7 +575,11 @@ function converters.define(name,set) -- ,language)
sequences[name] = settings_to_array(set)
end
-commands.defineconversion = converters.define
+implement {
+ name = "defineconversion",
+ actions = converters.define,
+ arguments = { "string", "string" }
+}
local function convert(method,n,language)
local converter = language and converters[method..":"..language] or converters[method]
@@ -575,13 +606,21 @@ end
converters.convert = convert
-function commands.doifelseconverter(method,language)
- ctx_doifelse(converters[method..":"..language] or converters[method] or sequences[method])
+local function valid(method,language)
+ return converters[method..":"..language] or converters[method] or sequences[method]
end
-function commands.checkedconversion(method,n,language)
- context(convert(method,n,language))
-end
+implement {
+ name = "doifelseconverter",
+ actions = { valid, commands.doifelse },
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "checkedconversion",
+ actions = { convert, context },
+ arguments = { "string", "integer" }
+}
-- Well, since the one asking for this didn't test it the following code is not
-- enabled.
@@ -756,7 +795,7 @@ function converters.ordinal(n,language)
return t and t(n)
end
-function commands.ordinal(n,language)
+local function ctxordinal(n,language)
local t = language and ordinals[language]
local o = t and t(n)
context(n)
@@ -765,6 +804,12 @@ function commands.ordinal(n,language)
end
end
+implement {
+ name = "ordinal",
+ actions = ctxordinal,
+ arguments = { "string", "string" }
+}
+
-- verbose numbers
local data = allocate()
@@ -1007,11 +1052,17 @@ function converters.verbose.translate(n,language)
return t and t.translate(n) or n
end
-function commands.verbose(n,language)
+local function verbose(n,language)
local t = language and data[language]
context(t and t.translate(n) or n)
end
+implement {
+ name = "verbose",
+ actions = verbose,
+ arguments = { "integer", "string" }
+}
+
-- These are just helpers but not really for the tex end. Do we have to
-- use translate here?
@@ -1074,33 +1125,60 @@ local months = { -- not variables.january
"december",
}
-function commands.dayname(n)
- context.labeltext(days[n] or "unknown")
+local function dayname(n)
+ return days[n] or "unknown"
end
-function commands.weekdayname(day,month,year)
- context.labeltext(days[weekday(day,month,year)] or "unknown")
+local function weekdayname(day,month,year)
+ return days[weekday(day,month,year)] or "unknown"
end
-function commands.monthname(n)
- context.labeltext(months[n] or "unknown")
+local function monthname(n)
+ return months[n] or "unknown"
end
-function commands.monthmnem(n)
+local function monthmnem(n)
local m = months[n]
- context.labeltext(m and (m ..":mnem") or "unknown")
+ return m and (m ..":mnem") or "unknown"
end
+implement {
+ name = "dayname",
+ actions = { dayname, context.labeltext },
+ arguments = "integer",
+}
+
+implement {
+ name = "weekdayname",
+ actions = { weekdayname, context.labeltext },
+ arguments = { "integer", "integer", "integer" }
+}
+
+implement {
+ name = "monthname",
+ actions = { monthname, context.labeltext },
+ arguments = { "integer" }
+}
+
+implement {
+ name = "monthmnem",
+ actions = { monthmnem, context.labeltext },
+ arguments = { "integer" }
+}
+
-- a prelude to a function that we can use at the lua end
-- day:ord month:mmem
-- j and jj obsolete
-function commands.currentdate(str,currentlanguage) -- second argument false : no label
+local function currentdate(str,currentlanguage) -- second argument false : no label
local list = utilities.parsers.settings_to_array(str)
local splitlabel = languages.labels.split or string.itself -- we need to get the loading order right
local year, month, day = tex.year, tex.month, tex.day
local auto = true
+ if currentlanguage == "" then
+ currentlanguage = false
+ end
for i=1,#list do
local entry = list[i]
local tag, plus = splitlabel(entry)
@@ -1126,9 +1204,9 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
if currentlanguage == false then
context(months[month] or "unknown")
elseif mnemonic then
- commands.monthmnem(month)
+ context.labeltext(monthmnem(month))
else
- commands.monthname(month)
+ context.labeltext(monthmnem(month))
end
elseif tag == "mm" then
context("%02i",month)
@@ -1138,7 +1216,7 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
if currentlanguage == false then
context(days[day] or "unknown")
else
- context.convertnumber(v_day,day)
+ context.convertnumber(v_day,day) -- why not direct
end
whatordinal = day
elseif tag == "dd" then
@@ -1152,7 +1230,7 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
if currentlanguage == false then
context(days[wd] or "unknown")
else
- commands.dayname(wd)
+ context.labeltext(days[wd] or "unknown")
end
elseif tag == "W" then
context(weekday(day,month,year))
@@ -1175,6 +1253,14 @@ function commands.currentdate(str,currentlanguage) -- second argument false : no
end
end
-function commands.rawdate(str)
- commands.currentdate(str,false)
-end
+implement {
+ name = "currentdate",
+ actions = currentdate,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "rawdate",
+ actions = currentdate,
+ arguments = { "string", false }
+}
diff --git a/tex/context/base/core-con.mkiv b/tex/context/base/core-con.mkiv
index fcc16ef12..19a81685e 100644
--- a/tex/context/base/core-con.mkiv
+++ b/tex/context/base/core-con.mkiv
@@ -67,47 +67,43 @@
%D \showsetup{romannumerals}
%D \showsetup{Romannumerals}
-\def\romannumerals#1{\ctxcommand{romannumerals(\number#1)}}
-\def\Romannumerals#1{\ctxcommand{Romannumerals(\number#1)}}
+\def\romannumerals#1{\clf_romannumerals\numexpr#1\relax}
+\def\Romannumerals#1{\clf_Romannumerals\numexpr#1\relax}
%D Arabic etc:
-\def\abjadnumerals #1{\ctxcommand{abjadnumerals (\number#1)}}
-\def\abjadnodotnumerals#1{\ctxcommand{abjadnodotnumerals(\number#1)}}
-\def\abjadnaivenumerals#1{\ctxcommand{arabicnumerals (\number#1)}}
+\def\abjadnumerals #1{\clf_abjadnumerals \numexpr#1\relax}
+\def\abjadnodotnumerals#1{\clf_abjadnodotnumerals\numexpr#1\relax}
+\def\abjadnaivenumerals#1{\clf_alphabetic \numexpr#1\relax{arabic}} % okay?
-\def\languagecharacters#1{\ctxcommand{alphabetic(\number#1,"\currentlanguage")}} % new
-\def\languageCharacters#1{\ctxcommand{Alphabetic(\number#1,"\currentlanguage")}} % new
+\def\languagecharacters#1{\clf_alphabetic\numexpr#1\relax{\currentlanguage}} % new
+\def\languageCharacters#1{\clf_Alphabetic\numexpr#1\relax{\currentlanguage}} % new
-\def\alphabeticnumerals#1{\ctxcommand{alphabetic(\number#1)}}
-\def\Alphabeticnumerals#1{\ctxcommand{Alphabetic(\number#1)}}
+\def\alphabeticnumerals#1{\clf_alphabetic\numexpr#1\relax{}}
+\def\Alphabeticnumerals#1{\clf_Alphabetic\numexpr#1\relax{}}
-% we could use an auxiliary macro to save some bytes in the format
-%
-% \def\dolanguagecharacters#1#2{\ctxcommand{alphabetic(\number#2,"#1")}}
-
-\def\thainumerals #1{\ctxcommand{alphabetic(\number#1,"thai")}}
-\def\devanagarinumerals#1{\ctxcommand{alphabetic(\number#1,"devanagari")}}
-\def\gurmurkhinumerals #1{\ctxcommand{alphabetic(\number#1,"gurmurkhi")}}
-\def\gujaratinumerals #1{\ctxcommand{alphabetic(\number#1,"gujarati")}}
-\def\tibetannumerals #1{\ctxcommand{alphabetic(\number#1,"tibetan")}}
-\def\greeknumerals #1{\ctxcommand{alphabetic(\number#1,"greek")}}
-\def\Greeknumerals #1{\ctxcommand{Alphabetic(\number#1,"greek")}}
-\def\arabicnumerals #1{\ctxcommand{alphabetic(\number#1,"arabic")}}
-\def\persiannumerals #1{\ctxcommand{alphabetic(\number#1,"persian")}}
+\def\thainumerals #1{\clf_alphabetic\numexpr#1\relax{thai}}
+\def\devanagarinumerals#1{\clf_alphabetic\numexpr#1\relax{devanagari}}
+\def\gurmurkhinumerals #1{\clf_alphabetic\numexpr#1\relax{gurmurkhi}}
+\def\gujaratinumerals #1{\clf_alphabetic\numexpr#1\relax{gujarati}}
+\def\tibetannumerals #1{\clf_alphabetic\numexpr#1\relax{tibetan}}
+\def\greeknumerals #1{\clf_alphabetic\numexpr#1\relax{greek}}
+\def\Greeknumerals #1{\clf_Alphabetic\numexpr#1\relax{greek}}
+\def\arabicnumerals #1{\clf_alphabetic\numexpr#1\relax{arabic}}
+\def\persiannumerals #1{\clf_alphabetic\numexpr#1\relax{persian}}
\let\arabicexnumerals \persiannumerals
-\def\koreannumerals #1{\ctxcommand{alphabetic(\number#1,"korean")}}
-\def\koreannumeralsp #1{\ctxcommand{alphabetic(\number#1,"korean-parent")}}
-\def\koreannumeralsc #1{\ctxcommand{alphabetic(\number#1,"korean-circle")}}
+\def\koreannumerals #1{\clf_alphabetic\numexpr#1\relax{korean}}
+\def\koreannumeralsp #1{\clf_alphabetic\numexpr#1\relax{korean-parent}}
+\def\koreannumeralsc #1{\clf_alphabetic\numexpr#1\relax{korean-circle}}
\let\koreanparentnumerals\koreannumeralsp
\let\koreancirclenumerals\koreannumeralsc
-\def\chinesenumerals #1{\ctxcommand{chinesenumerals (\number#1)}}
-\def\chinesecapnumerals#1{\ctxcommand{chinesecapnumerals(\number#1,"cap")}}
-\def\chineseallnumerals#1{\ctxcommand{chineseallnumerals(\number#1,"all")}}
+\def\chinesenumerals #1{\clf_chinesenumerals\numexpr#1\relax{normal}}
+\def\chinesecapnumerals#1{\clf_chinesenumerals\numexpr#1\relax{cap}}
+\def\chineseallnumerals#1{\clf_chinesenumerals\numexpr#1\relax{all}}
%D \macros
%D {character,Character}
@@ -127,8 +123,8 @@
\def\unknowncharacter{-} % else in lists \relax
-\def\character#1{\ctxcommand{character(\number#1)}}
-\def\Character#1{\ctxcommand{Character(\number#1)}}
+\def\character#1{\clf_character\numexpr#1\relax}
+\def\Character#1{\clf_Character\numexpr#1\relax}
%D \macros
%D {characters,Characters}
@@ -139,8 +135,8 @@
%D \showsetup{characters}
%D \showsetup{Characters}
-\def\characters#1{\ctxcommand{characters(\number#1)}}
-\def\Characters#1{\ctxcommand{Characters(\number#1)}}
+\def\characters#1{\clf_characters\numexpr#1\relax}
+\def\Characters#1{\clf_Characters\numexpr#1\relax}
%D \macros
%D {greeknumerals,Greeknumerals}
@@ -209,8 +205,8 @@
%D
%D Anyhow, the conversion looks like:
-\unexpanded\def\monthlong #1{\ctxcommand{monthname(#1)}}
-\unexpanded\def\monthshort#1{\ctxcommand{monthmnem(#1)}}
+\unexpanded\def\monthlong #1{\clf_monthname\numexpr#1\relax}
+\unexpanded\def\monthshort#1{\clf_monthmnem\numexpr#1\relax}
\let\convertmonth\monthlong % for old times sake
@@ -243,16 +239,16 @@
%D \showsetup{weekday}
%D \showsetup{WEEKDAY}
-\unexpanded\def\weekday#1{\ctxcommand{day(#1)}}
-\unexpanded\def\WEEKDAY#1{\WORD{\weekday{#1}}}
+\unexpanded\def\weekday#1{\clf_day\numexpr#1\relax}
+\unexpanded\def\WEEKDAY#1{\WORD{\clf_day\numexpr#1\relax}}
%D \macros
%D {getdayoftheweek, dayoftheweek}
\newcount\normalweekday
- \def\dayoftheweek #1#2#3{\ctxcommand{weekdayname(\number#1,\number#2,\number#3)}} % name
-\unexpanded\def\getdayoftheweek#1#2#3{\normalweekday\ctxcommand{weekday(\number#1,\number#2,\number#3)}\relax} % number
+ \def\dayoftheweek #1#2#3{\clf_weekdayname\numexpr#1\relax\numexpr#2\relax,\numexpr#3\relax} % name
+\unexpanded\def\getdayoftheweek#1#2#3{\normalweekday\clf_weekday\numexpr#1\relax\numexpr#2\relax,\numexpr#3\relax\relax} % number
%D Using this macro in
%D
@@ -298,13 +294,13 @@
%D The number of days is available in the macro \type {\numberofdays}.
\def\doifleapyearelse#1%
- {\ctxcommand{doifleapyearelse(\number#1)}}
+ {\clf_doifleapyearelse\numexpr#1\relax}
\unexpanded\def\getdayspermonth#1#2%
- {\edef\numberofdays{\ctxcommand{nofdays(\number#1,\number#2)}}}
+ {\edef\numberofdays{\clf_nofdays\numexpr#1\relax\numexpr#2\relax}}
\def\dayspermonth#1#2%
- {\ctxcommand{nofdays(\number#1,\number#2)}}
+ {\clf_nofdays\numexpr#1\relax\numexpr#2\relax}
% \dayoftheweek{2006}{9}{15}
% \doifleapyearelse{2000}{OK}{NOT OK}
@@ -416,7 +412,7 @@
{\begingroup
\the\everycurrentdate
\doifsomething{#1}{\edef\currentdatespecification{#1}}%
- \ctxcommand{currentdate(\!!bs\currentdatespecification\!!es,"\labellanguage")}%
+ \clf_currentdate{\currentdatespecification}{\labellanguage}%
\endgroup}
\unexpanded\def\date
@@ -437,7 +433,7 @@
\endgroup}
\def\rawdate[#1]% expandable and no labels
- {\ctxcommand{rawdate(\!!bs\currentdatespecification\!!es)}}
+ {\clf_rawdate{\currentdatespecification}}
%D \macros
%D {currenttime}
@@ -446,9 +442,9 @@
%D to the previous date macro using the keys \type {h}, \type {m} and a separator.
\unexpanded\def\calculatecurrenttime
- {\edef\currenthour {\ctxcommand{hour ()}}%
- \edef\currentminute{\ctxcommand{minute()}}%
- \edef\currentsecond{\ctxcommand{second()}}}
+ {\edef\currenthour {\clf_hour }%
+ \edef\currentminute{\clf_minute}%
+ \edef\currentsecond{\clf_second}}
\let\currenthour \!!plusone
\let\currentminute\!!plusone
@@ -542,12 +538,12 @@
\def\syst_converters_define_conversion_indeed#1#2#3%
{\doifinstringelse{,}{\detokenize{#3}}
- {\ctxcommand{defineconversion("#2",\!!bs\detokenize{#3}\!!es)}% a set e.g. of symbols
+ {\clf_defineconversion{#2}{\detokenize{#3}}% a set e.g. of symbols
\setgvalue{\??conversion#1}{\syst_converters_checked_conversion{#2}}}
{\setgvalue{\??conversion#1}{#3}}}
\def\syst_converters_checked_conversion#1#2%
- {\ctxcommand{checkedconversion("#1",#2)}}
+ {\clf_checkedconversion{#1}\numexpr#2\relax}
%D If a conversion is just a font switch then we need to make sure that the
%D number is indeed ends up as number in the input, so we need to handle the
@@ -609,10 +605,10 @@
\def\highordinalstr #1{\high{\notsmallcapped{#1}}}
\def\ordinalstr #1{\notsmallcapped{#1}}
-\def\ordinaldaynumber #1{\ctxcommand{ordinal(#1,"\currentlanguage")}}
+\def\ordinaldaynumber #1{\clf_ordinal\numexpr#1\relax{\currentlanguage}}
-\def\verbosenumber #1{\ctxcommand{verbose(#1,"\currentlanguage")}}
-\def\VerboseNumber #1{\Words{\ctxcommand{verbose(#1,"\currentlanguage")}}}
+\def\verbosenumber #1{\clf_verbose\numexpr#1\relax{\currentlanguage}}
+\def\VerboseNumber #1{\Words{\clf_verbose\numexpr#1\relax{\currentlanguage}}}
%D As longs as symbols are linked to levels or numbers, we can also use the
%D conversion mechanism, but in for instance the itemization macros, we prefer
@@ -721,11 +717,11 @@
%D feature. We do need these definitions for mechanisms like itemize that check
%D for converters.
-\def\sloveniannumerals#1{\ctxcommand{alphabetic(\number#1,"sl")}}
-\def\slovenianNumerals#1{\ctxcommand{Alphabetic(\number#1,"sl")}}
+\def\sloveniannumerals#1{\clf_alphabetic\numexpr#1\relax{sl}}
+\def\slovenianNumerals#1{\clf_Alphabetic\numexpr#1\relax{sl}}
-\def\spanishnumerals #1{\ctxcommand{alphabetic(\number#1,"es")}}
-\def\spanishNumerals #1{\ctxcommand{Alphabetic(\number#1,"es")}}
+\def\spanishnumerals #1{\clf_alphabetic\numexpr#1\relax{es}}
+\def\spanishNumerals #1{\clf_Alphabetic\numexpr#1\relax{es}}
\defineconversion [\s!sl] [character] [\sloveniannumerals]
\defineconversion [\s!sl] [Character] [\slovenianNumerals]
diff --git a/tex/context/base/core-sys.lua b/tex/context/base/core-sys.lua
index 3a3a691b0..263b4dc76 100644
--- a/tex/context/base/core-sys.lua
+++ b/tex/context/base/core-sys.lua
@@ -9,7 +9,8 @@ if not modules then modules = { } end modules ['core-sys'] = {
local lower, format, gsub = string.lower, string.format, string.gsub
local suffixonly, basename, removesuffix = file.suffix, file.basename, file.removesuffix
-local environment = environment
+local environment = environment
+local implement = interfaces.implement
local report_files = logs.reporter("system","files")
@@ -90,6 +91,11 @@ function environment.initializefilenames() -- commands.updatefilenames(jobname,f
function environment.initializefilenames() end
end
+implement {
+ name = "setdocumentfilenames",
+ actions = environment.initializefilenames,
+}
+
statistics.register("result saved in file", function()
-- suffix will be fetched from backend
local outputfilename = environment.outputfilename or environment.jobname or tex.jobname or "<unset>"
@@ -100,6 +106,10 @@ statistics.register("result saved in file", function()
end
end)
-function commands.systemlog(whereto,category,text)
- logs.system(whereto,"context",tex.jobname,category,text)
-end
+implement {
+ name = "systemlog",
+ arguments = { "string", "string", "string" },
+ actions = function(whereto,category,text)
+ logs.system(whereto,"context",tex.jobname,category,text)
+ end,
+}
diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua
index 9773eaf6f..bb1afa7db 100644
--- a/tex/context/base/core-two.lua
+++ b/tex/context/base/core-two.lua
@@ -144,18 +144,36 @@ jobpasses.inlist = inlist
-- interface
-function commands.gettwopassdata (id) local r = get (id) if r then context(r) end end
-function commands.getfirsttwopassdata(id) local r = first(id) if r then context(r) end end
-function commands.getlasttwopassdata (id) local r = last (id) if r then context(r) end end
-function commands.findtwopassdata (id,n) local r = find (id,n) if r then context(r) end end
-function commands.gettwopassdatalist (id) local r = list (id) if r then context(r) end end
-function commands.counttwopassdata (id) local r = count(id) if r then context(r) end end
-function commands.checktwopassdata (id) local r = check(id) if r then context(r) end end
-
-commands.definetwopasslist = jobpasses.define
-commands.savetwopassdata = jobpasses.save
-commands.savetaggedtwopassdata = jobpasses.savetagged
-
-function commands.doifelseintwopassdata(id,str)
- commands.doifelse(inlist(id,str))
-end
+local implement = interfaces.implement
+
+implement { name = "gettwopassdata", actions = { get , context }, arguments = "string" }
+implement { name = "getfirsttwopassdata",actions = { first, context }, arguments = "string" }
+implement { name = "getlasttwopassdata", actions = { last , context }, arguments = "string" }
+implement { name = "findtwopassdata", actions = { find , context }, arguments = { "string", "string" } }
+implement { name = "gettwopassdatalist", actions = { list , context }, arguments = "string" }
+implement { name = "counttwopassdata", actions = { count, context }, arguments = "string" }
+implement { name = "checktwopassdata", actions = { check, context }, arguments = "string" }
+
+implement {
+ name = "definetwopasslist",
+ actions = jobpasses.define,
+ arguments = "string"
+}
+
+implement {
+ name = "savetwopassdata",
+ actions = jobpasses.save,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "savetaggedtwopassdata",
+ actions = jobpasses.savetagged,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "doifelseintwopassdata",
+ actions = { inlist, commands.doifelse },
+ arguments = { "string", "string" }
+}
diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv
index b08914ef4..30fd27f3d 100644
--- a/tex/context/base/core-two.mkiv
+++ b/tex/context/base/core-two.mkiv
@@ -73,10 +73,10 @@
\registerctxluafile{core-two}{1.001}
-\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxcommand {savetwopassdata('#1',"#3")}}}
+\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\clf_savetwopassdata{#1}{#3}}}
\def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}}
\def\lazysavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatecommand{savetwopassdata('#1',"#3")}}}
-\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\ctxcommand {savetaggedtwopassdata('#1','#3',"#4")}}}
+\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\clf_savetaggedtwopassdata{#1}{#3}{#4}}}
\def\lazysavetaggedtwopassdata#1#2#3#4{\normalexpanded{\noexpand\ctxlatecommand{savetaggedtwopassdata('#1','#3',"#4")}}}
% temp hack: needs a proper \starteverytimeluacode
@@ -87,7 +87,7 @@
\newif \iftwopassdatafound % obsolete, will go
-\def\syst_twopass_check
+\def\syst_twopass_check % can be delegated to lua once obsolete is gone
{\ifx\twopassdata\empty
\twopassdatafoundfalse % obsolete
\setfalse\twopassdatafound
@@ -104,17 +104,17 @@
{\twopassdatafoundtrue % obsolete
\settrue\twopassdatafound}
-\unexpanded\def\definetwopasslist #1{\ctxcommand{definetwopasslist('#1')}}
-\unexpanded\def\gettwopassdata #1{\edef\twopassdata {\ctxcommand{gettwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\checktwopassdata #1{\edef\twopassdata {\ctxcommand{checktwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\findtwopassdata #1#2{\edef\twopassdata {\ctxcommand{findtwopassdata("#1","#2")}}\syst_twopass_check}
-\unexpanded\def\getfirsttwopassdata #1{\edef\twopassdata {\ctxcommand{getfirsttwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\getlasttwopassdata #1{\edef\twopassdata {\ctxcommand{getlasttwopassdata ("#1")}}%
- \edef\noftwopassitems{\ctxcommand{counttwopassdata ("#1")}}\syst_twopass_check}
-\unexpanded\def\getnamedtwopassdatalist#1#2{\edef #1{\ctxcommand{gettwopassdatalist ("#2")}}}
-\unexpanded\def\gettwopassdatalist #1{\edef\twopassdatalist{\ctxcommand{gettwopassdatalist ("#1")}}}
+\unexpanded\def\definetwopasslist #1{\clf_definetwopasslist{#1}}
+\unexpanded\def\gettwopassdata #1{\edef\twopassdata {\clf_gettwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\checktwopassdata #1{\edef\twopassdata {\clf_checktwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\findtwopassdata #1#2{\edef\twopassdata {\clf_findtwopassdata {#1}{#2}}\syst_twopass_check}
+\unexpanded\def\getfirsttwopassdata #1{\edef\twopassdata {\clf_getfirsttwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\getlasttwopassdata #1{\edef\twopassdata {\clf_getlasttwopassdata {#1}}%
+ \edef\noftwopassitems{\clf_counttwopassdata {#1}}\syst_twopass_check}
+\unexpanded\def\getnamedtwopassdatalist#1#2{\edef #1{\clf_gettwopassdatalist {#2}}}
+\unexpanded\def\gettwopassdatalist #1{\edef\twopassdatalist{\clf_gettwopassdatalist {#1}}}
-\unexpanded\def\doifelseintwopassdata #1#2{\ctxcommand{doifelseintwopassdata("#1","#2")}}
+\unexpanded\def\doifelseintwopassdata #1#2{\clf_doifelseintwopassdata{#1}{#2}}
\let\getfromtwopassdata \findtwopassdata
diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua
index 27ef93608..b6ddf775e 100644
--- a/tex/context/base/core-uti.lua
+++ b/tex/context/base/core-uti.lua
@@ -29,6 +29,8 @@ local packers = utilities.packers
local allocate = utilities.storage.allocate
local mark = utilities.storage.mark
+local implement = interfaces.implement
+
local texgetcount = tex.getcount
local report_passes = logs.reporter("job","passes")
@@ -378,5 +380,14 @@ function statistics.formatruntime(runtime)
end
end
-commands.savevariable = job.variables.save
-commands.setjobcomment = job.comment
+implement {
+ name = "savevariable",
+ actions = job.variables.save,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setjobcomment",
+ actions = job.comment,
+ arguments = { { "*" } }
+}
diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv
index 5937240b9..1fb8f0b57 100644
--- a/tex/context/base/core-uti.mkiv
+++ b/tex/context/base/core-uti.mkiv
@@ -18,15 +18,15 @@
\registerctxluafile{core-uti}{1.001}
\def\savecurrentvalue#1#2% immediate, so not \unexpanded
- {\ctxcommand{savevariable("\strippedcsname#1","#2")}}
+ {\clf_savevariable{\strippedcsname#1}{#2}}
\appendtoks
- \ctxlua{job.comment{
- file = tex.jobname,
- format = "\contextformat",
- stamp = "\contextversion",
- escape = "\!!bs\space...\space\!!es"
- }}%
+ \clf_setjobcomment
+ file {tex.jobname}%
+ format {\contextformat}%
+ stamp {\contextversion}%
+ escape {\!!bs\space...\space\!!es}%
+ \relax
\to \everystarttext
\appendtoks
diff --git a/tex/context/base/file-job.lua b/tex/context/base/file-job.lua
index ff99aa651..d90dcc271 100644
--- a/tex/context/base/file-job.lua
+++ b/tex/context/base/file-job.lua
@@ -11,15 +11,20 @@ if not modules then modules = { } end modules ['file-job'] = {
local gsub, match, find = string.gsub, string.match, string.find
local insert, remove, concat = table.insert, table.remove, table.concat
-local validstring = string.valid
+local validstring, formatters = string.valid, string.formatters
local sortedhash = table.sortedhash
-local formatters = string.formatters
-local commands, resolvers, context = commands, resolvers, context
+local commands = commands
+local resolvers = resolvers
+local context = context
-local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end)
+local ctx_doifelse = commands.doifelse
-local report_jobfiles = logs.reporter("system","jobfiles")
+local implement = interfaces.implement
+
+local trace_jobfiles = false trackers.register("system.jobfiles", function(v) trace_jobfiles = v end)
+
+local report_jobfiles = logs.reporter("system","jobfiles")
local texsetcount = tex.setcount
local elements = interfaces.elements
@@ -72,46 +77,69 @@ end
resolvers.findctxfile = findctxfile
-function commands.processfile(name)
- name = findctxfile(name)
- if name ~= "" then
- context.input(name)
+implement {
+ name = "processfile",
+ arguments = "string",
+ actions = function(name)
+ name = findctxfile(name)
+ if name ~= "" then
+ context.input(name)
+ end
end
-end
-
-function commands.doifinputfileelse(name)
- commands.doifelse(findctxfile(name) ~= "")
-end
+}
-function commands.locatefilepath(name)
- context(dirname(findctxfile(name)))
-end
+implement {
+ name = "doifinputfileelse",
+ arguments = "string",
+ actions = function(name)
+ ctx_doifelse(findctxfile(name) ~= "")
+ end
+}
-function commands.usepath(paths)
- report_jobfiles("using path: %s",paths)
- registerextrapath(paths)
-end
+implement {
+ name = "locatefilepath",
+ arguments = "string",
+ actions = function(name)
+ context(dirname(findctxfile(name)))
+ end
+}
-function commands.usesubpath(subpaths)
- report_jobfiles("using subpath: %s",subpaths)
- registerextrapath(nil,subpaths)
-end
+implement {
+ name = "usepath",
+ arguments = "string",
+ actions = function(paths)
+ report_jobfiles("using path: %s",paths)
+ registerextrapath(paths)
+ end
+}
-function commands.allinputpaths()
- context(concat(resolvers.instance.extra_paths or { },","))
-end
+implement {
+ name = "usesubpath",
+ arguments = "string",
+ actions = function(subpaths)
+ report_jobfiles("using subpath: %s",subpaths)
+ registerextrapath(nil,subpaths)
+ end
+}
-function commands.setdocumentfilenames()
- environment.initializefilenames()
-end
+implement {
+ name = "allinputpaths",
+ actions = function()
+ context(concat(resolvers.instance.extra_paths or { },","))
+ end
+}
-function commands.usezipfile(name,tree)
- if tree and tree ~= "" then
- resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree))
- else
- resolvers.usezipfile(formatters["zip:///%s"](name))
+implement {
+ name = "usezipfile",
+ arguments = { "string", "string" },
+ actions = function(name,tree)
+ if tree and tree ~= "" then
+ resolvers.usezipfile(formatters["zip:///%s?tree=%s"](name,tree))
+ else
+ resolvers.usezipfile(formatters["zip:///%s"](name))
+ end
end
-end
+}
local report_system = logs.reporter("system")
@@ -122,7 +150,7 @@ local luapatterns = { "%s" .. utilities.lua.suffixes.luc, "%s.lua" }
local cldpatterns = { "%s.cld" }
local xmlpatterns = { "%s.xml" }
-local uselibrary = commands.uselibrary
+local uselibrary = resolvers.uselibrary
local input = context.input
-- status
@@ -133,23 +161,36 @@ local processstack = { }
local processedfile = ""
local processedfiles = { }
-function commands.processedfile()
- context(processedfile)
-end
+implement {
+ name = "processedfile",
+ actions = function()
+ context(processedfile)
+ end
+}
-function commands.processedfiles()
- context(concat(processedfiles,","))
-end
+implement {
+ name = "processedfiles",
+ actions = function()
+ context(concat(processedfiles,","))
+ end
+}
-function commands.dostarttextfile(name)
- insert(processstack,name)
- processedfile = name
- insert(processedfiles,name)
-end
+implement {
+ name = "dostarttextfile",
+ arguments = "string",
+ actions = function(name)
+ insert(processstack,name)
+ processedfile = name
+ insert(processedfiles,name)
+ end
+}
-function commands.dostoptextfile()
- processedfile = remove(processstack) or ""
-end
+implement {
+ name = "dostoptextfile",
+ actions = function()
+ processedfile = remove(processstack) or ""
+ end
+}
local function startprocessing(name,notext)
if not notext then
@@ -230,11 +271,6 @@ local function usexmlfile(name,onlyonce,notext)
stopprocessing(notext)
end
-commands.usetexfile = usetexfile
-commands.useluafile = useluafile
-commands.usecldfile = usecldfile
-commands.usexmlfile = usexmlfile
-
local suffixes = {
mkvi = usetexfile,
mkiv = usetexfile,
@@ -259,7 +295,18 @@ local function useanyfile(name,onlyonce)
context(resolvers.poppath)
end
-commands.useanyfile = useanyfile
+implement { name = "usetexfile", actions = usetexfile, arguments = "string" }
+implement { name = "useluafile", actions = useluafile, arguments = "string" }
+implement { name = "usecldfile", actions = usecldfile, arguments = "string" }
+implement { name = "usexmlfile", actions = usexmlfile, arguments = "string" }
+
+implement { name = "usetexfileonce", actions = usetexfile, arguments = { "string", true } }
+implement { name = "useluafileonce", actions = useluafile, arguments = { "string", true } }
+implement { name = "usecldfileonce", actions = usecldfile, arguments = { "string", true } }
+implement { name = "usexmlfileonce", actions = usexmlfile, arguments = { "string", true } }
+
+implement { name = "useanyfile", actions = useanyfile, arguments = "string" }
+implement { name = "useanyfileonce", actions = useanyfile, arguments = { "string", true } }
function jobresolvers.usefile(name,onlyonce,notext)
local s = suffixes[suffixonly(name)]
@@ -280,6 +327,8 @@ local function startstoperror()
startstoperror = dummyfunction
end
+local stopped
+
local function starttext()
if textlevel == 0 then
if trace_jobfiles then
@@ -293,65 +342,86 @@ local function starttext()
end
local function stoptext()
- if textlevel == 0 then
- startstoperror()
- elseif textlevel > 0 then
- textlevel = textlevel - 1
- end
- texsetcount("global","textlevel",textlevel)
- if textlevel <= 0 then
- if trace_jobfiles then
- report_jobfiles("stopping text")
+ if not stopped then
+ if textlevel == 0 then
+ startstoperror()
+ elseif textlevel > 0 then
+ textlevel = textlevel - 1
+ end
+ texsetcount("global","textlevel",textlevel)
+ if textlevel <= 0 then
+ if trace_jobfiles then
+ report_jobfiles("stopping text")
+ end
+ context.dostoptext()
+ -- registerfileinfo[end]jobfilename
+ context.finalend()
+ stopped = true
end
- context.dostoptext()
- -- registerfileinfo[end]jobfilename
- context.finalend()
- commands.stoptext = dummyfunction
end
end
-commands.starttext = starttext
-commands.stoptext = stoptext
+implement { name = "starttext", actions = starttext }
+implement { name = "stoptext", actions = stoptext }
-function commands.forcequitjob(reason)
- if reason then
- report_system("forcing quit: %s",reason)
- else
- report_system("forcing quit")
+implement {
+ name = "forcequitjob",
+ arguments = "string",
+ actions = function(reason)
+ if reason then
+ report_system("forcing quit: %s",reason)
+ else
+ report_system("forcing quit")
+ end
+ context.batchmode()
+ while textlevel >= 0 do
+ context.stoptext()
+ end
end
- context.batchmode()
- while textlevel >= 0 do
+}
+
+implement {
+ name = "forceendjob",
+ actions = function()
+ report_system([[don't use \end to finish a document]])
context.stoptext()
end
-end
-
-function commands.forceendjob()
- report_system([[don't use \end to finish a document]])
- context.stoptext()
-end
+}
-function commands.autostarttext()
- if textlevel == 0 then
- report_system([[auto \starttext ... \stoptext]])
+implement {
+ name = "autostarttext",
+ actions = function()
+ if textlevel == 0 then
+ report_system([[auto \starttext ... \stoptext]])
+ end
+ context.starttext()
end
- context.starttext()
-end
+}
-commands.autostoptext = stoptext
+implement {
+ name = "autostoptext",
+ actions = stoptext
+}
-- project structure
-function commands.processfilemany(name)
- useanyfile(name,false)
-end
+implement {
+ name = "processfilemany",
+ arguments = { "string", false },
+ actions = useanyfile
+}
-function commands.processfileonce(name)
- useanyfile(name,true)
-end
+implement {
+ name = "processfileonce",
+ arguments = { "string", true },
+ actions = useanyfile
+}
-function commands.processfilenone(name)
- -- skip file
-end
+implement {
+ name = "processfilenone",
+ arguments = "string",
+ actions = dummyfunction,
+}
local tree = { type = "text", name = "", branches = { } }
local treestack = { }
@@ -619,10 +689,10 @@ local function process(what,name)
end
end
-function commands.useproject (name) process(v_project, name) end
-function commands.useenvironment(name) process(v_environment,name) end
-function commands.useproduct (name) process(v_product, name) end
-function commands.usecomponent (name) process(v_component, name) end
+implement { name = "useproject", actions = function(name) process(v_project, name) end, arguments = "string" }
+implement { name = "useenvironment", actions = function(name) process(v_environment,name) end, arguments = "string" }
+implement { name = "useproduct", actions = function(name) process(v_product, name) end, arguments = "string" } -- will be overloaded
+implement { name = "usecomponent", actions = function(name) process(v_component, name) end, arguments = "string" }
-- todo: setsystemmode to currenttype
-- todo: make start/stop commands at the tex end
@@ -669,20 +739,20 @@ local function autoname(name)
return name
end
-function commands.startproject (name) gotonextlevel(v_project, autoname(name)) end
-function commands.startproduct (name) gotonextlevel(v_product, autoname(name)) end
-function commands.startcomponent (name) gotonextlevel(v_component, autoname(name)) end
-function commands.startenvironment(name) gotonextlevel(v_environment,autoname(name)) end
+implement { name = "startproject", actions = function(name) gotonextlevel(v_project, autoname(name)) end, arguments = "string" }
+implement { name = "startproduct", actions = function(name) gotonextlevel(v_product, autoname(name)) end, arguments = "string" }
+implement { name = "startcomponent", actions = function(name) gotonextlevel(v_component, autoname(name)) end, arguments = "string" }
+implement { name = "startenvironment", actions = function(name) gotonextlevel(v_environment,autoname(name)) end, arguments = "string" }
-function commands.stopproject () gotopreviouslevel(v_project ) end
-function commands.stopproduct () gotopreviouslevel(v_product ) end
-function commands.stopcomponent () gotopreviouslevel(v_component ) end
-function commands.stopenvironment() gotopreviouslevel(v_environment) end
+implement { name = "stopproject", actions = function() gotopreviouslevel(v_project ) end }
+implement { name = "stopproduct", actions = function() gotopreviouslevel(v_product ) end }
+implement { name = "stopcomponent", actions = function() gotopreviouslevel(v_component ) end }
+implement { name = "stopenvironment", actions = function() gotopreviouslevel(v_environment) end }
-function commands.currentproject () context(topofstack(v_project )) end
-function commands.currentproduct () context(topofstack(v_product )) end
-function commands.currentcomponent () context(topofstack(v_component )) end
-function commands.currentenvironment() context(topofstack(v_environment)) end
+implement { name = "currentproject", actions = function() context(topofstack(v_project )) end }
+implement { name = "currentproduct", actions = function() context(topofstack(v_product )) end }
+implement { name = "currentcomponent", actions = function() context(topofstack(v_component )) end }
+implement { name = "currentenvironment", actions = function() context(topofstack(v_environment)) end }
-- -- -- this will move -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
@@ -711,7 +781,7 @@ local function convertexamodes(str)
end
end
-function commands.loadexamodes(filename)
+function environment.loadexamodes(filename)
if not filename or filename == "" then
filename = removesuffix(tex.jobname)
end
@@ -724,6 +794,8 @@ function commands.loadexamodes(filename)
end
end
+commands.loadexamodes = environment.loadexamodes
+
-- changed in mtx-context
-- code moved from luat-ini
@@ -766,22 +838,48 @@ function document.setfilename(i,name)
end
end
-function document.getargument(key,default) -- commands
+function document.getargument(key,default)
local v = document.arguments[key]
if type(v) == "boolean" then
v = (v and "yes") or "no"
document.arguments[key] = v
end
- context(v or default or "")
+ return v or default or ""
end
-function document.setargument(key,value)
- document.arguments[key] = value -- only strings
+function document.getfilename(i)
+ return document.files[tonumber(i)] or ""
end
-function document.getfilename(i) -- commands
- context(document.files[tonumber(i)] or "")
-end
+implement {
+ name = "setdocumentargument",
+ actions = document.setargument,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setdocumentdefaultargument",
+ actions = document.setdefaultargument,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setdocumentfilename",
+ actions = document.setfilename,
+ arguments = { "integer", "string" }
+}
+
+implement {
+ name = "getdocumentargument",
+ actions = { document.getargument, context },
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "getdocumentfilename",
+ actions = { document.getfilename, context },
+ arguments = "integer"
+}
function commands.getcommandline() -- has to happen at the tex end in order to expand
@@ -1048,15 +1146,20 @@ if environment.initex then
end
-function commands.doifelsecontinuewithfile(inpname,basetoo)
- local inpnamefull = addsuffix(inpname,"tex")
- local inpfilefull = addsuffix(environment.inputfilename,"tex")
- local continue = inpnamefull == inpfilefull
- if basetoo and not continue then
- continue = inpnamefull == basename(inpfilefull)
- end
- if continue then
- report_system("continuing input file %a",inpname)
+implement {
+ name = "doifelsecontinuewithfile",
+ arguments = "string",
+ actions = function(inpname,basetoo)
+ local inpnamefull = addsuffix(inpname,"tex")
+ local inpfilefull = addsuffix(environment.inputfilename,"tex")
+ local continue = inpnamefull == inpfilefull
+ -- if basetoo and not continue then
+ if not continue then
+ continue = inpnamefull == basename(inpfilefull)
+ end
+ if continue then
+ report_system("continuing input file %a",inpname)
+ end
+ ctx_doifelse(continue)
end
- commands.doifelse(continue)
-end
+}
diff --git a/tex/context/base/file-job.mkvi b/tex/context/base/file-job.mkvi
index 171dc1a6a..74cf8147f 100644
--- a/tex/context/base/file-job.mkvi
+++ b/tex/context/base/file-job.mkvi
@@ -22,28 +22,28 @@
% processing
\unexpanded\def\doifinputfileelse#name%
- {\ctxcommand{doifinputfileelse("#name")}}
+ {\clf_doifinputfileelse{#name}}
\unexpanded\def\processfile#name%
- {\ctxcommand{processfile("#name")}}
+ {\clf_processfile{#name}}
% path control
\unexpanded\def\usepath[#path]%
- {\ctxcommand{usepath("#path")}}
+ {\clf_usepath{#path}}
\unexpanded\def\usesubpath[#path]%
- {\ctxcommand{usesubpath("#path")}}
+ {\clf_usesubpath{#path}}
\def\allinputpaths
- {\ctxcommand{allinputpaths()}}
+ {\clf_allinputpaths}
% helper (not really needed nowadays)
\let\locatedfilepath\empty
\unexpanded\def\locatefilepath#name% no [] ?
- {\edef\locatedfilepath{\ctxcommand{locatefilepath("#name")}}}
+ {\edef\locatedfilepath{\clf_locatefilepath{#name}}}
% % maybe:
%
@@ -59,7 +59,7 @@
{\dodoubleempty\syst_files_use_zip_file}
\def\syst_files_use_zip_file[#zipname][#subtree]%
- {\ctxcommand{usezipfile("#zipname","#subtree")}}
+ {\clf_usezipfile{#zipname}{#subtree}}
% exa stuff might become obsolete:
@@ -85,14 +85,6 @@
\def\syst_files_load_indeed#name% from now on we assume a suffix to be part of the name
{\readsysfile{#name}{\showmessage\m!system2{#name}}\donothing}
-% obsolete, but we keep it as reference of what happened
-%
-% \unexpanded\def\loadoptionfile
-% {\readjobfile{\jobname.\f!optionextension}
-% {\writestatus\m!system{\jobname.\f!optionextension\space loaded}%
-% \ctxcommand{copyfiletolog("\jobname.\f!optionextension")}}%
-% {\writestatus\m!system{no \jobname.\f!optionextension}}}
-
% document structure
\ifdefined\textlevel \else \newcount\textlevel \fi % might go away
@@ -116,12 +108,12 @@
\doifsometokselse\everynotabene{\writeline\the\everynotabene\writeline}\donothing
\normalend} % tex's \end
-\unexpanded\def\starttext {\ctxcommand{starttext()}}
-\unexpanded\def\stoptext {\ctxcommand{stoptext()}}
-\unexpanded\def\forcequitjob {\ctxcommand{forcequitjob()}}
-\unexpanded\def\end {\ctxcommand{forceendjob()}}
-\unexpanded\def\autostarttext{\ctxcommand{autostarttext()}}
-\unexpanded\def\autostoptext {\ctxcommand{autostoptext()}}
+\unexpanded\def\starttext {\clf_starttext}
+\unexpanded\def\stoptext {\clf_stoptext}
+\unexpanded\def\forcequitjob {\clf_forcequitjob}
+\unexpanded\def\end {\clf_forceendjob}
+\unexpanded\def\autostarttext{\clf_autostarttext}
+\unexpanded\def\autostoptext {\clf_autostoptext}
\unexpanded\def\finishjob{\stoptext} % nicer in luatex call commandline
@@ -133,39 +125,39 @@
% protect structure
-\unexpanded\def\processfilemany#name{\ctxcommand{processfilemany("#name")}}
-\unexpanded\def\processfileonce#name{\ctxcommand{processfileonce("#name")}}
-\unexpanded\def\processfilenone#name{\ctxcommand{processfilenone("#name")}}
+\unexpanded\def\processfilemany#name{\clf_processfilemany{#name}}
+\unexpanded\def\processfileonce#name{\clf_processfileonce{#name}}
+\unexpanded\def\processfilenone#name{\clf_processfilenone{#name}}
\unexpanded\def\project {\doifnextoptionalcselse\useproject \syst_structure_arg_project}
\unexpanded\def\product {\doifnextoptionalcselse\useproduct \syst_structure_arg_product}
\unexpanded\def\component {\doifnextoptionalcselse\usecomponent \syst_structure_arg_component}
\unexpanded\def\environment{\doifnextoptionalcselse\useenvironment\syst_structure_arg_environment}
-\def\syst_structure_arg_project #name {\ctxcommand{useproject ("#name")}}
-\def\syst_structure_arg_product #name {\ctxcommand{useproduct ("#name")}}
-\def\syst_structure_arg_component #name {\ctxcommand{usecomponent ("#name")}}
-\def\syst_structure_arg_environment#name {\ctxcommand{useenvironment("#name")}}
+\def\syst_structure_arg_project #name {\clf_useproject {#name}}
+\def\syst_structure_arg_product #name {\clf_useproduct {#name}}
+\def\syst_structure_arg_component #name {\clf_usecomponent {#name}}
+\def\syst_structure_arg_environment#name {\clf_useenvironment{#name}}
\unexpanded\def\startproject {\doifnextoptionalcselse\syst_structure_start_opt_project \syst_structure_start_arg_project }
\unexpanded\def\startproduct {\doifnextoptionalcselse\syst_structure_start_opt_product \syst_structure_start_arg_product }
\unexpanded\def\startcomponent {\doifnextoptionalcselse\syst_structure_start_opt_component \syst_structure_start_arg_component }
\unexpanded\def\startenvironment{\doifnextoptionalcselse\syst_structure_start_opt_environment\syst_structure_start_arg_environment}
-\def\syst_structure_start_arg_project #name {\ctxcommand{startproject ("#name")}}
-\def\syst_structure_start_arg_product #name {\ctxcommand{startproduct ("#name")}}
-\def\syst_structure_start_arg_component #name {\ctxcommand{startcomponent ("#name")}}
-\def\syst_structure_start_arg_environment#name {\ctxcommand{startenvironment("#name")}}
+\def\syst_structure_start_arg_project #name {\clf_startproject {#name}}
+\def\syst_structure_start_arg_product #name {\clf_startproduct {#name}}
+\def\syst_structure_start_arg_component #name {\clf_startcomponent {#name}}
+\def\syst_structure_start_arg_environment#name {\clf_startenvironment{#name}}
-\unexpanded\def\useproject [#name]{\ctxcommand{useproject ("#name")}}
-\unexpanded\def\useproduct [#name]{\ctxcommand{useproduct ("#name")}}
-\unexpanded\def\usecomponent [#name]{\ctxcommand{usecomponent ("#name")}}
-\unexpanded\def\useenvironment[#name]{\ctxcommand{useenvironment("#name")}}
+\unexpanded\def\useproject [#name]{\clf_useproject {#name}}
+\unexpanded\def\useproduct [#name]{\clf_useproduct {#name}}
+\unexpanded\def\usecomponent [#name]{\clf_usecomponent {#name}}
+\unexpanded\def\useenvironment[#name]{\clf_useenvironment{#name}}
-\unexpanded\def\syst_structure_start_opt_project [#name]{\ctxcommand{startproject ("#name")}}
-\unexpanded\def\syst_structure_start_opt_product [#name]{\ctxcommand{startproduct ("#name")}}
-\unexpanded\def\syst_structure_start_opt_component [#name]{\ctxcommand{startcomponent ("#name")}}
-\unexpanded\def\syst_structure_start_opt_environment[#name]{\ctxcommand{startenvironment("#name")}}
+\unexpanded\def\syst_structure_start_opt_project [#name]{\clf_startproject {#name}}
+\unexpanded\def\syst_structure_start_opt_product [#name]{\clf_startproduct {#name}}
+\unexpanded\def\syst_structure_start_opt_component [#name]{\clf_startcomponent {#name}}
+\unexpanded\def\syst_structure_start_opt_environment[#name]{\clf_startenvironment{#name}}
\newconditional\endofinput % hack, needed because \endinput happens one level down in the input when we write from lua
@@ -178,34 +170,35 @@
\endinput
\fi}
-\unexpanded\def\stopproject {\ctxcommand{stopproject ()}\honorendofinput}
-\unexpanded\def\stopproduct {\ctxcommand{stopproduct ()}\honorendofinput}
-\unexpanded\def\stopcomponent {\ctxcommand{stopcomponent ()}\honorendofinput}
-\unexpanded\def\stopenvironment {\ctxcommand{stopenvironment()}\honorendofinput}
+\unexpanded\def\stopproject {\clf_stopproject \honorendofinput}
+\unexpanded\def\stopproduct {\clf_stopproduct \honorendofinput}
+\unexpanded\def\stopcomponent {\clf_stopcomponent \honorendofinput}
+\unexpanded\def\stopenvironment {\clf_stopenvironment\honorendofinput}
-\def\currentproject {\ctxcommand{currentproject ()}}
-\def\currentproduct {\ctxcommand{currentproduct ()}}
-\def\currentcomponent {\ctxcommand{currentcomponent ()}}
-\def\currentenvironment {\ctxcommand{currentenvironment()}}
-\def\processedfile {\ctxcommand{processedfile()}}
-\def\processedfiles {\ctxcommand{processedfiles()}}
+ \let\currentproject \clf_currentproject
+ \let\currentproduct \clf_currentproduct
+ \let\currentcomponent \clf_currentcomponent
+ \let\currentenvironment \clf_currentenvironment
+ \let\processedfile \clf_processedfile
+ \let\processedfiles \clf_processedfiles
-\unexpanded\def\dostarttextfile #name{\ctxcommand{dostarttextfile(name)}}
-\unexpanded\def\dostoptextfile {\ctxcommand{dostoptextfile()}}
+\unexpanded\def\dostarttextfile #name{\clf_dostarttextfile{name}}
+\unexpanded\def\dostoptextfile {\clf_dostoptextfile}
-\unexpanded\def\loadtexfile [#name]{\ctxcommand{usetexfile("#name")}}
-\unexpanded\def\loadluafile [#name]{\ctxcommand{useluafile("#name")}}
-\unexpanded\def\loadcldfile [#name]{\ctxcommand{usecldfile("#name")}}
-\unexpanded\def\loadanyfile [#name]{\ctxcommand{useanyfile("#name")}}
+\unexpanded\def\loadtexfile [#name]{\clf_usetexfile{#name}}
+\unexpanded\def\loadluafile [#name]{\clf_useluafile{#name}}
+\unexpanded\def\loadcldfile [#name]{\clf_usecldfile{#name}}
+\unexpanded\def\loadanyfile [#name]{\clf_useanyfile{#name}}
-\unexpanded\def\loadtexfileonce [#name]{\ctxcommand{usetexfile("#name",true)}}
-\unexpanded\def\loadluafileonce [#name]{\ctxcommand{useluafile("#name",true)}}
-\unexpanded\def\loadcldfileonce [#name]{\ctxcommand{usecldfile("#name",true)}}
-\unexpanded\def\loadanyfileonce [#name]{\ctxcommand{useanyfile("#name",true)}}
+\unexpanded\def\loadtexfileonce [#name]{\clf_usetexfileonce{#name}}
+\unexpanded\def\loadluafileonce [#name]{\clf_useluafileonce{#name}}
+\unexpanded\def\loadcldfileonce [#name]{\clf_usecldfileonce{#name}}
+\unexpanded\def\loadanyfileonce [#name]{\clf_useanyfileonce{#name}}
%D Handy for modules that have a test/demo appended (true added).
-\unexpanded\def\continueifinputfile#name{\ctxcommand{doifelsecontinuewithfile("#name",true)}\relax\endinput} % we cannot do \endinput via lua
+\unexpanded\def\continueifinputfile#name%
+ {\clf_doifelsecontinuewithfile{#name}\relax\endinput} % we cannot do \endinput via lua
% \startproject test
% 1: \startmode[*project] project \stopmode \endgraf
diff --git a/tex/context/base/file-lib.lua b/tex/context/base/file-lib.lua
index 2471cdd84..361608ea3 100644
--- a/tex/context/base/file-lib.lua
+++ b/tex/context/base/file-lib.lua
@@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['file-lib'] = {
-- todo: check all usage of truefilename at the tex end and remove
-- files there (and replace definitions by full names)
-local format = string.format
+local format, gsub = string.format, string.gsub
local trace_libraries = false trackers.register("resolvers.libraries", function(v) trace_libraries = v end)
----- trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end)
@@ -33,7 +33,7 @@ local function defaultfailure(name)
report_files("asked name %a, not found",name)
end
-function commands.uselibrary(specification) -- todo: reporter
+function resolvers.uselibrary(specification) -- todo: reporter
local name = specification.name
if name and name ~= "" then
local patterns = specification.patterns or defaultpatterns
@@ -86,3 +86,5 @@ function commands.uselibrary(specification) -- todo: reporter
end
end
end
+
+commands.uselibrary = resolvers.uselibrary -- for the moment
diff --git a/tex/context/base/file-mod.lua b/tex/context/base/file-mod.lua
index bf369d035..ff54dfe97 100644
--- a/tex/context/base/file-mod.lua
+++ b/tex/context/base/file-mod.lua
@@ -25,10 +25,9 @@ local permit_unprefixed = false directives.register("modules.permitunprefixed",
local report_modules = logs.reporter("resolvers","modules")
-commands = commands or { }
local commands = commands
-
local context = context
+local implement = interfaces.implement
local findbyscheme = resolvers.finders.byscheme -- use different one
local iterator = utilities.parsers.iterator
@@ -97,7 +96,7 @@ local function usemodule(name,hasscheme)
end
end
-function commands.usemodules(prefix,askedname,truename)
+function environment.usemodules(prefix,askedname,truename)
local truename = truename or environment.truefilename(askedname)
local hasprefix = prefix and prefix ~= ""
local hashname = ((hasprefix and prefix) or "*") .. "-" .. truename
@@ -184,23 +183,51 @@ end)
-- moved from syst-lua.lua:
-local splitter = lpeg.tsplitter(lpeg.S(". "),tonumber)
+local lpegmatch = lpeg.match
+local splitter = lpeg.tsplitter(lpeg.S(". "),tonumber)
-function commands.doifolderversionelse(one,two) -- one >= two
- if not two then
+function environment.comparedversion(one,two) -- one >= two
+ if not two or two == "" then
one, two = environment.version, one
elseif one == "" then
one = environment.version
end
- one = lpeg.match(splitter,one)
- two = lpeg.match(splitter,two)
+ one = lpegmatch(splitter,one)
+ two = lpegmatch(splitter,two)
one = (one[1] or 0) * 10000 + (one[2] or 0) * 100 + (one[3] or 0)
two = (two[1] or 0) * 10000 + (two[2] or 0) * 100 + (two[3] or 0)
- commands.doifelse(one>=two)
+ if one < two then
+ return -1
+ elseif one > two then
+ return 1
+ else
+ return 0
+ end
end
-function commands.useluamodule(list)
+environment.comparedversion = comparedversion
+
+
+function environment.useluamodule(list)
for filename in iterator(list) do
environment.loadluafile(filename)
end
end
+
+implement {
+ name = "usemodules",
+ actions = environment.usemodules,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "doifolderversionelse",
+ actions = function(one,two) commands.doifelse(comparedversion(one,two) >= 0) end,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "useluamodule",
+ actions = environment.useluamodule,
+ arguments = "string"
+}
diff --git a/tex/context/base/file-mod.mkvi b/tex/context/base/file-mod.mkvi
index 1591a69cc..d4fd3d3bc 100644
--- a/tex/context/base/file-mod.mkvi
+++ b/tex/context/base/file-mod.mkvi
@@ -37,39 +37,6 @@
\let\usemodule \usemodules
\let\usetexmodule\usemodules
-% \def\strc_modules_use[#category][#name][#parameters]%
-% {\pushmacro\currentmodule
-% \pushmacro\currentmoduleparameters
-% \let\currentmoduleparameters\empty
-% \ifthirdargument
-% \singleexpandafter\strc_modules_use_a
-% \else\ifsecondargument
-% \doubleexpandafter\strc_modules_use_b
-% \else
-% \doubleexpandafter\strc_modules_use_c
-% \fi\fi
-% % here we load
-% \popmacro\currentmoduleparameters
-% \popmacro\currentmodule}
-%
-% \def\strc_modules_use_a[#category][#name][#parameters]%
-% {\doifsomething{#name}
-% {\def\currentmoduleparameters{#parameters}%
-% \processcommalist[#name]{\strc_modules_use_indeed{#category}}}}
-%
-% \def\strc_modules_use_b[#category][#name][#parameters]%
-% {\doifsomething{#name}
-% {\doifassignmentelse{#name}
-% {\def\currentmoduleparameters{#name}%
-% \processcommalist[#category]{\strc_modules_use_indeed\empty}}
-% {\processcommalist[#name]{\strc_modules_use_indeed{#category}}}}}
-%
-% \def\strc_modules_use_c[#category][#name][#parameters]%
-% {\processcommalist[#category]{\strc_modules_use_indeed\empty}}
-%
-% \def\strc_modules_use_indeed#category#name%
-% {\ctxcommand{usemodules("#category","#name","\truefilename{#name}")}}
-
\def\strc_modules_use[#category][#name][#parameters]% category=t|m|x|p|...
{\pushmacro\currentmodule
\pushmacro\currentmodulecategory
@@ -96,8 +63,8 @@
\popmacro\currentmodulecategory
\popmacro\currentmodule}
-\def\strc_modules_use_indeed#category#name% truefilename moved to lua end
- {\ctxcommand{usemodules("#category","#name")}} % ,"\truefilename{#name}")}}
+\def\strc_modules_use_indeed#category#name%
+ {\clf_usemodules{#category}{#name}}
\installcorenamespace{module}
@@ -238,8 +205,8 @@
%D
%D The version pattern is \type {yyyy.mm.dd} (with mm and dd being optional).
-\unexpanded\def\doifolderversionelse#parent#child{\ctxcommand{doifolderversionelse("#parent","#child")}}
-\unexpanded\def\doifoldercontextelse #child{\ctxcommand{doifolderversionelse("#child")}}
+\unexpanded\def\doifolderversionelse#parent#child{\clf_doifolderversionelse{#parent}{#child}}
+\unexpanded\def\doifoldercontextelse #child{\clf_doifolderversionelse{#child}{}}
%D Relatively new:
@@ -299,6 +266,6 @@
% new:
-\unexpanded\def\useluamodule[#1]{\ctxcommand{useluamodule("#1")}}
+\unexpanded\def\useluamodule[#1]{\clf_useluamodule{#1}}
\protect \endinput
diff --git a/tex/context/base/file-syn.lua b/tex/context/base/file-syn.lua
index c1f9a5f48..b6ad27c83 100644
--- a/tex/context/base/file-syn.lua
+++ b/tex/context/base/file-syn.lua
@@ -6,13 +6,16 @@ if not modules then modules = { } end modules ['file-syn'] = {
license = "see context related readme files"
}
-local report_files = logs.reporter("files")
environment.filesynonyms = environment.filesynonyms or { }
local filesynonyms = environment.filesynonyms
-local settings_to_array = utilities.parsers.settings_to_array
-local findfile = resolvers.findfile
+local settings_to_array = utilities.parsers.settings_to_array
+local findfile = resolvers.findfile
+
+local implement = interfaces.implement
+
+local report_files = logs.reporter("files")
storage.register("environment/filesynonyms", filesynonyms, "environment.filesynonyms")
@@ -27,11 +30,7 @@ end
environment.truefilename = truefilename
-function commands.truefilename(name)
- context(truefilename(name))
-end
-
-function commands.definefilesynonym(name,realname)
+function environment.definefilesynonym(name,realname)
local names = settings_to_array(name)
for i=1,#names do
local name = names[i]
@@ -43,7 +42,7 @@ function commands.definefilesynonym(name,realname)
end
end
-function commands.definefilefallback(name,alternatives)
+function environment.definefilefallback(name,alternatives)
local names = settings_to_array(alternatives)
for i=1,#names do
local realname = findfile(names[i])
@@ -53,3 +52,21 @@ function commands.definefilefallback(name,alternatives)
end
end
end
+
+implement {
+ name = "truefilename",
+ actions = { truefilename, context },
+ arguments = "string"
+}
+
+implement {
+ name = "definefilesynonym",
+ actions = environment.definefilesynonym,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "definefilefallback",
+ actions = environment,definefilefallback,
+ arguments = { "string", "string" }
+}
diff --git a/tex/context/base/file-syn.mkvi b/tex/context/base/file-syn.mkvi
index b61bd8ae4..52ecd0d71 100644
--- a/tex/context/base/file-syn.mkvi
+++ b/tex/context/base/file-syn.mkvi
@@ -46,8 +46,8 @@
\unexpanded\def\definefilesynonym {\dodoubleempty \syst_files_define_synonym }
\unexpanded\def\definefilefallback{\dodoubleargument\syst_files_define_fallback} % still used?
-\def\syst_files_define_synonym [#name][#realname]{\ctxcommand{definefilesynonym ("#name","#realname")}}
-\def\syst_files_define_fallback[#name][#alternatives]{\ctxcommand{definefilefallback("#name","#alternatives")}}
+\def\syst_files_define_synonym [#name][#realname]{\clf_definefilesynonym {#name}{#realname}}
+\def\syst_files_define_fallback[#name][#alternatives]{\clf_definefilefallback{#name}{#alternatives}}
%D \macros
%D {truefilename}
@@ -61,6 +61,6 @@
%D
%D The implementation shows that nesting is supported.
-\def\truefilename#1{\ctxcommand{truefilename("#1")}}
+\def\truefilename#1{\clf_truefilename{#1}}
\protect \endinput
diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua
index 187e33311..997c57c9f 100644
--- a/tex/context/base/font-col.lua
+++ b/tex/context/base/font-col.lua
@@ -45,6 +45,8 @@ local currentfont = font.current
local fontpatternhassize = fonts.helpers.fontpatternhassize
+local implement = interfaces.implement
+
local list = { }
local current = 0
local enabled = false
@@ -275,9 +277,38 @@ end
-- interface
-commands.fontcollectiondefine = collections.define
-commands.fontcollectionreset = collections.reset
-commands.fontcollectionprepare = collections.prepare
-commands.fontcollectionreport = collections.report
-commands.fontcollectionregister = collections.registermain
-commands.fontcollectionclone = collections.clonevector
+implement {
+ name = "fontcollectiondefine",
+ actions = collections.define,
+ arguments = { "string", "string", "string", "string" }
+}
+
+implement {
+ name = "fontcollectionreset",
+ actions = collections.reset,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "fontcollectionprepare",
+ actions = collections.prepare,
+ arguments = "string"
+}
+
+implement {
+ name = "fontcollectionreport",
+ actions = collections.report,
+ arguments = "string"
+}
+
+implement {
+ name = "fontcollectionregister",
+ actions = collections.registermain,
+ arguments = "string"
+}
+
+implement {
+ name = "fontcollectionclone",
+ actions = collections.clonevector,
+ arguments = "string"
+}
diff --git a/tex/context/base/font-col.mkvi b/tex/context/base/font-col.mkvi
index 34a1b04a8..bc8e8151e 100644
--- a/tex/context/base/font-col.mkvi
+++ b/tex/context/base/font-col.mkvi
@@ -34,13 +34,13 @@
\unexpanded\def\resetfontfallback {\dodoubleempty \font_fallbacks_reset }
\def\font_fallbacks_define[#name][#font][#ranges][#settings]%
- {\ctxcommand{fontcollectiondefine("#name","#font",\!!bs#ranges\!!es,\!!bs#settings\!!es)}}
+ {\clf_fontcollectiondefine{#name}{#font}{#ranges}{#settings}}
\def\font_fallbacks_reset[#name][#font]%
- {\ctxcommand{fontcollectionreset("#name","#font")}}
+ {\clf_fontcollectionreset{#name}{#font}}
\def\font_fallbacks_prepare#name%
- {\ctxcommand{fontcollectionprepare("#name")}} % add fallbacks to last font
+ {\clf_fontcollectionprepare{#name}} % add fallbacks to last font
% we might as well move the handling to lua but then we need to pass the
% fallbacks, skewchar etc.
@@ -77,7 +77,7 @@
{\endgroup}
\def\font_fallbacks_clone_unique#specification#scale% kind of dododefinefont
- {\ctxcommand{fontcollectionreport("defining #specification (relative scale: #scale)")}% brrr
+ {\clf_fontcollectionreport{defining #specification (relative scale: #scale)}% brrr
\setfalse\c_font_auto_size
\let\lastfontidentifier\s!dummy
\def\v_font_size_relative{#scale}%
@@ -89,8 +89,8 @@
\def\font_fallbacks_clone_inherited#font% also a second argument
{\font_fallbacks_clone_unique{#font \savedfontspec}}
-\def\font_fallbacks_register_main #name{\ctxcommand{fontcollectionregister("#name")}}
-\def\font_fallbacks_prepare_clone_vectors#name{\ctxcommand{fontcollectionclone("#name")}}
+\def\font_fallbacks_register_main #name{\clf_fontcollectionregister{#name}}
+\def\font_fallbacks_prepare_clone_vectors#name{\clf_fontcollectionclone{#name}}
% check : only replace when present in replacement font (default: no)
% force : force replacent even when basefont has glyph (default: yes)
diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua
index 2d0e99653..0a0e5eab6 100644
--- a/tex/context/base/font-ctx.lua
+++ b/tex/context/base/font-ctx.lua
@@ -1761,10 +1761,10 @@ function fonts.definetypeface(name,t)
local boldwidth = t.boldwidth or t.width or p.boldwidth or p.width or "normal"
Shape = Shapes[shape] or "Serif"
ctx_startfontclass { name }
- ctx_definefontsynonym( { format("%s", Shape) }, { format("spec:%s-%s-regular-%s", fontname, normalweight, normalwidth) } )
- ctx_definefontsynonym( { format("%sBold", Shape) }, { format("spec:%s-%s-regular-%s", fontname, boldweight, boldwidth ) } )
- ctx_definefontsynonym( { format("%sBoldItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, boldweight, boldwidth ) } )
- ctx_definefontsynonym( { format("%sItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, normalweight, normalwidth) } )
+ ctx_definefontsynonym( { formatters["%s"] (Shape) }, { formatters["spec:%s-%s-regular-%s"] (fontname, normalweight, normalwidth) } )
+ ctx_definefontsynonym( { formatters["%sBold"] (Shape) }, { formatters["spec:%s-%s-regular-%s"] (fontname, boldweight, boldwidth ) } )
+ ctx_definefontsynonym( { formatters["%sBoldItalic"](Shape) }, { formatters["spec:%s-%s-italic-%s"] (fontname, boldweight, boldwidth ) } )
+ ctx_definefontsynonym( { formatters["%sItalic"] (Shape) }, { formatters["spec:%s-%s-italic-%s"] (fontname, normalweight, normalwidth) } )
ctx_stopfontclass()
local settings = sequenced({ features= t.features },",")
ctx_dofastdefinetypeface(name, shortcut, shape, size, settings)
@@ -2138,7 +2138,7 @@ local glyph_code = nodes.nodecodes.glyph
local states = analyzers.states
-local names = {
+local colornames = {
[states.init] = "font:1",
[states.medi] = "font:2",
[states.fina] = "font:3",
@@ -2159,7 +2159,7 @@ local function markstates(head)
for glyph in traverse_by_id(glyph_code,head) do
local a = getprop(glyph,a_state)
if a then
- local name = names[a]
+ local name = colornames[a]
if name then
local color = m_color[name]
if color then
diff --git a/tex/context/base/font-fea.mkvi b/tex/context/base/font-fea.mkvi
index e1a7651fe..90da7b0fc 100644
--- a/tex/context/base/font-fea.mkvi
+++ b/tex/context/base/font-fea.mkvi
@@ -129,7 +129,7 @@
{\dodoubleargument\font_basics_features_list}
\def\font_basics_features_list[#name][#separator]% todo: arg voor type
- {\clf_featurelist{#name}{\luaescapestring{#separator}}}
+ {\clf_featurelist{#name}{\detokenize{#separator}}}
\attribute\zerocount\zerocount % first in list, so fast match
diff --git a/tex/context/base/font-gds.lua b/tex/context/base/font-gds.lua
index c2c506b7a..b021004fe 100644
--- a/tex/context/base/font-gds.lua
+++ b/tex/context/base/font-gds.lua
@@ -9,10 +9,12 @@ if not modules then modules = { } end modules ['font-gds'] = {
-- depends on ctx
local type, next, tonumber = type, next, tonumber
-local gmatch, format, lower, find, splitup = string.gmatch, string.format, string.lower, string.find, string.splitup
-local texsp = tex.sp
+local gmatch, lower, find, splitup = string.gmatch, string.lower, string.find, string.splitup
-local fonts, nodes, attributes, node = fonts, nodes, attributes, node
+local fonts = fonts
+local nodes = nodes
+local attributes = attributes
+local node = node
local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end)
local report_goodies = logs.reporter("fonts","goodies")
@@ -20,6 +22,11 @@ local report_goodies = logs.reporter("fonts","goodies")
local allocate = utilities.storage.allocate
local setmetatableindex = table.setmetatableindex
+local implement = interfaces.implement
+
+local texsp = tex.sp
+local formatters = string.formatters
+
local otf = fonts.handlers.otf
local afm = fonts.handlers.afm
local tfm = fonts.handlers.tfm
@@ -429,7 +436,7 @@ local function setextrafeatures(tfmdata)
addotffeature(tfmdata.shared.rawdata,feature,specification)
registerotffeature {
name = feature,
- description = format("extra: %s",feature)
+ description = formatters["extra: %s"](feature)
}
end
end
@@ -819,8 +826,16 @@ end
-- interface
-commands.loadfontgoodies = fontgoodies.load
-commands.enablefontcolorschemes = colorschemes.enable
+implement {
+ name = "loadfontgoodies",
+ actions = fontgoodies.load,
+ arguments = "string"
+}
+
+implement {
+ name = "enablefontcolorschemes",
+ actions = colorschemes.enable
+}
-- weird place ... depends on math
diff --git a/tex/context/base/font-gds.mkvi b/tex/context/base/font-gds.mkvi
index 6d9798428..e9c34e807 100644
--- a/tex/context/base/font-gds.mkvi
+++ b/tex/context/base/font-gds.mkvi
@@ -46,10 +46,10 @@
\definesystemattribute[colorscheme][public]
\unexpanded\def\loadfontgoodies[#filename]%
- {\ctxcommand{loadfontgoodies("#filename")}}
+ {\clf_loadfontgoodies{#filename}}
\unexpanded\def\setfontcolorscheme % will move to the lua end
- {\ctxcommand{enablefontcolorschemes()}%
+ {\clf_enablefontcolorschemes
\unexpanded\xdef\setfontcolorscheme[##1]{\attribute\colorschemeattribute##1\relax}%
\setfontcolorscheme}
diff --git a/tex/context/base/font-ini.mkvi b/tex/context/base/font-ini.mkvi
index 9ab1962f6..dc3c491d2 100644
--- a/tex/context/base/font-ini.mkvi
+++ b/tex/context/base/font-ini.mkvi
@@ -740,7 +740,7 @@
{% we can now set more at the lua end
\global\let\somefontname\defaultfontfile
\let\somefontsize\empty
- \clf_definefont_one{\luaescapestring{#specification}}% the escapestring catches at \somedimen
+ \clf_definefont_one{\detokenize\expandafter{\normalexpanded{#specification}}}% the escapestring catches at \somedimen
% sets \scaledfontmode and \somefontname and \somefontsize
\ifcase\fontface\relax
% \let\v_font_size_absolute\textface % fontbody
diff --git a/tex/context/base/font-sel.lua b/tex/context/base/font-sel.lua
index aef528c53..c3431a213 100644
--- a/tex/context/base/font-sel.lua
+++ b/tex/context/base/font-sel.lua
@@ -20,6 +20,8 @@ local v_simplefonts = interfaces.variables.simplefonts
local v_selectfont = interfaces.variables.selectfont
local v_default = interfaces.variables.default
+local implement = interfaces.implement
+
local selectfont = fonts.select or { }
fonts.select = selectfont
@@ -299,12 +301,12 @@ local mathsettings = {
},
}
-function commands.defineselectfont(settings)
+function selectfont.define(settings)
local index = #data + 1
data[index] = settings
selectfont.searchfiles(index)
selectfont.filterinput(index)
- context(index)
+ return index
end
local function savefont(data,alternative,entries)
@@ -493,6 +495,14 @@ function selectfont.filterinput(index)
end
end
+local ctx_definefontsynonym = context.definefontsynonym
+local ctx_resetfontfallback = context.resetfontfallback
+local ctx_startfontclass = context.startfontclass
+local ctx_stopfontclass = context.stopfontclass
+local ctx_loadfontgoodies = context.loadfontgoodies
+local ctx_definefontfallback = context.definefontfallback
+local ctx_definetypeface = context.definetypeface
+
local function definefontsynonym(data,alternative,index,fallback)
local fontdata = data.fonts and data.fonts[alternative]
local style = data.metadata.style
@@ -534,15 +544,16 @@ local function definefontsynonym(data,alternative,index,fallback)
end
end
if fallback then
- context.definefontsynonym( { fontname }, { fontfile }, { features = features } )
+ -- can we use
+ ctx_definefontsynonym( { fontname }, { fontfile }, { features = features } )
else
- context.definefontsynonym( { fontname }, { fontfile }, { features = features, fallbacks = fontfile, goodies = goodies } )
+ ctx_definefontsynonym( { fontname }, { fontfile }, { features = features, fallbacks = fontfile, goodies = goodies } )
end
else
if fallback then
- context.definefontsynonym( { fontname }, { fontparent }, { features = features } )
+ ctx_definefontsynonym( { fontname }, { fontparent }, { features = features } )
else
- context.definefontsynonym( { fontname }, { fontparent }, { features = features, fallbacks = fontfile, goodies = goodies } )
+ ctx_definefontsynonym( { fontname }, { fontparent }, { features = features, fallbacks = fontfile, goodies = goodies } )
end
end
end
@@ -555,11 +566,11 @@ local function definetypescript(index)
local typeface = data.metadata.typeface
local style = data.metadata.style
if entry and entry["tf"] then
- context.startfontclass( { typeface } )
+ ctx_startfontclass( { typeface } )
if goodies ~= "" then
goodies = utilities.parsers.settings_to_array(goodies)
for _, goodie in next, goodies do
- context.loadfontgoodies( { goodie } )
+ ctx_loadfontgoodies( { goodie } )
end
end
for alternative, _ in next, alternatives do
@@ -567,7 +578,7 @@ local function definetypescript(index)
definefontsynonym(data,alternative)
end
end
- context.stopfontclass()
+ ctx_stopfontclass()
else
-- regular style not available, loading aborted
end
@@ -598,20 +609,20 @@ local function definetextfontfallback(data,alternative,index)
local synonym = formatters["%s-%s-%s-fallback-%s"](typeface, style, alternative, index)
local fallback = formatters["%s-%s-%s"] (typeface, style, alternative)
if index == 1 then
- context.resetfontfallback( { fallback } )
+ ctx_resetfontfallback( { fallback } )
end
- context.definefontfallback( { fallback }, { synonym }, { range }, { rscale = rscale, check = check, force = force } )
+ ctx_definefontfallback( { fallback }, { synonym }, { range }, { rscale = rscale, check = check, force = force } )
end
local function definetextfallback(entry,index)
local data = data[index]
local typeface = data.metadata.typeface
- context.startfontclass( { typeface } )
+ ctx_startfontclass( { typeface } )
for alternative, _ in next, alternatives do
definefontsynonym (data,alternative,entry,true)
definetextfontfallback(data,alternative,entry)
end
- context.stopfontclass()
+ ctx_stopfontclass()
-- inspect(data)
end
@@ -627,14 +638,14 @@ local function definemathfontfallback(data,alternative,index)
local fontdata = data.fonts and data.fonts[alternative]
local fallback = formatters["%s-%s-%s"](typeface, style, alternative)
if index == 1 then
- context.resetfontfallback( { fallback } )
+ ctx_resetfontfallback( { fallback } )
end
if fontdata and #fontdata > 0 then
for _, entry in next, fontdata do
local filename = entry["filename"]
local designsize = entry["designsize"] or 100
if designsize == 100 or designsize == 110 or designsize == 120 or designsize == 0 or #fontdata == 1 then
- context.definefontfallback( { fallback }, { formatters["file:%s*%s"](filename,features) }, { range }, { rscale = rscale, check = check, force = force, offset = offset } )
+ ctx_definefontfallback( { fallback }, { formatters["file:%s*%s"](filename,features) }, { range }, { rscale = rscale, check = check, force = force, offset = offset } )
break
end
end
@@ -645,13 +656,13 @@ local function definemathfallback(entry,index)
local data = data[index]
local typeface = data.metadata.typeface
local style = data.metadata.style
- context.startfontclass( { typeface } )
+ ctx_startfontclass( { typeface } )
for alternative, _ in next, alternatives do
if synonyms[style][alternative] then
definemathfontfallback(data,alternative,entry)
end
end
- context.stopfontclass()
+ ctx_stopfontclass()
-- inspect(data)
end
@@ -679,7 +690,7 @@ local function definetextfont(index)
local style = styles[data.metadata.style]
local designsize = data.options.opticals == v_yes and "auto" or "default"
local scale = data.options.scale ~= "" and data.options.scale or 1
- context.definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { designsize = designsize, rscale = scale } )
+ ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { designsize = designsize, rscale = scale } )
end
local function definemathfont(index)
@@ -691,9 +702,9 @@ local function definemathfont(index)
local typescript = cleanname(data.metadata.family)
local entries = data.fonts
if entries then
- context.definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { rscale = scale } )
+ ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { "" }, { "default" }, { rscale = scale } )
else
- context.definetypeface( { fontclass }, { shortstyle }, { style }, { typescript }, { "default" }, { rscale = scale } )
+ ctx_definetypeface( { fontclass }, { shortstyle }, { style }, { typescript }, { "default" }, { rscale = scale } )
end
end
@@ -711,5 +722,49 @@ function selectfont.definetypeface(index)
-- inspect(data)
end
-commands.definefontfamily = selectfont.definetypeface
-commands.definefallbackfamily = selectfont.registerfallback
+local styles = {
+ { "tf" }, { "bf" }, { "it" }, { "sl" }, { "bi" }, { "bs" }, { "sc" },
+}
+
+implement {
+ name = "defineselectfont",
+ actions = { selectfont.define, context },
+ arguments = {
+ {
+ {
+ "metadata", {
+ { "typeface" },
+ { "style" },
+ { "family" },
+ }
+ },
+ {
+ "options", {
+ { "opticals" },
+ { "scale" },
+ { "goodies" },
+ { "alternative" },
+ { "range" },
+ { "offset" },
+ { "check" },
+ { "force" },
+ }
+ },
+ { "alternatives", styles },
+ { "files", styles },
+ { "features", styles },
+ }
+ }
+}
+
+implement {
+ name = "definefontfamily",
+ actions = selectfont.definetypeface,
+ arguments = "integer"
+}
+
+implement {
+ name = "definefallbackfamily",
+ actions = selectfont.registerfallback,
+ arguments = { "string", "string", "integer"}
+}
diff --git a/tex/context/base/font-sel.mkvi b/tex/context/base/font-sel.mkvi
index 933afa466..94cd14929 100644
--- a/tex/context/base/font-sel.mkvi
+++ b/tex/context/base/font-sel.mkvi
@@ -27,51 +27,49 @@
\fi
\setexpandedselectfontparameter\c!style {\expandnamespaceparameter\??selectfontstyle \selectfontparameter\c!style \s!rm }%
\setexpandedselectfontparameter\c!alternative{\expandnamespaceparameter\??selectfontalternative\selectfontparameter\c!alternative\v!default}%
- \xdef\selectfont_index{\ctxcommand{
- defineselectfont {
- metadata = {
- typeface = "\selectfontparameter\c!name",
- style = "\selectfontparameter\c!style",
- family = "\selectfontparameter\c!family",
- },
- options = {
- opticals = "\selectfontparameter\c!opticalsize",
- scale = "\selectfontparameter\c!scale",
- goodies = "\selectfontparameter\c!goodies",
- alternative = "\selectfontparameter\c!alternative",
- range = "\selectfontparameter\c!range", % fallback only
- offset = "\selectfontparameter\c!offset", % fallback only
- check = "\selectfontparameter\c!check", % fallback only
- force = "\selectfontparameter\c!force", % fallback only
- },
- alternatives = {
- ["tf"] = "\selectfontparameter\s!tf",
- ["bf"] = "\selectfontparameter\s!bf",
- ["it"] = "\selectfontparameter\s!it",
- ["sl"] = "\selectfontparameter\s!sl",
- ["bi"] = "\selectfontparameter\s!bi",
- ["bs"] = "\selectfontparameter\s!bs",
- ["sc"] = "\selectfontparameter\s!sc",
- },
- files = {
- ["tf"] = "\selectfontparameter\c!regularfont",
- ["bf"] = "\selectfontparameter\c!boldfont",
- ["it"] = "\selectfontparameter\c!italicfont",
- ["sl"] = "\selectfontparameter\c!slantedfont",
- ["bi"] = "\selectfontparameter\c!bolditalicfont",
- ["bs"] = "\selectfontparameter\c!boldslantedfont",
- ["sc"] = "\selectfontparameter\c!smallcapsfont",
- },
- features = {
- ["tf"] = "\selectfontparameter\c!regularfeatures",
- ["bf"] = "\selectfontparameter\c!boldfeatures",
- ["it"] = "\selectfontparameter\c!italicfeatures",
- ["sl"] = "\selectfontparameter\c!slantedfeatures",
- ["bi"] = "\selectfontparameter\c!bolditalicfeatures",
- ["bs"] = "\selectfontparameter\c!boldslantedfeatures",
- ["sc"] = "\selectfontparameter\c!smallcapsfeatures",
- }
- }}}%
+ \xdef\selectfont_index{\clf_defineselectfont
+ metadata {%
+ typeface {\selectfontparameter\c!name}%
+ style {\selectfontparameter\c!style}%
+ family {\selectfontparameter\c!family}%
+ }
+ options {%
+ opticals {\selectfontparameter\c!opticalsize}%
+ scale {\selectfontparameter\c!scale}%
+ goodies {\selectfontparameter\c!goodies}%
+ alternative {\selectfontparameter\c!alternative}%
+ range {\selectfontparameter\c!range}% fallback only
+ offset {\selectfontparameter\c!offset}% fallback only
+ check {\selectfontparameter\c!check}% fallback only
+ force {\selectfontparameter\c!force}% fallback only
+ }
+ alternatives {%
+ tf {\selectfontparameter\s!tf}%
+ bf {\selectfontparameter\s!bf}%
+ it {\selectfontparameter\s!it}%
+ sl {\selectfontparameter\s!sl}%
+ bi {\selectfontparameter\s!bi}%
+ bs {\selectfontparameter\s!bs}%
+ sc {\selectfontparameter\s!sc}%
+ }
+ files {%
+ tf {\selectfontparameter\c!regularfont}%
+ bf {\selectfontparameter\c!boldfont}%
+ it {\selectfontparameter\c!italicfont}%
+ sl {\selectfontparameter\c!slantedfont}%
+ bi {\selectfontparameter\c!bolditalicfont}%
+ bs {\selectfontparameter\c!boldslantedfont}%
+ sc {\selectfontparameter\c!smallcapsfont}%
+ }
+ features {%
+ tf {\selectfontparameter\c!regularfeatures}%
+ bf {\selectfontparameter\c!boldfeatures}%
+ it {\selectfontparameter\c!italicfeatures}%
+ sl {\selectfontparameter\c!slantedfeatures}%
+ bi {\selectfontparameter\c!bolditalicfeatures}%
+ bs {\selectfontparameter\c!boldslantedfeatures}%
+ sc {\selectfontparameter\c!smallcapsfeatures}%
+ }}%
\endgroup}
%D \macros
@@ -330,7 +328,7 @@
{\doifassignmentelse{#settings}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},#settings]}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},\c!preset={#settings}]}%
- \ctxcommand{definefontfamily(\selectfont_index)}}
+ \clf_definefontfamily\selectfont_index\relax}
\unexpanded\def\definefallbackfamily
{\doquadrupleempty\selectfont_fallback_define}
@@ -340,7 +338,7 @@
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},#settings]}
{\selectfont_setparameters[\c!name={#typeface},\c!style={#style},\c!family={#family},\c!preset={#settings}]}%
\edef\p_selectfont_style{\expandnamespacevalue\??selectfontstyle{#style}\s!rm}%
- \ctxcommand{definefallbackfamily("#typeface","\p_selectfont_style",\selectfont_index)}}
+ \clf_definefallbackfamily{#typeface}{\p_selectfont_style}\selectfont_index\relax}
%D \macros
%D {setupfontfamily,setupfallbackfamily}
@@ -428,4 +426,4 @@
\c!smallcapsfeatures=\s!smallcaps,
\c!style=\s!rm]
-\protect \ No newline at end of file
+\protect
diff --git a/tex/context/base/font-sol.lua b/tex/context/base/font-sol.lua
index a41e4a679..bbb2997f4 100644
--- a/tex/context/base/font-sol.lua
+++ b/tex/context/base/font-sol.lua
@@ -45,6 +45,8 @@ local v_preroll = variables.preroll
local v_random = variables.random
local v_split = variables.split
+local implement = interfaces.implement
+
local settings_to_array = utilities.parsers.settings_to_array
local settings_to_hash = utilities.parsers.settings_to_hash
@@ -907,8 +909,52 @@ end
-- interface
-commands.definefontsolution = splitters.define
-commands.startfontsolution = splitters.start
-commands.stopfontsolution = splitters.stop
-commands.setfontsolution = splitters.set
-commands.resetfontsolution = splitters.reset
+implement {
+ name = "definefontsolution",
+ actions = splitters.define,
+ arguments = {
+ "string",
+ {
+ { "goodies" },
+ { "solution" },
+ { "less" },
+ { "more" },
+ }
+ }
+}
+
+implement {
+ name = "startfontsolution",
+ actions = splitters.start,
+ arguments = {
+ "string",
+ {
+ { "method" },
+ { "criterium" },
+ { "randomseed" },
+ }
+ }
+}
+
+implement {
+ name = "stopfontsolution",
+ actions = splitters.stop
+}
+
+implement {
+ name = "setfontsolution",
+ actions = splitters.set,
+ arguments = {
+ "string",
+ {
+ { "method" },
+ { "criterium" },
+ { "randomseed" },
+ }
+ }
+}
+
+implement {
+ name = "resetfontsolution",
+ actions = splitters.reset
+}
diff --git a/tex/context/base/font-sol.mkvi b/tex/context/base/font-sol.mkvi
index b40e37ced..d065b78ea 100644
--- a/tex/context/base/font-sol.mkvi
+++ b/tex/context/base/font-sol.mkvi
@@ -85,24 +85,30 @@
\let\setupfontsolutions\setupfontsolution
\appendtoks
- \ctxcommand{definefontsolution("\currentfontsolution",{ % these are frozen
- goodies = "\fontsolutionparameter\s!goodies",
- solution = "\fontsolutionparameter\c!solution",
- less = "\fontsolutionparameter\c!less",
- more = "\fontsolutionparameter\c!more",
- })}
+ \clf_definefontsolution
+ {\currentfontsolution}%
+ {% these are frozen
+ goodies {\fontsolutionparameter\s!goodies}%
+ solution {\fontsolutionparameter\c!solution}%
+ less {\fontsolutionparameter\c!less}%
+ more {\fontsolutionparameter\c!more}%
+ }%
+ \relax
\to \everydefinefontsolution
\unexpanded\def\setfontsolution[#solution]% just one
{\edef\currentfontsolution{#solution}%
- \ctxcommand{setfontsolution("\currentfontsolution",{
- method = "\fontsolutionparameter\c!method",
- criterium = "\fontsolutionparameter\c!criterium",
- % randomseed = "\fontsolutionparameter\c!random",
- })}}
+ \clf_setfontsolution
+ {\currentfontsolution}%
+ {%
+ method {\fontsolutionparameter\c!method}%
+ criterium {\fontsolutionparameter\c!criterium}%
+ % randomseed {\fontsolutionparameter\c!random}%
+ }%
+ \relax}
\unexpanded\def\resetfontsolution % resets all
- {\ctxcommand{resetfontsolution()}%
+ {\clf_resetfontsolution
\let\currentfontsolution\empty}
\unexpanded\def\startfontsolution % [#1]
@@ -111,7 +117,7 @@
\unexpanded\def\stopfontsolution
{\ifhmode\par\fi
- \ctxcommand{stopfontsolution()}%
+ \clf_stopfontsolution
\popmacro\currentfontsolution}
% We initialize this module at the \LUA\ end.
diff --git a/tex/context/base/font-sym.mkvi b/tex/context/base/font-sym.mkvi
index c8ca49f74..1badf338f 100644
--- a/tex/context/base/font-sym.mkvi
+++ b/tex/context/base/font-sym.mkvi
@@ -167,8 +167,8 @@
\currentsymbolfont
\global\expandafter\let\csname\??symbolfont\askedsymbolfont\endcsname\lastrawfontcall}
-\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\ctxcommand{fontchar("#character")}}}
-\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\ctxcommand{fontchar("#character")}}}
+\unexpanded\def\getnamedglyphstyled#fontname#character{{\setstyledsymbolicfont{#fontname}\clf_fontchar{#character}}}
+\unexpanded\def\getnamedglyphdirect#fontname#character{{\setdirectsymbolicfont{#fontname}\clf_fontchar{#character}}}
\unexpanded\def\getglyphstyled #fontname#character{{\setstyledsymbolicfont{#fontname}\doifnumberelse{#character}\char\donothing#character}}
\unexpanded\def\getglyphdirect #fontname#character{{\setdirectsymbolicfont{#fontname}\doifnumberelse{#character}\char\donothing#character}}
diff --git a/tex/context/base/lpdf-col.lua b/tex/context/base/lpdf-col.lua
index 030291c29..a2fda8ca5 100644
--- a/tex/context/base/lpdf-col.lua
+++ b/tex/context/base/lpdf-col.lua
@@ -48,6 +48,7 @@ local registercolor = colors.register
local colorsvalue = colors.value
local transparenciesvalue = transparencies.value
local forcedmodel = colors.forcedmodel
+local getpagecolormodel = colors.getpagecolormodel
local c_transparency = pdfconstant("Transparency")
@@ -98,11 +99,10 @@ table.setmetatableindex(transparencygroups, function(transparencygroups,colormod
end
end)
-local currentgroupcolormodel
-
local function addpagegroup()
- if currentgroupcolormodel then
- local g = transparencygroups[currentgroupcolormodel]
+ local model = getpagecolormodel()
+ if model then
+ local g = transparencygroups[model]
if g then
addtopageattributes("Group",g)
end
@@ -111,13 +111,6 @@ end
lpdf.registerpagefinalizer(addpagegroup,3,"pagegroup")
-local function synchronizecolormodel(model)
- currentgroupcolormodel = model
-end
-
-backends.codeinjections.synchronizecolormodel = synchronizecolormodel
-commands.synchronizecolormodel = synchronizecolormodel
-
-- injection code (needs a bit reordering)
-- color injection
@@ -491,8 +484,11 @@ function registrations.transparency(n,a,t)
end
statistics.register("page group warning", function()
- if done and not transparencygroups[currentgroupcolormodel] then
- return "transparencies are used but no pagecolormodel is set"
+ if done then
+ local model = getpagecolormodel()
+ if model and not transparencygroups[model] then
+ return "transparencies are used but no pagecolormodel is set"
+ end
end
end)
diff --git a/tex/context/base/luat-ini.mkiv b/tex/context/base/luat-ini.mkiv
index 78a324db2..38b8be3ae 100644
--- a/tex/context/base/luat-ini.mkiv
+++ b/tex/context/base/luat-ini.mkiv
@@ -193,19 +193,22 @@
%D \edef\luaescapestring#1{\!!bs#1\!!es}
%D \stoptyping
-\def\setdocumentfilename #1#2{\ctxlua{document.setfilename(#1,"#2")}}
-\def\setdocumentargument #1#2{\ctxlua{document.setargument("#1","#2")}}
-\def\setdocumentargumentdefault#1#2{\ctxlua{document.setdefaultargument("#1","#2")}}
-\def\getdocumentfilename #1{\ctxlua{document.getfilename("#1")}}
-\def\getdocumentargument #1{\ctxlua{document.getargument("#1")}}
-\def\setdocumentargument #1#2{\ctxlua{document.setargument("#1","#2")}}
-\def\getdocumentargumentdefault#1#2{\ctxlua{document.getargument("#1","#2")}}
-\def\doifdocumentargumentelse #1{\doifsomethingelse{\getdocumentargument{#1}}}
-\def\doifdocumentargument #1{\doifsomething {\getdocumentargument{#1}}}
-\def\doifnotdocumentargument #1{\doifnothing {\getdocumentargument{#1}}}
-\def\doifdocumentfilenameelse #1{\doifsomethingelse{\getdocumentfilename{#1}}}
-\def\doifdocumentfilename #1{\doifsomething {\getdocumentfilename{#1}}}
-\def\doifnotdocumentfilename #1{\doifnothing {\getdocumentfilename{#1}}}
+\def\setdocumentfilename #1#2{\clf_setdocumentfilename\numexpr#1\relax{#2}}
+\def\setdocumentargument #1#2{\clf_setdocumentargument{#1}{#2}}
+\def\setdocumentargumentdefault#1#2{\clf_setdocumentdefaultargument{#1}{#2}}
+\def\getdocumentfilename #1{\clf_getdocumentfilename\numexpr#1\relax}
+\def\getdocumentargument #1{\clf_getdocumentargument{#1}}
+\def\setdocumentargument #1#2{\clf_setdocumentargument{#1}{#2}}
+\def\getdocumentargumentdefault#1#2{\clf_getdocumentargument{#1}{#2}}
+
+% seldom used so no need for speedy variants:
+
+\def\doifdocumentargumentelse #1{\doifsomethingelse{\clf_getdocumentargument{#1}}}
+\def\doifdocumentargument #1{\doifsomething {\clf_getdocumentargument{#1}}}
+\def\doifnotdocumentargument #1{\doifnothing {\clf_getdocumentargument{#1}}}
+\def\doifdocumentfilenameelse #1{\doifsomethingelse{\clf_getdocumentfilename\numexpr#1\relax}}
+\def\doifdocumentfilename #1{\doifsomething {\clf_getdocumentfilename\numexpr#1\relax}}
+\def\doifnotdocumentfilename #1{\doifnothing {\clf_getdocumentfilename\numexpr#1\relax}}
\let\doifelsedocumentargument\doifdocumentargumentelse
diff --git a/tex/context/base/lxml-ini.lua b/tex/context/base/lxml-ini.lua
index 434814b66..8506e1096 100644
--- a/tex/context/base/lxml-ini.lua
+++ b/tex/context/base/lxml-ini.lua
@@ -39,8 +39,8 @@ implement { name = "xmlatt", actions = lxml.att,
implement { name = "xmlattdef", actions = lxml.att, arguments = { "string", "string", "string" } }
implement { name = "xmlattribute", actions = lxml.attribute, arguments = { "string", "string", "string" } }
implement { name = "xmlattributedef", actions = lxml.attribute, arguments = { "string", "string", "string", "string" } }
-implement { name = "xmlchainatt", actions = lxml.chainattribute, arguments = { "string", "string", "string" } }
-implement { name = "xmlchainattdef", actions = lxml.chainattribute, arguments = { "string", "string", "string", "string" } }
+implement { name = "xmlchainatt", actions = lxml.chainattribute, arguments = { "string", "'/'", "string" } }
+implement { name = "xmlchainattdef", actions = lxml.chainattribute, arguments = { "string", "'/'", "string", "string" } }
implement { name = "xmlchecknamespace", actions = xml.checknamespace, arguments = { "lxmlid", "string", "string" } }
implement { name = "xmlcommand", actions = lxml.command, arguments = { "string", "string", "string" } }
implement { name = "xmlconcat", actions = lxml.concat, arguments = { "string", "string", "string" } } -- \detokenize{#3}
@@ -53,7 +53,7 @@ implement { name = "xmldirectives", actions = lxml.directives.setup,
implement { name = "xmldirectivesafter", actions = lxml.directives.after, arguments = "string" }
implement { name = "xmldirectivesbefore", actions = lxml.directives.before, arguments = "string" }
implement { name = "xmldisplayverbatim", actions = lxml.displayverbatim, arguments = "string" }
-implement { name = "xmlelement", actions = lxml.element, arguments = { "string", "integer" } }
+implement { name = "xmlelement", actions = lxml.element, arguments = { "string", "string" } } -- could be integer but now we can alias
implement { name = "xmlfilter", actions = lxml.filter, arguments = { "string", "string" } }
implement { name = "xmlfilterlist", actions = lxml.filterlist, arguments = { "string", "string" } }
implement { name = "xmlfirst", actions = lxml.first, arguments = { "string", "string" } }
@@ -66,7 +66,7 @@ implement { name = "xmlinclude", actions = lxml.include,
implement { name = "xmlincludeoptions", actions = lxml.include, arguments = { "string", "string", "string", "string" } }
implement { name = "xmlinclusion", actions = lxml.inclusion, arguments = "string" }
implement { name = "xmlinclusions", actions = lxml.inclusions, arguments = "string" }
-implement { name = "xmlindex", actions = lxml.index, arguments = { "string", "string", "integer" } }
+implement { name = "xmlindex", actions = lxml.index, arguments = { "string", "string", "string" } } -- can be integer but now we can alias
implement { name = "xmlinfo", actions = lxml.info, arguments = "string" }
implement { name = "xmlinlineverbatim", actions = lxml.inlineverbatim, arguments = "string" }
implement { name = "xmllast", actions = lxml.last, arguments = "string" }
diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv
index 22654bc14..728bfcd00 100644
--- a/tex/context/base/lxml-ini.mkiv
+++ b/tex/context/base/lxml-ini.mkiv
@@ -33,74 +33,142 @@
\def\ctxlxml #1{\ctxlua{lxml.#1}}
-%def\xmlcontent #1{\clf_xmlcontent {#1}}
-%def\xmlflushstripped #1{\clf_xmlflushstripped {#1}}
-\def\xmlall #1#2{\clf_xmlall {#1}{#2}}
-\def\xmlatt #1#2{\clf_xmlatt {#1}{#2}}
-\def\xmlattdef #1#2#3{\clf_xmlattdef {#1}{#2}{#3}}
-\def\xmlattribute #1#2#3{\clf_xmlattribute {#1}{#2}{#3}}
-\def\xmlattributedef #1#2#3#4{\clf_xmlattributedef {#1}{#2}{#3}{#4}}
-\def\xmlchainatt #1#2{\clf_xmlchainatt {#1}{/}{#2}}
-\def\xmlchainattdef #1#2#3{\clf_xmlchainattdef {#1}{/}{#2}{#3}}
-\def\xmlchecknamespace #1#2#3{\clf_xmlchecknamespace {#1}{#2}{#3}} % element
-\def\xmlcommand #1#2#3{\clf_xmlcommand {#1}{#2}{#3}}
+%def\xmlall #1#2{\clf_xmlall {#1}{#2}}
+%def\xmlatt #1#2{\clf_xmlatt {#1}{#2}}
+%def\xmlattdef #1#2#3{\clf_xmlattdef {#1}{#2}{#3}}
+%def\xmlattribute #1#2#3{\clf_xmlattribute {#1}{#2}{#3}}
+%def\xmlattributedef #1#2#3#4{\clf_xmlattributedef {#1}{#2}{#3}{#4}}
+%def\xmlchainatt #1#2{\clf_xmlchainatt {#1}{#2}}
+%def\xmlchainattdef #1#2#3{\clf_xmlchainattdef {#1}{#2}{#3}}
+%def\xmlchecknamespace #1#2#3{\clf_xmlchecknamespace {#1}{#2}{#3}} % element
+%def\xmlcommand #1#2#3{\clf_xmlcommand {#1}{#2}{#3}}
\def\xmlconcat #1#2#3{\clf_xmlconcat {#1}{#2}{\detokenize{#3}}}
\def\xmlconcatrange #1#2#3#4#5{\clf_xmlconcatrange {#1}{#2}{#3}{#4}{\detokenize{#5}}}
-\def\xmlcontext #1#2{\clf_xmlcontext {#1}{#2}}
-\def\xmlcount #1#2{\clf_xmlcount {#1}{#2}}
-\def\xmldelete #1#2{\clf_xmldelete {#1}{#2}}
-\def\xmldirect #1{\clf_xmldirect {#1}} % in loops, not dt but root
-\def\xmldirectives #1{\clf_xmldirectives {#1}}
-\def\xmldirectivesafter #1{\clf_xmldirectivesafter {#1}}
-\def\xmldirectivesbefore #1{\clf_xmldirectivesbefore {#1}}
-\def\xmldisplayverbatim #1{\clf_xmldisplayverbatim {#1}}
-\def\xmlelement #1#2{\clf_xmlelement {#1}{#2}}
-\def\xmlfilter #1#2{\clf_xmlfilter {#1}{#2}}
-\def\xmlfilterlist #1#2{\clf_xmlfilterlist {#1}{#2}}
-\def\xmlfirst #1#2{\clf_xmlfirst {#1}{#2}}
-\def\xmlflush #1{\clf_xmlflush {#1}}
-\def\xmlflushcontext #1{\clf_xmlflushcontext {#1}}
-\def\xmlflushlinewise #1{\clf_xmlflushlinewise {#1}}
-\def\xmlflushspacewise #1{\clf_xmlflushspacewise {#1}}
-\def\xmlfunction #1#2{\clf_xmlfunction {#1}{#2}}
-\def\xmlinclude #1#2#3{\clf_xmlinclude {#1}{#2}{#3}}
-\def\xmlincludeoptions#1#2#3#4{\clf_xmlincludeoptions {#1}{#2}{#3}{#4}}
-\def\xmlinclusion #1{\clf_xmlinclusion {#1}}
-\def\xmlinclusions #1{\clf_xmlinclusions {#1}}
-\def\xmlindex #1#2#3{\clf_xmlindex {#1}{#2}\numexpr#3\relax}
-\def\xmlinlineverbatim #1{\clf_xmlinlineverbatim {#1}}
-\def\xmllast #1#2{\clf_xmllast {#1}{#2}}
+%def\xmlcontext #1#2{\clf_xmlcontext {#1}{#2}}
+%def\xmlcount #1#2{\clf_xmlcount {#1}{#2}}
+%def\xmldelete #1#2{\clf_xmldelete {#1}{#2}}
+%def\xmldirect #1{\clf_xmldirect {#1}} % in loops, not dt but root
+%def\xmldirectives #1{\clf_xmldirectives {#1}}
+%def\xmldirectivesafter #1{\clf_xmldirectivesafter {#1}}
+%def\xmldirectivesbefore #1{\clf_xmldirectivesbefore {#1}}
+%def\xmldisplayverbatim #1{\clf_xmldisplayverbatim {#1}}
+%def\xmlelement #1#2{\clf_xmlelement {#1}{#2}}
+%def\xmlfilter #1#2{\clf_xmlfilter {#1}{#2}}
+%def\xmlfilterlist #1#2{\clf_xmlfilterlist {#1}{#2}}
+%def\xmlfirst #1#2{\clf_xmlfirst {#1}{#2}}
+%def\xmlflush #1{\clf_xmlflush {#1}}
+%def\xmlflushcontext #1{\clf_xmlflushcontext {#1}}
+%def\xmlflushlinewise #1{\clf_xmlflushlinewise {#1}}
+%def\xmlflushspacewise #1{\clf_xmlflushspacewise {#1}}
+%def\xmlfunction #1#2{\clf_xmlfunction {#1}{#2}}
+%def\xmlinclude #1#2#3{\clf_xmlinclude {#1}{#2}{#3}}
+%def\xmlincludeoptions#1#2#3#4{\clf_xmlincludeoptions {#1}{#2}{#3}{#4}}
+%def\xmlinclusion #1{\clf_xmlinclusion {#1}}
+%def\xmlinclusions #1{\clf_xmlinclusions {#1}}
+%def\xmlindex #1#2#3{\clf_xmlindex {#1}{#2}{#3}}
+%let\xmlposition \xmlindex
+%def\xmlinlineverbatim #1{\clf_xmlinlineverbatim {#1}}
+%def\xmllast #1#2{\clf_xmllast {#1}{#2}}
\def\xmlload #1#2{\clf_xmlload {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
\def\xmlloadbuffer #1#2{\clf_xmlloadbuffer {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
\def\xmlloaddata #1#2{\clf_xmlloaddata {#1}{#2}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
-\def\xmlloaddirectives #1{\clf_xmlloaddirectives {#1}}
+%def\xmlloaddirectives #1{\clf_xmlloaddirectives {#1}}
\def\xmlloadregistered #1#2{\clf_xmlloadregistered {#1}{\directxmlparameter\c!entities}{\directxmlparameter\c!compress}}
-\def\xmlmain #1{\clf_xmlmain {#1}}
-\def\xmlmatch #1{\clf_xmlmatch {#1}}
-\def\xmlname #1{\clf_xmlname {#1}}
-\def\xmlnamespace #1{\clf_xmlnamespace {#1}}
-\def\xmlnonspace #1#2{\clf_xmlnonspace {#1}{#2}}
-\def\xmlpos #1{\clf_xmlpos {#1}}
-\def\xmlraw #1#2{\clf_xmlraw {#1}{#2}}
-\def\xmlregisterns #1#2{\clf_xmlregisterns {#1}{#2}} % document
-\def\xmlremapname #1#2#3#4{\clf_xmlremapname {#1}{#2}{#3}{#4}} % element
-\def\xmlremapnamespace #1#2#3{\clf_xmlremapnamespace {#1}{#2}{#3}} % document
-\def\xmlsave #1#2{\clf_xmlsave {#1}{#2}}
-\def\xmlsetfunction #1#2#3{\clf_xmlsetfunction {#1}{#2}{#3}}
-\def\xmlsetsetup #1#2#3{\clf_xmlsetsetup {#1}{#2}{#3}}
-\def\xmlsnippet #1#2{\clf_xmlsnippet {#1}{#2}}
-\def\xmlstrip #1#2{\clf_xmlstrip {#1}{#2}}
-\def\xmlstripanywhere #1#2{\clf_xmlstripanywhere {#1}{#2}}
-\def\xmlstripnolines #1#2{\clf_xmlstripnolines {#1}{#2}}
-\def\xmlstripped #1#2{\clf_xmlstripped {#1}{#2}}
-\def\xmlstrippednolines #1#2{\clf_xmlstrippednolines {#1}{#2}}
-\def\xmltag #1{\clf_xmltag {#1}}
-\def\xmltext #1#2{\clf_xmltext {#1}{#2}}
-\def\xmltobuffer #1#2#3{\clf_xmltobuffer {#1}{#2}{#3}} % id pattern name
-\def\xmltobufferverbose #1#2#3{\clf_xmltobufferverbose {#1}{#2}{#3}} % id pattern name
-\def\xmltofile #1#2#3{\clf_xmltofile {#1}{#2}{#3}} % id pattern filename
-\def\xmltoparameters #1{\clf_xmltoparameters {#1}}
-\def\xmlverbatim #1{\clf_xmlverbatim {#1}}
+%def\xmlmain #1{\clf_xmlmain {#1}}
+%def\xmlmatch #1{\clf_xmlmatch {#1}}
+%def\xmlname #1{\clf_xmlname {#1}}
+%def\xmlnamespace #1{\clf_xmlnamespace {#1}}
+%def\xmlnonspace #1#2{\clf_xmlnonspace {#1}{#2}}
+%def\xmlpos #1{\clf_xmlpos {#1}}
+%def\xmlraw #1#2{\clf_xmlraw {#1}{#2}}
+%def\xmlregisterns #1#2{\clf_xmlregisterns {#1}{#2}} % document
+%def\xmlremapname #1#2#3#4{\clf_xmlremapname {#1}{#2}{#3}{#4}} % element
+%def\xmlremapnamespace #1#2#3{\clf_xmlremapnamespace {#1}{#2}{#3}} % document
+%def\xmlsave #1#2{\clf_xmlsave {#1}{#2}}
+%def\xmlsetfunction #1#2#3{\clf_xmlsetfunction {#1}{#2}{#3}}
+%def\xmlsetsetup #1#2#3{\clf_xmlsetsetup {#1}{#2}{#3}}
+%def\xmlsnippet #1#2{\clf_xmlsnippet {#1}{#2}}
+%def\xmlstrip #1#2{\clf_xmlstrip {#1}{#2}}
+%def\xmlstripanywhere #1#2{\clf_xmlstripanywhere {#1}{#2}}
+%def\xmlstripnolines #1#2{\clf_xmlstripnolines {#1}{#2}}
+%def\xmlstripped #1#2{\clf_xmlstripped {#1}{#2}}
+%def\xmlstrippednolines #1#2{\clf_xmlstrippednolines {#1}{#2}}
+%def\xmltag #1{\clf_xmltag {#1}}
+%def\xmltext #1#2{\clf_xmltext {#1}{#2}}
+%def\xmltobuffer #1#2#3{\clf_xmltobuffer {#1}{#2}{#3}} % id pattern name
+%def\xmltobufferverbose #1#2#3{\clf_xmltobufferverbose {#1}{#2}{#3}} % id pattern name
+%def\xmltofile #1#2#3{\clf_xmltofile {#1}{#2}{#3}} % id pattern filename
+%def\xmltoparameters #1{\clf_xmltoparameters {#1}}
+%def\xmlverbatim #1{\clf_xmlverbatim {#1}}
+
+% experiment:
+\let\xmlall \clf_xmlall
+\let\xmlatt \clf_xmlatt
+\let\xmlattdef \clf_xmlattdef
+\let\xmlattribute \clf_xmlattribute
+\let\xmlattributedef \clf_xmlattributedef
+\let\xmlchainatt \clf_xmlchainatt
+\let\xmlchainattdef \clf_xmlchainattdef
+\let\xmlchecknamespace \clf_xmlchecknamespace
+\let\xmlcommand \clf_xmlcommand
+% \xmlconcat
+% \xmlconcatrange
+\let\xmlcontext \clf_xmlcontext
+\let\xmlcount \clf_xmlcount
+\let\xmldelete \clf_xmldelete
+\let\xmldirect \clf_xmldirect % in loops, not dt but root
+\let\xmldirectives \clf_xmldirectives
+\let\xmldirectivesafter \clf_xmldirectivesafter
+\let\xmldirectivesbefore \clf_xmldirectivesbefore
+\let\xmldisplayverbatim \clf_xmldisplayverbatim
+\let\xmlelement \clf_xmlelement
+\let\xmlfilter \clf_xmlfilter
+\let\xmlfilterlist \clf_xmlfilterlist
+\let\xmlfirst \clf_xmlfirst
+\let\xmlflush \clf_xmlflush
+\let\xmlflushcontext \clf_xmlflushcontext
+\let\xmlflushlinewise \clf_xmlflushlinewise
+\let\xmlflushspacewise \clf_xmlflushspacewise
+\let\xmlfunction \clf_xmlfunction
+\let\xmlinclude \clf_xmlinclude
+\let\xmlincludeoptions \clf_xmlincludeoptions
+\let\xmlinclusion \clf_xmlinclusion
+\let\xmlinclusions \clf_xmlinclusions
+\let\xmlindex \clf_xmlindex
+\let\xmlposition \clf_xmlindex
+\let\xmlinlineverbatim \clf_xmlinlineverbatim
+\let\xmllast \clf_xmllast
+% \xmlload
+% \xmlloadbuffer
+% \xmlloaddata
+\let\xmlloaddirectives \clf_xmlloaddirectives
+% \xmlloadregistered
+\let\xmlmain \clf_xmlmain
+\let\xmlmatch \clf_xmlmatch
+\let\xmlname \clf_xmlname
+\let\xmlnamespace \clf_xmlnamespace
+\let\xmlnonspace \clf_xmlnonspace
+\let\xmlpos \clf_xmlpos
+\let\xmlraw \clf_xmlraw
+\let\xmlregisterns \clf_xmlregisterns % document
+\let\xmlremapname \clf_xmlremapname % element
+\let\xmlremapnamespace \clf_xmlremapnamespace % document
+\let\xmlsave \clf_xmlsave
+\let\xmlsetfunction \clf_xmlsetfunction
+\let\xmlsetsetup \clf_xmlsetsetup
+\let\xmlsnippet \clf_xmlsnippet
+\let\xmlstrip \clf_xmlstrip
+\let\xmlstripanywhere \clf_xmlstripanywhere
+\let\xmlstripnolines \clf_xmlstripnolines
+\let\xmlstripped \clf_xmlstripped
+\let\xmlstrippednolines \clf_xmlstrippednolines
+\let\xmltag \clf_xmltag
+\let\xmltext \clf_xmltext
+\let\xmltobuffer \clf_xmltobuffer % id pattern name
+\let\xmltobufferverbose \clf_xmltobufferverbose % id pattern name
+\let\xmltofile \clf_xmltofile % id pattern filename
+\let\xmltoparameters \clf_xmltoparameters
+\let\xmlverbatim \clf_xmlverbatim
\def\xmlinfo #1{\hbox{\ttxx[\clf_xmlinfo{#1}]}}
\def\xmlshow #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked}
@@ -117,24 +185,41 @@
% kind of special:
-\def\xmlstartraw{\clf_xmlstartraw} % \let
-\def\xmlstopraw {\clf_xmlstopraw} % \let
-
-% todo: \xmldoifelseattribute
-
-\def\xmldoif #1#2{\clf_xmldoif {#1}{#2}} % expandable
-\def\xmldoifnot #1#2{\clf_xmldoifnot {#1}{#2}} % expandable
-\def\xmldoifelse #1#2{\clf_xmldoifelse {#1}{#2}} % expandable
-\def\xmldoiftext #1#2{\clf_xmldoiftext {#1}{#2}} % expandable
-\def\xmldoifnottext #1#2{\clf_xmldoifnottext {#1}{#2}} % expandable
-\def\xmldoifelsetext #1#2{\clf_xmldoifelsetext {#1}{#2}} % expandable
-
-\def\xmldoifempty #1#2{\clf_xmldoifempty {#1}{#2}}
-\def\xmldoifnotempty #1#2{\clf_xmldoifnotempty {#1}{#2}}
-\def\xmldoifelseempty #1#2{\clf_xmldoifelseempty {#1}{#2}}
-\def\xmldoifselfempty #1{\clf_xmldoifselfempty {#1}}
-\def\xmldoifnotselfempty #1{\clf_xmldoifnotselfempty {#1}}
-\def\xmldoifelseselfempty #1{\clf_xmldoifelseselfempty{#1}}
+%def\xmlstartraw{\clf_xmlstartraw}
+%def\xmlstopraw {\clf_xmlstopraw}
+
+\let\xmlstartraw\clf_xmlstartraw
+\let\xmlstopraw \clf_xmlstopraw
+
+% these are expandable! todo: \xmldoifelseattribute
+
+%def\xmldoif #1#2{\clf_xmldoif {#1}{#2}}
+%def\xmldoifnot #1#2{\clf_xmldoifnot {#1}{#2}}
+%def\xmldoifelse #1#2{\clf_xmldoifelse {#1}{#2}}
+%def\xmldoiftext #1#2{\clf_xmldoiftext {#1}{#2}}
+%def\xmldoifnottext #1#2{\clf_xmldoifnottext {#1}{#2}}
+%def\xmldoifelsetext #1#2{\clf_xmldoifelsetext {#1}{#2}}
+
+%def\xmldoifempty #1#2{\clf_xmldoifempty {#1}{#2}}
+%def\xmldoifnotempty #1#2{\clf_xmldoifnotempty {#1}{#2}}
+%def\xmldoifelseempty #1#2{\clf_xmldoifelseempty {#1}{#2}}
+%def\xmldoifselfempty #1{\clf_xmldoifselfempty {#1}}
+%def\xmldoifnotselfempty #1{\clf_xmldoifnotselfempty {#1}}
+%def\xmldoifelseselfempty #1{\clf_xmldoifelseselfempty{#1}}
+
+\let\xmldoif \clf_xmldoif
+\let\xmldoifnot \clf_xmldoifnot
+\let\xmldoifelse \clf_xmldoifelse
+\let\xmldoiftext \clf_xmldoiftext
+\let\xmldoifnottext \clf_xmldoifnottext
+\let\xmldoifelsetext \clf_xmldoifelsetext
+
+\let\xmldoifempty \clf_xmldoifempty
+\let\xmldoifnotempty \clf_xmldoifnotempty
+\let\xmldoifelseempty \clf_xmldoifelseempty
+\let\xmldoifselfempty \clf_xmldoifselfempty
+\let\xmldoifnotselfempty \clf_xmldoifnotselfempty
+\let\xmldoifelseselfempty \clf_xmldoifelseselfempty
% \startxmlsetups xml:include
% \xmlinclude{main}{include}{filename|href}
@@ -349,8 +434,8 @@
\setnewconstant\xmlautoentities\plusone % 0=off, 1=upper, 2=upper,lower
-\def\xmlsetentity#1#2{\clf_xmlsetentity{#1}{\detokenize{#2}}}
-\def\xmltexentity#1#2{\clf_xmltexentity{#1}{\detokenize{#2}}}
+\unexpanded\def\xmlsetentity#1#2{\clf_xmlsetentity{#1}{\detokenize{#2}}}
+\unexpanded\def\xmltexentity#1#2{\clf_xmltexentity{#1}{\detokenize{#2}}}
% \xmlsetentity{tex}{\TEX{}} % {} needed
diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua
index 3e2ce82c5..383c06aa0 100644
--- a/tex/context/base/lxml-tex.lua
+++ b/tex/context/base/lxml-tex.lua
@@ -1490,7 +1490,7 @@ end
lxml.content = text
function lxml.position(id,pattern,n)
- position(xmlapplylpath(getid(id),pattern),n)
+ position(xmlapplylpath(getid(id),pattern),tonumber(n))
end
function lxml.chainattribute(id,pattern,a,default)
@@ -1506,7 +1506,7 @@ function lxml.concat(id,pattern,separator,lastseparator,textonly)
end
function lxml.element(id,n)
- position(xmlapplylpath(getid(id),"/*"),n)
+ position(xmlapplylpath(getid(id),"/*"),tonumber(n)) -- tonumber handy
end
lxml.index = lxml.position
diff --git a/tex/context/base/math-frc.lua b/tex/context/base/math-frc.lua
index 1485c2159..639edc94b 100644
--- a/tex/context/base/math-frc.lua
+++ b/tex/context/base/math-frc.lua
@@ -53,5 +53,5 @@ end
interfaces.implement {
name = "mathfraction",
actions = mathfraction,
- arguments = { "string", "integer", "dimen", "dimen" }
+ arguments = { "string", "number", "number", "dimen" }
}
diff --git a/tex/context/base/math-frc.mkiv b/tex/context/base/math-frc.mkiv
index 90778810e..6b7b91d7b 100644
--- a/tex/context/base/math-frc.mkiv
+++ b/tex/context/base/math-frc.mkiv
@@ -223,8 +223,8 @@
\def\math_frac_command
{\clf_mathfraction
{\mathfractionparameter\c!rule}%
- \numexpr\mathfractionparameter\c!left\relax
- \numexpr\mathfractionparameter\c!right\relax
+ \mathfractionparameter\c!left\space
+ \mathfractionparameter\c!right\space
\dimexpr\mathfractionparameter\c!rulethickness\relax
\relax}
diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv
index 2002834b1..1c6179523 100644
--- a/tex/context/base/math-ini.mkiv
+++ b/tex/context/base/math-ini.mkiv
@@ -331,21 +331,21 @@
\unexpanded\def\boldsymbol
{\mathortext\mathboldsymbol\bold}
-%D Helpers (assume {} being used):
+%D Helpers
-\let\utfmathclass \clf_utfmathclass
-\let\utfmathstretch \clf_utfmathstretch
-\let\utfmathcommand \clf_utfmathcommand
-\let\utfmathfiller \clf_utfmathfiller
+\def\utfmathclass #1{\clf_utfmathclass {#1}}
+\def\utfmathstretch#1{\clf_utfmathstretch{#1}}
+\def\utfmathcommand#1{\clf_utfmathcommand{#1}}
+\def\utfmathfiller #1{\clf_utfmathfiller {#1}}
-\let\utfmathcommandabove \clf_utfmathcommandabove
-\let\utfmathcommandbelow \clf_utfmathcommandbelow
-\let\utfmathcommandfiller\clf_utfmathcommandfiller
+\def\utfmathcommandabove #1{\clf_utfmathcommandabove {#1}}
+\def\utfmathcommandbelow #1{\clf_utfmathcommandbelow {#1}}
+\def\utfmathcommandfiller#1{\clf_utfmathcommandfiller{#1}}
-\unexpanded\def\doifelseutfmathaccent{\clf_doifelseutfmathaccent}
-\unexpanded\def\doifelseutfmathabove {\clf_doifelseutfmathabove }
-\unexpanded\def\doifelseutfmathbelow {\clf_doifelseutfmathbelow }
-\unexpanded\def\doifelseutfmathfiller{\clf_doifelseutfmathfiller}
+\unexpanded\def\doifelseutfmathaccent#1{\clf_doifelseutfmathaccent{#1}}
+\unexpanded\def\doifelseutfmathabove #1{\clf_doifelseutfmathabove {#1}}
+\unexpanded\def\doifelseutfmathbelow #1{\clf_doifelseutfmathbelow {#1}}
+\unexpanded\def\doifelseutfmathfiller#1{\clf_doifelseutfmathfiller{#1}}
%D Not used that much:
diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv
index 3d70feb34..2c4023de8 100644
--- a/tex/context/base/meta-ini.mkiv
+++ b/tex/context/base/meta-ini.mkiv
@@ -297,28 +297,6 @@
\edef\currentMPformat{\MPinstanceparameter\s!format}%
\meta_process_graphic}
-% \unexpanded\def\meta_process_graphic#1% todo: extensions and inclusions outside beginfig
-% {\meta_start_current_graphic
-% \forgetall
-% \edef\p_extensions{\MPinstanceparameter\s!extensions}%
-% \meta_process_graphic_start
-% \normalexpanded{\noexpand\ctxlua{metapost.graphic {
-% instance = "\currentMPinstance",
-% format = "\currentMPformat",
-% data = \!!bs#1;\!!es,
-% initializations = \!!bs\meta_flush_current_initializations\!!es,
-% % useextensions = "\MPinstanceparameter\s!extensions",
-% \ifx\p_extensions\v!yes
-% extensions = \!!bs\clf_getmpextensions{\currentMPinstance}\!!es,
-% \fi
-% inclusions = \!!bs\meta_flush_current_inclusions\!!es,
-% definitions = \!!bs\meta_flush_current_definitions\!!es,
-% figure = "\MPaskedfigure",
-% method = "\MPinstanceparameter\c!method",
-% }}}%
-% \meta_process_graphic_stop
-% \meta_stop_current_graphic}
-
\unexpanded\def\meta_process_graphic#1% todo: extensions and inclusions outside beginfig
{\meta_start_current_graphic
\forgetall
@@ -330,7 +308,7 @@
data {#1;}%
initializations {\meta_flush_current_initializations}%
\ifx\p_extensions\v!yes
- extensions {\clf_getmpextensions{\currentMPinstance}}%
+ extensions {\clf_getmpextensions{\currentMPinstance}}% goes through tex again
\fi
inclusions {\meta_flush_current_inclusions}%
definitions {\meta_flush_current_definitions}%
@@ -460,19 +438,6 @@
\fi
\endgroup}
-% \def\meta_grab_clip_path_indeed
-% {\meta_start_current_graphic
-% \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath {
-% instance = "\currentMPinstance",
-% format = "\currentMPformat",
-% data = \!!bs\csname\??mpclip\currentMPclip\endcsname\!!es,
-% initializations = \!!bs\meta_flush_current_initializations\!!es,
-% useextensions = "\MPinstanceparameter\s!extensions",
-% inclusions = \!!bs\meta_flush_current_inclusions\!!es,
-% method = "\MPinstanceparameter\c!method",
-% }}}}%
-% \meta_stop_current_graphic}
-
\def\meta_grab_clip_path_indeed
{\meta_start_current_graphic
\normalexpanded{\noexpand\clf_mpsetclippath
diff --git a/tex/context/base/mlib-ctx.lua b/tex/context/base/mlib-ctx.lua
index 43c4b4c42..f259113f4 100644
--- a/tex/context/base/mlib-ctx.lua
+++ b/tex/context/base/mlib-ctx.lua
@@ -23,14 +23,9 @@ local mplib = mplib
metapost = metapost or {}
local metapost = metapost
-local scanners = tokens.scanners
-local scanstring = scanners.string
-local scaninteger = scanners.integer
local setters = tokens.setters
local setmacro = setters.macro
-
-local compilescanner = tokens.compile
-local scanners = interfaces.scanners
+local implement = interfaces.implement
local v_no = interfaces.variables.no
@@ -94,12 +89,14 @@ end
-- context(metapost.getextensions(instance,state))
-- end
-scanners.setmpextensions = compilescanner {
+implement {
+ name = "setmpextensions",
actions = metapost.setextensions,
arguments = { "string", "string" }
}
-scanners.getmpextensions = compilescanner {
+implement {
+ name = "getmpextensions",
actions = { metapost.getextensions, context } ,
arguments = "string"
}
@@ -107,7 +104,13 @@ scanners.getmpextensions = compilescanner {
local report_metapost = logs.reporter ("metapost")
local status_metapost = logs.messenger("metapost")
-local patterns = { "meta-imp-%s.mkiv", "meta-imp-%s.tex", "meta-%s.mkiv", "meta-%s.tex" } -- we are compatible
+local patterns = {
+ "meta-imp-%s.mkiv",
+ "meta-imp-%s.tex",
+ -- obsolete:
+ "meta-%s.mkiv",
+ "meta-%s.tex"
+}
local function action(name,foundname)
status_metapost("library %a is loaded",name)
@@ -120,59 +123,74 @@ local function failure(name)
report_metapost("library %a is unknown or invalid",name)
end
-scanners.useMPlibrary = function() -- name
- commands.uselibrary {
- name = scanstring(),
- patterns = patterns,
- action = action,
- failure = failure,
- onlyonce = true,
- }
-end
+implement {
+ name = "useMPlibrary",
+ arguments = "string",
+ actions = function(name)
+ resolvers.uselibrary {
+ name = name,
+ patterns = patterns,
+ action = action,
+ failure = failure,
+ onlyonce = true,
+ }
+ end
+}
-- metapost.variables = { } -- to be stacked
-scanners.mprunvar = function() -- name
- local value = metapost.variables[scanstring()]
- if value ~= nil then
- local tvalue = type(value)
- if tvalue == "table" then
- context(concat(value," "))
- elseif tvalue == "number" or tvalue == "boolean" then
- context(tostring(value))
- elseif tvalue == "string" then
- context(value)
+implement {
+ name = "mprunvar",
+ arguments = "string",
+ actions = function(name)
+ local value = metapost.variables[name]
+ if value ~= nil then
+ local tvalue = type(value)
+ if tvalue == "table" then
+ context(concat(value," "))
+ elseif tvalue == "number" or tvalue == "boolean" then
+ context(tostring(value))
+ elseif tvalue == "string" then
+ context(value)
+ end
end
end
-end
+}
-scanners.mpruntab = function() -- name n
- local value = metapost.variables[scanstring()]
- if value ~= nil then
- local tvalue = type(value)
- if tvalue == "table" then
- context(value[scaninteger()])
- elseif tvalue == "number" or tvalue == "boolean" then
- context(tostring(value))
- elseif tvalue == "string" then
- context(value)
+implement {
+ name = "mpruntab",
+ arguments = { "string", "integer" },
+ actions = function(name,n)
+ local value = metapost.variables[name]
+ if value ~= nil then
+ local tvalue = type(value)
+ if tvalue == "table" then
+ context(value[n])
+ elseif tvalue == "number" or tvalue == "boolean" then
+ context(tostring(value))
+ elseif tvalue == "string" then
+ context(value)
+ end
end
end
-end
+}
-scanners.mprunset = function() -- name connector
- local value = metapost.variables[scanstring()]
- if value ~= nil then
- local tvalue = type(value)
- if tvalue == "table" then
- context(concat(value,scanstring()))
- elseif tvalue == "number" or tvalue == "boolean" then
- context(tostring(value))
- elseif tvalue == "string" then
- context(value)
+implement {
+ name = "mprunset",
+ actions = function(name,connector)
+ local value = metapost.variables[name]
+ if value ~= nil then
+ local tvalue = type(value)
+ if tvalue == "table" then
+ context(concat(value,connector))
+ elseif tvalue == "number" or tvalue == "boolean" then
+ context(tostring(value))
+ elseif tvalue == "string" then
+ context(value)
+ end
end
end
-end
+}
-- we need to move more from pps to here as pps is the plugin .. the order is a mess
-- or just move the scanners to pps
@@ -181,64 +199,40 @@ function metapost.graphic(specification)
metapost.graphic_base_pass(setmpsformat(specification))
end
--- scanners.mpgraphic = compilescanner {
--- actions = { setmpsformat, metapost.graphic_base_pass }, -- not yet implemented
--- arguments = {
--- {
--- { "instance" },
--- { "format" },
--- { "data" },
--- { "initializations" },
--- { "extensions" },
--- { "inclusions" },
--- { "definitions" },
--- { "figure" },
--- { "method" },
--- },
--- }
--- }
-
-local get_mpgraphic_spec = compilescanner {
- {
- { "instance" },
- { "format" },
- { "data" },
- { "initializations" },
- { "extensions" },
- { "inclusions" },
- { "definitions" },
- { "figure" },
- { "method" },
+implement {
+ name = "mpgraphic",
+ actions = function(specification) metapost.graphic_base_pass(setmpsformat(specification)) end, -- not yet implemented
+ arguments = {
+ {
+ { "instance" },
+ { "format" },
+ { "data" },
+ { "initializations" },
+ { "extensions" },
+ { "inclusions" },
+ { "definitions" },
+ { "figure" },
+ { "method" },
+ }
}
}
-scanners.mpgraphic = function()
- metapost.graphic_base_pass(setmpsformat(get_mpgraphic_spec()))
-end
-
--- scanners.mpsetoutercolor = compilescanner {
--- action = metapost.setoutercolor, -- not yet implemented
--- arguments = { "integer", "integer", "integer", "integer" }
--- }
-
-scanners.mpsetoutercolor = function()
- metapost.setoutercolor(scaninteger(),scaninteger(),scaninteger(),scaninteger())
-end
-
--- scanners.mpflushreset = metapost.flushreset -- will become obsolete and internal
-
-scanners.mpflushreset = function()
- metapost.flushreset()
-end
+implement {
+ name = "mpsetoutercolor",
+ actions = function(...) metapost.setoutercolor(...) end, -- not yet implemented
+ arguments = { "integer", "integer", "integer", "integer" }
+}
--- scanners.mpflushliteral = compilescanner {
--- action = metapost.flushliteral, -- not yet implemented
--- arguments = "string",
--- }
+implement {
+ name = "mpflushreset",
+ actions = function() metapost.flushreset() end -- not yet implemented
+}
-scanners.mpflushliteral = function()
- metapost.flushliteral(scanstring())
-end
+implement {
+ name = "mpflushliteral",
+ actions = function(str) metapost.flushliteral(str) end, -- not yet implemented
+ arguments = "string",
+}
function metapost.getclippath(specification) -- why not a special instance for this
setmpsformat(specification)
@@ -295,22 +289,24 @@ function metapost.theclippath(...)
end
end
-local get_mpsetclippath_spec = compilescanner {
- {
- { "instance" },
- { "format" },
- { "data" },
- { "initializations" },
- { "useextensions" },
- { "inclusions" },
- { "method" },
- },
+implement {
+ name = "mpsetclippath",
+ actions = function(specification)
+ setmacro("MPclippath",metapost.theclippath(specification),"global")
+ end,
+ arguments = {
+ {
+ { "instance" },
+ { "format" },
+ { "data" },
+ { "initializations" },
+ { "useextensions" },
+ { "inclusions" },
+ { "method" },
+ },
+ }
}
-scanners.mpsetclippath = function()
- setmacro("MPclippath",metapost.theclippath(get_mpsetclippath_spec()),"global")
-end
-
statistics.register("metapost processing time", function()
local n = metapost.n
if n and n > 0 then
@@ -344,6 +340,10 @@ function mptex.set(str)
environments[#environments+1] = str
end
+function mptex.setfrombuffer(name)
+ environments[#environments+1] = buffers.content(name)
+end
+
function mptex.get()
return concat(environments,"\n")
end
@@ -352,18 +352,24 @@ function mptex.reset()
environments = { }
end
-scanners.mptexset = function()
- environments[#environments+1] = scanstring()
-end
+implement {
+ name = "mptexset",
+ arguments = "string",
+ actions = mptex.set
+}
-scanners.mptexget = function()
- context(concat(environments,"\n"))
-end
+implement {
+ name = "mptexsetfrombuffer",
+ arguments = "string",
+ actions = mptex.setfrombuffer
+}
-scanners.mptexsetfrombuffer = function()
- environments[#environments+1] = buffers.content(scanstring())
-end
+implement {
+ name = "mptexget",
+ actions = { mptex.get, context }
+}
-scanners.mptexreset = function()
- environments = { }
-end
+implement {
+ name = "mptexreset",
+ actions = mptex.reset
+}
diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv
index 2cc1c6399..bc178fdb6 100644
--- a/tex/context/base/mult-aux.mkiv
+++ b/tex/context/base/mult-aux.mkiv
@@ -783,11 +783,11 @@
\else
\global\advance\c_mult_interfaces_n_of_namespaces\plusone
\expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template}%
- \ctxcommand{registernamespace(\number\c_mult_interfaces_n_of_namespaces,"#1")}%
+ \clf_registernamespace\c_mult_interfaces_n_of_namespaces{#1}%
\fi}
\def\mult_interfaces_get_parameters_error_indeed#1#2%
- {\ctxcommand{showassignerror("#1","#2",\the\inputlineno)}} % no longer \waitonfatalerror
+ {\clf_showassignerror{#1}{#2}\inputlineno} % no longer \waitonfatalerror
% We install two core namespaces here, as we want nice error messages. Maybe
% we will reserve the first 9.
diff --git a/tex/context/base/mult-ini.lua b/tex/context/base/mult-ini.lua
index c64ac8c05..17b92de28 100644
--- a/tex/context/base/mult-ini.lua
+++ b/tex/context/base/mult-ini.lua
@@ -287,7 +287,7 @@ function interfaces.writestatus(category,message)
reporters[category](message) -- could also be a setmetatablecall
end
-implement { name = "registernamespace", actions = interfaces.registernamespace, arguments = { "string", "string" } }
+implement { name = "registernamespace", actions = interfaces.registernamespace, arguments = { "integer", "string" } }
implement { name = "setinterfaceconstant", actions = interfaces.setconstant, arguments = { "string", "string" } }
implement { name = "setinterfacevariable", actions = interfaces.setvariable, arguments = { "string", "string" } }
implement { name = "setinterfaceelement", actions = interfaces.setelement, arguments = { "string", "string" } }
@@ -319,6 +319,7 @@ local function showassignerror(namespace,key,line)
if ns then
namespace = corenamespaces[tonumber(ns)] or ns
end
+ -- injected in the stream for timing:
if instance and instance ~= "" then
context.writestatus("setup",formatters["error in line %a, namespace %a, instance %a, key %a"](line,namespace,instance,key))
else
diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua
index 9527cc2e8..d14f4a6da 100644
--- a/tex/context/base/node-ref.lua
+++ b/tex/context/base/node-ref.lua
@@ -90,6 +90,8 @@ local free_node = nuts.free
local tosequence = nodes.tosequence
+local implement = interfaces.implement
+
-- Normally a (destination) area is a box or a simple stretch if nodes but when it is
-- a paragraph we hav ea problem: we cannot calculate the height well. This happens
-- with footnotes or content broken across a page.
@@ -667,17 +669,17 @@ function references.mark(reference,h,d,view)
return setdestination(tex.currentgrouplevel,h,d,reference,view)
end
-function references.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible
+function references.inject(prefix,reference,specification) -- todo: use currentreference is possible
-- print(prefix,reference,h,d,highlight,newwindow,layer)
local set, bug = references.identify(prefix,reference)
if bug or #set == 0 then
-- unknown ref, just don't set it and issue an error
else
-- check
- set.highlight = highlight
- set.newwindow = newwindow
- set.layer = layer
- setreference(h,d,set) -- sets attribute / todo: for set[*].error
+ set.highlight = specification.highlight
+ set.newwindow = specification.newwindow
+ set.layer = specification.layer
+ setreference(specification.height,specification.depth,set) -- sets attribute / todo: for set[*].error
end
end
@@ -688,8 +690,32 @@ function references.injectcurrentset(h,d) -- used inside doifelse
end
end
-commands.injectreference = references.inject
-commands.injectcurrentreference = references.injectcurrentset
+implement {
+ name = "injectreference",
+ actions = references.inject,
+ arguments = {
+ "string",
+ "string",
+ {
+ { "highlight", "boolean" },
+ { "newwindow", "boolean" },
+ { "layer" },
+ { "height", "dimen" },
+ { "depth", "dimen" },
+ }
+ }
+}
+
+implement {
+ name = "injectcurrentreference",
+ actions = references.injectcurrentset,
+}
+
+implement {
+ name = "injectcurrentreference_dimensions",
+ actions = references.injectcurrentset,
+ arguments = { "dimen", "dimen" },
+}
--
diff --git a/tex/context/base/pack-com.mkiv b/tex/context/base/pack-com.mkiv
index 4f4bc9f47..735f04714 100644
--- a/tex/context/base/pack-com.mkiv
+++ b/tex/context/base/pack-com.mkiv
@@ -178,7 +178,7 @@
\unexpanded\def\pack_common_caption_stop {\removeunwantedspaces\egroup}
\unexpanded\def\stopcombination
- {\bgroup\normalexpanded{\egroup{}\ctxcommand{ntimes("{}{}",\number\c_pack_combinations_n)}}% brr
+ {\bgroup\normalexpanded{\egroup{}\ntimes{{}{}}\c_pack_combinations_n}% brr
\dostoptagged
\egroup
\egroup}
diff --git a/tex/context/base/page-lin.mkvi b/tex/context/base/page-lin.mkvi
index c55a1228b..7fbde3df8 100644
--- a/tex/context/base/page-lin.mkvi
+++ b/tex/context/base/page-lin.mkvi
@@ -535,7 +535,7 @@
% eventually we will do this in lua
-\def\currentreferencelinenumber{\ctxcommand{filterreference("linenumber")}}
+\def\currentreferencelinenumber{\clf_filterreference{linenumber}}
\let\m_page_lines_from\empty
\let\m_page_lines_to \empty
diff --git a/tex/context/base/page-mix.lua b/tex/context/base/page-mix.lua
index e5e5cdb5e..474d010bf 100644
--- a/tex/context/base/page-mix.lua
+++ b/tex/context/base/page-mix.lua
@@ -13,6 +13,7 @@ if not modules then modules = { } end modules ["page-mix"] = {
-- local trackers, logs, storage = trackers, logs, storage
-- local number, table = number, table
+local next, type = next, type
local concat = table.concat
local ceil, floor = math.ceil, math.floor
@@ -84,6 +85,9 @@ local v_more = variables.more
local v_less = variables.less
local v_halfline = variables.halfline
+local context = context
+local implement = interfaces.implement
+
pagebuilders = pagebuilders or { }
pagebuilders.mixedcolumns = pagebuilders.mixedcolumns or { }
local mixedcolumns = pagebuilders.mixedcolumns
@@ -224,7 +228,7 @@ local function stripbottomglue(results,discarded)
return height
end
-local function setsplit(specification) -- a rather large function
+local function preparesplit(specification) -- a rather large function
local box = specification.box
if not box then
report_state("fatal error, no box")
@@ -718,7 +722,7 @@ local kept = head
return specification
end
-function mixedcolumns.finalize(result)
+local function finalize(result)
if result then
local results = result.results
local columns = result.nofcolumns
@@ -775,12 +779,12 @@ local function report_deltas(result,str)
report_state("%s, cycles %s, deltas % | t",str,result.cycle or 1,t)
end
-function mixedcolumns.setsplit(specification)
+local function setsplit(specification)
splitruns = splitruns + 1
if trace_state then
report_state("split run %s",splitruns)
end
- local result = setsplit(specification)
+ local result = preparesplit(specification)
if result then
if result.overflow then
if trace_state then
@@ -793,7 +797,7 @@ function mixedcolumns.setsplit(specification)
local cycles = specification.cycles or 100
while result.rest and cycle <= cycles do
specification.extra = cycle * step
- result = setsplit(specification) or result
+ result = preparesplit(specification) or result
if trace_state then
report_state("cycle: %s.%s, original height %p, total height %p",
splitruns,cycle,result.originalheight,result.nofcolumns*result.targetheight)
@@ -815,7 +819,7 @@ function mixedcolumns.setsplit(specification)
end
end
-function mixedcolumns.getsplit(result,n)
+local function getsplit(result,n)
if not result then
report_state("flush, column %s, no result",n)
return
@@ -927,19 +931,19 @@ function mixedcolumns.getsplit(result,n)
return v
end
-function mixedcolumns.getrest(result)
+local function getrest(result)
local rest = result and result.rest
result.rest = nil -- to be sure
return rest
end
-function mixedcolumns.getlist(result)
+local function getlist(result)
local originalhead = result and result.originalhead
result.originalhead = nil -- to be sure
return originalhead
end
-function mixedcolumns.cleanup(result)
+local function cleanup(result)
local discarded = result.discarded
for i=1,#discarded do
freenode(discarded[i])
@@ -947,52 +951,100 @@ function mixedcolumns.cleanup(result)
result.discarded = { }
end
+mixedcolumns.setsplit = setsplit
+mixedcolumns.getsplit = getsplit
+mixedcolumns.finalize = finalize
+mixedcolumns.getrest = getrest
+mixedcolumns.getlist = getlist
+mixedcolumns.cleanup = cleanup
+
-- interface --
local result
-function commands.mixsetsplit(specification)
- if result then
- for k, v in next, specification do
- result[k] = v
+implement {
+ name = "mixsetsplit",
+ actions = function(specification)
+ if result then
+ for k, v in next, specification do
+ result[k] = v
+ end
+ result = setsplit(result)
+ else
+ result = setsplit(specification)
end
- result = mixedcolumns.setsplit(result)
- else
- result = mixedcolumns.setsplit(specification)
- end
-end
+ end,
+ arguments = {
+ {
+ { "box", "integer" },
+ { "nofcolumns", "integer" },
+ { "maxheight", "dimen" },
+ { "step", "dimen" },
+ { "cycles", "integer" },
+ { "preheight", "dimen" },
+ { "prebox", "integer" },
+ { "strutht", "dimen" },
+ { "strutdp", "dimen" },
+ { "threshold", "dimen" },
+ { "splitmethod" },
+ { "balance" },
+ { "alternative" },
+ { "internalgrid" },
+ { "grid", "boolean" },
+ }
+ }
+}
-function commands.mixgetsplit(n)
- if result then
- context(tonode(mixedcolumns.getsplit(result,n)))
- end
-end
+implement {
+ name = "mixgetsplit",
+ arguments = "integer",
+ actions = function(n)
+ if result then
+ context(tonode(getsplit(result,n)))
+ end
+ end,
+}
-function commands.mixfinalize()
- if result then
- mixedcolumns.finalize(result)
+implement {
+ name = "mixfinalize",
+ actions = function()
+ if result then
+ finalize(result)
+ end
end
-end
+}
-function commands.mixflushrest()
- if result then
- context(tonode(mixedcolumns.getrest(result)))
+implement {
+ name = "mixflushrest",
+ actions = function()
+ if result then
+ context(tonode(getrest(result)))
+ end
end
-end
+}
-function commands.mixflushlist()
- if result then
- context(tonode(mixedcolumns.getlist(result)))
+implement {
+ name = "mixflushlist",
+ actions = function()
+ if result then
+ context(tonode(getlist(result)))
+ end
end
-end
+}
-function commands.mixstate()
- context(result and result.rest and 1 or 0)
-end
+implement {
+ name = "mixstate",
+ actions = function()
+ context(result and result.rest and 1 or 0)
+ end
+}
-function commands.mixcleanup()
- if result then
- mixedcolumns.cleanup(result)
- result = nil
+implement {
+ name = "mixcleanup",
+ actions = function()
+ if result then
+ cleanup(result)
+ result = nil
+ end
end
-end
+}
diff --git a/tex/context/base/page-mix.mkiv b/tex/context/base/page-mix.mkiv
index 4a86dfcf4..f69f6ac0e 100644
--- a/tex/context/base/page-mix.mkiv
+++ b/tex/context/base/page-mix.mkiv
@@ -544,23 +544,23 @@
\unexpanded\def\page_mix_routine_construct#1%
{\d_page_mix_max_height\mixedcolumnsparameter\c!maxheight % can have changed due to header=high
- \ctxcommand{mixsetsplit {
- box = \number\b_page_mix_collected,
- nofcolumns = \number\c_page_mix_n_of_columns,
- maxheight = \number\d_page_mix_max_height,
- step = \number\d_page_mix_balance_step,
- cycles = \number\c_page_mix_balance_cycles,
- preheight = \number\d_page_mix_preceding_height,
- prebox = \number\b_page_mix_preceding,
- strutht = \number\strutht,
- strutdp = \number\strutdp,
- threshold = \number\d_page_mix_threshold,
- splitmethod = "\mixedcolumnsparameter\c!splitmethod",
- balance = "#1",
- alternative = "\mixedcolumnsparameter\c!alternative",
- grid = \ifgridsnapping true\else false\fi,
- internalgrid = "\mixedcolumnsparameter\c!internalgrid",
- }}%
+ \clf_mixsetsplit
+ box \b_page_mix_collected
+ nofcolumns \c_page_mix_n_of_columns
+ maxheight \d_page_mix_max_height
+ step \d_page_mix_balance_step
+ cycles \c_page_mix_balance_cycles
+ preheight \d_page_mix_preceding_height
+ prebox \b_page_mix_preceding
+ strutht \strutht
+ strutdp \strutdp
+ threshold \d_page_mix_threshold
+ splitmethod {\mixedcolumnsparameter\c!splitmethod}%
+ balance {#1}%
+ alternative {\mixedcolumnsparameter\c!alternative}%
+ internalgrid {\mixedcolumnsparameter\c!internalgrid}%
+ grid \ifgridsnapping true\else false\fi
+ \relax
\deadcycles\zerocount}
\newdimen\mixedcolumnseparatorheight
@@ -589,7 +589,7 @@
\fi}
\unexpanded\def\page_mix_routine_package
- {\ctxcommand{mixfinalize()}%
+ {\clf_mixfinalize
\setbox\b_page_mix_collected\vbox \bgroup
\ifvoid\b_page_mix_preceding \else
\page_postprocessors_linenumbers_deepbox\b_page_mix_preceding
@@ -608,7 +608,7 @@
\unexpanded\def\page_mix_command_package_column
{\page_mix_hbox to \d_page_mix_column_width \bgroup
% maybe intercept empty
- \ctxcommand{mixgetsplit(\recurselevel)}%
+ \clf_mixgetsplit\recurselevel\relax
\hskip-\d_page_mix_column_width
\page_mix_hbox to \d_page_mix_column_width \bgroup
\placenoteinserts
@@ -624,8 +624,8 @@
\page_mix_routine_construct\v!no
\page_mix_routine_package
\page_otr_construct_and_shipout\box\b_page_mix_collected
- \ctxcommand{mixflushrest()}%
- \ctxcommand{mixcleanup()}%
+ \clf_mixflushrest
+ \clf_mixcleanup
\egroup}
\unexpanded\def\page_mix_routine_balance
@@ -636,9 +636,9 @@
\doloop
{%writestatus\m!columns{construct continue (\the\htdp\b_page_mix_collected)}%
\page_mix_routine_construct\v!no
- \ifcase\ctxcommand{mixstate()}\relax
+ \ifcase\clf_mixstate\relax
% 0 = okay, we can balance
- \setbox\b_page_mix_collected\vbox{\ctxcommand{mixflushlist()}}% we could avoid this
+ \setbox\b_page_mix_collected\vbox{\clf_mixflushlist}% we could avoid this
%writestatus\m!columns{construct balance}%
\page_mix_routine_construct\v!yes
\page_mix_routine_package
@@ -653,16 +653,16 @@
\par
\nointerlineskip
\prevdepth\strutdp
- \ctxcommand{mixflushrest()}% rubish
- \ctxcommand{mixcleanup()}% rubish
+ \clf_mixflushrest% rubish
+ \clf_mixcleanup % rubish
\exitloop
\or
% 1 = we have stuff left, so flush and rebalance
%writestatus\m!columns{flush continue}%
\page_mix_routine_package
\page_otr_construct_and_shipout\box\b_page_mix_collected
- \setbox\b_page_mix_collected\vbox{\ctxcommand{mixflushrest()}}% we could avoid this
- \ctxcommand{mixcleanup()}%
+ \setbox\b_page_mix_collected\vbox{\clf_mixflushrest}% we could avoid this
+ \clf_mixcleanup
\ifdim\ht\b_page_mix_collected=\zeropoint
\exitloop
\fi
@@ -757,8 +757,8 @@
\page_mix_routine_construct\v!yes
\page_mix_routine_package
\dontleavehmode\box\b_page_mix_collected
- \ctxcommand{mixflushrest()}%
- \ctxcommand{mixcleanup()}%
+ \clf_mixflushrest
+ \clf_mixcleanup
\egroup}
%D As usual, floats complicates matters and this is where experimental code
diff --git a/tex/context/base/publ-imp-apa.mkvi b/tex/context/base/publ-imp-apa.mkvi
index c812a76be..3651fd036 100644
--- a/tex/context/base/publ-imp-apa.mkvi
+++ b/tex/context/base/publ-imp-apa.mkvi
@@ -27,6 +27,18 @@
%D }
%D \stopTEX
+% set ALL specific APA compliant values
+
+\definebtx
+ [apa]
+ [\c!default=default,
+ \c!specification=apa,
+ \c!otherstext={\space\btxlabeltext{apa:others}},
+ %c!journalconversion=\v!normal,
+ \c!monthconversion=\v!month]
+
+% First, define list and rendering parameters
+
% The APA style sorts the unnumbered rendered list by authoryear
\definebtxrendering
@@ -42,15 +54,6 @@
\c!distance=.5\emwidth,
\c!margin=3\emwidth]
-% set ALL specific APA compliant values
-
-\definebtx
- [apa]
- [\c!default=default,
- \c!otherstext={\space\btxlabeltext{apa:others}},
- %c!journalconversion=\v!normal,
- \c!monthconversion=\v!month]
-
\definebtx
[apa:list]
[apa]
@@ -62,8 +65,6 @@
\c!separator:names:3={,\nobreakspace\textampersand\space}, % comma separated list
\c!separator:names:4= {\nobreakspace\textampersand\space}] % last of two, no comma!
-% The following are similar to default, but inherit from apa:list
-
\definebtx
[apa:list:author]
[apa:list]
@@ -225,11 +226,11 @@
[apa:page]
[\c!command={\wordright}]
-% The APA style defines authoryear citations.
+% Then define and set cite parameters.
\definebtx
[apa:cite]
- [apa:list]
+ [apa]
[\c!alternative=authoryear,
\c!otherstext={,\space\btxlabeltext{apa:others}},
\c!etallimit=5,
@@ -244,8 +245,6 @@
[apa:cite:author]
[apa:cite]
-% The following are similar to default, but inherit from apa:cite
-
\definebtx
[apa:cite:authoryear]
[apa:cite:author]
@@ -441,8 +440,6 @@
apa:Retrieved={Available from}, % {Retrieved from},
apa:In=In]
-% Check this (google translate!!):
-
\setupbtxlabeltext
[nl]
[apa:and=en,
@@ -791,7 +788,8 @@
\texdefinition{btx:apa:suffixedyear}
\btxrightparenthesis
}
- \btxperiod % outside of interaction
+ % outside of interaction
+ \btxperiod
\doif {\btxfoundname{author}} {title} {
\setmode{btx:apa:title-placed}
}
diff --git a/tex/context/base/publ-imp-aps.lua b/tex/context/base/publ-imp-aps.lua
index 5977fdb27..efd1c85c1 100644
--- a/tex/context/base/publ-imp-aps.lua
+++ b/tex/context/base/publ-imp-aps.lua
@@ -62,7 +62,6 @@ local generic = {
-- allows the substitution of an alternate field.
--
-- note that anything can get assigned a doi or be available online.
- doi = { "doi", "url" },
editionset = { "edition", "volume", "number", "pages" },
}
@@ -87,19 +86,16 @@ local categories = specification.categories
categories.article = {
sets = {
author = { "author", "editor" },
- volume = { "volume", "number", "pages" },
- doi = generic.doi,
- isbn = { "issn" },
},
required = {
- "author"
+ "author",
},
optional = {
"collaboration",
"year",
"title", "subtitle", "type", "file",
- "journal", "volume",
- "doi", "note", "isbn"
+ "journal", "volume", "number", "pages",
+ "doi", "url", "note",
},
}
@@ -115,9 +111,9 @@ categories.magazine = {
optional = {
"collaboration",
"title", "subtitle", "type", "file",
- "number",
+ "number", "pages",
"month", "day",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -128,8 +124,6 @@ categories.newspaper = categories.magazine
categories.periodical = {
sets = {
author = { "editor", "publisher" },
- doi = generic.doi,
- isbn = { "issn" },
},
required = {
"title",
@@ -141,7 +135,7 @@ categories.periodical = {
"subtitle", "file",
"series", "volume", "number", "month",
"organization",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -150,7 +144,6 @@ categories.periodical = {
categories.standard = {
sets = {
author = { "author", "institution", "organization" },
- doi = generic.doi,
},
required = {
"author",
@@ -160,6 +153,7 @@ categories.standard = {
},
optional = {
"collaboration",
+ "url",
},
}
@@ -169,7 +163,6 @@ categories.book = {
sets = {
author = { "author", "editor", "publisher" },
editionset = generic.editionset,
- doi = generic.doi,
},
required = {
"author",
@@ -181,7 +174,7 @@ categories.book = {
"title", "subtitle", "type", "file",
"editionset", "series",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -191,7 +184,6 @@ categories.inbook = {
sets = {
author = { "author", "editor", "publisher", },
editionset = generic.editionset,
- doi = generic.doi,
},
required = {
"author",
@@ -206,7 +198,7 @@ categories.inbook = {
"editionset", "series",
"month",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -217,7 +209,6 @@ categories.incollection = {
sets = {
author = { "author", "editor", "publisher" },
editionset = generic.editionset,
- doi = generic.doi,
},
required = {
"author",
@@ -231,7 +222,7 @@ categories.incollection = {
"chapter",
"month",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -240,7 +231,6 @@ categories.incollection = {
categories.booklet = {
sets = {
publisher = { "howpublished" }, -- no "publisher"!
- doi = generic.doi,
},
required = {
"author",
@@ -252,7 +242,7 @@ categories.booklet = {
"year", "month",
"subtitle", "type", "file",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -263,7 +253,6 @@ categories.proceedings = {
author = { "editor", "organization", "publisher" }, -- no "author"!
publisher = { "publisher", "organization" },
editionset = generic.editionset,
- doi = generic.doi,
},
required = {
"author",
@@ -276,7 +265,7 @@ categories.proceedings = {
"editionset", "series",
"month",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -291,7 +280,7 @@ categories.inproceedings = {
"month",
"edition", "series",
"address", "organization",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -300,9 +289,6 @@ categories.conference = categories.inproceedings
-- a thesis (of course).
categories.thesis = {
- sets = {
- doi = generic.doi,
- },
required = {
"author",
"title",
@@ -315,7 +301,7 @@ categories.thesis = {
"subtitle", "file",
"month",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -333,7 +319,7 @@ categories.mastersthesis = {
"subtitle", "file",
"month",
"address",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
categories.phdthesis = categories.mastersthesis
@@ -345,7 +331,6 @@ categories.techreport = {
author = { "author", "institution", "publisher" },
publisher = { "publisher", "institution", },
editionset = { "type", "volume", "number", "pages" }, -- no "edition"!
- doi = generic.doi,
},
required = {
"author",
@@ -360,7 +345,7 @@ categories.techreport = {
"subtitle", "file",
"editionset",
"month",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -371,7 +356,6 @@ categories.manual = {
author = { "author", "organization", "publisher" },
publisher = { "publisher", "organization", },
editionset = generic.editionset,
- doi = generic.doi,
},
required = {
"title"
@@ -382,7 +366,7 @@ categories.manual = {
"address",
"subtitle", "file",
"editionset", "month", "year",
- "doi", "note", "isbn",
+ "doi", "url", "note",
},
}
@@ -395,7 +379,6 @@ categories.patent = {
year = { "year", "yearfiled", },
month = { "month", "monthfiled", },
day = { "day", "dayfiled", },
- doi = generic.doi,
},
required = {
"nationality",
@@ -410,16 +393,13 @@ categories.patent = {
"title", "subtitle", "file",
"address",
"day", "month",
- "doi", "note"
+ "doi", "url", "note",
},
}
-- a document having an author and title, but not formally published.
categories.unpublished = {
- sets = {
- doi = generic.doi,
- },
required = {
"author",
"title",
@@ -429,16 +409,13 @@ categories.unpublished = {
"collaboration",
"subtitle", "file",
"year", "month",
- "doi"
+ "doi", "url",
},
}
-- like misc below but includes organization.
categories.electronic = {
- sets = {
- doi = generic.doi,
- },
required = {
"title"
},
@@ -450,17 +427,13 @@ categories.electronic = {
"address",
"organization",
"howpublished",
- "doi", "note"
+ "doi", "url", "note",
},
}
-- use this type when nothing else fits.
categories.misc = {
- sets = {
- doi = generic.doi,
- isbn = { "isbn", "issn" },
- },
required = {
-- nothing is really important here
},
@@ -470,17 +443,13 @@ categories.misc = {
"title", "subtitle", "file",
"year", "month",
"howpublished",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
-- other (whatever jabref does not know!)
categories.other = {
- sets = {
- doi = generic.doi,
- isbn = { "isbn", "issn" },
- },
required = {
"author",
"title",
@@ -489,7 +458,7 @@ categories.other = {
optional = {
"collaboration",
"subtitle", "file",
- "doi", "note", "isbn"
+ "doi", "url", "note",
},
}
@@ -498,14 +467,13 @@ categories.other = {
categories.literal = {
sets = {
author = { "key" }, -- need to check this!
- doi = generic.doi,
},
required = {
"text"
},
optional = {
"author",
- "doi", "note"
+ "doi", "url", "note"
},
virtual = false,
}
diff --git a/tex/context/base/publ-imp-aps.mkvi b/tex/context/base/publ-imp-aps.mkvi
index 3179e8149..e5ea2459a 100644
--- a/tex/context/base/publ-imp-aps.mkvi
+++ b/tex/context/base/publ-imp-aps.mkvi
@@ -27,37 +27,38 @@
%D }
%D \stopTEX
-\definebtxrendering
- [aps]
- [\c!specification=aps]
-
-\setupbtxlist
- [aps]
- [alternative=paragraph,
- width=auto,
- distance=0pt]
-
% set ALL specific APS compliant values
\definebtx
[aps]
[\c!default=default,
+ \c!specification=aps,
\c!otherstext={\space\btxlabeltext{aps:others}},
\c!etallimit=10,
\c!etaldisplay=\btxparameter\c!etallimit,
%c!journalconversion=\v!normal,
\c!monthconversion=\v!month,
+ optionaltitle=\v!yes,
\c!separator:names:2={,\space},
\c!separator:names:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand
\c!separator:names:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand
+% First, define and set list and rendering parameters
+
+\definebtxrendering
+ [aps]
+ [\c!specification=aps]
+
+\setupbtxlist
+ [aps]
+ [alternative=paragraph,
+ width=auto,
+ distance=0pt]
+
\definebtx
[aps:list]
[aps]
- [\c!authorconversion=normalshort,
- placetitle=\v!yes] % can be set to no for journal, for example.
-
-% The following are similar to default, but inherit from aps:list
+ [\c!authorconversion=normalshort]
\definebtx
[aps:list:author]
@@ -109,6 +110,10 @@
%command=\btxexpandedjournal] % btxabbreviatedjournal
\definebtx
+ [aps:list:volume]
+ [\c!style=\v!bold]
+
+\definebtx
[aps:list:title]
[\c!style=\v!italic,
\c!command=\Word]
@@ -226,17 +231,17 @@
[aps:page]
[\c!command={\wordright}]
+% Then define and set all cite parameters
+
\definebtx
[aps:cite]
- [aps:list]
+ [aps]
[\c!authorconversion=\v!name]
\definebtx
[aps:cite:author]
[aps:cite]
-% The following are similar to default, but inherit from aps:cite
-
\definebtx
[aps:cite:authoryear]
[aps:cite:author]
@@ -667,7 +672,7 @@
\stoptexdefinition
\starttexdefinition btx:aps:optional-title
- \doif{\btxparameter{placetitle}}\v!yes {
+ \doif{\btxparameter{optionaltitle}}\v!yes {
\texdefinition {btx:aps:title}
}
\stoptexdefinition
@@ -768,14 +773,15 @@
}
\stoptexdefinition
-\starttexdefinition btx:aps:journal-volumeset-year
+\starttexdefinition btx:aps:journal-volume-year
\btxdoif {journal} {
% expandedjournal abbreviatedjournal
\btxflush{expandedjournal -> journal}
- % A newspaper may not have a volume but may have a number!
\btxdoifelse {volume} {
\btxspace
- \texdefinition{btx:aps:bold}{volume}
+ \btxstartstyleandcolor [aps:list:volume]
+ \btxflush{volume}
+ \btxstopstyleandcolor
\btxdoif {number} {
\removeunwantedspaces(
\btxflush{number}
@@ -788,14 +794,13 @@
\btxcomma
}
}
- \btxdoif {number} {
+ \btxdoif {pages} {
\btxspace
\btxflush{pages}
}
\btxleftparenthesis
\texdefinition{btx:aps:year}
\btxrightparenthesis
- \btxperiod
}
\stoptexdefinition
@@ -823,58 +828,8 @@
\btxrightparenthesis
\stoptexdefinition
-\definebreakpoints[doi]
-\definebreakpoint [doi][:][nleft=3,type=1]
-\definebreakpoint [doi][/][nleft=3,type=1]
-\definebreakpoint [doi][-][nleft=3,type=1]
-\definebreakpoint [doi][.][nleft=3,type=1]
-
-% use \btxentry here?
-\starttexdefinition btx:aps:url
- \btxspace
- \begingroup
- \setbreakpoints[doi]
- \ifconditional\btxinteractive
- \goto {
- \btxflush{url}
- } [
- url(\btxflush{url})
- ]
- \else
- \btxflush{url}
- \fi
- \endgroup
-\stoptexdefinition
-
-% use \btxentry here?
-\starttexdefinition btx:aps:doi
- \btxspace
- \begingroup
- \setbreakpoints[doi]
- \ifconditional\btxinteractive
- \goto {
- doi:\btxflush{doi}
- } [
- url(http://dx.doi.org/\btxflush{doi})
- ]
- \else
- doi:\btxflush{doi}
- \fi
- \endgroup
-\stoptexdefinition
-
-% also issn - see publ-imp-aps.lua
-\starttexdefinition btx:aps:isbn
- \btxdoif {isbn} {
- \btxleftparenthesis
- \WORD{\btxfoundname{isbn}}:\btxspace
- \setbreakpoints[doi]
- \btxflush{isbn}
- \btxrightparenthesis
- }
-\stoptexdefinition
-
\starttexdefinition btx:aps:note
+ \btxperiod
\btxdoif {note} {
\btxleftparenthesis
\btxflush{note}
@@ -882,16 +837,21 @@
}
\stoptexdefinition
-\starttexdefinition btx:aps:url-doi-note
- \doif {\btxfoundname{doi}} {url} {
- \texdefinition{btx:aps:url}
- }
- \texdefinition{btx:aps:isbn}
- \doif {\btxfoundname{doi}} {doi} {
- \texdefinition{btx:aps:doi}
- }
- \texdefinition{btx:aps:note}
- \removeunwantedspaces
+\starttexdefinition btx:aps:doi-url #text
+ \ifconditional\btxinteractive
+ \btxdoifelse {doi} {
+ \goto {#text} [url(http://dx.doi.org/\btxflush{doi})]
+ } {
+ \btxdoifelse {url} {
+ \goto {#text} [url(\btxflush{url})]
+ } {
+ #text
+ }
+ }
+ \else
+ #text
+ \fi
+
\stoptexdefinition
% Then setups, by category
@@ -904,8 +864,8 @@
\startsetups btx:aps:list:article
\texdefinition{btx:aps:author}
\texdefinition{btx:aps:optional-title}
- \texdefinition{btx:aps:journal-volumeset-year}
- \texdefinition{btx:aps:url-note-doi}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:journal-volume-year}}
+ \texdefinition{btx:aps:note}
\stopsetups
% An article from a magazine.
@@ -918,7 +878,7 @@
% An article from a newspaper.
% Required fields: author or title, journal, (year).
-% Optional fields: volume, number, pages, type, month, day, doi, url, note.
+% Optional fields: number, pages, type, month, day, doi, url, note.
\startsetups btx:aps:list:newspaper
\fastsetup{btx:aps:list:article}
@@ -940,7 +900,7 @@
\startsetups btx:aps:list:standard
\texdefinition{btx:aps:author}
\texdefinition{btx:aps:title}
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:note}
\stopsetups
% year?
@@ -955,8 +915,8 @@
\texdefinition{btx:aps:author}
\texdefinition{btx:aps:title}
\texdefinition{btx:aps:editionset}
- \texdefinition{btx:aps:publisher-wherefrom-year}
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:note}
\stopsetups
% There is some debate about how inbook should differ from incollection
@@ -973,8 +933,8 @@
\texdefinition{btx:aps:title}
\texdefinition{btx:aps:editor-in}
\texdefinition{btx:aps:editionset}
- \texdefinition{btx:aps:publisher-wherefrom-year}
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:note}
\stopsetups
% chapter?
@@ -1010,8 +970,8 @@
\btxflush{organization}
\btxcomma
}
- \texdefinition{btx:aps:publisher-wherefrom-year}
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
+ \texdefinition{btx:aps:note}
\stopsetups
\startsetups btx:aps:list:conference
@@ -1051,7 +1011,7 @@
}
}
\btxperiod
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:note}
\stopsetups
\startsetups btx:aps:list:phdthesis
@@ -1121,7 +1081,7 @@
\btxperiod
\italiccorrection
\endgroup
- \texdefinition{btx:aps:publisher-wherefrom-year}
+ \texdefinition{btx:aps:doi-url} {\texdefinition{btx:aps:publisher-wherefrom-year}}
\texdefinition{btx:aps:url}
\texdefinition{btx:aps:note}
\stopsetups
@@ -1146,7 +1106,7 @@
\btxflush{howpublished}
\btxperiod
}
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:note}
\stopsetups
% Other. Note that this category was not defined with BIBTEX. Below from JabRef:
@@ -1169,7 +1129,7 @@
\btxflush{howpublished}
\btxperiod
}
- \texdefinition{btx:aps:url-doi-note}
+ \texdefinition{btx:aps:note}
\stopsetups
% If all else fails to match:
diff --git a/tex/context/base/publ-imp-default.mkvi b/tex/context/base/publ-imp-default.mkvi
index 8e7b151c7..c0664f5df 100644
--- a/tex/context/base/publ-imp-default.mkvi
+++ b/tex/context/base/publ-imp-default.mkvi
@@ -43,7 +43,7 @@
\definebtx
[\s!default:\s!cite]
- [\s!default:\s!list]
+ [\s!default]
[\c!alternative=num,
\c!authorconversion=\v!name]
diff --git a/tex/context/base/spac-ali.lua b/tex/context/base/spac-ali.lua
index 08e33c5b8..880da6213 100644
--- a/tex/context/base/spac-ali.lua
+++ b/tex/context/base/spac-ali.lua
@@ -133,7 +133,11 @@ function alignments.set(n)
texsetattribute(a_realign,texgetcount("realpageno") * 10 + n)
end
-commands.setrealign = alignments.set
+interfaces.implement {
+ name = "setrealign",
+ actions = alignments.set,
+ arguments = "integer",
+}
statistics.register("realigning", function()
if nofrealigned > 0 then
diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv
index c13e4ca76..13a4ce192 100644
--- a/tex/context/base/spac-ali.mkiv
+++ b/tex/context/base/spac-ali.mkiv
@@ -38,8 +38,8 @@
\to \everyforgetall
\unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue}
-\unexpanded\def\signalinnerrealign{\ctxcommand{setrealign(2)}}
-\unexpanded\def\signalouterrealign{\ctxcommand{setrealign(1)}}
+\unexpanded\def\signalinnerrealign{\clf_setrealign\plustwo}
+\unexpanded\def\signalouterrealign{\clf_setrealign\plusone}
\installcorenamespace{aligncommand}
\installcorenamespace{alignhorizontal}
diff --git a/tex/context/base/spac-hor.lua b/tex/context/base/spac-hor.lua
index c9d6e2b15..5d5a43e31 100644
--- a/tex/context/base/spac-hor.lua
+++ b/tex/context/base/spac-hor.lua
@@ -6,14 +6,15 @@ if not modules then modules = { } end modules ['spac-hor'] = {
license = "see context related readme files"
}
-local match = string.match
local utfbyte = utf.byte
+local lpegmatch, P, C = lpeg.match, lpeg.P, lpeg.C
local context = context
-local commands = commands
local chardata = characters.data
+local p_check = P("the ") * (P("letter") + P("character")) * P(" ") * lpeg.patterns.utf8byte -- is a capture already
+
local can_have_space = table.tohash {
"lu", "ll", "lt", "lm", "lo", -- letters
-- "mn", "mc", "me", -- marks
@@ -26,10 +27,18 @@ local can_have_space = table.tohash {
-- "cc", "cf", "cs", "co", "cn", -- others
}
-function commands.autonextspace(str) -- todo: use nexttoken
- local ch = match(str,"the letter (.)") or match(str,"the character (.)")
- ch = ch and chardata[utfbyte(ch)]
- if ch and can_have_space[ch.category] then
- context.space()
+local function autonextspace(str) -- todo: make a real not intrusive lookahead
+ local b = lpegmatch(p_check,str)
+ if b then
+ local d = chardata[b]
+ if d and can_have_space[d.category] then
+ context.space()
+ end
end
end
+
+interfaces.implement {
+ name = "autonextspace",
+ actions = autonextspace,
+ arguments = "string",
+}
diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv
index c61355ae5..72828c1b8 100644
--- a/tex/context/base/spac-hor.mkiv
+++ b/tex/context/base/spac-hor.mkiv
@@ -1046,7 +1046,7 @@
{\futurelet\nexttoken\spac_spaces_auto_insert_next}
\def\spac_spaces_auto_insert_next
- {\ctxcommand{autonextspace(\!!bs\meaning\nexttoken\!!es)}} % todo, just consult nexttoken at the lua end
+ {\clf_autonextspace{\meaning\nexttoken}} % todo, just consult nexttoken at the lua end
%D Moved from bib module:
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index 278ee192c..c62a009b8 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index 2451479e7..21d601a72 100644
--- a/tex/context/base/status-lua.pdf
+++ b/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua
index 837921972..0ababcfc0 100644
--- a/tex/context/base/strc-blk.lua
+++ b/tex/context/base/strc-blk.lua
@@ -16,6 +16,8 @@ local allocate = utilities.storage.allocate
local context = context
local commands = commands
+local implement = interfaces.implement
+
local structures = structures
structures.blocks = structures.blocks or { }
@@ -154,8 +156,7 @@ end
-- interface
-
-commands.definestructureblock = blocks.define
-commands.savestructureblock = blocks.save
-commands.selectstructureblock = blocks.select
-commands.setstructureblockstate = blocks.setstate
+implement { name = "definestructureblock", actions = blocks.define, arguments = "string" }
+implement { name = "savestructureblock", actions = blocks.save, arguments = { "string", "string" ,"string" } }
+implement { name = "selectstructureblock", actions = blocks.select, arguments = { "string", "string" ,"string", "string" } }
+implement { name = "setstructureblockstate", actions = blocks.setstate, arguments = { "string", "string" ,"string" } }
diff --git a/tex/context/base/strc-blk.mkiv b/tex/context/base/strc-blk.mkiv
index bceb66beb..a2e66da17 100644
--- a/tex/context/base/strc-blk.mkiv
+++ b/tex/context/base/strc-blk.mkiv
@@ -33,7 +33,7 @@
\installcommandhandler \??block {block} \??block
\appendtoks
- \ctxcommand{definestructureblock("\currentblock")}%
+ \clf_definestructureblock{\currentblock}%
\setuevalue{\e!begin\currentblock}{\dodoubleempty\strc_blocks_begin[\currentblock]}%
\setuevalue{\e!end \currentblock}{}%
\to \everydefineblock
@@ -41,7 +41,7 @@
\unexpanded\def\strc_blocks_begin[#1][#2]%
{\normalexpanded{\buff_pickup{@block@}{\e!begin#1}{\e!end#1}}
{}% before
- {\ctxcommand{savestructureblock("#1","#2","@block@")}}%
+ {\clf_savestructureblock{#1}{#2}{@block@}}%
\plusone}% after
\let\strc_blocks_setup\relax
@@ -72,17 +72,17 @@
\egroup}
\def\strc_blocks_set_state[#1][#2][#3]% state name tag
- {\ctxcommand{setstructureblockstate("#1","#2","#3")}}
+ {\clf_setstructureblockstate{#1}{#2}{#3}}
\def\strc_blocks_select[#1][#2][#3][#4]% state name tag setups
{\bgroup
\doifassignmentelse{#3}
{\getparameters[\??blocktemp][\c!criterium=\v!text,#3]%
\def\strc_blocks_setup{\setupcurrentblock[#3]}%
- \ctxcommand{selectstructureblock("#1","#2","","\csname\??blocktemp\c!criterium\endcsname")}}
+ \clf_selectstructureblock{#1}{#2}{}{\csname\??blocktemp\c!criterium\endcsname}}
{\getparameters[\??blocktemp][\c!criterium=\v!text,#4]%
\def\strc_blocks_setup{\setupcurrentblock[#4]}%
- \ctxcommand{selectstructureblock("#1","#2","#3","\csname\??blocktemp\c!criterium\endcsname")}}%
+ \clf_selectstructureblock{#1}{#2}{#3}{\csname\??blocktemp\c!criterium\endcsname}}%
\egroup}
% hide : save, if [+] also hidden execute
diff --git a/tex/context/base/strc-con.mkvi b/tex/context/base/strc-con.mkvi
index d3d698481..63c609070 100644
--- a/tex/context/base/strc-con.mkvi
+++ b/tex/context/base/strc-con.mkvi
@@ -1009,7 +1009,7 @@
% macros.
\def\reinstateconstructionnumberentry#1% was xdef
- {\edef\currentconstructionattribute {\ctxcommand {getinternallistreference(#1)}}%
+ {\edef\currentconstructionattribute {\clf_getinternallistreference#1}%
\edef\currentconstructionsynchronize{\ctxlatecommand{enhancelist(#1)}}}
\installstructurelistprocessor{construction}{\usestructurelistprocessor{number+title}}
diff --git a/tex/context/base/strc-enu.mkvi b/tex/context/base/strc-enu.mkvi
index 2db542c6b..0da71ecdf 100644
--- a/tex/context/base/strc-enu.mkvi
+++ b/tex/context/base/strc-enu.mkvi
@@ -371,6 +371,6 @@
\fi}
\unexpanded\def\strc_enumerations_skip_number_coupling[#tag]% e.g. for questions with no answer
- {\ctxcommand{setnextreferenceorder("construction","#tag")}}
+ {\clf_setnextreferenceorder{construction}{#tag}}
\protect \endinput
diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua
index e7dc97dcd..b21e31ace 100644
--- a/tex/context/base/strc-ini.lua
+++ b/tex/context/base/strc-ini.lua
@@ -377,4 +377,8 @@ end
-- interface
-commands.definestructureset = sets.define
+interfaces.implement {
+ name = "definestructureset",
+ actions = sets.define,
+ arguments = { "string", "string", "string", "string", "boolean" }
+}
diff --git a/tex/context/base/strc-ini.mkvi b/tex/context/base/strc-ini.mkvi
index 8488d1dab..ad83cbc58 100644
--- a/tex/context/base/strc-ini.mkvi
+++ b/tex/context/base/strc-ini.mkvi
@@ -70,12 +70,12 @@
\unexpanded\def\defineconversionset{\dotripleempty\strc_sets_define_conversion_set}
\unexpanded\def\defineprefixset {\dotripleempty\strc_sets_define_prefix_set}
-% Low level versions (no optional checking). The detokenize and escaping might go away.
+% Low level versions (no optional checking). The detokenize might go away.
-\unexpanded\def\strc_sets_define_reset_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:resets", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}",true)}}
-\unexpanded\def\strc_sets_define_separator_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:separators", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}}
-\unexpanded\def\strc_sets_define_conversion_set[#name][#set][#default]{\ctxcommand{definestructureset("structure:conversions","#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}}
-\unexpanded\def\strc_sets_define_prefix_set [#name][#set][#default]{\ctxcommand{definestructureset("structure:prefixes", "#name","\luaescapestring{\detokenize{#set}}","\luaescapestring{\detokenize{#default}}")}}
+\unexpanded\def\strc_sets_define_reset_set [#name][#set][#default]{\clf_definestructureset{structure:resets} {#name}{\detokenize{#set}}{\detokenize{#default}}true\relax}
+\unexpanded\def\strc_sets_define_separator_set [#name][#set][#default]{\clf_definestructureset{structure:separators} {#name}{\detokenize{#set}}{\detokenize{#default}}false\relax}
+\unexpanded\def\strc_sets_define_conversion_set[#name][#set][#default]{\clf_definestructureset{structure:conversions}{#name}{\detokenize{#set}}{\detokenize{#default}}false\relax}
+\unexpanded\def\strc_sets_define_prefix_set [#name][#set][#default]{\clf_definestructureset{structure:prefixes} {#name}{\detokenize{#set}}{\detokenize{#default}}false\relax}
\let\definestructureresetset \defineresetset
\let\definestructureseparatorset \defineseparatorset
diff --git a/tex/context/base/strc-itm.lua b/tex/context/base/strc-itm.lua
index b736ff4e3..adec591c1 100644
--- a/tex/context/base/strc-itm.lua
+++ b/tex/context/base/strc-itm.lua
@@ -10,6 +10,8 @@ local structures = structures
local itemgroups = structures.itemgroups
local jobpasses = job.passes
+local implement = interfaces.implement
+
local setvariable = jobpasses.save
local getvariable = jobpasses.getfield
@@ -25,7 +27,7 @@ local counts = table.setmetatableindex("number")
local trialtypesetting = context.trialtypesetting
-function commands.analyzeitemgroup(name,level)
+local function analyzeitemgroup(name,level)
local n = counts[name]
if level == 1 then
n = n + 1
@@ -38,7 +40,7 @@ function commands.analyzeitemgroup(name,level)
texsetdimen("local","d_strc_itemgroups_max_width",w)
end
-function commands.registeritemgroup(name,level,nofitems,maxwidth)
+local function registeritemgroup(name,level,nofitems,maxwidth)
local n = counts[name]
if not trialtypesetting() then
-- no trialtypsetting
@@ -47,3 +49,15 @@ function commands.registeritemgroup(name,level,nofitems,maxwidth)
counts[name] = n - 1
end
end
+
+implement {
+ name = "analyzeitemgroup",
+ actions = analyzeitemgroup,
+ arguments = { "string", "integer" }
+}
+
+implement {
+ name = "registeritemgroup",
+ actions = registeritemgroup,
+ arguments = { "string", "integer", "integer", "dimen" }
+}
diff --git a/tex/context/base/strc-itm.mkvi b/tex/context/base/strc-itm.mkvi
index dccf1c85c..c709463a8 100644
--- a/tex/context/base/strc-itm.mkvi
+++ b/tex/context/base/strc-itm.mkvi
@@ -229,10 +229,10 @@
\let \currentitemgroupsegments \empty
\def\strc_itemgroups_register_status
- {\ctxcommand{registeritemgroup("\currentparentitemgroup",\number\c_strc_itemgroups_nesting,\number\c_strc_itemgroups_n_of_items,\number\dimexpr\itemgroupparameter\c!maxwidth)}}
+ {\clf_registeritemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\c_strc_itemgroups_n_of_items\dimexpr\itemgroupparameter\c!maxwidth\relax}
\def\strc_itemgroups_check_n_of_items % we could do this at the lua end and save a call (i.e. will be dimen and counter)
- {\ctxcommand{analyzeitemgroup("\currentparentitemgroup",\number\c_strc_itemgroups_nesting)}\relax
+ {\clf_analyzeitemgroup{\currentparentitemgroup}\c_strc_itemgroups_nesting\relax
\edef\currentnofitems{\the\c_strc_itemgroups_max_items}}
% todo: \dodosetreference -> \strc_counters_register_component (to be checked)
@@ -251,44 +251,47 @@
{%\setnextinternalreference
% no need to collect nodes in \b_strc_destination_nodes here ... maybe at some point
\strc_references_start_destination_nodes
- % this is somewhat over the top ... we should use the counter's reference
- \ctxcommand{setreferenceattribute("\s!full", "\referenceprefix","\currentitemreference",
- {
- metadata = {
- kind = "item",% ?
- catcodes = \the\catcodetable,
- xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
- },
- references = {
- % internal = \nextinternalreference, % no: this spoils references
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- prefixdata = structures.helpers.simplify {
- prefix = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefix",
- separatorset = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset",
- conversion = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion\!!es,
- conversionset = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset",
- set = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset",
- segments = "\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments",
- % segments = "\askedprefixsegments",
- connector = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector\!!es,
- },
- numberdata = structures.helpers.simplify {
- numbers = structures.counters.compact("\v_strc_itemgroups_counter",nil,true),
- separatorset = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset",
- % conversion = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion",
- % conversion = "\currentitemgroupconversionset",
- % conversionset = "\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset",
- % todo: fixedconversion = "\currentitemgroupconversionset", % temp hack:
- conversionset = "fixed::\currentitemgroupconversionset",
+ % this is somewhat over the top ... we should use the counter's reference
+ \clf_setreferenceattribute
+ {\referenceprefix}%
+ {\currentitemreference}%
+ {%
+ metadata {%
+ kind {\s!full}% was item, why?
+ \ifx\currentreferencecoding\s!xml
+ xmlroot {\xmldocument}% only useful when text
+ \fi
+ catcodes \catcodetable
+ }%
+ references {%
+ % internal \nextinternalreference % no: this spoils references
+ block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ }%
+ prefixdata {%
+ prefix {\namedcounterparameter\v_strc_itemgroups_counter\c!prefix}%
+ separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixseparatorset}%
+ conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversion}%
+ conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconversionset}%
+ set {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixset}%
+ segments {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixsegments}%
+ % segments {\askedprefixsegments}%
+ connector {\namedcounterparameter\v_strc_itemgroups_counter\c!prefixconnector}%
+ }%
+ numberdata {%
+ numbers {\v_strc_itemgroups_counter}%
+ separatorset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberseparatorset}%
+ % conversion {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversion}%
+ % conversionset {\namedcounterparameter\v_strc_itemgroups_counter\c!numberconversionset}%
+ % fixedconversion {\currentitemgroupconversionset}%
+ conversionset {fixed::\currentitemgroupconversionset}% temp hack
%
% for the moment no stopper, we need to make references configurable first
- % stopper = \!!bs\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper\!!es,
- segments = "\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments",
- },
- })
- }%
+ % stopper {\namedcounterparameter\v_strc_itemgroups_counter\c!numberstopper}%
+ segments {\namedcounterparameter\v_strc_itemgroups_counter\c!numbersegments}%
+ }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
% will become an option:
@@ -482,6 +485,7 @@
\fi}
\ifdefined\dotagsetitemgroup \else \let\dotagsetitemgroup\relax \fi
+\ifdefined\dotagsetitem \else \let\dotagsetitem \relax \fi
\def\strc_itemgroups_tag_start_group
{\dostarttaggedchained\t!itemgroup\currentparentitemgroup\??itemgroup
@@ -1040,6 +1044,7 @@
\setfalse\c_strc_itemgroups_concat
\fi
\dostarttagged\t!item\empty
+ \dotagsetitem
\dostarttagged\t!itemtag\empty
\strc_itemgroups_insert_item
\dostoptagged
@@ -1087,6 +1092,7 @@
\unexpanded\def\strc_itemgroups_start_head_indeed
{\settrue\c_strc_itemgroups_head
+ \dotagsetitem % weird place
\useitemgroupstyleandcolor\c!headstyle\c!headcolor\ignorespaces}
\unexpanded\def\strc_itemgroups_stop_head_indeed
diff --git a/tex/context/base/strc-lev.lua b/tex/context/base/strc-lev.lua
index 947889e1e..d7ffd6af4 100644
--- a/tex/context/base/strc-lev.lua
+++ b/tex/context/base/strc-lev.lua
@@ -8,26 +8,30 @@ if not modules then modules = { } end modules ['strc-lev'] = {
local insert, remove = table.insert, table.remove
-local context = context
-local commands = commands
+local context = context
+local interfaces = interfaces
-local sections = structures.sections
-local default = interfaces.variables.default
+local sections = structures.sections
+local implement = interfaces.implement
-sections.levels = sections.levels or { }
+local v_default = interfaces.variables.default
-local level, levels, categories = 0, sections.levels, { }
+sections.levels = sections.levels or { }
-storage.register("structures/sections/levels", levels, "structures.sections.levels")
+local level = 0
+local levels = sections.levels
+local categories = { }
local f_two_colon = string.formatters["%s:%s"]
-function commands.definesectionlevels(category,list)
+storage.register("structures/sections/levels", levels, "structures.sections.levels")
+
+local function definesectionlevels(category,list)
levels[category] = utilities.parsers.settings_to_array(list)
end
-function commands.startsectionlevel(category)
- category = category ~= "" and category or default
+local function startsectionlevel(category)
+ category = category ~= "" and category or v_default
level = level + 1
local lc = levels[category]
if not lc or level > #lc then
@@ -38,7 +42,7 @@ function commands.startsectionlevel(category)
insert(categories,category)
end
-function commands.stopsectionlevel()
+local function stopsectionlevel()
local category = remove(categories)
if category then
local lc = levels[category]
@@ -52,3 +56,20 @@ function commands.stopsectionlevel()
-- error
end
end
+
+implement {
+ name = "definesectionlevels",
+ actions = definesectionlevels,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "startsectionlevel",
+ actions = startsectionlevel,
+ arguments = "string"
+}
+
+implement {
+ name = "stopsectionlevel",
+ actions = stopsectionlevel,
+}
diff --git a/tex/context/base/strc-lev.mkvi b/tex/context/base/strc-lev.mkvi
index b3ec2a2d5..1384f5f2f 100644
--- a/tex/context/base/strc-lev.mkvi
+++ b/tex/context/base/strc-lev.mkvi
@@ -26,17 +26,17 @@
\unexpanded\def\definesectionlevels{\dodoubleargument\strc_levels_define}
\unexpanded\def\startsectionlevel {\dosingleempty \strc_levels_start }
-\unexpanded\def\strc_levels_define[#category][#list]{\ctxcommand{definesectionlevels("#category","#list")}}
-\unexpanded\def\strc_levels_start [#category]{\ctxcommand{startsectionlevel("#category")}}
-\unexpanded\def\stopsectionlevel {\ctxcommand{stopsectionlevel()}}
+\unexpanded\def\strc_levels_define[#category][#list]{\clf_definesectionlevels{#category}{#list}}
+\unexpanded\def\strc_levels_start [#category]{\clf_startsectionlevel{#category}}
+\unexpanded\def\stopsectionlevel {\clf_stopsectionlevel}
\unexpanded\def\nostarthead{\dotripleargument\strc_levels_start_nop} % used at the lua end
\unexpanded\def\nostophead {\dosingleargument\strc_levels_stop_nop } % used at the lua end
\unexpanded\def\strc_levels_start[#category]%
{\doifassignmentelse{#category}
- {\ctxcommand{startsectionlevel("\v!default")}[#category]}
- {\ctxcommand{startsectionlevel("#category")}}}
+ {\clf_startsectionlevel{\v!default}[#category]}
+ {\clf_startsectionlevel{#category}}}
\unexpanded\def\strc_levels_start_nop[#category][#settings][#userdata]%
{\blank
diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv
index 8cee9c3b0..42634fb9a 100644
--- a/tex/context/base/strc-num.mkiv
+++ b/tex/context/base/strc-num.mkiv
@@ -517,24 +517,21 @@
\def\strc_counters_register_component_page#1%
{\xdef\currentstructurecomponentreference {#1\c!reference}%
\xdef\currentstructurecomponentreferenceprefix{#1\c!referenceprefix}%
- % maybe have a helper in strc-ref.mkvi
\setnextinternalreference
- \ctxcommand{setreferenceattribute(% can be helper with less passed
- "\s!page",
- "\currentstructurecomponentreferenceprefix",
- "\currentstructurecomponentreference",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = {
- kind = "page",
- },
- },
- "\interactionparameter\c!focus")
- }%
+ \clf_setreferenceattribute
+ {\currentstructurecomponentreferenceprefix}%
+ {\currentstructurecomponentreference}%
+ {%
+ references {%
+ internal \nextinternalreference
+ block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ }%
+ metadata {%
+ kind {\s!page}%
+ }%
+ }%
+ \relax
\xdef\m_strc_counters_last_registered_attribute {\the\lastdestinationattribute}%
\glet\m_strc_counters_last_registered_index \relax
\glet\m_strc_counters_last_registered_synchronize\relax}
diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua
index aa7acd542..5627fffbc 100644
--- a/tex/context/base/strc-ref.lua
+++ b/tex/context/base/strc-ref.lua
@@ -358,12 +358,23 @@ references.setnextinternal = setnextinternal
references.currentorder = currentorder
references.setcomponent = setcomponent
-commands.setnextreferenceorder = setnextorder
-commands.setnextinternalreference = setnextinternal
+implement {
+ name = "setnextreferenceorder",
+ actions = setnextorder,
+ arguments = { "string", "string" }
+}
-function commands.currentreferenceorder(kind,name)
- context(currentorder(kind,name))
-end
+implement {
+ name = "setnextinternalreference",
+ actions = setnextinternal,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "currentreferenceorder",
+ actions = { currentorder, context },
+ arguments = { "string", "string" }
+}
function references.set(kind,prefix,tag,data)
-- setcomponent(data)
@@ -417,7 +428,11 @@ function references.enhance(prefix,tag)
end
end
-commands.enhancereference = references.enhance
+implement {
+ name = "enhancereference",
+ actions = references.enhance,
+ arguments = { "string", "string" }
+}
-- -- -- related to strc-ini.lua -- -- --
@@ -510,7 +525,11 @@ function urls.get(name)
end
end
-function commands.geturl(name)
+function urls.found(name)
+ return urldata[name]
+end
+
+local function geturl(name)
local url = urls.get(name)
if url and url ~= "" then
ctx_pushcatcodes(txtcatcodes)
@@ -519,18 +538,23 @@ function commands.geturl(name)
end
end
--- function commands.gethyphenatedurl(name,...)
--- local url = urls.get(name)
--- if url and url ~= "" then
--- hyphenatedurl(url,...)
--- end
--- end
+implement {
+ name = "doifurldefinedelse",
+ actions = { urls.found, commands.doifelse },
+ arguments = "string"
+}
-function commands.doifurldefinedelse(name)
- commands.doifelse(urldata[name])
-end
+implement {
+ name = "useurl",
+ actions = urls.define,
+ arguments = { "string", "string", "string", "string" }
+}
-commands.useurl= urls.define
+implement {
+ name = "geturl",
+ actions = geturl,
+ arguments = "string",
+}
-- files
@@ -552,11 +576,36 @@ function files.get(name,method,space) -- method: none, before, after, both, spac
end
end
-function commands.doiffiledefinedelse(name)
- commands.doifelse(filedata[name])
+function files.found(name)
+ return filedata[name]
+end
+
+local function getfile(name)
+ local fil = files.get(name)
+ if fil and fil ~= "" then
+ ctx_pushcatcodes(txtcatcodes)
+ context(fil)
+ ctx_popcatcodes()
+ end
end
-commands.usefile= files.define
+implement {
+ name = "doiffiledefinedelse",
+ actions = { files.found, commands.doifelse },
+ arguments = "string"
+}
+
+implement {
+ name = "usefile",
+ actions = files.define,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "getfile",
+ actions = getfile,
+ arguments = "string"
+}
-- helpers
@@ -636,20 +685,30 @@ function references.checkedprogram(whatever) -- return whatever if not resolved
end
end
-commands.defineprogram = programs.define
+implement {
+ name = "defineprogram",
+ actions = programs.define,
+ arguments = { "string", "string", "string" }
+}
-function commands.getprogram(name)
- local f = programdata[name]
- if f then
- context(f[1])
+local function getprogram(name)
+ local p = programdata[name]
+ if p then
+ context(p[1])
end
end
+implement {
+ name = "getprogram",
+ actions = getprogram,
+ arguments = "string"
+}
+
-- shared by urls and files
-function references.whatfrom(name)
- context((urldata[name] and v_url) or (filedata[name] and v_file) or v_unknown)
-end
+-- function references.whatfrom(name)
+-- context((urldata[name] and v_url) or (filedata[name] and v_file) or v_unknown)
+-- end
function references.from(name)
local u = urldata[name]
@@ -676,7 +735,7 @@ function references.from(name)
end
end
-function commands.from(name)
+local function from(name)
local u = urldata[name]
if u then
local url, file, description = u[1], u[2], u[3]
@@ -701,6 +760,12 @@ function commands.from(name)
end
end
+implement {
+ name = "from",
+ actions = from,
+ arguments = "string"
+}
+
function references.define(prefix,reference,list)
local d = defined[prefix] if not d then d = { } defined[prefix] = d end
d[reference] = list
@@ -713,86 +778,17 @@ function references.reset(prefix,reference)
end
end
-commands.definereference = references.define
-commands.resetreference = references.reset
-
--- \primaryreferencefoundaction
--- \secondaryreferencefoundaction
--- \referenceunknownaction
-
--- t.special t.operation t.arguments t.outer t.inner
-
--- to what extend do we check the non prefixed variant
+implement {
+ name = "definereference",
+ actions = references.define,
+ arguments = { "string", "string", "string" }
+}
--- local strict = false
---
--- local function resolve(prefix,reference,args,set) -- we start with prefix,reference
--- if reference and reference ~= "" then
--- if not set then
--- set = { prefix = prefix, reference = reference }
--- else
--- if not set.reference then set.reference = reference end
--- if not set.prefix then set.prefix = prefix end
--- end
--- local r = settings_to_array(reference)
--- for i=1,#r do
--- local ri = r[i]
--- local d
--- if strict then
--- d = defined[prefix] or defined[""]
--- d = d and d[ri]
--- else
--- d = defined[prefix]
--- d = d and d[ri]
--- if not d then
--- d = defined[""]
--- d = d and d[ri]
--- end
--- end
--- if d then
--- resolve(prefix,d,nil,set)
--- else
--- local var = splitreference(ri)
--- if var then
--- var.reference = ri
--- local vo, vi = var.outer, var.inner
--- if not vo and vi then
--- -- to be checked
--- if strict then
--- d = defined[prefix] or defined[""]
--- d = d and d[vi]
--- else
--- d = defined[prefix]
--- d = d and d[vi]
--- if not d then
--- d = defined[""]
--- d = d and d[vi]
--- end
--- end
--- --
--- if d then
--- resolve(prefix,d,var.arguments,set) -- args can be nil
--- else
--- if args then var.arguments = args end
--- set[#set+1] = var
--- end
--- else
--- if args then var.arguments = args end
--- set[#set+1] = var
--- end
--- if var.has_tex then
--- set.has_tex = true
--- end
--- else
--- -- report_references("funny pattern %a",ri)
--- end
--- end
--- end
--- return set
--- else
--- return { }
--- end
--- end
+implement {
+ name = "resetreference",
+ actions = references.reset,
+ arguments = { "string", "string" }
+}
setmetatableindex(defined,"table")
@@ -847,11 +843,11 @@ end
references.currentset = nil
-function commands.setreferenceoperation(k,v)
+local function setreferenceoperation(k,v)
references.currentset[k].operation = v
end
-function commands.setreferencearguments(k,v)
+local function setreferencearguments(k,v)
references.currentset[k].arguments = v
end
@@ -872,7 +868,22 @@ function references.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex
end
end
-commands.expandcurrentreference = references.expandcurrent -- for the moment the same
+implement {
+ name = "expandcurrentreference",
+ actions = references.expandcurrent
+}
+
+implement {
+ name = "setreferenceoperation",
+ actions = setreferenceoperation,
+ arguments = { "integer", "string" }
+}
+
+implement {
+ name = "setreferencearguments",
+ actions = setreferencearguments,
+ arguments = { "integer", "string" }
+}
local externals = { }
@@ -1164,7 +1175,7 @@ local useproduct = commands.useproduct
if useproduct then
- function commands.useproduct(product)
+ local function newuseproduct(product)
useproduct(product)
if texconditionals.autocrossfilereferences then
local component = justacomponent()
@@ -1177,6 +1188,13 @@ if useproduct then
end
end
+ implement {
+ name = "useproduct",
+ actions = newuseproduct,
+ arguments = "string",
+ overload = true,
+ }
+
end
-- productdata.firstsection.numberdata.numbers
@@ -1702,7 +1720,7 @@ references.identify = identify
local unknowns, nofunknowns, f_valid = { }, 0, formatters["[%s][%s]"]
-function references.valid(prefix,reference,highlight,newwindow,layer)
+function references.valid(prefix,reference,specification)
local set, bug = identify(prefix,reference)
local unknown = bug or #set == 0
if unknown then
@@ -1717,18 +1735,28 @@ function references.valid(prefix,reference,highlight,newwindow,layer)
unknowns[str] = u + 1
end
else
- set.highlight = highlight
- set.newwindow = newwindow
- set.layer = layer
+ set.highlight = specification.highlight
+ set.newwindow = specification.newwindow
+ set.layer = specification.layer
currentreference = set[1]
end
-- we can do the expansion here which saves a call
return not unknown
end
-function commands.doifelsereference(prefix,reference,highlight,newwindow,layer)
- commands.doifelse(references.valid(prefix,reference,highlight,newwindow,layer))
-end
+implement {
+ name = "doifelsereference",
+ actions = { references.valid, commands.doifelse },
+ arguments = {
+ "string",
+ "string",
+ {
+ { "highlight", "boolean" },
+ { "newwindow", "boolean" },
+ { "layer" },
+ }
+ }
+}
function references.reportproblems() -- might become local
if nofunknowns > 0 then
@@ -1847,13 +1875,75 @@ implement {
-- arguments = "integer",
-- }
-function references.setandgetattribute(kind,prefix,tag,data,view) -- maybe do internal automatically here
- local attr = references.set(kind,prefix,tag,data) and setinternalreference(prefix,tag,nil,view) or unsetvalue
+function references.setandgetattribute(prefix,tag,data) -- maybe do internal automatically here
+ local attr = unsetvalue
+ local mdat = data.metadata
+ local rdat = data.references
+ if mdat and rdat then
+ if not rdat.section then
+ rdat.section = structures.sections.currentid()
+ end
+ local ndat = data.numberdata
+ if ndat then
+ local numbers = ndat.numbers
+ if type(numbers) == "string" then
+ ndat.numbers = structures.counters.compact(numbers)
+ end
+ data.numberdata = structures.helpers.simplify(ndat)
+ end
+ local pdat = data.prefixdata
+ if pdat then
+ data.prefixdata = structures.helpers.simplify(pdat)
+ end
+ local udat = data.userdata
+ if type(udat) == "string" then
+ data.userdata = structures.helpers.touserdata(udat)
+ end
+ local done = references.set(mdat.kind or "page",prefix,tag,data)
+ if done then
+ attr = setinternalreference(prefix,tag,nil,rdat.view) or unsetvalue
+ end
+ end
texsetcount("lastdestinationattribute",attr)
return attr
end
-commands.setreferenceattribute = references.setandgetattribute
+implement {
+ name = "setreferenceattribute",
+ actions = references.setandgetattribute,
+ arguments = {
+ "string",
+ "string",
+ {
+ {
+ "references", {
+ { "internal", "integer" },
+ { "block" },
+ { "view" },
+ },
+ },
+ {
+ "metadata", {
+ { "kind" },
+ { "xmlroot" },
+ { "catcodes", "integer" },
+ },
+ },
+ {
+ "prefixdata", { "*" }
+ },
+ {
+ "numberdata", { "*" }
+ },
+ {
+ "entries", { "*" }
+ },
+ {
+ "userdata"
+ }
+ }
+ }
+}
function references.getinternallistreference(n) -- n points into list (todo: registers)
local l = lists.collected[n]
@@ -1861,11 +1951,11 @@ function references.getinternallistreference(n) -- n points into list (todo: reg
return i and destinationattributes[i] or 0
end
-function commands.getinternallistreference(n) -- this will also be a texcount
- local l = lists.collected[n]
- local i = l and l.references.internal
- context(i and destinationattributes[i] or 0)
-end
+implement {
+ name = "getinternallistreference",
+ actions = { references.getinternallistreference, context },
+ arguments = "integer"
+}
--
@@ -1874,12 +1964,11 @@ function references.getcurrentmetadata(tag)
return data and data.metadata and data.metadata[tag]
end
-function commands.getcurrentreferencemetadata(tag)
- local data = references.getcurrentmetadata(tag)
- if data then
- context(data)
- end
-end
+implement {
+ name = "getcurrentreferencemetadata",
+ actions = { references.getcurrentmetadata, context },
+ arguments = "string",
+}
local function currentmetadata(tag)
local data = currentreference and currentreference.i
@@ -1889,15 +1978,19 @@ end
references.currentmetadata = currentmetadata
local function getcurrentprefixspec(default)
- -- todo: message
- return currentmetadata("kind") or "?", currentmetadata("name") or "?", default or "?"
+ return
+ currentmetadata("kind") or "?",
+ currentmetadata("name") or "?",
+ default or "?"
end
references.getcurrentprefixspec = getcurrentprefixspec
-function commands.getcurrentprefixspec(default)
- ctx_getreferencestructureprefix(getcurrentprefixspec(default))
-end
+implement {
+ name = "getcurrentprefixspec",
+ actions = { getcurrentprefixspec, context }, -- returns 3 arguments
+ arguments = "string",
+}
local genericfilters = { }
local userfilters = { }
@@ -1916,7 +2009,7 @@ local function filterreference(name,...) -- number page title ...
if data then
if name == "realpage" then
local cs = references.analyze() -- normally already analyzed but also sets state
- context(tonumber(cs.realpage) or 0) -- todo, return and in command namespace
+ context(tonumber(cs.realpage) or 0)
else -- assumes data is table
local kind = type(data) == "table" and data.metadata and data.metadata.kind
if kind then
@@ -1942,21 +2035,27 @@ local function filterreference(name,...) -- number page title ...
end
local function filterreferencedefault()
- return filterreference("default",getcurrentprefixspec(v_default))
+ return filterreference("default",getcurrentprefixspec("default"))
end
references.filter = filterreference
references.filterdefault = filterreferencedefault
-commands.filterreference = filterreference
-commands.filterdefaultreference = filterreferencedefault
+implement {
+ name = "filterreference",
+ actions = filterreference,
+ arguments = "string",
+}
-function commands.currentreferencedefault(tag)
- if not tag then
- tag = "default"
- end
- filterreference(tag,context_delayed(getcurrentprefixspec(tag)))
-end
+implement {
+ name = "filterdefaultreference",
+ actions = filterreference,
+ arguments = {
+ "string", -- 'default'
+ { { "*" } }, -- prefixspec
+ { { "*" } }, -- numberspec
+ }
+}
function genericfilters.title(data)
if data then
@@ -2235,46 +2334,50 @@ function references.analyze(actions,position,spread)
return actions
end
--- function commands.referencepagestate(actions)
--- if not actions then
--- actions = references.currentset
--- end
--- if not actions then
--- context(0)
--- else
--- if not actions.pagestate then
--- references.analyze(actions) -- delayed unless explicitly asked for
--- end
--- context(actions.pagestate)
--- end
--- end
-
-function commands.referencepagestate(position,detail,spread)
+local function referencepagestate(position,detail,spread)
local actions = references.currentset
if not actions then
- context(0)
+ return 0
else
if not actions.pagestate then
references.analyze(actions,position,spread) -- delayed unless explicitly asked for
end
local pagestate = actions.pagestate
if detail then
- context(pagestate)
+ return pagestate
elseif pagestate == 4 then
- context(2) -- compatible
+ return 2 -- compatible
elseif pagestate == 5 then
- context(3) -- compatible
+ return 3 -- compatible
else
- context(pagestate)
+ return pagestate
end
end
end
-function commands.referencerealpage(actions)
+implement {
+ name = "referencepagestate",
+ actions = { referencepagestate, context },
+ arguments = "string"
+}
+
+implement {
+ name = "referencepagedetail",
+ actions = { referencepagestate, context },
+ arguments = { "string", "boolean", "boolean" }
+}
+
+local function referencerealpage(actions)
actions = actions or references.currentset
- context(not actions and 0 or actions.realpage or setreferencerealpage(actions))
+ return not actions and 0 or actions.realpage or setreferencerealpage(actions)
end
+implement {
+ name = "referencerealpage",
+ actions = { referencerealpage, context },
+ arguments = "string"
+}
+
local plist, nofrealpages
local function realpageofpage(p) -- the last one counts !
@@ -2515,24 +2618,36 @@ function references.export(usedname) end
function references.import(usedname) end
function references.load (usedname) end
-commands.exportreferences = references.export
+implement { name = "exportreferences", actions =references.export }
-- better done here .... we don't insert/remove, just use a pointer
local prefixstack = { "" }
local prefixlevel = 1
-function commands.pushreferenceprefix(prefix)
+local function pushreferenceprefix(prefix)
prefixlevel = prefixlevel + 1
prefixstack[prefixlevel] = prefix
- context(prefix)
+ return prefix
end
-function commands.popreferenceprefix()
+local function popreferenceprefix()
prefixlevel = prefixlevel - 1
if prefixlevel > 0 then
- context(prefixstack[prefixlevel])
+ return prefixstack[prefixlevel]
else
report_references("unable to pop referenceprefix")
+ return ""
end
end
+
+implement {
+ name = "pushreferenceprefix",
+ actions = { pushreferenceprefix, context }, -- we can use setmacro
+ arguments = "string",
+}
+
+implement {
+ name = "popreferenceprefix",
+ actions = { popreferenceprefix, context }, -- we can use setmacro
+}
diff --git a/tex/context/base/strc-ref.mkvi b/tex/context/base/strc-ref.mkvi
index 3c4cf80a5..678f9ca4f 100644
--- a/tex/context/base/strc-ref.mkvi
+++ b/tex/context/base/strc-ref.mkvi
@@ -143,7 +143,7 @@
\newcount\lastdestinationattribute
\def\dofinishfullreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label")}}}
-\def\dofinishtextreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label",{})}}}
+\def\dofinishtextreference#prefix#label{\normalexpanded{\ctxlatecommand{enhancereference("#prefix","#label")}}}
\let\dofinishpagereference\dofinishfullreference
\let\dofinishuserreference\dofinishfullreference
@@ -216,30 +216,34 @@
% beware, the structures.references.set writes a
\setnextinternalreference
\strc_references_start_destination_nodes
- \ctxcommand{setreferenceattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = { % we could assume page to have no metadata
- kind = "#kind", % \currentreferencekind
- \ifx\currentreferencekind\s!page\else
- catcodes = \the\catcodetable,
- xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument"\else nil\fi, % only useful when text
- \fi
- },
+ \clf_setreferenceattribute
+ {\referenceprefix}%
+ {\currentreferencelabels}%
+ {%
+ references {%
+ internal \nextinternalreference
+ block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ }%
+ metadata {%
+ kind {\currentreferencekind}%
+ \ifx\currentreferencekind\s!page\else
+ \ifx\currentreferencecoding\s!xml
+ xmlroot {\xmldocument}%
+ \fi
+ catcodes \catcodetable
+ \fi
+ }%
\ifx\currentreferencedata\empty\else
- entries = {
- text = \!!bs\currentreferencedata\!!es
- },
+ entries {%
+ text {\currentreferencedata}%
+ }%
\fi
\ifx\currentreferenceuserdata\empty\else
- userdata = structures.helpers.touserdata(\!!bs\detokenize{#userdata}\!!es)
+ userdata {\detokenize{#userdata}}%
\fi
- },"\interactionparameter\c!focus")
- }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\fi
\else
@@ -265,19 +269,21 @@
\lastdestinationattribute\attributeunsetvalue
\else
\strc_references_start_destination_nodes
-\setnextinternalreference
- \ctxcommand{setreferenceattribute("\s!page", "\referenceprefix","\currentreferencelabels",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = {
- kind = "page",
- },
- },"\interactionparameter\c!focus")
- }%
+ \setnextinternalreference
+ \clf_setreferenceattribute
+ {\referenceprefix}%
+ {\currentreferencelabels}%
+ {%
+ references {%
+ internal \nextinternalreference
+ block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ }%
+ metadata {%
+ kind {page}%
+ }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\fi
\else
@@ -291,28 +297,28 @@
\setnextinternalreference
\edef\m_strc_references_user{#user}%
\edef\m_strc_references_text{#text}%
- \ctxcommand{setreferenceattribute("\s!full", "\referenceprefix","#labels",
- {
- references = {
- internal = \nextinternalreference,
- block = "\currentsectionblock",
- section = structures.sections.currentid(),
- },
- metadata = {
- kind = "\s!full",
- },
- \ifx\m_strc_references_text\empty \else
- entries = {
- text = \!!bs\m_strc_references_text\!!es
- },
- \fi
- \ifx\m_strc_references_user\empty \else
- userdata = {
- \m_strc_references_user
- }
- \fi
- },"\interactionparameter\c!focus")
- }%
+ \clf_setreferenceattribute
+ {\referenceprefix}%
+ {#labels}%
+ {%
+ references {%
+ internal \nextinternalreference
+ block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ }%
+ metadata {%
+ kind {\s!full}%
+ }%
+ \ifx\m_strc_references_text\empty \else
+ entries {%
+ text {\m_strc_references_text}%
+ }%
+ \fi
+ \ifx\m_strc_references_user\empty \else
+ userdata {\m_strc_references_user}%
+ \fi
+ }%
+ \relax
\strc_references_stop_destination_nodes
\else
\setbox\b_strc_destination_nodes\emptyhbox
@@ -368,17 +374,19 @@
\def\strc_references_set_simple_page_reference#label%
{\iflocation
\strc_references_start_destination_nodes
- \ctxcommand{setreferenceattribute("\s!page", "\referenceprefix","#label",
- {
- references = {
- % block = "\currentsectionblock",
- % section = structures.sections.currentid(),
- },
- metadata = { % we could assume page to have no metadata
- kind = "\s!page",
- },
- },"\interactionparameter\c!focus")
- }%
+ \clf_setreferenceattribute
+ {\referenceprefix}%
+ {#label}%
+ {%
+ references {%
+ block {\currentsectionblock}%
+ view {\interactionparameter\c!focus}%
+ }%
+ metadata {%
+ kind {\s!page}%
+ }%
+ }%
+ \relax
\strc_references_stop_destination_nodes
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
\else
@@ -388,7 +396,15 @@
\def\strc_references_get_simple_page_reference#label%
{\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {%
+ height \ht\strutbox
+ depth \dp\strutbox
+ \extrareferencearguments
+ }%
+ \relax
\xdef\currentreferenceattribute{\number\lastreferenceattribute}%
\else
\xdef\currentreferenceattribute{\number\attributeunsetvalue}%
@@ -528,9 +544,6 @@
\newcount\referencehastexstate % set in backend
-\def\referencepagestate{\ctxcommand{referencepagestate()}}
-\def\referencerealpage {\ctxcommand{referencerealpage ()}}
-
% referencepagestate:
%
% 0 = no page ref, 1=same page, 2=before, 3=after
@@ -618,13 +631,13 @@
{\dodoubleempty\strc_references_define_reference}
\def\strc_references_define_reference[#name][#specification]%
- {\ctxcommand{definereference("\referenceprefix","#name",\!!bs\detokenize{#specification}\!!es)}}
+ {\clf_definereference{\referenceprefix}{#name}{\detokenize{#specification}}}
\unexpanded\def\resetreference[#name]%
- {\ctxcommand{resetreference("\referenceprefix","#name")}}
+ {\clf_resetreference{\referenceprefix}{#name}}
\def\setpagereference#name#specification% hm,. low level ?
- {\ctxcommand{definereference("","#name",\!!bs\v!page(\luaescapestring{#specification})\!!es)}}
+ {\clf_definereference{}{#name}{\v!page(\detokenize{#specification}}} % is detokenize needed here?
%D Chained references are defined as:
%D
@@ -654,13 +667,13 @@
\newconditional\gotonewwindow \setfalse\gotonewwindow
\def\expandtexincurrentreference % will happen in lua some time
- {\ifcase\referencehastexstate\else\ctxcommand{expandcurrentreference()}\fi}
+ {\ifcase\referencehastexstate\else\clf_expandcurrentreference\fi}
-\def\expandreferenceoperation#tag#content{\ctxcommand{setreferenceoperation(#tag,\!!bs#content\!!es)}}
-\def\expandreferencearguments#tag#content{\ctxcommand{setreferencearguments(#tag,\!!bs#content\!!es)}}
+\def\expandreferenceoperation#tag#content{\clf_setreferenceoperation#tag{#content}}
+\def\expandreferencearguments#tag#content{\clf_setreferencearguments#tag{#content}}
-\def\doifreferencefoundelse#labels#yes#nop%
- {\ctxcommand{doifelsereference("\referenceprefix",\!!bs#labels\!!es,\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}%
+\def\doifreferencefoundelse#label#yes#nop%
+ {\clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
#yes}%
{#nop}}
@@ -770,10 +783,10 @@
{\global\advance\locationcount\plusone}
\def\setnextinternalreferences#kind#name% plural
- {\ctxcommand{setnextinternalreference("#kind","#name")}}
+ {\clf_setnextinternalreference{#kind}{#name}}
\def\getinternalorderreference#kind#name%
- {\ctxcommand{currentreferenceorder("#kind","#name")}}
+ {\clf_currentreferenceorder{#kind}{#name}}
\def\thisissomeinternal#kind#name% only for old time sake
{\begingroup
@@ -840,7 +853,7 @@
\appendtoks
\edef\p_export{\referencingparameter\c!export}%
\ifx\p_export\v!yes
- \ctxcommand{exportreferences()}%
+ \clf_exportreferences
\fi
\to \everygoodbye
@@ -855,16 +868,16 @@
% {\popmacro\referenceprefix}
\unexpanded\def\globalpushreferenceprefix#prefix%
- {\xdef\referenceprefix{\ctxcommand{pushreferenceprefix("#prefix")}}}
+ {\xdef\referenceprefix{\clf_pushreferenceprefix{#prefix}}}
\unexpanded\def\globalpopreferenceprefix
- {\xdef\referenceprefix{\ctxcommand{popreferenceprefix()}}}
+ {\xdef\referenceprefix{\clf_popreferenceprefix}}
\unexpanded\def\pushreferenceprefix#prefix%
- {\edef\referenceprefix{\ctxcommand{pushreferenceprefix("#prefix")}}}
+ {\edef\referenceprefix{\clf_pushreferenceprefix{#prefix}}}
\unexpanded\def\popreferenceprefix
- {\edef\referenceprefix{\ctxcommand{popreferenceprefix()}}}
+ {\edef\referenceprefix{\clf_popreferenceprefix}}
\def\m_strc_references_prefix_yes{+}
\def\m_strc_references_prefix_nop{-}
@@ -954,15 +967,15 @@
\ifdefined\over \let\normalmathover \over \unexpanded\def\over {\mathortext\normalmathover \strc_references_about} \else \let\over \strc_references_about \fi
\to \everydump
- \def\filterreference #key{\ctxcommand{filterreference("#key")}} % no checking, expanded
-\unexpanded\def\getreferenceentry#key{\ctxcommand{filterreference("#key")}} % no checking, unexpanded
+ \def\filterreference #key{\clf_filterreference{#key}} % no checking, expanded
+\unexpanded\def\getreferenceentry#key{\clf_filterreference{#key}} % no checking, unexpanded
-\def\currentreferencenumber {\filterreference{number}}
-\def\currentreferencepage {\filterreference{page}}
-\def\currentreferencetitle {\filterreference{title}}
-\def\currentreferencetext {\filterreference{text}}
-\def\currentreferencedefault {\filterreference{default}}
-\def\currentreferencerealpage{\filterreference{realpage}}
+\def\currentreferencenumber {\clf_filterreference{number}}
+\def\currentreferencepage {\clf_filterreference{page}}
+\def\currentreferencetitle {\clf_filterreference{title}}
+\def\currentreferencetext {\clf_filterreference{text}}
+\def\currentreferencedefault {\clf_filterreference{default}}
+\def\currentreferencerealpage{\clf_filterreference{realpage}}
%D The most straightforward way of retrieving references is
%D using \type{\ref}.
@@ -972,7 +985,7 @@
\def\strc_references_get_reference[#key][#label]% #key = number page title text default realpage ...
{\ifsecondargument
- \doifreferencefoundelse{#label}{\ctxcommand{filterreference("#key")}}\dummyreference
+ \doifreferencefoundelse{#label}{\clf_filterreference{#key}}\dummyreference
\else
\dummyreference
\fi}
@@ -1007,42 +1020,6 @@
%D ... \atpage[someref] ...
%D \stoptyping
-% % 0 = unknown
-% % 1 = same
-% % 2 = before
-% % 3 = after
-%
-% \def\strc_references_by_reference_page_state#unknown#before#current#after%
-% {\ifcase\referencepagestate\space#unknown\or#current\or#before\or#after\fi}
-%
-% % \unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
-% % {\doifreferencefoundelse{#label}% usage needs checking (useless)
-% % {\goto{\strc_references_by_reference_page_state{#label}{#backward}{}{#foreward}}[#label]}
-% % {[#label]}}
-% %
-% % better:
-%
-% \unexpanded\def\somewhere#backward#foreward#dummy[#label]% #dummy gobbles space around #foreward
-% {\doifreferencefoundelse{#label}%
-% {\strc_references_by_reference_page_state{#label}{\goto{#backward}[#label]}{}{\goto{#foreward}[#label]}}
-% {[#label]}}
-%
-% \unexpanded\def\atpage[#label]% todo
-% {\doifreferencefoundelse{#label}% kind of inefficient as \goto also analyzes
-% {\goto
-% {\strc_references_by_reference_page_state
-% {\labeltexts\v!page\dummyreference}%
-% {\labeltext\v!hencefore}%
-% {\labeltexts\v!atpage\currentreferencepage}%
-% {\labeltext\v!hereafter}}%
-% [#label]}
-% {[#label]}}
-%
-% \unexpanded\def\referencesymbol
-% {\hbox{\strut\high
-% {\setupsymbolset[\interactionparameter\c!symbolset]%
-% \symbol[\strc_references_by_reference_page_state\v!somewhere\v!nowhere\v!previous\v!next]}}}
-
% standard detail
%
% 0 = unknown unknown
@@ -1085,8 +1062,20 @@
\setupreferencing
[\c!doublesided=\v!yes]
-\def\referencepagestate {\numexpr\ctxcommand{referencepagestate("rst::\number\nofreferencestates")}\relax}
-\def\referencepagedetail{\numexpr\ctxcommand{referencepagestate("rst::\number\nofreferencestates",true\ifconditional\pagestatespread\ifdoublesided,\s!true\fi\fi)}\relax}
+\def\referencepagestate
+ {\numexpr\clf_referencepagestate
+ {rst::\number\nofreferencestates}%
+ \relax}
+
+\def\referencepagedetail
+ {\numexpr\clf_referencepagestate
+ {rst::\number\nofreferencestates}%
+ true %
+ \ifconditional\pagestatespread false\ifdoublesided true\else false\fi\fi
+ \relax}
+
+\def\referencerealpage
+ {\clf_referencerealpage}
\unexpanded\def\tracedpagestate
{{\blue\tttf(\ifcase\referencepagedetail unknown\or same\or previous\or next\or above\or below\else unknown\fi)}}
@@ -1268,8 +1257,15 @@
\goto{\referencesequence}[#label]}%
\strc_references_stop_goto}
-\unexpanded\def\strc_references_in{\strc_references_start_goto\let\currentreferencecontent\currentreferencedefault\strc_references_pickup_goto}
-\unexpanded\def\strc_references_at{\strc_references_start_goto\let\currentreferencecontent\currentreferencepage \strc_references_pickup_goto}
+\unexpanded\def\strc_references_in
+ {\strc_references_start_goto
+ \let\currentreferencecontent\currentreferencedefault
+ \strc_references_pickup_goto}
+
+\unexpanded\def\strc_references_at
+ {\strc_references_start_goto
+ \let\currentreferencecontent\currentreferencepage
+ \strc_references_pickup_goto}
%D \macros
%D {definereferenceformat}
@@ -1380,7 +1376,7 @@
\def\autoreferencelabeltextflag{*} % a proper key like 'auto' or 'name' can clash with a label key
\unexpanded\def\autoreferencelabeltext
- {\ctxcommand{getcurrentreferencemetadata("name")}}
+ {\clf_getcurrentreferencemetadata{name}}
% \starttext
% \definereferenceformat[inxx] [left=(,right=),text=txt]
@@ -1425,7 +1421,9 @@
\newconditional\uselocationstrut \settrue\uselocationstrut
\def\extrareferencearguments
- {\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow,"\currentviewerlayer"}
+ {highlight \luaconditional\highlighthyperlinks\space
+ newwindow \luaconditional\gotonewwindow\space
+ layer {\currentviewerlayer}}
\unexpanded\def\directgoto
{\ifconditional\uselocationstrut
@@ -1457,7 +1455,15 @@
\attribute\referenceattribute\attributeunsetvalue
\global\lastsavedreferenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {%
+ height \ht\strutbox
+ depth \dp\strutbox
+ \extrareferencearguments
+ }%
+ \relax
\setlocationattributes
\setstrut % can be option
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1476,7 +1482,15 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {%
+ height \dimexpr\interactionparameter\c!height\relax
+ depth \dimexpr\interactionparameter\c!depth \relax
+ \extrareferencearguments
+ }%
+ \relax
\setlocationattributes
\attribute\referenceattribute\lastreferenceattribute
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1495,9 +1509,12 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(\number\ht\strutbox,\number\dp\strutbox)}%
+ \clf_injectcurrentreference_dimensions
+ \ht\strutbox
+ \dp\strutbox
+ \relax
\setlocationattributes
\setstrut % can be option
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1516,7 +1533,9 @@
{\dontleavehmode
\begingroup
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}{\expandafter\startgoto_yes}{\expandafter\startgoto_nop}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
+ {\expandafter\startgoto_yes}%
+ {\expandafter\startgoto_nop}%
\else
\expandafter\startgoto_nop
\fi}
@@ -1529,7 +1548,10 @@
\unexpanded\def\startgoto_yes
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(\number\ht\strutbox,\number\dp\strutbox)}%
+ \clf_injectcurrentreference_dimensions
+ \ht\strutbox
+ \dp\strutbox
+ \relax
\setlocationattributes
\setstrut % can be option
\global\lastsavedreferenceattribute\lastreferenceattribute
@@ -1547,9 +1569,12 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax)}%
+ \clf_injectcurrentreference_dimensions
+ \dimexpr\interactionparameter\c!height\relax
+ \dimexpr\interactionparameter\c!depth \relax
+ \relax
\setlocationattributes
\global\lastsavedreferenceattribute\lastreferenceattribute
\attribute\referenceattribute\lastreferenceattribute
@@ -1568,7 +1593,11 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {\extrareferencearguments}%
+ \relax
\setlocationattributes
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
@@ -1585,7 +1614,11 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {\extrareferencearguments}%
+ \relax
\setlocationcolorspec{#resolver}% no consequence for strut
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
@@ -1602,7 +1635,11 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{injectreference("\referenceprefix","#label",nil,nil,\extrareferencearguments)}%
+ \clf_injectreference
+ {\referenceprefix}%
+ {#label}%
+ {\extrareferencearguments}%
+ \relax
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
\hbox attr \referenceattribute \lastreferenceattribute {#content}%
@@ -1618,9 +1655,9 @@
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\expandtexincurrentreference
- \ctxcommand{injectcurrentreference(nil,nil)}%
+ \clf_injectcurrentreference
\setlocationattributes
\global\lastsavedreferenceattribute\lastreferenceattribute
\dostarttagged\t!link\empty
@@ -1640,8 +1677,8 @@
\ht\scratchbox#height%
\global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
- \ctxcommand{doifelsereference("\referenceprefix","#label",\extrareferencearguments)}%
- {\ctxcommand{injectcurrentreference(nil,nil)}%
+ \clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
+ {\clf_injectcurrentreference
\global\lastsavedreferenceattribute\lastreferenceattribute
\hbox attr \referenceattribute \lastreferenceattribute {\box\scratchbox}}
{\box\scratchbox}%
@@ -1703,13 +1740,13 @@
\let\useexternaldocument\usefile
\def\strc_references_use_url[#label][#url][#file][#description]%
- {\ctxcommand{useurl("#label",\!!bs\detokenize{#url}\!!es,\!!bs\detokenize{#file}\!!es,\!!bs\detokenize{#description}\!!es)}}
+ {\clf_useurl{#label}{\detokenize{#url}}{\detokenize{#file}}{\detokenize{#description}}}
\def\strc_references_use_file[#label][#file][#description]%
- {\ctxcommand{usefile("#label",\!!bs\detokenize{#file}\!!es,\!!bs\detokenize{#description}\!!es)}}
+ {\clf_usefile{#label}{\detokenize{#file}}{\detokenize{#description}}}
-\def\doifurldefinedelse #label{\ctxcommand{doifurldefinedelse ("#label")}}
-\def\doiffiledefinedelse#label{\ctxcommand{doiffiledefinedelse("#label")}}
+\def\doifurldefinedelse #label{\clf_doifurldefinedelse {#label}}
+\def\doiffiledefinedelse#label{\clf_doiffiledefinedelse{#label}}
%D \macros
%D {url,setupurl}
@@ -1740,7 +1777,7 @@
{\dontleavehmode
\begingroup
\useurlstyleandcolor\c!style\c!color
- \hyphenatedurl{\ctxcommand{geturl("#label")}}%
+ \hyphenatedurl{\clf_geturl{#label}}%
\endgroup}
%D This macro is hooked into a support macro, and thereby
@@ -1771,7 +1808,7 @@
\def\strc_references_do_special_from[#label]%
{\dontleavehmode
- \goto{\ctxcommand{from("#label")}}[fileorurl(#label)]}
+ \goto{\clf_from{#label}}[fileorurl(#label)]}
\def\dofromurldescription#content% called at the lua end
{#content}
@@ -1816,13 +1853,13 @@
{\dotripleargument\strc_references_define_program}
\def\strc_references_define_program[#name][#program][#description]%
- {\ctxcommand{defineprogram("#name",\!!bs#program\!!es,\!!bs#description\!!es)}}
+ {\clf_defineprogram{#name}{#program}{#description}}
\def\program[#name]% incompatible, more consistent, hardy used anyway
{\dontleavehmode
\begingroup
\useprogramsstyleandcolor\c!style\c!color
- \ctxcommand{getprogram("#name","\directprogramsparameter\c!alternative","\directprogramsparameter\c!space")}%
+ \clf_getprogram{#name}%
\endgroup}
%D As we can see, we directly use the special reference
@@ -2046,36 +2083,25 @@
\installcorenamespace{referencingprefix}
-% \def\getreferencestructureprefix#kind#name#category% name will change
-% {{
-% prefix = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix",
-% separatorset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset",
-% conversion = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion",
-% conversionset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset",
-% set = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset",
-% segments = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments",
-% connector = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector\!!es,
-% }}
-
\def\getreferencestructureprefix#kind#name#category% name will change
{{
- prefix = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix",
- separatorset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset",
- conversion = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion",
- conversionset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset",
- starter = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstarter\!!es,
- stopper = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstopper\!!es,
- set = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset",
- segments = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments",
- connector = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector\!!es,
- },
+ prefix {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefix}%
+ separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixseparatorset}%
+ conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversion}%
+ conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconversionset}%
+ starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstarter}%
+ stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixstopper}%
+ set {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixset}%
+ segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixsegments}%
+ connector {\referencestructureprefixparameter{#kind}{#name}{#category}\c!prefixconnector}%
+ }
{
- separatorset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberseparatorset",
- conversion = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversion",
- conversionset = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversionset",
- starter = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstarter\!!es,
- stopper = \!!bs\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstopper\!!es,
- segments = "\referencestructureprefixparameter{#kind}{#name}{#category}\c!numbersegments",
+ separatorset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberseparatorset}%
+ conversion {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversion}%
+ conversionset {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberconversionset}%
+ starter {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstarter}%
+ stopper {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numberstopper}%
+ segments {\referencestructureprefixparameter{#kind}{#name}{#category}\c!numbersegments}%
}}
\unexpanded\def\setupreferencestructureprefix
@@ -2097,16 +2123,11 @@
\csname \??referencingprefix:#category#parameter\endcsname
\fi\fi\fi}
-% \def\currentreferencedefault
-% {\ctxcommand{filterdefaultreference()}}
-
\def\currentreferencedefault
- {\ctxcommand{filterreference("\s!default",\ctxcommand{getcurrentprefixspec("\s!default")})}}
-
-% needs testing
-%
-% \def\currentreferencedefault
-% {\ctxcommand{currentreferencedefault()}}
+ {\clf_filterdefaultreference
+ {\s!default}%
+ \getreferencestructureprefix\clf_getcurrentprefixspec{\s!default}% returns #kind#name#category
+ \relax}
%D Not all support is visible by looking at the \TEX\ code; here is one of those:^
%D
diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua
index 4268001fa..99cad84a7 100644
--- a/tex/context/base/strc-reg.lua
+++ b/tex/context/base/strc-reg.lua
@@ -47,6 +47,8 @@ local v_text = variables.text
local context = context
local commands = commands
+local implement = interfaces.implement
+
local matchingtilldepth = sections.matchingtilldepth
local numberatdepth = sections.numberatdepth
local currentlevel = sections.currentlevel
@@ -416,8 +418,18 @@ end
registers.define = defineregister -- 4 times is somewhat over the top but we want consistency
registers.setmethod = defineregister -- and we might have a difference some day
-commands.defineregister = defineregister
-commands.setregistermethod = defineregister
+
+implement {
+ name = "defineregister",
+ actions = defineregister,
+ arguments = { "string", "string" }
+}
+
+implement {
+ name = "setregistermethod",
+ actions = defineregister, -- duplicate use
+ arguments = { "string", "string" }
+}
local entrysplitter = lpeg.tsplitat('+') -- & obsolete in mkiv
@@ -845,13 +857,11 @@ function registers.userdata(index,name)
return data and data.userdata and data.userdata[name] or nil
end
-function commands.registeruserdata(index,name)
- local data = references.internals[tonumber(index)]
- data = data and data.userdata and data.userdata[name]
- if data then
- context(data)
- end
-end
+implement {
+ name = "registeruserdata",
+ actions = { registers.userdata, context },
+ arguments = { "integer", "string" }
+}
-- todo: ownnumber
@@ -990,8 +1000,8 @@ function registers.flush(data,options,prefixspec,pagespec)
if #list > 1 then
list[#list] = nil
else
- -- we have an \seeindex{Foo}{Bar} without Foo being defined anywhere
- report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1])
+ -- we have an \seeindex{Foo}{Bar} without Foo being defined anywhere .. somehow this message is wrong
+ -- report_registers("invalid see entry in register %a, reference %a",entry.metadata.name,list[1][1])
end
end
end
diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv
index 30fc698be..d4dbea9d5 100644
--- a/tex/context/base/strc-reg.mkiv
+++ b/tex/context/base/strc-reg.mkiv
@@ -134,7 +134,7 @@
\ifconditional\c_strc_registers_defining \else % todo: dosingle ...
\settrue\c_strc_registers_defining
\definemixedcolumns[\currentregister][\v!register]% first as otherwise it overloads start/stop
- \ctxcommand{defineregister("\currentregister","\registerparameter\c!referencemethod")}%
+ \clf_defineregister{\currentregister}{\registerparameter\c!referencemethod}%
\normalexpanded{\presetheadtext[\currentregister=\Word{\currentregister}]}%
\setuevalue{\currentregister}{\dodoubleempty\strc_registers_insert_entry[\currentregister]}%
\setuevalue{\e!see\currentregister}{\dodoubleempty\strc_registers_insert_see[\currentregister]}%
@@ -155,7 +155,7 @@
\to \everydefineregister
\appendtoks
- \ctxcommand{setregistermethod("\currentregister","\registerparameter\c!referencemethod")}%
+ \clf_setregistermethod{\currentregister}{\registerparameter\c!referencemethod}%
\to \everysetupregister
%D Registering:
@@ -923,7 +923,7 @@
% \placeregister[index][n=1,pagecommand=\MyRegisterPageCommand]
% \stoptext
-\def\registerpageuserdata #1#2{\ctxcommand{registeruserdata(#1,"#2")}}
+\def\registerpageuserdata #1#2{\clf_registeruserdata#1{#2}}
\def\currentregisterpageuserdata {\registerpageuserdata\currentregisterpageindex} % {#1}
% not yet ok : new internal handler names
diff --git a/tex/context/base/strc-tag.lua b/tex/context/base/strc-tag.lua
index a20375448..aa7311947 100644
--- a/tex/context/base/strc-tag.lua
+++ b/tex/context/base/strc-tag.lua
@@ -389,10 +389,10 @@ function tags.elementtag()
end
function tags.setuserproperties(tag,list)
- if list then
- tag = tagcontext[tag]
- else
+ if not list or list == "" then
tag, list = chain[stacksize], tag
+ else
+ tag = tagcontext[tag]
end
if tag then -- an attribute now
local l = settings_to_hash(list)
@@ -478,14 +478,7 @@ implement { name = "settagproperty_n", actions = tags.setproperty, arguments = {
implement { name = "getelementtag", actions = { tags.elementtag, context } }
implement {
- name = "setelementuserproperties_o",
- scope = "private",
- actions = tags.setuserproperties,
- arguments = "string"
-}
-
-implement {
- name = "setelementuserproperties_t",
+ name = "setelementuserproperties",
scope = "private",
actions = tags.setuserproperties,
arguments = { "string", "string" }
diff --git a/tex/context/base/strc-tag.mkiv b/tex/context/base/strc-tag.mkiv
index d114c15b5..804eadc61 100644
--- a/tex/context/base/strc-tag.mkiv
+++ b/tex/context/base/strc-tag.mkiv
@@ -295,16 +295,13 @@
\def\strc_tags_setup_element_user_properties_indeed
{\iftrialtypesetting
- \expandafter \strc_tags_setup_element_user_properties_indeed_nop
- \else\ifsecondargument
- \doubleexpandafter\strc_tags_setup_element_user_properties_indeed_two
+ \expandafter\strc_tags_setup_element_user_properties_indeed_nop
\else
- \doubleexpandafter\strc_tags_setup_element_user_properties_indeed_one
- \fi\fi}
+ \expandafter\strc_tags_setup_element_user_properties_indeed_yes
+ \fi}
\def\strc_tags_setup_element_user_properties_indeed_nop[#1][#2]{}
-\def\strc_tags_setup_element_user_properties_indeed_one[#1][#2]{\clf_setelementuserproperties_o{#1}}
-\def\strc_tags_setup_element_user_properties_indeed_two[#1][#2]{\clf_setelementuserproperties_u{#1}{#2}}
+\def\strc_tags_setup_element_user_properties_indeed_yes[#1][#2]{\clf_setelementuserproperties{#1}{#2}}
\unexpanded\def\strc_tags_enable_properties
{\let\getelementtag \strc_tags_get_element_tag_yes
@@ -486,7 +483,7 @@
%D \stoptyping
\unexpanded\def\settaggedmetadata[#1]%
- {\clf_registermetadata{#1}}
+ {\clf_settaggedmetadata{#1}}
%D An overload:
diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv
index 9546026e9..bf936caa4 100644
--- a/tex/context/base/syst-aux.mkiv
+++ b/tex/context/base/syst-aux.mkiv
@@ -7038,7 +7038,7 @@
%def\getsubstring#1#2#3{\cldcontext{utf.sub([[#3]],tonumber("#1"),tonumber("#2"))}}
\def\getsubstring#1#2#3{\ctxcommand{getsubstring(\!!bs#3\!!es,"#1","#2")}}
-%D Other dimensions that pt:
+%D Other dimensions than pt:
% \def\converteddimen#1#2{\ctxcommand{converteddimen(\number\dimexpr#1,"#2")}}
@@ -7095,6 +7095,22 @@
% \def\syst_aux_case_nop#1%
% {\syst_aux_case}
+%D \macros
+%D {ntimes}
+%D
+%D some repetition:
+%D
+%D \startbuffer
+%D \ntimes{*}{20}
+%D \stopbuffer
+%D
+%D \typebuffer \blank gives: \getbuffer \blank
+%D
+%D This is not real fast but quite okay:
+
+%def\ntimes#1#2{\ifnum#2>\zerocount#1\ntimes{#1}{\numexpr#2-\plusone\relax}\fi} % 1.72
+\def\ntimes#1#2{\clf_ntimes{#1}\numexpr#2\relax} % 0.33
+
\protect \endinput
% \edef\choicetokenyes{+}
diff --git a/tex/context/base/syst-con.lua b/tex/context/base/syst-con.lua
index dfbd49051..0fa685b2d 100644
--- a/tex/context/base/syst-con.lua
+++ b/tex/context/base/syst-con.lua
@@ -7,16 +7,18 @@ if not modules then modules = { } end modules ['syst-con'] = {
}
local tonumber = tonumber
+local math = math
local utfchar = utf.char
-local gsub, format = string.gsub, string.format
+local gsub = string.gsub
converters = converters or { }
local converters = converters
local context = context
-local comands = commands
+local commands = commands
+local implement = interfaces.implement
-local formatters = string,formatters
+local formatters = string.formatters
--[[ldx--
<p>For raw 8 bit characters, the offset is 0x110000 (bottom of plane 18) at
@@ -28,45 +30,39 @@ function converters.octstringtonumber(n) tonumber(n, 8) end
function converters.rawcharacter (n) utfchar(0x110000+n) end
-converters.lchexnumber = formatters["%x" ]
-converters.uchexnumber = formatters["%X" ]
-converters.lchexnumbers = formatters["%02x"]
-converters.uchexnumbers = formatters["%02X"]
-converters.octnumber = formatters["%03o"]
-
-function commands.hexstringtonumber(n) context(tonumber(n,16)) end
-function commands.octstringtonumber(n) context(tonumber(n, 8)) end
-
-function commands.rawcharacter (n) context(utfchar(0x110000+n)) end
-
-function commands.lchexnumber (n) context("%x" ,n) end
-function commands.uchexnumber (n) context("%X" ,n) end
-function commands.lchexnumbers (n) context("%02x",n) end
-function commands.uchexnumbers (n) context("%02X",n) end
-function commands.octnumber (n) context("%03o",n) end
-
-function commands.format(fmt,...) -- used ?
- fmt = gsub(fmt,"@","%%")
- context(fmt,...)
-end
-
-local cosd, sind, tand = math.cosd, math.sind, math.tand
-local cos, sin, tan = math.cos, math.sin, math.tan
-
--- unfortunately %s spits out: 6.1230317691119e-017
---
--- function commands.sind(n) context(sind(n)) end
--- function commands.cosd(n) context(cosd(n)) end
--- function commands.tand(n) context(tand(n)) end
---
--- function commands.sin (n) context(sin (n)) end
--- function commands.cos (n) context(cos (n)) end
--- function commands.tan (n) context(tan (n)) end
-
-function commands.sind(n) context("%0.6F",sind(n)) end
-function commands.cosd(n) context("%0.6F",cosd(n)) end
-function commands.tand(n) context("%0.6F",tand(n)) end
-
-function commands.sin (n) context("%0.6F",sin (n)) end
-function commands.cos (n) context("%0.6F",cos (n)) end
-function commands.tan (n) context("%0.6F",tan (n)) end
+local lchexnumber = formatters["%x"]
+local uchexnumber = formatters["%X"]
+local lchexnumbers = formatters["%02x"]
+local uchexnumbers = formatters["%02X"]
+local octnumber = formatters["%03o"]
+local nicenumber = formatters["%0.6F"]
+
+converters.lchexnumber = lchexnumber
+converters.uchexnumber = uchexnumber
+converters.lchexnumbers = lchexnumbers
+converters.uchexnumbers = uchexnumbers
+converters.octnumber = octnumber
+converters.nicenumber = nicenumber
+
+implement { name = "hexstringtonumber", actions = { tonumber, context }, arguments = { "integer", 16 } }
+implement { name = "octstringtonumber", actions = { tonumber, context }, arguments = { "integer", 8 } }
+
+implement { name = "rawcharacter", actions = function(n) context(utfchar(0x110000+n)) end, arguments = "integer" }
+
+implement { name = "lchexnumber", actions = { lchexnumber, context }, arguments = "integer" }
+implement { name = "uchexnumber", actions = { uchexnumber, context }, arguments = "integer" }
+implement { name = "lchexnumbers", actions = { lchexnumbers, context }, arguments = "integer" }
+implement { name = "uchexnumbers", actions = { uchexnumbers, context }, arguments = "integer" }
+implement { name = "octnumber", actions = { octnumber, context }, arguments = "integer" }
+
+implement { name = "sin", actions = { math.sin, nicenumber, context }, arguments = "number" }
+implement { name = "cos", actions = { math.cos, nicenumber, context }, arguments = "number" }
+implement { name = "tan", actions = { math.tan, nicenumber, context }, arguments = "number" }
+
+implement { name = "sind", actions = { math.sind, nicenumber, context }, arguments = "number" }
+implement { name = "cosd", actions = { math.cosd, nicenumber, context }, arguments = "number" }
+implement { name = "tand", actions = { math.tand, nicenumber, context }, arguments = "number" }
+
+-- only as commands
+
+function commands.format(fmt,...) context((gsub(fmt,"@","%%")),...) end
diff --git a/tex/context/base/syst-con.mkiv b/tex/context/base/syst-con.mkiv
index de8ed597e..17c407819 100644
--- a/tex/context/base/syst-con.mkiv
+++ b/tex/context/base/syst-con.mkiv
@@ -46,10 +46,10 @@
%D [\expandafter\uchexnumber\expandafter{\the\zerocount}]
%D \stoptyping
-\def\lchexnumber #1{\ctxcommand{lchexnumber(\number#1)}}
-\def\uchexnumber #1{\ctxcommand{uchexnumber(\number#1)}}
-\def\lchexnumbers#1{\ctxcommand{lchexnumbers(\number#1)}}
-\def\uchexnumbers#1{\ctxcommand{uchexnumbers(\number#1)}}
+\def\lchexnumber #1{\clf_lchexnumber \numexpr#1\relax}
+\def\uchexnumber #1{\clf_uchexnumber \numexpr#1\relax}
+\def\lchexnumbers#1{\clf_lchexnumbers\numexpr#1\relax}
+\def\uchexnumbers#1{\clf_uchexnumbers\numexpr#1\relax}
\let\hexnumber\uchexnumber
@@ -58,7 +58,7 @@
%D
%D For unicode remapping purposes, we need octal numbers.
-\def\octnumber#1{\ctxcommand{octnumber(\number#1)}}
+\def\octnumber#1{\clf_octnumber\numexpr#1\relax}
%D \macros
%D {hexstringtonumber,octstringtonumber}
@@ -67,8 +67,8 @@
%D a decimal number, thereby taking care of lowercase characters
%D as well.
-\def\hexstringtonumber#1{\ctxcommand{hexstringtonumber("#1")}}
-\def\octstringtonumber#1{\ctxcommand{octstringtonumber("#1")}}
+\def\hexstringtonumber#1{\clf_hexstringtonumber\numexpr#1\relax}
+\def\octstringtonumber#1{\clf_octstringtonumber\numexpr#1\relax}
%D \macros
%D {rawcharacter}
@@ -76,7 +76,7 @@
%D This macro can be used to produce proper 8 bit characters
%D that we sometimes need in backends and round||trips.
-\def\rawcharacter#1{\ctxcommand{rawcharacter(\number#1)}}
+\def\rawcharacter#1{\clf_rawcharacter\numexpr#1\relax}
%D \macros
%D {twodigits, threedigits}
@@ -126,23 +126,12 @@
%D \macros
%D {setcalculatedsin,setcalculatedcos,setcalculatedtan}
-%D
-%D This saves some 2K in the format. At some point we will redo the
-%D code that calls this. Beware: in \MKII\ this is a separate module.
-
-% \let\calculatesin\gobbleoneargument
-% \let\calculatecos\gobbleoneargument
-% \let\calculatetan\gobbleoneargument
-
-% \def\setcalculatedsin#1#2{\edef#1{\cldcontext{math.sind(#2)}}} % jit-unsafe
-% \def\setcalculatedcos#1#2{\edef#1{\cldcontext{math.cosd(#2)}}} % jit-unsafe
-% \def\setcalculatedtan#1#2{\edef#1{\cldcontext{math.tand(#2)}}} % jit-unsafe
-\def\setcalculatedsin#1#2{\edef#1{\ctxcommand{sind(#2)}}}
-\def\setcalculatedcos#1#2{\edef#1{\ctxcommand{cosd(#2)}}}
-\def\setcalculatedtan#1#2{\edef#1{\ctxcommand{tand(#2)}}}
+\def\setcalculatedsin#1#2{\edef#1{\clf_sind#2}}
+\def\setcalculatedcos#1#2{\edef#1{\clf_cosd#2}}
+\def\setcalculatedtan#1#2{\edef#1{\clf_tand#2}}
- \def\formatted#1{\ctxcommand{format(#1)}}
-\unexpanded\def\format #1{\ctxcommand{format(#1)}}
+ \def\formatted#1{\ctxcommand{format(#1)}} % not clf
+\unexpanded\def\format #1{\ctxcommand{format(#1)}} % not clf
\protect \endinput
diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua
index 8fa43588f..9466ed94b 100644
--- a/tex/context/base/syst-lua.lua
+++ b/tex/context/base/syst-lua.lua
@@ -6,15 +6,17 @@ if not modules then modules = { } end modules ['syst-lua'] = {
license = "see context related readme files"
}
-local format, find, match, rep = string.format, string.find, string.match, string.rep
+local find, match = string.find, string.match
local tonumber = tonumber
local S, lpegmatch, lpegtsplitat = lpeg.S, lpeg.match, lpeg.tsplitat
-commands = commands or { }
-local commands = commands
+commands = commands or { }
+local commands = commands
-local context = context
-local csprint = context.sprint
+local implement = interfaces.implement
+
+local context = context
+local csprint = context.sprint
local prtcatcodes = tex.prtcatcodes
@@ -158,9 +160,11 @@ function commands.firstinset(str)
context(first or str)
end
-function commands.ntimes(str,n)
- context(rep(str,n or 1))
-end
+implement {
+ name = "ntimes",
+ actions = { string.rep, context },
+ arguments = { "string", "integer" }
+}
function commands.execute(str)
os.execute(str) -- wrapped in sandbox
diff --git a/tex/context/base/toks-scn.lua b/tex/context/base/toks-scn.lua
index 3da962dad..b01376b60 100644
--- a/tex/context/base/toks-scn.lua
+++ b/tex/context/base/toks-scn.lua
@@ -21,8 +21,6 @@ local loadstring = loadstring
local scanners = tokens.scanners
local tokenbits = tokens.bits
-if not scanners then return end -- for now
-
local scanstring = scanners.string
local scaninteger = scanners.integer
local scannumber = scanners.number
@@ -32,12 +30,11 @@ local scancode = scanners.code
local scanboolean = scanners.boolean
local scandimen = scanners.dimen
-if not scanstring then return end -- for now
-
local todimen = number.todimen
+local toboolean = toboolean
local lpegmatch = lpeg.match
-local p_unquoted = lpeg.patterns.unquoted
+local p_unquoted = lpeg.Cs(lpeg.patterns.unquoted)
local trace_compile = false trackers.register("tokens.compile", function(v) trace_compile = v end)
local report_compile = logs.reporter("tokens","compile")
@@ -93,6 +90,7 @@ local shortcuts = {
todimen = todimen,
tonumber = tonumber,
tostring = tostring,
+ toboolean = toboolean,
inspect = inspect,
report = report_scan,
}
@@ -108,10 +106,11 @@ local function loadstripped(code)
end
tokens.converters = {
- tonumber = "tonumber",
- todimen = "todimen",
- toglue = "todimen",
- tostring = "tostring",
+ tonumber = "tonumber",
+ tostring = "tostring",
+ toboolean = "toboolean",
+ todimen = "todimen",
+ toglue = "todimen",
}
local f_if = formatters[ " if scankeyword('%s') then data['%s'] = scan%s()"]
@@ -128,6 +127,9 @@ local f_any = formatters[" else local key = scanword() if key then data[ke
local f_any_c = formatters[" else local key = scanword() if key then data[key] = %s(scan%s()) else break end end"]
local s_done = " else break end"
+local f_any_all = formatters[" local key = scanword() if key then data[key] = scan%s() else break end"]
+local f_any_all_c= formatters[" local key = scanword() if key then data[key] = %s(scan%s()) else break end"]
+
local f_table = formatters["%\nt\nreturn function()\n local data = { }\n%s\n return %s\nend\n"]
local f_sequence = formatters["%\nt\n%\nt\n%\nt\nreturn function()\n return %s\nend\n"]
local f_simple = formatters["%\nt\nreturn function()\n return %s\nend\n"]
@@ -190,30 +192,44 @@ function tokens.compile(specification)
local m = 0
for i=1,#t do
local ti = t[i]
- local t1 = ti[1]
- local t2 = ti[2] or "string"
- if type(t2) == "table" then
- n = n + 1
- f[n] = compile(t2,n)
- t2 = n
- end
- local t3 = ti[3]
- if type(t3) == "function" then
- -- todo: also create shortcut
- elseif t3 then
- c[t3] = f_shortcut(t3,t3)
- if t1 == "*" then
- done = f_any_c(t3,t2)
- else
- m = m + 1
- r[m] = (m > 1 and f_elseif_c or f_if_c)(t1,t1,t3,t2)
- end
+ if ti == "*" and i == 1 then
+ done = f_any_all("string")
else
- if t1 == "*" then
- done = f_any(t2)
+ local t1 = ti[1]
+ local t2 = ti[2] or "string"
+ if type(t2) == "table" then
+ n = n + 1
+ f[n] = compile(t2,n)
+ t2 = n
+ end
+ local t3 = ti[3]
+ if type(t3) == "function" then
+ -- todo: also create shortcut
+ elseif t3 then
+ c[t3] = f_shortcut(t3,t3)
+ if t1 == "*" then
+ if i == 1 then
+ done = f_any_all_c(t3,t2)
+ break
+ else
+ done = f_any_c(t3,t2)
+ end
+ else
+ m = m + 1
+ r[m] = (m > 1 and f_elseif_c or f_if_c)(t1,t1,t3,t2)
+ end
else
- m = m + 1
- r[m] = (m > 1 and f_elseif or f_if )(t1,t1,t2)
+ if t1 == "*" then
+ if i == 1 then
+ done = f_any_all(t2)
+ break
+ else
+ done = f_any(t2)
+ end
+ else
+ m = m + 1
+ r[m] = (m > 1 and f_elseif or f_if )(t1,t1,t2)
+ end
end
end
end
@@ -227,7 +243,12 @@ function tokens.compile(specification)
local tt = type(t)
if tt == "string" then
if a then
- code = f_scan(t)
+ local s = lpegmatch(p_unquoted,t)
+ if s and t ~= s then
+ code = t
+ else
+ code = f_scan(t)
+ end
tokens._action = a
for i=1,#a do
code = f_action_f(i,code)
diff --git a/tex/context/base/trac-ctx.lua b/tex/context/base/trac-ctx.lua
index 706e7a244..493ce7936 100644
--- a/tex/context/base/trac-ctx.lua
+++ b/tex/context/base/trac-ctx.lua
@@ -6,15 +6,15 @@ if not modules then modules = { } end modules ['trac-ctx'] = {
license = "see context related readme files"
}
-local commands = commands
-local context = context
-local register = trackers.register
+local context = context
+local implement = interfaces.implement
+local register = trackers.register
local textrackers = tex.trackers or { }
local texdirectives = tex.directives or { }
-tex.trackers = textrackers
-tex.directives = texdirectives
+tex.trackers = textrackers
+tex.directives = texdirectives
storage.register("tex/trackers", textrackers, "tex.trackers")
storage.register("tex/directives",texdirectives,"tex.directives")
@@ -39,10 +39,32 @@ local function install(category,register,tag,enable,disable)
register(tag, function(v) doit(category,tag,v) end) -- todo: v,tag in caller
end
-function commands.initializetextrackers () initialize(textrackers ,trackers .register ) end
-function commands.initializetexdirectives() initialize(texdirectives,directives.register) end
+implement {
+ name = "initializetextrackers",
+ actions = function()
+ initialize(textrackers,trackers.register)
+ end
+}
--- commands.install(tag,enable,disable):
+implement {
+ name = "initializetexdirectives",
+ actions = function()
+ initialize(texdirectives,directives.register)
+ end
+}
-function commands.installtextracker (...) install(textrackers ,trackers .register,...) end
-function commands.installtexdirective(...) install(texdirectives,directives.register,...) end
+implement {
+ name = "installtextracker",
+ actions = function(tag,enable,disable)
+ install(textrackers,trackers.register,tag,enable,disable)
+ end,
+ arguments = { "string", "string", "string" }
+}
+
+implement {
+ name = "installtexdirective",
+ actions = function(tag,enable,disable)
+ install(texdirectives,directives.register,tag,enable,disable)
+ end,
+ arguments = { "string", "string", "string" }
+}
diff --git a/tex/context/base/trac-ctx.mkiv b/tex/context/base/trac-ctx.mkiv
index 3eb53713c..4240281a6 100644
--- a/tex/context/base/trac-ctx.mkiv
+++ b/tex/context/base/trac-ctx.mkiv
@@ -18,14 +18,14 @@
\unprotect
\unexpanded\def\installtextracker#1#2#3%
- {\ctxcommand{installtextracker("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+ {\clf_installtextracker{#1}{\detokenize{#2}}{\detokenize{#3}}}
\unexpanded\def\installtexdirective#1#2#3%
- {\ctxcommand{installtexdirective("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+ {\clf_installtexdirective{#1}{\detokenize{#2}}{\detokenize{#3}}}
\appendtoks
- \ctxcommand{initializetextrackers ()}%
- \ctxcommand{initializetexdirectives()}%
+ \clf_initializetextrackers
+ \clf_initializetexdirectives
\to \everyjob
\protect \endinput
diff --git a/tex/context/base/type-ini.lua b/tex/context/base/type-ini.lua
index 4f53fbf40..cd5b32d3e 100644
--- a/tex/context/base/type-ini.lua
+++ b/tex/context/base/type-ini.lua
@@ -6,15 +6,23 @@ if not modules then modules = { } end modules ['type-ini'] = {
license = "see context related readme files"
}
+local gsub = string.gsub
+local lpegmatch, P, Cs = lpeg.match, lpeg.P, lpeg.Cs
+
-- more code will move here
-local commands, context = commands, context
+local commands = commands
+local context = context
+local implement = interfaces.implement
-local gsub = string.gsub
+local uselibrary = resolvers.uselibrary
+
+local name_one = nil
+local name_two = nil
-local report_typescripts = logs.reporter("fonts","typescripts")
+local p_strip = Cs((P("type-") * (P("imp-")^0))^0/"" * P(1)^0)
-local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex", "type-%s.mkiv", "type-%s.tex" } -- this will be imp only
+local report = logs.reporter("fonts","typescripts")
local function action(name,foundname)
-- context.startreadingfile()
@@ -27,52 +35,83 @@ local function action(name,foundname)
context.loadfoundtypescriptfile(foundname)
end
-local name_one, name_two
-
-local function failure_two(name)
- report_typescripts("unknown library %a or %a",name_one,name_two)
-end
+local patterns = {
+ "type-imp-%s.mkiv",
+ "type-imp-%s.tex"
+}
-local function failure_one(name)
- name_two = gsub(name,"%-.*$","")
+local function failure(name)
if name == "loc" then
-- ignore
- elseif name_two == name then
- report_typescripts("unknown library %a",name_one)
else
- commands.uselibrary {
- name = name_two,
+ report("unknown library %a",name)
+ end
+end
+
+implement {
+ name = "loadtypescriptfile",
+ arguments = "string",
+ actions = function(name) -- a more specific name
+ uselibrary {
+ name = lpegmatch(p_strip,name) or name,
patterns = patterns,
action = action,
- failure = failure_two,
+ failure = failure,
onlyonce = false, -- will become true
}
end
-end
-
-function commands.doprocesstypescriptfile(name)
- name_one = gsub(name,"^type%-","")
- commands.uselibrary {
- name = name_one,
- patterns = patterns,
- action = action,
- failure = failure_one,
- onlyonce = false, -- will become true
- }
-end
+}
-local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex" }
+local patterns = {
+ "type-imp-%s.mkiv",
+ "type-imp-%s.tex",
+ -- obsolete
+ "type-%s.mkiv",
+ "type-%s.tex"
+}
-local function failure(name)
- report_typescripts("unknown library %a",name)
-end
+-- local function failure_two(name)
+-- report("unknown library %a or %a",name_one,name_two)
+-- end
+--
+-- local function failure_one(name)
+-- name_two = gsub(name,"%-.*$","")
+-- if name == "loc" then
+-- -- ignore
+-- elseif name_two == name then
+-- report("unknown library %a",name_one)
+-- else
+-- commands.uselibrary {
+-- name = name_two,
+-- patterns = patterns,
+-- action = action,
+-- failure = failure_two,
+-- onlyonce = false, -- will become true
+-- }
+-- end
+-- end
+--
+-- function commands.doprocesstypescriptfile(name)
+-- name_one = lpegmatch(p_strip,name) or name
+-- uselibrary {
+-- name = name_one,
+-- patterns = patterns,
+-- action = action,
+-- failure = failure_one,
+-- onlyonce = false, -- will become true
+-- }
+-- end
-function commands.loadtypescriptfile(name) -- a more specific name
- commands.uselibrary {
- name = gsub(name,"^type%-",""),
- patterns = patterns,
- action = action,
- failure = failure,
- onlyonce = false, -- will become true
- }
-end
+implement {
+ name = "doprocesstypescriptfile",
+ arguments = "string",
+ actions = function(name)
+ uselibrary {
+ name = lpegmatch(p_strip,name) or name,
+ patterns = patterns,
+ action = action,
+ failure = failure,
+ onlyonce = false, -- will become true
+ }
+ end
+}
diff --git a/tex/context/base/type-ini.mkvi b/tex/context/base/type-ini.mkvi
index faa9c667c..4514a8b5f 100644
--- a/tex/context/base/type-ini.mkvi
+++ b/tex/context/base/type-ini.mkvi
@@ -172,7 +172,7 @@
\unexpanded\def\loadtypescriptfile[#1]%
{\pushmacro\typescriptstate
\let\typescriptstate\plustwo % assumes 2 at the outer level
- \ctxcommand{loadtypescriptfile("#1")}%
+ \clf_loadtypescriptfile{#1}%
\popmacro\typescriptstate}
\unexpanded\def\loadfoundtypescriptfile#1%
@@ -237,7 +237,7 @@
\expandafter\let\csname\??typescriptfiles\currenttypefile\endcsname\t_font_typescripts}
\def\font_typescript_process_typescript_file
- {\ctxcommand{doprocesstypescriptfile("\currenttypefile")}}
+ {\clf_doprocesstypescriptfile{\currenttypefile}}
\unexpanded\def\usetypescriptonce
{\dotripleempty\font_typescripts_use_once}
@@ -575,12 +575,6 @@
\fi \fi \fi
\ifmmode\mr\else\tf\fi} % needed ?
-% obsolete
-%
-% \unexpanded\def\usetypefile[#type]% recurses on path ! % no storage
-% {\edef\currenttypefile{#type}%
-% \ctxcommand{doprocesstypescriptfile("\currenttypefile")}}
-
%D For Taco:
%D
%D \starttyping
diff --git a/tex/context/base/typo-prc.lua b/tex/context/base/typo-prc.lua
index 3b94a0f10..cde66df00 100644
--- a/tex/context/base/typo-prc.lua
+++ b/tex/context/base/typo-prc.lua
@@ -11,7 +11,7 @@ local lpegmatch, patterns, P, C, Cs = lpeg.match, lpeg.patterns, lpeg.P, lpeg.C,
-- processors: syntax: processor->data ... not ok yet
local context = context
-local commands = commands
+local implement = interfaces.implement
local formatters = string.formatters
@@ -125,5 +125,5 @@ end
-- interface
-commands.registerstructureprocessor = processors.register
-commands.resetstructureprocessor = processors.reset
+implement { name = "registerstructureprocessor", actions = processors.register, arguments = "string" }
+implement { name = "resetstructureprocessor", actions = processors.reset, arguments = "string" }
diff --git a/tex/context/base/typo-prc.mkvi b/tex/context/base/typo-prc.mkvi
index 038abb304..49a165696 100644
--- a/tex/context/base/typo-prc.mkvi
+++ b/tex/context/base/typo-prc.mkvi
@@ -55,7 +55,7 @@
\appendtoks
\letvalue{\??processorcheck\currentprocessor}\relax
- \ctxcommand{registerstructureprocessor("\currentprocessor")}% global, but it permits using processor that are yet undefined
+ \clf_registerstructureprocessor{\currentprocessor}% global, but it permits using processor that are yet undefined
\to \everydefineprocessor
%D The following command can be used by users but normally it will be
diff --git a/tex/context/base/typo-spa.lua b/tex/context/base/typo-spa.lua
index eb84eb7d7..519ba3f34 100644
--- a/tex/context/base/typo-spa.lua
+++ b/tex/context/base/typo-spa.lua
@@ -230,6 +230,30 @@ end
-- interface
-commands.definecharacterspacing = spacings.define
-commands.setupcharacterspacing = spacings.setup
-commands.setcharacterspacing = spacings.set
+local implement = interfaces.implement
+
+implement {
+ name = "definecharacterspacing",
+ actions = spacings.define,
+ arguments = "string"
+}
+
+implement {
+ name = "setupcharacterspacing",
+ actions = spacings.setup,
+ arguments = {
+ "string",
+ "integer",
+ {
+ { "left", "number" },
+ { "right", "number" },
+ { "alternative", "integer" },
+ }
+ }
+}
+
+implement {
+ name = "setcharacterspacing",
+ actions = spacings.set,
+ arguments = "string"
+}
diff --git a/tex/context/base/typo-spa.mkiv b/tex/context/base/typo-spa.mkiv
index d783353d6..2e3e71bf3 100644
--- a/tex/context/base/typo-spa.mkiv
+++ b/tex/context/base/typo-spa.mkiv
@@ -35,7 +35,7 @@
\c!alternative=0]
\unexpanded\def\definecharacterspacing[#1]%
- {\ctxcommand{definecharacterspacing("#1")}}
+ {\clf_definecharacterspacing{#1}}
\unexpanded\def\setupcharacterspacing
{\dotripleargument\typo_characterspacing_setup}
@@ -43,15 +43,19 @@
\def\typo_characterspacing_setup[#1][#2][#3]% todo: #2 list
{\begingroup
\setupcurrent_p_characterspacing[#3]%
- \ctxcommand{setupcharacterspacing("#1",\number#2, { % todo: just pass #3 to the lua end
- left = \direct_p_characterspacingparameter\c!left,
- right = \direct_p_characterspacingparameter\c!right,
- alternative = \direct_p_characterspacingparameter\c!alternative
- })}%
+ \clf_setupcharacterspacing
+ {#1}%
+ \numexpr#2\relax
+ {%
+ left \direct_p_characterspacingparameter\c!left\space
+ right \direct_p_characterspacingparameter\c!right\space
+ alternative \direct_p_characterspacingparameter\c!alternative
+ }%
+ \relax
\endgroup}
\unexpanded\def\setcharacterspacing[#1]% we can store the attribute if we want speed
- {\ctxcommand{setcharacterspacing("#1")}}
+ {\clf_setcharacterspacing{#1}}
\unexpanded\def\resetcharacterspacing % fast one
{\attribute\spacingattribute\attributeunsetvalue}
diff --git a/tex/context/base/x-asciimath.lua b/tex/context/base/x-asciimath.lua
index 5914c3c69..1fc9ae5a4 100644
--- a/tex/context/base/x-asciimath.lua
+++ b/tex/context/base/x-asciimath.lua
@@ -787,7 +787,7 @@ local p_aftercomma = p_fourafter
+ d_one * d_spaced
local digitized_2 = Cs (
- p_fourbefore * p_aftercomma +
+ p_fourbefore * (p_aftercomma^0) +
p_beforecomma * ((p_aftercomma + d_one^1)^0)
)
@@ -796,7 +796,7 @@ local p_aftercomma = p_fourafter
+ d_three * d_spaced * P(1)^0
local digitized_3 = Cs (
- p_fourbefore * p_aftercomma +
+ p_fourbefore * (p_aftercomma^0) +
p_beforecomma * ((p_aftercomma + d_one^1)^0)
)
@@ -838,28 +838,26 @@ function numbermess(s)
return s
end
-asciimath.setup { splitmethod = 3 }
-
-local t = {
- "1", "12", "123", "1234", "12345", "123456", "1234567", "12345678", "123456789",
- "1,1",
- "12,12",
- "123,123",
- "1234,1234",
- "12345,1234",
- "1234,12345",
- "12345,12345",
- "123456,123456",
- "1234567,1234567",
- "12345678,12345678",
- "123456789,123456789",
- "0,1234",
- "1234,0",
- "1234,00",
- "0,123456789",
-}
-for i=1,#t do print(formatters["%-20s : [%s]"](t[i],numbermess(t[i]))) end
-
+-- asciimath.setup { splitmethod = 3 }
+-- local t = {
+-- "1", "12", "123", "1234", "12345", "123456", "1234567", "12345678", "123456789",
+-- "1,1",
+-- "12,12",
+-- "123,123",
+-- "1234,1234",
+-- "12345,1234",
+-- "1234,12345",
+-- "12345,12345",
+-- "123456,123456",
+-- "1234567,1234567",
+-- "12345678,12345678",
+-- "123456789,123456789",
+-- "0,1234",
+-- "1234,0",
+-- "1234,00",
+-- "0,123456789",
+-- }
+-- for i=1,#t do print(formatters["%-20s : [%s]"](t[i],numbermess(t[i]))) end
statistics.register("asciimath",function()
if trace_digits then
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index b47d49e37..cc3e40272 100644
--- a/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 03/28/15 22:37:53
+-- merge date : 03/30/15 23:33:48
do -- begin closure to overcome local limits and interference