diff options
author | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-01-29 20:15:07 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-01-29 20:15:07 +0100 |
commit | 397508ee8dca010aec5a9c6951b68434e5657f14 (patch) | |
tree | dae6e16fb8990964ba5261228231696cca3859a1 /tex/context/base/mkiv/cldf-ini.lua | |
parent | 452587cdeefbf6e3bf1eee91e4e976f1135b785f (diff) | |
download | context-397508ee8dca010aec5a9c6951b68434e5657f14.tar.gz |
2016-01-29 19:02:00
Diffstat (limited to 'tex/context/base/mkiv/cldf-ini.lua')
-rw-r--r-- | tex/context/base/mkiv/cldf-ini.lua | 393 |
1 files changed, 217 insertions, 176 deletions
diff --git a/tex/context/base/mkiv/cldf-ini.lua b/tex/context/base/mkiv/cldf-ini.lua index f4819b11a..c6cc39abc 100644 --- a/tex/context/base/mkiv/cldf-ini.lua +++ b/tex/context/base/mkiv/cldf-ini.lua @@ -706,7 +706,7 @@ local containseol = patterns.containseol local writer -if luafunctions then +-- if luafunctions then writer = function (parent,command,first,...) -- already optimized before call local t = { first, ... } @@ -772,6 +772,7 @@ if luafunctions then local tj = ti[1] if type(tj) == "function" then flush(currentcatcodes,"[\\cldl",storefunction(tj),"]") + -- flush(currentcatcodes,"[",storefunction(tj),"]") else flush(currentcatcodes,"[",tj,"]") end @@ -782,8 +783,10 @@ if luafunctions then if type(tj) == "function" then if j == tn then flush(currentcatcodes,"\\cldl",storefunction(tj),"]") + -- flush(currentcatcodes,"",storefunction(tj),"]") else flush(currentcatcodes,"\\cldl",storefunction(tj),",") + -- flush(currentcatcodes,"",storefunction(tj),",") end else if j == tn then @@ -796,6 +799,7 @@ if luafunctions then end elseif typ == "function" then flush(currentcatcodes,"{\\cldl ",storefunction(ti),"}") -- todo: ctx|prt|texcatcodes + -- flush(currentcatcodes,"{",storefunction(ti),"}") -- todo: ctx|prt|texcatcodes elseif typ == "boolean" then if ti then flushdirect(currentcatcodes,"\r") @@ -806,109 +810,110 @@ if luafunctions then report_context("coroutines not supported as we cannot yield across boundaries") elseif isnode(ti) then -- slow flush(currentcatcodes,"{\\cldl",storenode(ti),"}") + -- flush(currentcatcodes,"{",storenode(ti),"}") else report_context("error: %a gets a weird argument %a",command,ti) end end end -else - - writer = function (parent,command,first,...) -- already optimized before call - local t = { first, ... } - flush(currentcatcodes,command) -- todo: ctx|prt|texcatcodes - local direct = false - for i=1,#t do - local ti = t[i] - local typ = type(ti) - if direct then - if typ == "string" or typ == "number" then - flush(currentcatcodes,ti) - else -- node.write - report_context("error: invalid use of direct in %a, only strings and numbers can be flushed directly, not %a",command,typ) - end - direct = false - elseif ti == nil then - -- nothing - elseif ti == "" then - flush(currentcatcodes,"{}") - elseif typ == "string" then - -- is processelines seen ? - if processlines and lpegmatch(containseol,ti) then - flush(currentcatcodes,"{") - local flushlines = parent.__flushlines or flushlines - flushlines(ti) - flush(currentcatcodes,"}") - elseif currentcatcodes == contentcatcodes then - flush(currentcatcodes,"{",ti,"}") - else - flush(currentcatcodes,"{") - flush(contentcatcodes,ti) - flush(currentcatcodes,"}") - end - elseif typ == "number" then - -- numbers never have funny catcodes - flush(currentcatcodes,"{",ti,"}") - elseif typ == "table" then - local tn = #ti - if tn == 0 then - local done = false - for k, v in next, ti do - if done then - if v == "" then - flush(currentcatcodes,",",k,'=') - else - flush(currentcatcodes,",",k,"={",v,"}") - end - else - if v == "" then - flush(currentcatcodes,"[",k,"=") - else - flush(currentcatcodes,"[",k,"={",v,"}") - end - done = true - end - end - if done then - flush(currentcatcodes,"]") - else - flush(currentcatcodes,"[]") - end - elseif tn == 1 then -- some 20% faster than the next loop - local tj = ti[1] - if type(tj) == "function" then - flush(currentcatcodes,"[\\cldf{",storefunction(tj),"}]") - else - flush(currentcatcodes,"[",tj,"]") - end - else -- is concat really faster than flushes here? probably needed anyway (print artifacts) - for j=1,tn do - local tj = ti[j] - if type(tj) == "function" then - ti[j] = "\\cldf{" .. storefunction(tj) .. "}" - end - end - flush(currentcatcodes,"[",concat(ti,","),"]") - end - elseif typ == "function" then - flush(currentcatcodes,"{\\cldf{",storefunction(ti),"}}") -- todo: ctx|prt|texcatcodes - elseif typ == "boolean" then - if ti then - flushdirect(currentcatcodes,"\r") - else - direct = true - end - elseif typ == "thread" then - report_context("coroutines not supported as we cannot yield across boundaries") - elseif isnode(ti) then -- slow - flush(currentcatcodes,"{\\cldn{",storenode(ti),"}}") - else - report_context("error: %a gets a weird argument %a",command,ti) - end - end - end - -end +-- else +-- +-- writer = function (parent,command,first,...) -- already optimized before call +-- local t = { first, ... } +-- flush(currentcatcodes,command) -- todo: ctx|prt|texcatcodes +-- local direct = false +-- for i=1,#t do +-- local ti = t[i] +-- local typ = type(ti) +-- if direct then +-- if typ == "string" or typ == "number" then +-- flush(currentcatcodes,ti) +-- else -- node.write +-- report_context("error: invalid use of direct in %a, only strings and numbers can be flushed directly, not %a",command,typ) +-- end +-- direct = false +-- elseif ti == nil then +-- -- nothing +-- elseif ti == "" then +-- flush(currentcatcodes,"{}") +-- elseif typ == "string" then +-- -- is processelines seen ? +-- if processlines and lpegmatch(containseol,ti) then +-- flush(currentcatcodes,"{") +-- local flushlines = parent.__flushlines or flushlines +-- flushlines(ti) +-- flush(currentcatcodes,"}") +-- elseif currentcatcodes == contentcatcodes then +-- flush(currentcatcodes,"{",ti,"}") +-- else +-- flush(currentcatcodes,"{") +-- flush(contentcatcodes,ti) +-- flush(currentcatcodes,"}") +-- end +-- elseif typ == "number" then +-- -- numbers never have funny catcodes +-- flush(currentcatcodes,"{",ti,"}") +-- elseif typ == "table" then +-- local tn = #ti +-- if tn == 0 then +-- local done = false +-- for k, v in next, ti do +-- if done then +-- if v == "" then +-- flush(currentcatcodes,",",k,'=') +-- else +-- flush(currentcatcodes,",",k,"={",v,"}") +-- end +-- else +-- if v == "" then +-- flush(currentcatcodes,"[",k,"=") +-- else +-- flush(currentcatcodes,"[",k,"={",v,"}") +-- end +-- done = true +-- end +-- end +-- if done then +-- flush(currentcatcodes,"]") +-- else +-- flush(currentcatcodes,"[]") +-- end +-- elseif tn == 1 then -- some 20% faster than the next loop +-- local tj = ti[1] +-- if type(tj) == "function" then +-- flush(currentcatcodes,"[\\cldf{",storefunction(tj),"}]") +-- else +-- flush(currentcatcodes,"[",tj,"]") +-- end +-- else -- is concat really faster than flushes here? probably needed anyway (print artifacts) +-- for j=1,tn do +-- local tj = ti[j] +-- if type(tj) == "function" then +-- ti[j] = "\\cldf{" .. storefunction(tj) .. "}" +-- end +-- end +-- flush(currentcatcodes,"[",concat(ti,","),"]") +-- end +-- elseif typ == "function" then +-- flush(currentcatcodes,"{\\cldf{",storefunction(ti),"}}") -- todo: ctx|prt|texcatcodes +-- elseif typ == "boolean" then +-- if ti then +-- flushdirect(currentcatcodes,"\r") +-- else +-- direct = true +-- end +-- elseif typ == "thread" then +-- report_context("coroutines not supported as we cannot yield across boundaries") +-- elseif isnode(ti) then -- slow +-- flush(currentcatcodes,"{\\cldn{",storenode(ti),"}}") +-- else +-- report_context("error: %a gets a weird argument %a",command,ti) +-- end +-- end +-- end +-- +-- end local generics = { } context.generics = generics local indexer = nil @@ -1022,7 +1027,7 @@ end local caller -if luafunctions then +-- if luafunctions then caller = function(parent,f,a,...) if not parent then @@ -1053,6 +1058,7 @@ if luafunctions then elseif typ == "function" then -- ignored: a ... flush(currentcatcodes,"{\\cldl",storefunction(f),"}") -- todo: ctx|prt|texcatcodes + -- flush(currentcatcodes,"{",storefunction(f),"}") -- todo: ctx|prt|texcatcodes elseif typ == "boolean" then if f then if a ~= nil then @@ -1074,6 +1080,7 @@ if luafunctions then elseif isnode(f) then -- slow -- writenode(f) flush(currentcatcodes,"\\cldl",storenode(f)," ") + -- flush(currentcatcodes,"",storenode(f)," ") else report_context("error: %a gets a weird argument %a","context",f) end @@ -1082,71 +1089,72 @@ if luafunctions then function context.flushnode(n) flush(currentcatcodes,"\\cldl",storenode(n)," ") + -- flush(currentcatcodes,"",storenode(n)," ") end -else - - caller = function(parent,f,a,...) - if not parent then - -- so we don't need to test in the calling (slower but often no issue) - elseif f ~= nil then - local typ = type(f) - if typ == "string" then - if f == "" then - -- new, can save a bit sometimes - -- if trace_context then - -- report_context("empty argument to context()") - -- end - elseif a then - flush(contentcatcodes,formatters[f](a,...)) -- was currentcatcodes - -- flush(contentcatcodes,splitformatters[f](a,...)) -- was currentcatcodes - elseif processlines and lpegmatch(containseol,f) then - local flushlines = parent.__flushlines or flushlines - flushlines(f) - else - flush(contentcatcodes,f) - end - elseif typ == "number" then - if a then - flush(currentcatcodes,f,a,...) - else - flush(currentcatcodes,f) - end - elseif typ == "function" then - -- ignored: a ... - flush(currentcatcodes,"{\\cldf{",storefunction(f),"}}") -- todo: ctx|prt|texcatcodes - elseif typ == "boolean" then - if f then - if a ~= nil then - local flushlines = parent.__flushlines or flushlines - flushlines(a) - else - flushdirect(currentcatcodes,"\n") -- no \r, else issues with \startlines ... use context.par() otherwise - end - else - if a ~= nil then - -- no command, same as context(a,...) - writer(parent,"",a,...) - else - -- ignored - end - end - elseif typ == "thread" then - report_context("coroutines not supported as we cannot yield across boundaries") - elseif isnode(f) then -- slow - -- writenode(f) - flush(currentcatcodes,"\\cldn{",storenode(f),"}") - else - report_context("error: %a gets a weird argument %a","context",f) - end - end - end - - function context.flushnode(n) - flush(currentcatcodes,"\\cldn{",storenode(n),"}") - end - -end +-- else +-- +-- caller = function(parent,f,a,...) +-- if not parent then +-- -- so we don't need to test in the calling (slower but often no issue) +-- elseif f ~= nil then +-- local typ = type(f) +-- if typ == "string" then +-- if f == "" then +-- -- new, can save a bit sometimes +-- -- if trace_context then +-- -- report_context("empty argument to context()") +-- -- end +-- elseif a then +-- flush(contentcatcodes,formatters[f](a,...)) -- was currentcatcodes +-- -- flush(contentcatcodes,splitformatters[f](a,...)) -- was currentcatcodes +-- elseif processlines and lpegmatch(containseol,f) then +-- local flushlines = parent.__flushlines or flushlines +-- flushlines(f) +-- else +-- flush(contentcatcodes,f) +-- end +-- elseif typ == "number" then +-- if a then +-- flush(currentcatcodes,f,a,...) +-- else +-- flush(currentcatcodes,f) +-- end +-- elseif typ == "function" then +-- -- ignored: a ... +-- flush(currentcatcodes,"{\\cldf{",storefunction(f),"}}") -- todo: ctx|prt|texcatcodes +-- elseif typ == "boolean" then +-- if f then +-- if a ~= nil then +-- local flushlines = parent.__flushlines or flushlines +-- flushlines(a) +-- else +-- flushdirect(currentcatcodes,"\n") -- no \r, else issues with \startlines ... use context.par() otherwise +-- end +-- else +-- if a ~= nil then +-- -- no command, same as context(a,...) +-- writer(parent,"",a,...) +-- else +-- -- ignored +-- end +-- end +-- elseif typ == "thread" then +-- report_context("coroutines not supported as we cannot yield across boundaries") +-- elseif isnode(f) then -- slow +-- -- writenode(f) +-- flush(currentcatcodes,"\\cldn{",storenode(f),"}") +-- else +-- report_context("error: %a gets a weird argument %a","context",f) +-- end +-- end +-- end +-- +-- function context.flushnode(n) +-- flush(currentcatcodes,"\\cldn{",storenode(n),"}") +-- end +-- +-- end local defaultcaller = caller @@ -1211,6 +1219,8 @@ local currenttrace = nil local nofwriters = 0 local nofflushes = 0 +local tracingpermitted = true + local visualizer = lpeg.replacer { { "\n","<<newline>>" }, { "\r","<<par>>" }, @@ -1231,15 +1241,24 @@ local tracedwriter = function(parent,...) -- also catcodes ? local savedflush = flush local savedflushdirect = flushdirect -- unlikely to be used here local t, n = { "w : - : " }, 1 - local traced = function(normal,catcodes,...) -- todo: check for catcodes + local traced = function(catcodes,...) -- todo: check for catcodes local s = concat({...}) s = lpegmatch(visualizer,s) n = n + 1 t[n] = s - normal(catcodes,...) end - flush = function(...) traced(normalflush, ...) end - flushdirect = function(...) traced(normalflushdirect,...) end + flush = function(...) + normalflush(...) + if tracingpermitted then + traced(...) + end + end + flushdirect = function(...) + normalflushdirect(...) + if tracingpermitted then + traced(...) + end + end normalwriter(parent,...) flush = savedflush flushdirect = savedflushdirect @@ -1248,11 +1267,9 @@ end -- we could reuse collapsed -local traced = function(normal,one,two,...) - nofflushes = nofflushes + 1 +local traced = function(one,two,...) if two then -- only catcodes if 'one' is number - normal(one,two,...) local catcodes = type(one) == "number" and one local arguments = catcodes and { two, ... } or { one, two, ... } local collapsed, c = { formatters["f : %s : "](catcodes or '-') }, 1 @@ -1271,7 +1288,6 @@ local traced = function(normal,one,two,...) currenttrace(concat(collapsed)) else -- no catcodes - normal(one) local argtype = type(one) if argtype == "string" then currenttrace(formatters["f : - : %s"](lpegmatch(visualizer,one))) @@ -1283,8 +1299,29 @@ local traced = function(normal,one,two,...) end end -local tracedflush = function(...) traced(normalflush, ...) end -local tracedflushdirect = function(...) traced(normalflushdirect,...) end +local tracedflush = function(one,two,...) + nofflushes = nofflushes + 1 + if two then + normalflush(one,two,...) + else + normalflush(one) + end + if tracingpermitted then + traced(...) + end +end + +local tracedflushdirect = function(one,two,...) + nofflushes = nofflushes + 1 + if two then + normalflushdirect(one,two,...) + else + normalflushdirect(one) + end + if tracingpermitted then + traced(...) + end +end local function pushlogger(trace) trace = trace or report_context @@ -1404,8 +1441,10 @@ do -- end local collectdirect = collect + local permitted = true - -- doesn't work well with tracing do we need to avoid that then + -- doesn't work well with tracing do we need to avoid that when + -- collecting stuff function context.startcollecting() if level == 0 then @@ -1414,6 +1453,7 @@ do -- flush = collect flushdirect = collectdirect + permitted = tracingpermitted -- context.__flush = flush context.__flushdirect = flushdirect @@ -1424,8 +1464,9 @@ do function context.stopcollecting() level = level - 1 if level < 1 then - flush = normalflush - flushdirect = normalflushdirect + flush = normalflush + flushdirect = normalflushdirect + tracingpermitted = permitted -- context.__flush = flush context.__flushdirect = flushdirect @@ -1682,8 +1723,8 @@ local function caller(parent,f,a,...) end elseif typ == "function" then -- ignored: a ... --- flush(currentcatcodes,mpdrawing,"{\\cldf{",store_(f),"}}") flush(currentcatcodes,mpdrawing,"{\\cldl",store_(f),"}") + -- flush(currentcatcodes,mpdrawing,"{",store_(f),"}") elseif typ == "boolean" then -- ignored: a ... if f then |