diff options
115 files changed, 1289 insertions, 1285 deletions
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index a42713378..cae4c8d3e 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -813,7 +813,6 @@ function table.fromhash(t) return h end - table.serialize_functions = true table.serialize_compact = true table.serialize_inline = true @@ -902,8 +901,8 @@ local function do_serialize(root,name,depth,level,indexed) local k = sk[i] local v = root[k] -- circular - local t = type(v) - if compact and first and type(k) == "number" and k >= first and k <= last then + local t, tk = type(v), type(k) + if compact and first and tk == "number" and k >= first and k <= last then if t == "number" then if hexify then handle(format("%s 0x%04X,",depth,v)) @@ -945,12 +944,18 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s __p__=nil,",depth)) end elseif t == "number" then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g end + elseif tk == "boolean" then + if hexify then + handle(format("%s [%s]=0x%04X,",depth,tostring(k),v)) + else + handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g + end elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then if hexify then handle(format("%s %s=0x%04X,",depth,k,v)) @@ -966,24 +971,28 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "string" then if reduce and tonumber(v) then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%s,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) end else - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%q,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,v)) else @@ -992,12 +1001,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "table" then if not next(v) then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end + elseif tk == "boolean" then + handle(format("%s [%s]={},",depth,tostring(k))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={},",depth,k)) else @@ -1006,12 +1017,14 @@ local function do_serialize(root,name,depth,level,indexed) elseif inline then local st = simple_table(v) if st then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", "))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={ %s },",depth,k,concat(st,", "))) else @@ -1024,12 +1037,14 @@ local function do_serialize(root,name,depth,level,indexed) do_serialize(v,k,depth,level+1) end elseif t == "boolean" then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,tostring(v))) else handle(format("%s [%s]=%s,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,tostring(v))) else @@ -1037,12 +1052,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "function" then if functions then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v))) else handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v))) end + elseif tk == "boolean" then + handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=loadstring(%q),",depth,k,dump(v))) else @@ -1050,12 +1067,14 @@ local function do_serialize(root,name,depth,level,indexed) end end else - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,tostring(v))) else @@ -1343,7 +1362,7 @@ function table.sequenced(t,sep,simple) -- hash only end function table.print(...) - print(table.serialize(...)) + table.tohandle(print,...) end @@ -3477,7 +3496,7 @@ parsers.patterns = parsers.patterns or { } local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg local lpegmatch = lpeg.match local concat, format, gmatch = table.concat, string.format, string.gmatch -local tostring, type = tostring, type +local tostring, type, next = tostring, type, next local sortedhash = table.sortedhash local escape, left, right = P("\\"), P('{'), P('}') @@ -3682,6 +3701,7 @@ local tables = utilities.tables local format, gmatch = string.format, string.gmatch local concat, insert, remove = table.concat, table.insert, table.remove +local setmetatable = setmetatable function tables.definetable(target) -- defines undefined tables local composed, t = nil, { } @@ -4894,21 +4914,8 @@ function logs.obsolete(old,new) end end -if tex.error then - - function logs.texerrormessage(...) -- for the moment we put this function here - tex.error(format(...), { }) - end - -else - - function logs.texerrormessage(...) -- for the moment we put this function here - local v = format(...) - tex.sprint(tex.ctxcatcodes,"\\errmessage{") - tex.sprint(tex.vrbcatcodes,v) - tex.print(tex.ctxcatcodes,"}") - end - +function logs.texerrormessage(...) -- for the moment we put this function here + tex.error(format(...), { }) end diff --git a/scripts/context/lua/x-ldx.lua b/scripts/context/lua/x-ldx.lua index cd0bf63ab..18e7b9b38 100644 --- a/scripts/context/lua/x-ldx.lua +++ b/scripts/context/lua/x-ldx.lua @@ -10,6 +10,10 @@ subsystem. On the other hand, we cannot expect proper <logo label='tex'/> ad for educational purposed the syntax migh be wrong. --ldx]]-- +-- there is anice parser on from http://lua-users.org/wiki/LpegRecipes (by +-- Patrick Donnelly) but lua crashes when I apply functions to some of the +-- matches + banner = "version 1.0.1 - 2007+ - PRAGMA ADE / CONTEXT" --[[ diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index a42713378..cae4c8d3e 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -813,7 +813,6 @@ function table.fromhash(t) return h end - table.serialize_functions = true table.serialize_compact = true table.serialize_inline = true @@ -902,8 +901,8 @@ local function do_serialize(root,name,depth,level,indexed) local k = sk[i] local v = root[k] -- circular - local t = type(v) - if compact and first and type(k) == "number" and k >= first and k <= last then + local t, tk = type(v), type(k) + if compact and first and tk == "number" and k >= first and k <= last then if t == "number" then if hexify then handle(format("%s 0x%04X,",depth,v)) @@ -945,12 +944,18 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s __p__=nil,",depth)) end elseif t == "number" then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g end + elseif tk == "boolean" then + if hexify then + handle(format("%s [%s]=0x%04X,",depth,tostring(k),v)) + else + handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g + end elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then if hexify then handle(format("%s %s=0x%04X,",depth,k,v)) @@ -966,24 +971,28 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "string" then if reduce and tonumber(v) then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%s,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) end else - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%q,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,v)) else @@ -992,12 +1001,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "table" then if not next(v) then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end + elseif tk == "boolean" then + handle(format("%s [%s]={},",depth,tostring(k))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={},",depth,k)) else @@ -1006,12 +1017,14 @@ local function do_serialize(root,name,depth,level,indexed) elseif inline then local st = simple_table(v) if st then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", "))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={ %s },",depth,k,concat(st,", "))) else @@ -1024,12 +1037,14 @@ local function do_serialize(root,name,depth,level,indexed) do_serialize(v,k,depth,level+1) end elseif t == "boolean" then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,tostring(v))) else handle(format("%s [%s]=%s,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,tostring(v))) else @@ -1037,12 +1052,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "function" then if functions then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v))) else handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v))) end + elseif tk == "boolean" then + handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=loadstring(%q),",depth,k,dump(v))) else @@ -1050,12 +1067,14 @@ local function do_serialize(root,name,depth,level,indexed) end end else - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,tostring(v))) else @@ -1343,7 +1362,7 @@ function table.sequenced(t,sep,simple) -- hash only end function table.print(...) - print(table.serialize(...)) + table.tohandle(print,...) end @@ -3477,7 +3496,7 @@ parsers.patterns = parsers.patterns or { } local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg local lpegmatch = lpeg.match local concat, format, gmatch = table.concat, string.format, string.gmatch -local tostring, type = tostring, type +local tostring, type, next = tostring, type, next local sortedhash = table.sortedhash local escape, left, right = P("\\"), P('{'), P('}') @@ -3682,6 +3701,7 @@ local tables = utilities.tables local format, gmatch = string.format, string.gmatch local concat, insert, remove = table.concat, table.insert, table.remove +local setmetatable = setmetatable function tables.definetable(target) -- defines undefined tables local composed, t = nil, { } @@ -4894,21 +4914,8 @@ function logs.obsolete(old,new) end end -if tex.error then - - function logs.texerrormessage(...) -- for the moment we put this function here - tex.error(format(...), { }) - end - -else - - function logs.texerrormessage(...) -- for the moment we put this function here - local v = format(...) - tex.sprint(tex.ctxcatcodes,"\\errmessage{") - tex.sprint(tex.vrbcatcodes,v) - tex.print(tex.ctxcatcodes,"}") - end - +function logs.texerrormessage(...) -- for the moment we put this function here + tex.error(format(...), { }) end diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index a42713378..cae4c8d3e 100755 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -813,7 +813,6 @@ function table.fromhash(t) return h end - table.serialize_functions = true table.serialize_compact = true table.serialize_inline = true @@ -902,8 +901,8 @@ local function do_serialize(root,name,depth,level,indexed) local k = sk[i] local v = root[k] -- circular - local t = type(v) - if compact and first and type(k) == "number" and k >= first and k <= last then + local t, tk = type(v), type(k) + if compact and first and tk == "number" and k >= first and k <= last then if t == "number" then if hexify then handle(format("%s 0x%04X,",depth,v)) @@ -945,12 +944,18 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s __p__=nil,",depth)) end elseif t == "number" then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g end + elseif tk == "boolean" then + if hexify then + handle(format("%s [%s]=0x%04X,",depth,tostring(k),v)) + else + handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g + end elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then if hexify then handle(format("%s %s=0x%04X,",depth,k,v)) @@ -966,24 +971,28 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "string" then if reduce and tonumber(v) then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%s,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) end else - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%q,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,v)) else @@ -992,12 +1001,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "table" then if not next(v) then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end + elseif tk == "boolean" then + handle(format("%s [%s]={},",depth,tostring(k))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={},",depth,k)) else @@ -1006,12 +1017,14 @@ local function do_serialize(root,name,depth,level,indexed) elseif inline then local st = simple_table(v) if st then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", "))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={ %s },",depth,k,concat(st,", "))) else @@ -1024,12 +1037,14 @@ local function do_serialize(root,name,depth,level,indexed) do_serialize(v,k,depth,level+1) end elseif t == "boolean" then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,tostring(v))) else handle(format("%s [%s]=%s,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,tostring(v))) else @@ -1037,12 +1052,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "function" then if functions then - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v))) else handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v))) end + elseif tk == "boolean" then + handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=loadstring(%q),",depth,k,dump(v))) else @@ -1050,12 +1067,14 @@ local function do_serialize(root,name,depth,level,indexed) end end else - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,tostring(v))) else @@ -1343,7 +1362,7 @@ function table.sequenced(t,sep,simple) -- hash only end function table.print(...) - print(table.serialize(...)) + table.tohandle(print,...) end @@ -3477,7 +3496,7 @@ parsers.patterns = parsers.patterns or { } local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg local lpegmatch = lpeg.match local concat, format, gmatch = table.concat, string.format, string.gmatch -local tostring, type = tostring, type +local tostring, type, next = tostring, type, next local sortedhash = table.sortedhash local escape, left, right = P("\\"), P('{'), P('}') @@ -3682,6 +3701,7 @@ local tables = utilities.tables local format, gmatch = string.format, string.gmatch local concat, insert, remove = table.concat, table.insert, table.remove +local setmetatable = setmetatable function tables.definetable(target) -- defines undefined tables local composed, t = nil, { } @@ -4894,21 +4914,8 @@ function logs.obsolete(old,new) end end -if tex.error then - - function logs.texerrormessage(...) -- for the moment we put this function here - tex.error(format(...), { }) - end - -else - - function logs.texerrormessage(...) -- for the moment we put this function here - local v = format(...) - tex.sprint(tex.ctxcatcodes,"\\errmessage{") - tex.sprint(tex.vrbcatcodes,v) - tex.print(tex.ctxcatcodes,"}") - end - +function logs.texerrormessage(...) -- for the moment we put this function here + tex.error(format(...), { }) end diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua index 28d32089d..d47109891 100644 --- a/tex/context/base/anch-pos.lua +++ b/tex/context/base/anch-pos.lua @@ -13,7 +13,6 @@ more efficient.</p> --ldx]]-- local concat, format = table.concat, string.format -local texprint, ctxcatcodes = tex.print, tex.ctxcatcodes local lpegmatch = lpeg.match local allocate, mark = utilities.storage.allocate, utilities.storage.mark @@ -55,20 +54,20 @@ function jobpositions.doifelse(name) commands.testcase(collected[name] or tobesaved[name]) end -function jobpositions.MPp(id) local jpi = collected[id] or tobesaved[id] texprint(ctxcatcodes,(jpi and jpi[1]) or '0' ) end -function jobpositions.MPx(id) local jpi = collected[id] or tobesaved[id] texprint(ctxcatcodes,(jpi and jpi[2]) or '0pt') end -function jobpositions.MPy(id) local jpi = collected[id] or tobesaved[id] texprint(ctxcatcodes,(jpi and jpi[3]) or '0pt') end -function jobpositions.MPw(id) local jpi = collected[id] or tobesaved[id] texprint(ctxcatcodes,(jpi and jpi[4]) or '0pt') end -function jobpositions.MPh(id) local jpi = collected[id] or tobesaved[id] texprint(ctxcatcodes,(jpi and jpi[5]) or '0pt') end -function jobpositions.MPd(id) local jpi = collected[id] or tobesaved[id] texprint(ctxcatcodes,(jpi and jpi[6]) or '0pt') end +function jobpositions.MPp(id) local jpi = collected[id] or tobesaved[id] context(jpi and jpi[1] or '0' ) end +function jobpositions.MPx(id) local jpi = collected[id] or tobesaved[id] context(jpi and jpi[2] or '0pt') end +function jobpositions.MPy(id) local jpi = collected[id] or tobesaved[id] context(jpi and jpi[3] or '0pt') end +function jobpositions.MPw(id) local jpi = collected[id] or tobesaved[id] context(jpi and jpi[4] or '0pt') end +function jobpositions.MPh(id) local jpi = collected[id] or tobesaved[id] context(jpi and jpi[5] or '0pt') end +function jobpositions.MPd(id) local jpi = collected[id] or tobesaved[id] context(jpi and jpi[6] or '0pt') end function jobpositions.MPx(id) local jpi = collected[id] or tobesaved[id] local x = jpi and jpi[2] if x then - texprint(ctxcatcodes,format('\\the\\dimexpr%s-%s\\relax',x,dx)) -- no space after dimexpr ! + context('\\the\\dimexpr%s-%s\\relax',x,dx) else - texprint(ctxcatcodes,'0pt') + context('0pt') end end @@ -76,9 +75,9 @@ function jobpositions.MPy(id) local jpi = collected[id] or tobesaved[id] local y = jpi and jpi[3] if y then - texprint(ctxcatcodes,format('\\the\\dimexpr%s-%s\\relax',y,dy)) -- no space after dimexpr ! + context('\\the\\dimexpr%s-%s\\relax',y,dy) else - texprint(ctxcatcodes,'0pt') + context('0pt') end end @@ -89,59 +88,54 @@ end function jobpositions.MPxy(id) local jpi = collected[id] or tobesaved[id] if jpi then - texprint(ctxcatcodes,format('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy)) ---~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'-',dy,')') + context('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy) else - texprint(ctxcatcodes,'(0,0)') + context('(0,0)') end end function jobpositions.MPll(id) local jpi = collected[id] or tobesaved[id] if jpi then - texprint(ctxcatcodes,format('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy)) ---~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'-',jpi[6],'-',dy,')') + context('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy) else - texprint(ctxcatcodes,'(0,0)') + context('(0,0)') end end function jobpositions.MPlr(id) local jpi = collected[id] or tobesaved[id] if jpi then - texprint(ctxcatcodes,format('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy)) ---~ texprint(ctxcatcodes,'(',jpi[2],'+',jpi[4],'-',dx,',',jpi[3],'-',jpi[6],'-',dy,')') + context('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy) else - texprint(ctxcatcodes,'(0,0)') + context('(0,0)') end end function jobpositions.MPur(id) local jpi = collected[id] or tobesaved[id] if jpi then - texprint(ctxcatcodes,format('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy)) ---~ texprint(ctxcatcodes,'(',jpi[2],'+',jpi[4],'-',dx,',',jpi[3],'+',jpi[5],'-',dy,')') + context('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy) else - texprint(ctxcatcodes,'(0,0)') + context('(0,0)') end end function jobpositions.MPul(id) local jpi = collected[id] or tobesaved[id] if jpi then - texprint(ctxcatcodes,format('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy)) ---~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'+',jpi[5],'-',dy,')') + context('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy) else - texprint(ctxcatcodes,'(0,0)') + context('(0,0)') end end function jobpositions.MPpos(id) local jpi = collected[id] or tobesaved[id] if jpi then - texprint(ctxcatcodes,concat(jpi,',',1,6)) + context(concat(jpi,',',1,6)) else - texprint(ctxcatcodes,'0,0,0,0,0,0') + context('0,0,0,0,0,0') end end @@ -150,19 +144,18 @@ local splitter = lpeg.Ct(lpeg.splitat(",")) function jobpositions.MPplus(id,n,default) local jpi = collected[id] or tobesaved[id] if not jpi then - texprint(ctxcatcodes,default) + context(default) else local split = jpi[0] if not split then split = lpegmatch(splitter,jpi[7]) jpi[0] = split end - texprint(ctxcatcodes,split[n] or default) + context(split[n] or default) end end function jobpositions.MPrest(id,default) local jpi = collected[id] or tobesaved[id] - -- texprint(ctxcatcodes,(jpi and jpi[7] and concat(jpi,",",7,#jpi)) or default) - texprint(ctxcatcodes,(jpi and jpi[7]) or default) + context(jpi and jpi[7] or default) end diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua index 4341b465a..425e1ad15 100644 --- a/tex/context/base/back-pdf.lua +++ b/tex/context/base/back-pdf.lua @@ -20,8 +20,6 @@ local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.f local concat = table.concat local round = math.round local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues -local texsprint, texwrite = tex.sprint, tex.write -local ctxcatcodes = tex.ctxcatcodes local backends, lpdf, nodes, node = backends, lpdf, nodes, node diff --git a/tex/context/base/bibl-bib.lua b/tex/context/base/bibl-bib.lua index db9fef14d..5e759eff2 100644 --- a/tex/context/base/bibl-bib.lua +++ b/tex/context/base/bibl-bib.lua @@ -638,9 +638,6 @@ end if commands then - local texsprint = tex and tex.sprint - local ctxcatcodes = tex and tex.ctxcatcodes - local sessions = { } function commands.definebibtexsession(name) @@ -674,7 +671,7 @@ if commands then if collected then local author = collected[1].dt[1] or "" if author ~= "" then - texsprint(ctxcatcodes,authors.concat(author,method,what,settings)) + context(authors.concat(author,method,what,settings)) end end end @@ -684,7 +681,7 @@ if commands then local c = collected[1] local year = xmlfilter(c,"xml://field[@name='year']/text()") local author = xmlfilter(c,"xml://field[@name='author']/text()") - texsprint(ctxcatcodes,authors.short(author,year)) + context(authors.short(author,year)) end end @@ -718,29 +715,29 @@ if commands then function bibtex.authorref(id,list) local result = collectauthoryears(id,list,method,what) for author, years in next, result do - texsprint(ctxcatcodes,authors.concat(author,method,what,settings)) + context(authors.concat(author,method,what,settings)) end end function bibtex.authoryearref(id,list) local result = collectauthoryears(id,list,method,what) for author, years in next, result do - texsprint(ctxcatcodes,authors.concat(author,method,what,settings)," (",concat(years,", "),")") + context("%s (%s)",authors.concat(author,method,what,settings),concat(years,", ")) end end function bibtex.authoryearsref(id,list) local result = collectauthoryears(id,list,method,what) for author, years in next, result do - texsprint(ctxcatcodes,"(",authors.concat(author,method,what,settings),", ",concat(years,", "),")") + context("(%s, %s)",authors.concat(author,method,what,settings),concat(years,", ")) end end function bibtex.singularorplural(singular,plural) if lastconcatsize and lastconcatsize > 1 then - texsprint(ctxcatcodes,plural) + context(plural) else - texsprint(ctxcatcodes,singular) + context(singular) end end diff --git a/tex/context/base/bibl-tra.lua b/tex/context/base/bibl-tra.lua index 60a673546..f901b1f0a 100644 --- a/tex/context/base/bibl-tra.lua +++ b/tex/context/base/bibl-tra.lua @@ -13,7 +13,6 @@ bibtex.hacks = bibtex.hacks or { } local hacks = bibtex.hacks local match, gmatch, format, concat, sort = string.match, string.gmatch, string.format, table.concat, table.sort -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local variables, constants = interfaces.variables, interfaces.constants local trace_bibtex = false trackers.register("publications.bibtex", function(v) trace_bibtex = v end) diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index 56886e28b..a0ef32c82 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -682,7 +682,7 @@ % {\letvalue{#1@num}\!!zerocount % \doloop % {\doifdefinedelse{\??pb @#1\recurselevel} -% {\letvalue{\??pb @#1\recurselevel}\empty} % why not undefined? +% {\letvalueempty{\??pb @#1\recurselevel}} % why not undefined? % {\exitloop}}} % \def\clearbibitemtwo#1% diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua index 0564c70cf..cb41b48cf 100644 --- a/tex/context/base/buff-ini.lua +++ b/tex/context/base/buff-ini.lua @@ -22,7 +22,7 @@ local report_buffers = logs.new("buffers") local utf = unicode.utf8 -local concat, texsprint, texprint, texwrite = table.concat, tex.sprint, tex.print, tex.write +local concat, texprint, texwrite = table.concat, tex.print, tex.write local utfbyte, utffind, utfgsub = utf.byte, utf.find, utf.gsub local type, next = type, next local huge = math.huge @@ -43,6 +43,7 @@ buffers = { } local buffers = buffers +local context = context local data = buffers.data local flags = buffers.flags @@ -106,26 +107,36 @@ function buffers.doifelsebuffer(name) commands.testcase(data[name] ~= nil) end -flags.optimizeverbatim = true -flags.countemptylines = false +-- handy helpers +-- +-- \sop[color] switch_of_pretty +-- \bop[color] begin_of_pretty +-- \eop end_of_pretty +-- \obs obeyedspace +-- \char <n> special characters + +local sop = context.sop +local bop = context.bop +local eop = context.eop +local obs = context.obs +local par = context.par +local chr = context.char -local no_break_command = "\\doverbatimnobreak" -local do_break_command = "\\doverbatimgoodbreak" -local begin_of_line_command = "\\doverbatimbeginofline" -local end_of_line_command = "\\doverbatimendofline" -local empty_line_command = "\\doverbatimemptyline" +local bgroup = context.bgroup +local egroup = context.egroup -local begin_of_display_command = "\\doverbatimbeginofdisplay" -local end_of_display_command = "\\doverbatimendofdisplay" -local begin_of_inline_command = "\\doverbatimbeginofinline" -local end_of_inline_command = "\\doverbatimendofinline" +flags.optimizeverbatim = true +flags.countemptylines = false + +local doverbatimnobreak = context.doverbatimnobreak +local doverbatimgoodbreak = context.doverbatimgoodbreak function buffers.verbatimbreak(n,m) if flags.optimizeverbatim then if n == 2 or n == m then - texsprint(no_break_command) + doverbatimnobreak() elseif n > 1 then - texsprint(do_break_command) + doverbatimgoodbreak() end end end @@ -399,14 +410,11 @@ function buffers.inspect(name) if type(b) == "table" then for k=1,#b do local v = b[k] - if v == "" then - texsprint(ctxcatcodes,"[crlf]\\par ") -- space ? - else - texsprint(ctxcatcodes,(gsub(v,"(.)",tobyte)),"\\par") - end + context(v == "" and "[crlf]" or gsub(v,"(.)",tobyte)) + par() end else - texsprint(ctxcatcodes,(gsub(b,"(.)",tobyte))) + context((gsub(b,"(.)",tobyte))) end end end @@ -463,6 +471,14 @@ end local default = buffers.newvisualizer(visualizers.defaultname) +default.begin_of_display = context.doverbatimbeginofdisplay +default.end_of_display = context.doverbatimendofdisplay +default.begin_of_inline = context.doverbatimbeginofinline +default.end_of_inline = context.doverbatimendofinline +default.begin_of_line = context.doverbatimbeginofline +default.end_of_line = context.doverbatimendofline +default.empty_line = context.doverbatimemptyline + --~ print(variables.typing) os.exit() -- will become cleaner @@ -561,34 +577,23 @@ function hooks.line(str) return (currenthandler.line or default.line)(str) end --- defaults - -function default.begin_of_display(currentvisualizer) - texsprint(ctxcatcodes,begin_of_display_command,"{",currentvisualizer,"}") -end - -function default.end_of_display() - texsprint(ctxcatcodes,end_of_display_command) -end +buffers.currentcolors = { } -- todo: registercurrentcolor and preset sop then ... faster or at least precreate tables -function default.begin_of_inline(currentvisualizer) - texsprint(ctxcatcodes,begin_of_inline_command,"{",currentvisualizer,"}") -end - -function default.end_of_inline() - texsprint(ctxcatcodes,end_of_inline_command) -end - -function default.begin_of_line(n) - texsprint(ctxcatcodes, begin_of_line_command,"{",n,"}") -end - -function default.end_of_line() - texsprint(ctxcatcodes,end_of_line_command) -end - -function default.empty_line() - texsprint(ctxcatcodes,empty_line_command) +function buffers.changestate(n, state) + if n then + if state ~= n then + if state > 0 then + sop { buffers.currentcolors[n] } + else + bop { buffers.currentcolors[n] } + end + return n + end + elseif state > 0 then + eop() + return 0 + end + return state end function default.line(str) @@ -600,7 +605,7 @@ function default.flush_line(str) if visualizers.obeyspace then for c in utfcharacters(str) do if c == " " then - texsprint(ctxcatcodes,"\\obs") + obs() else texwrite(c) end @@ -614,42 +619,6 @@ end buffers.commands.nested = "\\switchslantedtype " ---~ function visualizers.flushnested(str, enable) -- todo: no utf, vrb catcodes, kind of obsolete mess ---~ str = gsub(str," *[\n\r]+ *"," ") ---~ local result, c, nested, i = "", "", 0, 1 ---~ local commands = buffers.commands -- otherwise wrong commands ---~ while i < #str do -- slow ---~ c = sub(str,i,i+1) ---~ if c == "<<" then ---~ nested = nested + 1 ---~ if enable then ---~ result = result .. "{" .. commands.nested ---~ else ---~ result = result .. "{" ---~ end ---~ i = i + 2 ---~ elseif c == ">>" then ---~ if nested > 0 then ---~ nested = nested - 1 ---~ result = result .. "}" ---~ end ---~ i = i + 2 ---~ else ---~ c = sub(str,i,i) ---~ if c == " " then ---~ result = result .. "\\obs " ---~ elseif find(c,"%a") then ---~ result = result .. c ---~ else ---~ result = result .. "\\char" .. byte(c) .. " " ---~ end ---~ i = i + 1 ---~ end ---~ end ---~ result = result .. "\\char" .. byte(sub(str,i,i)) .. " " .. rep("}",nested) ---~ texsprint(ctxcatcodes,result) ---~ end - function visualizers.flushnested(str, enable) -- todo: no utf, vrb catcodes, kind of obsolete mess str = gsub(str," *[\n\r]+ *"," ") local c, nested, i = "", 0, 1 @@ -658,63 +627,38 @@ function visualizers.flushnested(str, enable) -- todo: no utf, vrb catcodes, kin c = sub(str,i,i+1) if c == "<<" then nested = nested + 1 + bgroup() if enable then - texsprint(ctxcatcodes,"{",commands.nested) - else - texsprint(ctxcatcodes,"{") + context(commands.nested) end i = i + 2 elseif c == ">>" then if nested > 0 then nested = nested - 1 - texsprint(ctxcatcodes,"}") + egroup() end i = i + 2 else c = sub(str,i,i) if c == " " then - texsprint(ctxcatcodes,"\\obs") + obs() elseif find(c,"%a") then - texsprint(ctxcatcodes,c) + context(c) else - texsprint(ctxcatcodes,"\\char",byte(c)," ") + chr(byte(c)) end i = i + 1 end end - texsprint(ctxcatcodes,"\\char",byte(sub(str,i,i))," ",rep("}",nested)) -end - --- handy helpers --- --- \sop[color] switch_of_pretty --- \bop[color] begin_of_pretty --- \eop end_of_pretty --- \obs obeyedspace --- \char <n> special characters - -buffers.currentcolors = { } - -function buffers.changestate(n, state) - if n then - if state ~= n then - if state > 0 then - texsprint(ctxcatcodes,"\\sop[",buffers.currentcolors[n],"]") - else - texsprint(ctxcatcodes,"\\bop[",buffers.currentcolors[n],"]") - end - return n - end - elseif state > 0 then - texsprint(ctxcatcodes,"\\eop") - return 0 + chr(byte(sub(str,i,i))) + for i=1,#nested do + egroup() end - return state end function buffers.finishstate(state) if state > 0 then - texsprint(ctxcatcodes,"\\eop") + eop() return 0 else return state @@ -732,9 +676,9 @@ end function buffers.flushresult(result,nested) if nested then - texsprint(ctxcatcodes,buffers.replacenested(concat(result))) + context(buffers.replacenested(concat(result))) else - texsprint(ctxcatcodes,concat(result)) + context(concat(result)) end end @@ -786,7 +730,7 @@ local function flush_escaped_line(str,pattern,flushline) flushline(a) end if b and b ~= "" then - texsprint(ctxcatcodes,"{",b,"}") + context(b) end if c then if c == "" then diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua index a6b033b08..b3ac6fc22 100644 --- a/tex/context/base/char-ini.lua +++ b/tex/context/base/char-ini.lua @@ -500,10 +500,8 @@ else -- keep this -- by this time, we're still in normal catcode mode -- subtle: not "\\",contextname but "\\"..contextname if chr.unicodeslot < 128 then - -- texprint(ctxcatcodes, "\\chardef\\"..contextname,"=",u) texprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) else - -- texprint(ctxcatcodes, "\\let\\"..contextname,"=",utfchar(u)) texprint(ctxcatcodes,format("\\let\\%s=%s",contextname,utfchar(u))) if is_letter[category] then lettered[#lettered+1] = "\\c"..u.."\\l" diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua index c3549ec01..d8ffdeed0 100644 --- a/tex/context/base/char-utf.lua +++ b/tex/context/base/char-utf.lua @@ -23,8 +23,6 @@ local utf = unicode.utf8 local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub local concat, gmatch, gsub = table.concat, string.gmatch, string.gsub local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues -local ctxcatcodes = tex.ctxcatcodes -local texsprint = tex.sprint local allocate = utilities.storage.allocate -- todo: trackers @@ -269,9 +267,9 @@ end commands = commands or { } -function commands.uchar(first,second) - texsprint(ctxcatcodes,utfchar(first*256+second)) -end +--~ function commands.uchar(first,second) +--~ context(utfchar(first*256+second)) +--~ end --[[ldx-- <p>A few helpers (used to be <t>luat-uni<t/>).</p> diff --git a/tex/context/base/chem-ini.lua b/tex/context/base/chem-ini.lua index 776647554..4bbfe4c38 100644 --- a/tex/context/base/chem-ini.lua +++ b/tex/context/base/chem-ini.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['chem-ini'] = { license = "see context related readme files" } -local format, texsprint = string.format, tex.sprint +local format = string.format local lpegmatch = lpeg.match local P, R, V, Cc, Cs = lpeg.P, lpeg.R, lpeg.V, lpeg.Cc, lpeg.Cs @@ -15,7 +15,7 @@ local trace_molecules = false trackers.register("chemistry.molecules", functio local report_chemistry = logs.new("chemistry") -local ctxcatcodes = tex.ctxcatcodes +local context = context chemicals = chemicals or { } local chemicals = chemicals @@ -72,8 +72,8 @@ function commands.molecule(str) if trace_molecules then local rep = lpegmatch(parser,str) report_chemistry("molecule %s => %s",str,rep) - texsprint(ctxcatcodes,rep) + context(rep) else - texsprint(ctxcatcodes,lpegmatch(parser,str)) + context(lpegmatch(parser,str)) end end diff --git a/tex/context/base/chem-str.lua b/tex/context/base/chem-str.lua index 7cd713470..f574a8ac4 100644 --- a/tex/context/base/chem-str.lua +++ b/tex/context/base/chem-str.lua @@ -18,13 +18,13 @@ local report_chemistry = logs.new("chemistry") local format, gmatch, match, lower, gsub = string.format, string.gmatch, string.match, string.lower, string.gsub local concat, insert, remove = table.concat, table.insert, table.remove local apply = structures.processors.apply -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local lpegmatch = lpeg.match local settings_to_array = utilities.parsers.settings_to_array local P, R, S, C, Cs, Ct, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc local variables = interfaces.variables +local context = context chemicals = chemicals or { } local chemicals = chemicals @@ -481,9 +481,9 @@ function chemicals.inline(spec) local s = spec[i] local inl = inline[lower(s)] if inl then - texsprint(ctxcatcodes,inl) + context(inl) else - texsprint(ctxcatcodes,format("\\chemicalinline{%s}",molecule(s))) + context.chemicalinline(molecule(s)) end end end diff --git a/tex/context/base/cldf-ini.mkiv b/tex/context/base/cldf-ini.mkiv new file mode 100644 index 000000000..b8731fe29 --- /dev/null +++ b/tex/context/base/cldf-ini.mkiv @@ -0,0 +1,19 @@ +%D \module +%D [ file=cldf-ini, +%D version=2010.10.19,, +%D title=\CONTEXT\ \LUA\ Document Functions, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=Hans Hagen] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt Lua Documents / Functions} + +%registerctxluafile{cldf-ini}{1.001} % maybe mult-cld moves here +\registerctxluafile{cldf-ver}{1.001} + +\endinput diff --git a/tex/context/base/cldf-ver.lua b/tex/context/base/cldf-ver.lua new file mode 100644 index 000000000..0d7d55649 --- /dev/null +++ b/tex/context/base/cldf-ver.lua @@ -0,0 +1,22 @@ +if not modules then modules = { } end modules ['cldf-ver'] = { + version = 1.001, + comment = "companion to cldf-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local concat = table.concat + +local context = context + +function table.tocontext(...) + local function flush(...) + context(concat{...,"\n"}) + end + context.starttyping() + context.pushcatcodes("verbatim") + table.tohandle(flush,...) + context.stoptyping() + context.popcatcodes() +end diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua index cba78954d..77b2ea888 100644 --- a/tex/context/base/colo-ini.lua +++ b/tex/context/base/colo-ini.lua @@ -9,8 +9,6 @@ if not modules then modules = { } end modules ['colo-ini'] = { local type, tonumber = type, tonumber local concat = table.concat local format, gmatch, gsub, lower, match, find = string.format, string.gmatch, string.gsub, string.lower, string.match, string.find -local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes local trace_define = false trackers.register("colors.define",function(v) trace_define = v end) diff --git a/tex/context/base/colo-ini.mkiv b/tex/context/base/colo-ini.mkiv index 1795f2e3a..a94495a0b 100644 --- a/tex/context/base/colo-ini.mkiv +++ b/tex/context/base/colo-ini.mkiv @@ -371,7 +371,7 @@ \def\dodefinepalet[#1][#2]% {\doifassignmentelse{#2} {%\showcolormessage\m!colors6{#1}% - \letvalue{\??pa#1}\empty + \letvalueempty{\??pa#1}% \setevalue{\??pa\??pa#1}{#2}% \def\dodododefinepalet[##1=##2]% {\doifvaluesomething{\??pa#1} @@ -765,8 +765,8 @@ % Since we couple definitions, we could stick to one test. Todo. Same for mpcolor. -\letvalue{(cs:-}\empty -\letvalue{(ts:-}\empty +\letvalueempty{(cs:-} +\letvalueempty{(ts:-} \def\doactivatecolor#1% : in currentpalet, maybe not, ugly {\def\currentcolorname{#1}% diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 5cf80f8fc..5744d86a6 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2010.10.14 13:14} +\newcontextversion{2010.10.19 23:03} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii index a6fff168c..4156f2b59 100644 --- a/tex/context/base/context.mkii +++ b/tex/context/base/context.mkii @@ -108,7 +108,7 @@ %D We already need some synonyms (patterns). At runtime this %D file will be reloaded. -\loadcorefile{cont-fil} +\loadmarkfile{cont-fil} %D \CONTEXT\ does not implement its own table handling. We %D just go for the best there is and load \TABLE. Just to be diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 69441cb33..89226a9a9 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -114,7 +114,7 @@ \loadmarkfile{core-fil} \loadmarkfile{core-con} -\loadcorefile{cont-fil} +\loadmarkfile{cont-fil} \loadmarkfile{regi-ini} \loadcorefile{regi-syn} @@ -332,10 +332,12 @@ \loadmarkfile{page-app} \loadmarkfile{meta-fig} -\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented) +\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented) \loadmarkfile{lang-spa} % will become obsolete +\loadmarkfile{cldf-ini} % this can come later + \loadmarkfile{bibl-bib} \loadmarkfile{bibl-tra} diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 48f31836c..00a426a14 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2010.10.14 13:14} +\edef\contextversion{2010.10.19 23:03} %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 7c1bb01f9..8f90eac16 100644 --- a/tex/context/base/core-con.lua +++ b/tex/context/base/core-con.lua @@ -22,30 +22,27 @@ local utfchar, utfbyte = utf.char, utf.byte local tonumber, tostring = tonumber, tostring local settings_to_array = utilities.parsers.settings_to_array -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local allocate = utilities.storage.allocate +local context = context + converters = converters or { } local converters = converters languages = languages or { } local languages = languages -local function flush(...) - texsprint(ctxcatcodes,...) -end - function converters.convert(method,n,direct) local method = converters[method] if method then return method(n,direct) else - return direct and n or flush(n) + return direct and n or context(n) end end function converters.numberst(n,direct) - return direct and n or flush(n) + return direct and n or context(n) end --~ ['arabic-digits'] = { @@ -149,7 +146,7 @@ local fallback = utf.byte('0') local function chr(n,m,direct) local s = (n > 0 and n < 27 and utfchar(n+m)) or "" - if direct then return s else flush(s) end + if direct then return s else context(s) end end --~ local function chrs(n,m,direct) @@ -157,7 +154,7 @@ end --~ chrs(floor((n-1)/26),m) --~ n = (n-1)%26 + 1 --~ end ---~ flush(utfchar(n+m)) +--~ context(utfchar(n+m)) --~ end local function chrs(n,m,direct,t) @@ -173,19 +170,11 @@ local function chrs(n,m,direct,t) if direct then return concat(t) else - flush(concat(t)) + context(concat(t)) end end end ---~ local function maxchrs(n,m,cmd,direct) ---~ if n > m then ---~ maxchrs(floor((n-1)/m),m,cmd) ---~ n = (n-1)%m + 1 ---~ end ---~ flush(format("%s{%s}",cmd,n)) ---~ end - local function maxchrs(n,m,cmd,direct,t) -- direct is not ok if not t then t = { } @@ -199,7 +188,7 @@ local function maxchrs(n,m,cmd,direct,t) -- direct is not ok if direct then return concat(t) else - flush(concat(t)) + context(concat(t)) end end end @@ -219,7 +208,7 @@ converters.maxchrs = maxchrs --~ n = (n-1)%max+1 --~ end --~ n = chr(n,mapping) ---~ flush(escapes[n] or utfchar(n)) +--~ context(escapes[n] or utfchar(n)) --~ end --~ local lccodes, uccodes = characters.lccode, characters.uccode @@ -270,7 +259,7 @@ local function do_alphabetic(n,mapping,mapper,direct,verbose,t) if direct then return concat(t) else - flush(concat(t)) + context(concat(t)) end end end @@ -289,7 +278,7 @@ function converters.Characters(n,direct) return chrs(n,64,direct) end function converters.weekday(day,month,year,direct) local s = date("%w",time{year=year,month=month,day=day}) + 1 - if direct then return s else flush(s) end + if direct then return s else context(s) end end function converters.isleapyear(year) @@ -298,7 +287,7 @@ end function converters.leapyear(year) local s = converters.isleapyear(year) and 1 or 0 - if direct then return s else flush(s) end + if direct then return s else context(s) end end local days = { @@ -308,17 +297,17 @@ local days = { function converters.nofdays(year,month,direct) local s = days[converters.isleapyear(year)][month] - if direct then return s else flush(s) end + if direct then return s else context(s) end end -function converters.year (direct) local s = date("%Y") if direct then return s else flush(s) end end -function converters.year (direct) local s = date("%Y") if direct then return s else flush(s) end end -function converters.month (direct) local s = date("%m") if direct then return s else flush(s) end end -function converters.hour (direct) local s = date("%H") if direct then return s else flush(s) end end -function converters.minute (direct) local s = date("%M") if direct then return s else flush(s) end end -function converters.second (direct) local s = date("%S") if direct then return s else flush(s) end end +function converters.year (direct) local s = date("%Y") if direct then return s else context(s) end end +function converters.year (direct) local s = date("%Y") if direct then return s else context(s) end end +function converters.month (direct) local s = date("%m") if direct then return s else context(s) end end +function converters.hour (direct) local s = date("%H") if direct then return s else context(s) end end +function converters.minute (direct) local s = date("%M") if direct then return s else context(s) end end +function converters.second (direct) local s = date("%S") if direct then return s else context(s) end end function converters.textime(direct) local s = tonumber(date("%H")) * 60 + tonumber(date("%M")) - if direct then return s else flush(s) end end + if direct then return s else context(s) end end local roman = { { [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' }, @@ -334,8 +323,8 @@ local function toroman(n) end end -function converters.romannumerals(n,direct) local s = lower(toroman(n)) if direct then return s else flush(s) end end -function converters.Romannumerals(n,direct) local s = toroman(n) if direct then return s else flush(s) end end +function converters.romannumerals(n,direct) local s = lower(toroman(n)) if direct then return s else context(s) end end +function converters.Romannumerals(n,direct) local s = toroman(n) if direct then return s else context(s) end end converters.toroman = toroman @@ -385,8 +374,8 @@ function converters.toabjad(n,what) end end -function converters.abjadnumerals (n,direct) local s = converters.toabjad(n,false) if direct then return s else flush(s) end end -function converters.abjadnodotnumerals(n,direct) local s = converters.toabjad(n,true ) if direct then return s else flush(s) end end +function converters.abjadnumerals (n,direct) local s = converters.toabjad(n,false) if direct then return s else context(s) end end +function converters.abjadnodotnumerals(n,direct) local s = converters.toabjad(n,true ) if direct then return s else context(s) end end local vector = { normal = { @@ -526,9 +515,9 @@ end --~ print(v,tochinese(v),tochinese(v,"all"),tochinese(v,"cap")) --~ end -function converters.chinesenumerals (n) local s = tochinese(n,"normal") if direct then return s else flush(s) end end -function converters.chinesecapnumerals(n) local s = tochinese(n,"cap" ) if direct then return s else flush(s) end end -function converters.chineseallnumerals(n) local s = tochinese(n,"all" ) if direct then return s else flush(s) end end +function converters.chinesenumerals (n) local s = tochinese(n,"normal") if direct then return s else context(s) end end +function converters.chinesecapnumerals(n) local s = tochinese(n,"cap" ) if direct then return s else context(s) end end +function converters.chineseallnumerals(n) local s = tochinese(n,"all" ) if direct then return s else context(s) end end --~ Well, since the one asking for this didn't test it the following code is not --~ enabled. @@ -653,7 +642,7 @@ function converters.convert(method,n,direct) -- todo: language elseif sequence then return do_alphabetic(n,sequence,false,direct,true) else - return direct and n or flush(n) + return direct and n or context(n) end end end diff --git a/tex/context/base/core-job.lua b/tex/context/base/core-job.lua index 474eb86bf..abbbf4e5e 100644 --- a/tex/context/base/core-job.lua +++ b/tex/context/base/core-job.lua @@ -11,7 +11,7 @@ local ctxcatcodes, texcatcodes = tex.ctxcatcodes, tex.texcatcodes local lower, format, find, gmatch, gsub, match = string.lower, string.format, string.find, string.gmatch, string.gsub, string.match local concat = table.concat -local commands, resolvers = commands, resolvers +local commands, resolvers, context = commands, resolvers, context -- main code @@ -106,9 +106,9 @@ local function convertexamodes(str) local data = xml.text(e) local mode = match(label,"^mode:(.+)$") if mode then - texsprint(ctxcatcodes,format("\\enablemode[%s:%s]",mode,data)) + context.enablemode { format("%s:%s",mode,data) } end - texsprint(ctxcatcodes,format("\\setvariable{exa:variables}{%s}{%s}",label,gsub(data,"([{}])","\\%1"))) + context.setvariable("exa:variables",label,(gsub(data,"([{}])","\\%1"))) end end end @@ -150,7 +150,7 @@ end --~ for sa in gmatch(a,"[^ ,]+") do --~ for sb in gmatch(b,"[^ ,]+") do --~ if sa == sb then ---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",sa,"}") +--~ context.setvalue("commalistelement",sa) --~ return true --~ end --~ end @@ -158,24 +158,24 @@ end --~ elseif ba then --~ for sa in gmatch(a,"[^ ,]+") do --~ if sa == b then ---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",b,"}") +--~ context.setvalue("commalistelement",b) --~ return true --~ end --~ end --~ elseif bb then --~ for sb in gmatch(b,"[^ ,]+") do --~ if a == sb then ---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}") +--~ context.setvalue("commalistelement",sb) --~ return true --~ end --~ end --~ else --~ if a == b then ---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}") +--~ context.setvalue("commalistelement",a) --~ return true --~ end --~ end ---~ texsprint(ctxcatcodes,"\\let\\commalistelement\\empty") +--~ context.letvalueempty("commalistelement") --~ return false --~ end --~ local function doifinsetelse(a,b) diff --git a/tex/context/base/core-mis.mkiv b/tex/context/base/core-mis.mkiv index ff69f0011..239af98ad 100644 --- a/tex/context/base/core-mis.mkiv +++ b/tex/context/base/core-mis.mkiv @@ -292,7 +292,7 @@ \setvalue{\e!start\currentparagraph}% {\bgroup \edef\currentparagraph{#1}% - \letvalue{\s!do\s!next\currentparagraph}\empty + \letvalueempty{\s!do\s!next\currentparagraph}% \setvalue{\e!stop\currentparagraph}{\getvalue\currentparagraph\egroup}% \getvalue\currentparagraph}% \getparameters[\??al\currentparagraph]% diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua index 1681646df..88afb35a9 100644 --- a/tex/context/base/core-uti.lua +++ b/tex/context/base/core-uti.lua @@ -19,7 +19,6 @@ saves much runtime but at the cost of more memory usage.</p> local format, match = string.format, string.match local next, type, tostring = next, type, tostring -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local definetable, accesstable = utilities.tables.definetable, utilities.tables.accesstable local serialize = table.serialize local packers = utilities.packers @@ -94,7 +93,7 @@ local function initializer() end tobesaved.randomseed = r for cs, value in next, collected do - texsprint(ctxcatcodes,format("\\xdef\\%s{%s}",cs,value)) + context.setxvalue(cs,value) end end diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua index 357567d14..59ba0547c 100644 --- a/tex/context/base/font-col.lua +++ b/tex/context/base/font-col.lua @@ -8,18 +8,16 @@ if not modules then modules = { } end modules ['font-col'] = { -- possible optimization: delayed initialization of vectors -local format, gmatch, texsprint, type = string.format, string.gmatch, tex.sprint, type +local gmatch, type = string.gmatch, type local traverse_id, first_character = node.traverse_id, node.first_character local lpegmatch = lpeg.match local settings_to_hash = utilities.parsers.settings_to_hash -local ctxcatcodes = tex.ctxcatcodes - local trace_collecting = false trackers.register("fonts.collecting", function(v) trace_collecting = v end) local report_fonts = logs.new("fonts") -local fonts = fonts +local fonts, context = fonts, context fonts.collections = fonts.collections or { } local collections = fonts.collections @@ -166,20 +164,20 @@ function collections.prepare(name) report_fonts("def: applying collection %s to %s (file: %s)",name,current,filename) end list = { } - texsprint(ctxcatcodes,"\\dostartcloningfonts") -- move this to tex \dostart... + context.dostartcloningfonts() -- move this to tex \dostart... for i=1,#d do local f = d[i] local name = f.font local scale = f.rscale or 1 if lpegmatch(okay,name) then - texsprint(ctxcatcodes,format("\\doclonefonta{%s}{%s}",name,scale)) -- define with unique specs + context.doclonefonta(name,scale) -- define with unique specs else - texsprint(ctxcatcodes,format("\\doclonefontb{%s}{%s}",name,scale)) -- define with inherited specs + context.doclonefontb(name,scale) -- define with inherited specs end - texsprint(ctxcatcodes,format("\\ctxlua{fonts.collections.stage_1('%s')}",name)) -- registering main font + context.doclonefontstageone(name) -- registering main font end - texsprint(ctxcatcodes,format("\\ctxlua{fonts.collections.stage_2('%s')}",name)) -- preparing clone vectors - texsprint(ctxcatcodes,"\\dostopcloningfonts") + context.doclonefontstagetwo(name) -- preparing clone vectors + context.dostopcloningfonts() elseif trace_collecting then local filename = file.basename(fontdata[current].filename or "?") report_fonts("def: error in applying collection %s to %s (file: %s)",name,current,filename) diff --git a/tex/context/base/font-col.mkiv b/tex/context/base/font-col.mkiv index 181b985f6..0ace4854f 100644 --- a/tex/context/base/font-col.mkiv +++ b/tex/context/base/font-col.mkiv @@ -93,6 +93,13 @@ \def\doclonefontb#1% #2 {\doclonefonta{#1 \savedfontspec}} +\def\doclonefontstageone#1% + {\ctxlua{fonts.collections.stage_1("#1")}} + +\def\doclonefontstagetwo#1% + {\ctxlua{fonts.collections.stage_2("#1")}} + + % 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 b6c0dd3f3..8802ccb64 100644 --- a/tex/context/base/font-ctx.lua +++ b/tex/context/base/font-ctx.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['font-ctx'] = { -- needs a cleanup: merge of replace, lang/script etc -local texsprint, count, texsetcount, write_nl = tex.sprint, tex.count, tex.setcount, texio.write_nl +local texcount, texsetcount, write_nl = tex.count, tex.setcount, texio.write_nl local format, gmatch, match, find, lower, gsub, byte = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub, string.byte local concat, serialize = table.concat, table.serialize local settings_to_hash, hash_to_string = utilities.parsers.settings_to_hash, utilities.parsers.hash_to_string @@ -18,8 +18,6 @@ local tostring, next, type = tostring, next, type local lpegmatch = lpeg.match local round = math.round -local ctxcatcodes = tex.ctxcatcodes - local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) local trace_usage = false trackers.register("fonts.usage", function(v) trace_usage = v end) local trace_mapfiles = false trackers.register("fonts.mapfiles", function(v) trace_mapfiles = v end) @@ -43,7 +41,9 @@ local setups = specifiers.contextsetups local numbers = specifiers.contextnumbers local merged = specifiers.contextmerged local synonyms = specifiers.synonyms + local triggers = fonts.triggers +local names = fonts.names -- Beware, number can be shared between redefind features but as it is -- applied only for special cases it probably doesn't matter. @@ -349,35 +349,40 @@ local getspecification = definers.getspecification -- we can make helper macros which saves parsing (but normaly not -- that many calls, e.g. in mk a couple of 100 and in metafun 3500) +local setdefaultfontname = context.fntsetdefname +local setsomefontname = context.fntsetsomename +local setemptyfontsize = context.fntsetnopsize +local setsomefontsize = context.fntsetsomesize + function definers.stage_one(str) statistics.starttiming(fonts) local fullname, size = lpegmatch(splitpattern,str) local lookup, name, sub, method, detail = getspecification(fullname) if not name then report_define("strange definition '%s'",str) - texsprint(ctxcatcodes,"\\fcglet\\somefontname\\defaultfontfile") + setdefaultfontname() elseif name == "unknown" then - texsprint(ctxcatcodes,"\\fcglet\\somefontname\\defaultfontfile") + setdefaultfontname() else - texsprint(ctxcatcodes,"\\fcxdef\\somefontname{",name,"}") + setsomefontname(name) end -- we can also use a count for the size if size and size ~= "" then local mode, size = lpegmatch(sizepattern,size) if size and mode then - count.scaledfontmode = mode - texsprint(ctxcatcodes,"\\def\\somefontsize{",size,"}") + texcount.scaledfontmode = mode + setsomefontsize(size) else - count.scaledfontmode = 0 - texsprint(ctxcatcodes,"\\let\\somefontsize\\empty") + texcount.scaledfontmode = 0 + setemptyfontsize() end elseif true then -- so we don't need to check in tex - count.scaledfontmode = 2 - texsprint(ctxcatcodes,"\\let\\somefontsize\\empty") + texcount.scaledfontmode = 2 + setemptyfontsize() else - count.scaledfontmode = 0 - texsprint(ctxcatcodes,"\\let\\somefontsize\\empty") + texcount.scaledfontmode = 0 + setemptyfontsize() end specification = definers.makespecification(str,lookup,name,sub,method,detail,size) end @@ -434,7 +439,7 @@ function definers.stage_two(global,cs,str,size,classfeatures,fontfeatures,classf end tex.definefont(global,cs,tfmdata) -- resolved (when designsize is used): - texsprint(ctxcatcodes,format("\\def\\somefontsize{%isp}",fontdata[tfmdata].size)) + setsomefontsize(fontdata[tfmdata].size .. "sp") texsetcount("global","lastfontid",tfmdata) else -- local t = os.clock(t) @@ -448,7 +453,7 @@ function definers.stage_two(global,cs,str,size,classfeatures,fontfeatures,classf report_define("defining %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s)",name,id,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks) end -- resolved (when designsize is used): - texsprint(ctxcatcodes,format("\\def\\somefontsize{%isp}",tfmdata.size or 655360)) + setsomefontsize((tfmdata.size or 655360) .. "sp") --~ if specification.fallbacks then --~ fonts.collections.prepare(specification.fallbacks) --~ end @@ -569,7 +574,7 @@ function fonts.dimenfactor(unit,tfmdata) end function fonts.cleanname(name) - texsprint(ctxcatcodes,fonts.names.cleanname(name)) + context(names.cleanname(name)) end local p, f = 1, "%0.1fpt" -- normally this value is changed only once @@ -581,7 +586,7 @@ function fonts.nbfs(amount,precision) p = precision f = "%0." .. p .. "fpt" end - texsprint(ctxcatcodes,lpegmatch(stripper,format(f,amount/65536))) + context(lpegmatch(stripper,format(f,amount/65536))) end -- for the moment here, this will become a chain of extras that is @@ -682,7 +687,7 @@ function fonts.char(n) -- todo: afm en tfm n = nametoslot(n) end if type(n) == "number" then - texsprint(ctxcatcodes,format("\\char%s ",n)) + context.char(n) end end diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua index ea6854456..5916319fc 100644 --- a/tex/context/base/font-fbk.lua +++ b/tex/context/base/font-fbk.lua @@ -9,7 +9,8 @@ if not modules then modules = { } end modules ['font-fbk'] = { local cos, tan, rad, format = math.cos, math.tan, math.rad, string.format local utfbyte, utfchar = utf.byte, utf.char -local trace_combining = false trackers.register("fonts.combining", function(v) trace_combining = v end) +local trace_combining = false trackers.register("fonts.combining", function(v) trace_combining = v end) +local trace_combining_all = false trackers.register("fonts.combining.all", function(v) trace_combining_all = v end) trackers.register("fonts.composing", "fonts.combining") @@ -105,7 +106,7 @@ function vf.aux.compose_characters(g) -- todo: scaling depends on call location charsacc = acc and chars[acc] end if charsacc then - if trace_combining then + if trace_combining_all then report_combining("%s (0x%05X) = %s (0x%05X) + %s (0x%05X)",utfchar(i),i,utfchar(chr),chr,utfchar(acc),acc) end local chr_t = cache[chr] @@ -178,7 +179,7 @@ function vf.aux.compose_characters(g) -- todo: scaling depends on call location end done = true end - elseif trace_combining then + elseif trace_combining_all then report_combining("%s (0x%05X) = %s (0x%05X)",utfchar(i),i,utfchar(chr),chr) end chars[i] = t @@ -300,7 +301,7 @@ fallbacks['textcent'] = function (g) end fallbacks['texteuro'] = function (g) - local c = byte("C") + local c = utfbyte("C") local t = table.fastcopy(g.characters[c],true) local d = cos(rad(90+(g.italicangle))) local vfspecials = backends.tables.vfspecials diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua index 8209f483e..fd4465d62 100644 --- a/tex/context/base/font-ini.lua +++ b/tex/context/base/font-ini.lua @@ -23,7 +23,7 @@ fontloader.totable = fontloader.to_table -- vtf comes first -- fix comes last -fonts = fonts or { } +fonts = fonts or { } -- we will also have des and fam hashes @@ -86,9 +86,9 @@ fonts.definers.specifiers.synonyms = fonts.definers.specifiers.synonyms or { } -- tracing -if not fonts.color then +if not fonts.colors then - fonts.color = allocate { + fonts.colors = allocate { set = function() end, reset = function() end, } diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index bb5661c19..79e5529ff 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -975,11 +975,14 @@ \expandafter\dogetfontparameteryes \fi} -% hm, was wrong, class/global reversed +% helpers, some day these will be toks and counts -\let\fcglobal\global -\let\fcxdef \xdef -\let\fcglet \glet +\def\fntsetdefname {\global\let\somefontname\defaultfontfile} +\def\fntsetsomename{\gdef\somefontname} % {#1} +\def\fntsetnopsize {\let\somefontsize\empty} +\def\fntsetsomesize{\def\somefontsize} % {#1} + +% end of helpers \def\nonodefinefontsynonymnop {\@EA\let\csname\??ff\@@fontname\s!features \endcsname\undefined @@ -987,9 +990,9 @@ \@EA\let\csname\??ff\@@fontname\s!goodies \endcsname\undefined} \def\nonodefinefontsynonymyes - {\fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined - \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined - \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!goodies \endcsname\undefined} + {\global\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined + \global\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined + \global\@EA\let\csname\??ff\fontclass\@@fontname\s!goodies \endcsname\undefined} \def\dodododefinefontsynonymnop {\@EA\let\csname\??ff\@@fontname\s!features \endcsname\@@ff@@features @@ -997,9 +1000,9 @@ \@EA\let\csname\??ff\@@fontname\s!goodies \endcsname\@@ff@@goodies} \def\dodododefinefontsynonymyes - {\fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features - \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks - \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!goodies \endcsname\@@ff@@goodies} + {\global\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features + \global\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks + \global\@EA\let\csname\??ff\fontclass\@@fontname\s!goodies \endcsname\@@ff@@goodies} \let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater @@ -1482,7 +1485,7 @@ % only once \else % prevent loop (hence \empty) - \letvalue{\@size@#1}\empty + \letvalueempty{\@size@#1}% \pushmacro\fontclass % new per 26102009 \edef\fontclass{#2}% % new per 26102009 \defineunknownfont{#1}% @@ -1701,8 +1704,8 @@ \def\dodefinebodyfontyesxx#1#2[#3#4#5=#6]% style body def {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5] - \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#5*\endcsname\undefined - \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#5\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#5}{\normalunexpanded{#6}}}} + \global\@EA\let\csname*\fontclass#2#1#3#4#5*\endcsname\undefined + \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#5\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#5}{\normalunexpanded{#6}}}} \def\dodefinebodyfontnopmm#1#2[#3#4#5=#6]% style body def {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5] @@ -1715,12 +1718,12 @@ \def\dodefinebodyfontyesmm#1#2[#3#4#5=#6]% style body def {\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5] - \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#51*\endcsname\undefined - \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#52*\endcsname\undefined - \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#53*\endcsname\undefined - \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#51\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#51}{\normalunexpanded{#6}}}% - \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#52\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#52}{\normalunexpanded{#6}}}% - \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}} + \global\@EA\let\csname*\fontclass#2#1#3#4#51*\endcsname\undefined + \global\@EA\let\csname*\fontclass#2#1#3#4#52*\endcsname\undefined + \global\@EA\let\csname*\fontclass#2#1#3#4#53*\endcsname\undefined + \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#51\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#51}{\normalunexpanded{#6}}}% + \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#52\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#52}{\normalunexpanded{#6}}}% + \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}} \def\checkbodyfont#1% tests for ttsl mmbf {\edef\c!!mm{#1}% @@ -2170,10 +2173,10 @@ % \ifcsname\@fontclass@#1\endcsname % \edef\fontclass{#1}% % \else -% \letvalue{\@no@fontclass@#1}\empty +% \letvalueempty{\@no@fontclass@#1}% % \fi % \else -% \letvalue{\@no@fontclass@#1}\empty +% \letvalueempty{\@no@fontclass@#1}% % \fi} \def\trycurrentfontclass#1% @@ -2191,12 +2194,12 @@ \edef\fontclass{#1}% \else % todo: message - \letvalue{\@no@fontclass@#1}\empty + \letvalueempty{\@no@fontclass@#1}% \fi \fi \else % todo: message - \letvalue{\@no@fontclass@#1}\empty + \letvalueempty{\@no@fontclass@#1}% \fi} \let\defaultfontstyle \c!rm @@ -3988,7 +3991,7 @@ \else\ifthirdargument \setvalue{\??sx#1::#2}{#3}% \else\ifsecondargument - \letvalue{\??sx#1::#2}\empty + \letvalueempty{\??sx#1::#2}% \fi\fi\fi} \unexpanded\def\styleinstance[#1]% will be made faster diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua index 5e7135013..46e84ada2 100644 --- a/tex/context/base/font-map.lua +++ b/tex/context/base/font-map.lua @@ -16,8 +16,6 @@ local trace_unimapping = false trackers.register("otf.unimapping", function(v) local report_otf = logs.new("load otf") -local ctxcatcodes = tex and tex.ctxcatcodes - --[[ldx-- <p>Eventually this code will disappear because map files are kind of obsolete. Some code may move to runtime or auxiliary modules.</p> diff --git a/tex/context/base/font-ota.lua b/tex/context/base/font-ota.lua index 73e2c578b..d148eddbf 100644 --- a/tex/context/base/font-ota.lua +++ b/tex/context/base/font-ota.lua @@ -43,7 +43,7 @@ local traverse_node_list = node.traverse local fontdata = fonts.ids local state = attributes.private('state') -local fontcolors = fonts.colors +local fontscolors = fonts.colors local fcs = (fontscolors and fontscolors.set) or function() end local fcr = (fontscolors and fontscolors.reset) or function() end @@ -161,6 +161,10 @@ local isol_fina_medi_init = { [0x077E] = true, [0x077F] = true, [zwj] = true, } +local mark = { + [0x0650] = true, +} + local arab_warned = { } -- todo: gref @@ -231,7 +235,7 @@ function analyzers.methods.arab(head,font,attr) -- maybe make a special version if current.id == glyph_code and current.subtype<256 and current.font == font and not has_attribute(current,state) then done = true local char = current.char - if marks[char] then + if marks[char] or mark[char] then set_attribute(current,state,5) -- mark if trace_analyzing then fcs(current,"font:mark") end elseif isol[char] then -- can be zwj or zwnj too diff --git a/tex/context/base/font-tra.mkiv b/tex/context/base/font-tra.mkiv index e47c8c49d..527941162 100644 --- a/tex/context/base/font-tra.mkiv +++ b/tex/context/base/font-tra.mkiv @@ -40,10 +40,10 @@ {\ctxlua{nodes.tracers.steppers.glyphs(\number\otfcollector,#1)}% \unhbox\otfcollector} -\def\otfstepcharcommand#1#2% font char +\def\otfstepcharcommand#1#2#3% font char class {\removeunwantedspaces \hskip.5em plus .125em\relax - U+\hexnumber{#2}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}% + \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}% \hskip.5em plus .125em\relax} \def\otfstepmessagecommand#1#2% @@ -58,10 +58,10 @@ \blank} \def\showotfstepchars#1% - {\ctxlua{nodes.tracers.steppers.codes(#1,\!!bs\detokenize{\otfstepcharcommand}\!!es)}} + {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand")}} \def\showotfstepmessages#1% - {\ctxlua{nodes.tracers.steppers.messages(#1,\!!bs\detokenize{\otfstepmessagecommand}\!!es,true)}} + {\ctxlua{nodes.tracers.steppers.messages(#1,"otfstepmessagecommand",true)}} \def\showotfstepfeatures {\ctxlua{nodes.tracers.steppers.features()}} diff --git a/tex/context/base/font-uni.mkiv b/tex/context/base/font-uni.mkiv index 40ab75ed6..ea60aa017 100644 --- a/tex/context/base/font-uni.mkiv +++ b/tex/context/base/font-uni.mkiv @@ -19,7 +19,8 @@ \unprotect -\def\uchar#1#2{\ctxlua{commands.uchar(\number#1,\number#2)}} +%def\uchar#1#2{\ctxlua{commands.uchar(,)}} +\def\uchar#1#2{\ctxcontext{utf.char(\number\numexpr#1*256+#2\relax)}} \let\uc\uchar diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua index 5f290edb1..240a84e6b 100644 --- a/tex/context/base/grph-inc.lua +++ b/tex/context/base/grph-inc.lua @@ -40,14 +40,13 @@ run TeX code from within Lua. Some more functionality will move to Lua. -- commands.writestatus -> report local format, lower, find, match, gsub, gmatch = string.format, string.lower, string.find, string.match, string.gsub, string.gmatch -local texsprint, texbox = tex.sprint, tex.box +local texbox = tex.box local contains = table.contains local concat = table.concat local todimen = string.todimen local settings_to_array = utilities.parsers.settings_to_array local allocate = utilities.storage.allocate -local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables local codeinjections = backends.codeinjections local nodeinjections = backends.nodeinjections @@ -60,9 +59,9 @@ local trace_inclusion = false trackers.register("figures.inclusion", function local report_graphics = logs.new("graphics") ---- some extra img functions --- +local context, img = context, img -local img = img +--- some extra img functions --- local imgkeys = img.keys() @@ -337,8 +336,6 @@ function figures.pop() end end --- maybe move texsprint to tex - function figures.get(category,tag,default) local value = figuredata[category] value = value and value[tag] @@ -350,7 +347,7 @@ function figures.get(category,tag,default) end function figures.tprint(category,tag,default) - texsprint(ctxcatcodes,figures.get(category,tag,default)) + context(figures.get(category,tag,default)) end function figures.current() @@ -743,7 +740,7 @@ function figures.include(data) return (includers[ds.format] or includers.generic)(data) end function figures.scale(data) -- will become lua code - texsprint(ctxcatcodes,"\\doscalefigure") + context.doscalefigure() return data end function figures.done(data) @@ -861,29 +858,32 @@ function includers.generic(data) box.width, box.height, box.depth = figure.width, figure.height, 0 -- new, hm, tricky, we need to do that in tex (yet) texbox[nr] = box ds.objectnumber = figure.objnum - texsprint(ctxcatcodes,"\\relocateexternalfigure") + context.relocateexternalfigure() end return data end -- -- -- nongeneric -- -- -- -function checkers.nongeneric(data,command) +function checkers.nongeneric(data,command) -- todo: macros and context.* local dr, du, ds = data.request, data.used, data.status local name = du.fullname or "unknown nongeneric" local hash = name if dr.object then - -- hm, bugged + -- hm, bugged ... waiting for an xform interface if not job.objects.get("FIG::"..hash) then - texsprint(ctxcatcodes,command) - texsprint(ctxcatcodes,format("\\setobject{FIG}{%s}\\vbox{\\box\\foundexternalfigure}",hash)) + if type(command) == "function" then + command() + end + context.dosetfigureobject(hash) end - texsprint(ctxcatcodes,format("\\global\\setbox\\foundexternalfigure\\vbox{\\getobject{FIG}{%s}}",hash)) - else - texsprint(ctxcatcodes,command) + context.doboxfigureobject(hash) + elseif type(command) == "function" then + command() end return data end + function includers.nongeneric(data) return data end @@ -942,9 +942,9 @@ end function checkers.mps(data) local mprun, mpnum = internal(data.used.fullname) if mpnum then - return checkers.nongeneric(data,format("\\docheckfiguremprun{%s}{%s}",mprun,mpnum)) + return checkers.nongeneric(data,function() context.docheckfiguremprun(mprun,mpnum) end) else - return checkers.nongeneric(data,format("\\docheckfiguremps{%s}",data.used.fullname)) + return checkers.nongeneric(data,function() context.docheckfiguremps(data.used.fullname) end) end end includers.mps = includers.nongeneric @@ -956,7 +956,7 @@ function existers.tex(askedname) return (askedname ~= "" and askedname) or false end function checkers.tex(data) - return checkers.nongeneric(data,format("\\docheckfiguretex{%s}", data.used.fullname)) + return checkers.nongeneric(data,function() context.docheckfiguretex(data.used.fullname) end) end includers.tex = includers.nongeneric @@ -964,7 +964,7 @@ includers.tex = includers.nongeneric existers.buffer = existers.tex function checkers.buffer(data) - return checkers.nongeneric(data,format("\\docheckfigurebuffer{%s}", file.nameonly(data.used.fullname))) + return checkers.nongeneric(data,function() context.docheckfigurebuffer(file.nameonly(data.used.fullname)) end) end includers.buffers = includers.nongeneric @@ -972,7 +972,7 @@ includers.buffers = includers.nongeneric existers.cld = existers.tex function checkers.cld(data) - return checkers.nongeneric(data,format("\\docheckfigurecld{%s}", data.used.fullname)) + return checkers.nongeneric(data,function() context.docheckfigurecld(data.used.fullname) end) end includers.cld = includers.nongeneric diff --git a/tex/context/base/grph-inc.mkiv b/tex/context/base/grph-inc.mkiv index e74c437a0..730fe1ee5 100644 --- a/tex/context/base/grph-inc.mkiv +++ b/tex/context/base/grph-inc.mkiv @@ -396,6 +396,14 @@ \externalfigure[#1][#2,\c!display=,\c!object=\v!no]% \stopnointerference} +% helpers (will be replaced when xforms are accessible at the lua end) + +\def\dosetfigureobject#1% + {\setobject{FIG}{#1}\vbox{\box\foundexternalfigure}} + +\def\doboxfigureobject#1% + {\global\setbox\foundexternalfigure\vbox{\getobject{FIG}{#1}}} % probably one vbox too many + % figurebases \def\usefigurebase[#1]% diff --git a/tex/context/base/grph-swf.lua b/tex/context/base/grph-swf.lua index deff3defa..c597a77f8 100644 --- a/tex/context/base/grph-swf.lua +++ b/tex/context/base/grph-swf.lua @@ -6,13 +6,12 @@ if not modules then modules = { } end modules ['grph-swf'] = { license = "see context related readme files" } -local format = string.format +local todimen = number.todimen -local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes local nodeinjections = backends.nodeinjections local figures = figures +local context = context function figures.checkers.swf(data) local dr, du, ds = data.request, data.used, data.status @@ -21,7 +20,7 @@ function figures.checkers.swf(data) local foundname = du.fullname dr.width, dr.height = width, height du.width, du.height, du.foundname = width, height, foundname - texsprint(ctxcatcodes,format("\\startfoundexternalfigure{%ssp}{%ssp}",width,height)) + context.startfoundexternalfigure(todimen(width),todimen(height)) nodeinjections.insertswf { foundname = foundname, width = width, @@ -31,7 +30,7 @@ function figures.checkers.swf(data) -- controls = dr.controls, -- label = dr.label, } - texsprint(ctxcatcodes,"\\stopfoundexternalfigure") + context.stopfoundexternalfigure() return data end diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua index 1a871f0fe..b9753dd26 100644 --- a/tex/context/base/l-table.lua +++ b/tex/context/base/l-table.lua @@ -297,13 +297,6 @@ function table.fromhash(t) return h end ---~ print(table.serialize(t), "\n") ---~ print(table.serialize(t,"name"), "\n") ---~ print(table.serialize(t,false), "\n") ---~ print(table.serialize(t,true), "\n") ---~ print(table.serialize(t,"name",true), "\n") ---~ print(table.serialize(t,"name",true,true), "\n") - table.serialize_functions = true table.serialize_compact = true table.serialize_inline = true @@ -395,8 +388,8 @@ local function do_serialize(root,name,depth,level,indexed) --~ if v == root then -- circular --~ else - local t = type(v) - if compact and first and type(k) == "number" and k >= first and k <= last then + local t, tk = type(v), type(k) + if compact and first and tk == "number" and k >= first and k <= last then if t == "number" then if hexify then handle(format("%s 0x%04X,",depth,v)) @@ -438,17 +431,18 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s __p__=nil,",depth)) end elseif t == "number" then - --~ if hexify then - --~ handle(format("%s %s=0x%04X,",depth,key(k),v)) - --~ else - --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g - --~ end - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g end + elseif tk == "boolean" then + if hexify then + handle(format("%s [%s]=0x%04X,",depth,tostring(k),v)) + else + handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g + end elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then if hexify then handle(format("%s %s=0x%04X,",depth,k,v)) @@ -464,26 +458,28 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "string" then if reduce and tonumber(v) then - --~ handle(format("%s %s=%s,",depth,key(k),v)) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%s,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) end else - --~ handle(format("%s %s=%q,",depth,key(k),v)) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%q,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,v)) else @@ -492,13 +488,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "table" then if not next(v) then - --~ handle(format("%s %s={},",depth,key(k))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end + elseif tk == "boolean" then + handle(format("%s [%s]={},",depth,tostring(k))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={},",depth,k)) else @@ -507,13 +504,14 @@ local function do_serialize(root,name,depth,level,indexed) elseif inline then local st = simple_table(v) if st then - --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", "))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", "))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={ %s },",depth,k,concat(st,", "))) else @@ -526,13 +524,14 @@ local function do_serialize(root,name,depth,level,indexed) do_serialize(v,k,depth,level+1) end elseif t == "boolean" then - --~ handle(format("%s %s=%s,",depth,key(k),tostring(v))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,tostring(v))) else handle(format("%s [%s]=%s,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,tostring(v))) else @@ -540,13 +539,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "function" then if functions then - --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v))) else handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v))) end + elseif tk == "boolean" then + handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=loadstring(%q),",depth,k,dump(v))) else @@ -554,13 +554,14 @@ local function do_serialize(root,name,depth,level,indexed) end end else - --~ handle(format("%s %s=%q,",depth,key(k),tostring(v))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,tostring(v))) else @@ -869,5 +870,5 @@ function table.sequenced(t,sep,simple) -- hash only end function table.print(...) - print(table.serialize(...)) + table.tohandle(print,...) end diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua index d66b2645b..7bbf42aa7 100644 --- a/tex/context/base/lang-ini.lua +++ b/tex/context/base/lang-ini.lua @@ -157,7 +157,7 @@ function languages.synonym(synonym,tag) -- convenience function end function languages.installed(separator) - tex.sprint(tex.ctxcatcodes,concat(table.sortedkeys(registered),separator or ",")) + context(concat(table.sortedkeys(registered),separator or ",")) end function languages.associate(tag,script,language) -- not yet used diff --git a/tex/context/base/lang-url.lua b/tex/context/base/lang-url.lua index 2453739db..ecde7f3ae 100644 --- a/tex/context/base/lang-url.lua +++ b/tex/context/base/lang-url.lua @@ -11,7 +11,7 @@ local utf = unicode.utf8 local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local utfbyte, utfgsub = utf.byte, utf.gsub -local ctxcatcodes, texsprint = tex.ctxcatcodes, tex.sprint +context = context commands = commands or { } local commands = commands @@ -76,15 +76,15 @@ function hyphenatedurl.action(str, left, right, disc) for s in utfcharacters(str) do n = n + 1 if s == d then - texsprint(ctxcatcodes,"\\d{",utfbyte(s),"}") + context.d(utfbyte(s)) else local c = chars[s] if not c or n<=b or n>=e then - texsprint(ctxcatcodes,"\\n{",utfbyte(s),"}") + context.n(utfbyte(s)) elseif c == 1 then - texsprint(ctxcatcodes,"\\b{",utfbyte(s),"}") + context.b(utfbyte(s)) elseif c == 2 then - texsprint(ctxcatcodes,"\\a{",utfbyte(s),"}") + context.a(utfbyte(s)) end end end diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua index afb48ba53..9e49e0098 100644 --- a/tex/context/base/lpdf-fld.lua +++ b/tex/context/base/lpdf-fld.lua @@ -12,7 +12,6 @@ if not modules then modules = { } end modules ['lpdf-fld'] = { local gmatch, lower, format = string.gmatch, string.lower, string.format local lpegmatch = lpeg.match -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local bpfactor, todimen = number.dimenfactors.bp, string.todimen local trace_fields = false trackers.register("widgets.fields", function(v) trace_fields = v end) @@ -22,6 +21,7 @@ local report_fields = logs.new("fields") local backends, lpdf = backends, lpdf local variables = interfaces.variables +local context = context local references = structures.references local settings_to_array = utilities.parsers.settings_to_array @@ -422,7 +422,7 @@ function codeinjections.getdefaultfieldvalue(name) end end if default then - tex.sprint(ctxcatcodes,default) + context(default) end end end @@ -529,7 +529,7 @@ function codeinjections.getfieldgroup(name) end end if g then - texsprint(ctxcatcodes,g) + context(g) end end end diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua index 882fdfab5..a39040d7f 100644 --- a/tex/context/base/lpdf-ini.lua +++ b/tex/context/base/lpdf-ini.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['lpdf-ini'] = { local setmetatable, getmetatable, type, next, tostring, tonumber, rawset = setmetatable, getmetatable, type, next, tostring, tonumber, rawset local char, byte, format, gsub, concat, match, sub, gmatch = string.char, string.byte, string.format, string.gsub, table.concat, string.match, string.sub, string.gmatch local utfvalues = string.utfvalues -local texwrite, texset, texsprint, ctxcatcodes = tex.write, tex.set, tex.sprint, tex.ctxcatcodes +local texset = tex.set local sind, cosd = math.sind, math.cosd local lpegmatch = lpeg.match @@ -28,7 +28,7 @@ local trace_detail = false trackers.register("backend.detail", function local report_backends = logs.new("backends") -local backends = backends +local backends, context = backends, context backends.pdf = backends.pdf or { comment = "backend for directly generating pdf output", @@ -631,7 +631,7 @@ local collected = pdfdictionary { } ; collected = collected() function lpdf.collectedresources() - tex.sprint(tex.ctxcatcodes,collected) + context(collected) end function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end @@ -657,7 +657,7 @@ registerpagefinalizer(checkshades,3,"shades") function lpdf.rotationcm(a) local s, c = sind(a), cosd(a) - texwrite(format("%s %s %s %s 0 0 cm",c,s,-s,c)) + context("%s %s %s %s 0 0 cm",c,s,-s,c) end -- ! -> universaltime diff --git a/tex/context/base/lpdf-mis.lua b/tex/context/base/lpdf-mis.lua index 6bf277d4b..39d7fbae8 100644 --- a/tex/context/base/lpdf-mis.lua +++ b/tex/context/base/lpdf-mis.lua @@ -17,8 +17,7 @@ if not modules then modules = { } end modules ['lpdf-mis'] = { local next, tostring = next, tostring local format = string.format -local texsprint, texset = tex.sprint, tex.set -local ctxcatcodes = tex.ctxcatcodes +local texset = tex.set local backends, lpdf, nodes = backends, lpdf, nodes diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua index 33513c0d1..6cc00fc3e 100644 --- a/tex/context/base/lpdf-ren.lua +++ b/tex/context/base/lpdf-ren.lua @@ -10,7 +10,6 @@ if not modules then modules = { } end modules ['lpdf-ren'] = { local tostring, tonumber, next = tostring, tonumber, next local format = string.format -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local settings_to_array = utilities.parsers.settings_to_array local backends, lpdf = backends, lpdf diff --git a/tex/context/base/lpdf-swf.lua b/tex/context/base/lpdf-swf.lua index c3e340db0..a55ad9d1b 100644 --- a/tex/context/base/lpdf-swf.lua +++ b/tex/context/base/lpdf-swf.lua @@ -124,6 +124,5 @@ function backends.pdf.nodeinjections.insertswf(spec) -- controls = spec.controls, -- label = spec.label, } - -- texsprint(ctxcatcodes,format("\\pdfannot width %ssp height %ssp {%s}",spec.width,spec.height,annotation())) -- brrrr node.write(pdfannotation(spec.width,spec.height,0,annotation())) end diff --git a/tex/context/base/lpdf-wid.lua b/tex/context/base/lpdf-wid.lua index 3a2d1338e..1dd0a60d5 100644 --- a/tex/context/base/lpdf-wid.lua +++ b/tex/context/base/lpdf-wid.lua @@ -6,8 +6,8 @@ if not modules then modules = { } end modules ['lpdf-wid'] = { license = "see context related readme files" } -local format, gmatch, gsub, find = string.format, string.gmatch, string.gsub, string.find -local texsprint, ctxcatcodes, texbox, texcount = tex.sprint, tex.ctxcatcodes, tex.box, tex.count +local gmatch, gsub, find = string.gmatch, string.gsub, string.find +local texbox, texcount = tex.box, tex.count local settings_to_array = utilities.parsers.settings_to_array local settings_to_hash = utilities.parsers.settings_to_hash @@ -57,7 +57,7 @@ end function codeinjections.presetsymbol(symbol) if not presets[symbol] then - texsprint(ctxcatcodes,format("\\predefinesymbol[%s]",symbol)) + context.predefinesymbol { symbol } end end diff --git a/tex/context/base/m-timing.tex b/tex/context/base/m-timing.tex index e5c315c74..8ecdd2d69 100644 --- a/tex/context/base/m-timing.tex +++ b/tex/context/base/m-timing.tex @@ -40,10 +40,10 @@ local progress = moduledata.progress function progress.show(filename,parameters,nodes,other) for n, name in pairs(parameters or progress.parameters(filename)) do - tex.sprint(tex.ctxcatcodes,string.format("\\ShowNamedUsage{%s}{%s}{%s}",filename or progress.defaultfilename,name,other or "")) + context.ShowNamedUsage(filename or progress.defaultfilename,name,other or "") end for n, name in pairs(nodes or progress.nodes(filename)) do - tex.sprint(tex.ctxcatcodes,string.format("\\ShowNamedUsage{%s}{%s}{%s}",filename or progress.defaultfilename,name,other or "")) + context.ShowNamedUsage(filename or progress.defaultfilename,name,other or "") end end \stopluacode diff --git a/tex/context/base/math-ali.mkiv b/tex/context/base/math-ali.mkiv index 872cc3b82..a97326413 100644 --- a/tex/context/base/math-ali.mkiv +++ b/tex/context/base/math-ali.mkiv @@ -193,8 +193,8 @@ \def\rightofeqalign{\getvalue{\??eq:\v!right:\number\eqaligncolumn}} \def\doseteqaligncolumn#1% - {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\empty - \letvalue{\??eq:\v!right:\number\eqaligncolumn}\empty + {\letvalueempty{\??eq:\v!left :\number\eqaligncolumn}% + \letvalueempty{\??eq:\v!right:\number\eqaligncolumn}% \doif{#1}\v!left {\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill}% \doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}% \doif{#1}\v!middle{\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua index 4b4126559..0c77469a8 100644 --- a/tex/context/base/meta-pdf.lua +++ b/tex/context/base/meta-pdf.lua @@ -13,11 +13,10 @@ if not modules then modules = { } end modules ['meta-pdf'] = { local concat, format, gsub, find, byte, gmatch, match = table.concat, string.format, string.gsub, string.find, string.byte, string.gmatch, string.match local lpegmatch = lpeg.match local round = math.round -local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local report_mptopdf = logs.new("mptopdf") -local mplib, metapost, lpdf = mplib, metapost, lpdf +local mplib, metapost, lpdf, context = mplib, metapost, lpdf, context local pdfrgbcode = lpdf.rgbcode local pdfcmykcode = lpdf.cmykcode @@ -25,6 +24,7 @@ local pdfgraycode = lpdf.graycode local pdfspotcode = lpdf.spotcode local pdftransparencycode = lpdf.transparencycode local pdffinishtransparencycode = lpdf.finishtransparencycode +local pdfliteral = node.pdfliteral metapost.mptopdf = metapost.mptopdf or { } local mptopdf = metapost.mptopdf @@ -54,11 +54,7 @@ resetall() -- in no hurry as this kind of conversion does not happen that often in mkiv local function pdfcode(str) -- could be a node.write instead - texsprint(ctxcatcodes,"\\pdfliteral{",str,"}") -end - -local function texcode(str) - texsprint(ctxcatcodes,str) + context(pdfliteral(str)) end local function mpscode(str) @@ -133,7 +129,7 @@ function mps.newpath() end function mps.boundingbox(llx, lly, urx, ury) - texcode("\\MPSboundingbox{" .. llx .. "}{" .. lly .. "}{" .. urx .. "}{" .. ury .. "}") + context.MPSboundingbox(llx,lly,urx,ury) end function mps.moveto(x,y) @@ -227,7 +223,7 @@ function mps.textext(font, scale, str) -- old parser dx, dy = m_stack_path[1][1], m_stack_path[1][2] end flushconcat() - texcode("\\MPStextext{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}") + context.MPStextext(font,scale,str,dx,dy) resetpath() end diff --git a/tex/context/base/meta-pdh.mkiv b/tex/context/base/meta-pdh.mkiv index ec9bab9d8..e953d6c25 100644 --- a/tex/context/base/meta-pdh.mkiv +++ b/tex/context/base/meta-pdh.mkiv @@ -555,7 +555,7 @@ % {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}} % % \def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig -% {\global\letvalue{\@@MPSK#8}\empty +% {\letgvalueempty{\@@MPSK#8}% % \vbox to \zeropoint % {\vss % \hbox to \zeropoint @@ -595,7 +595,7 @@ % {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}} % % \def\handleMPhyperlink#1#2#3#4#5#6% -% {\global\letvalue{\@@MPSK#6}\empty +% {\letgvalueempty{\@@MPSK#6}% % \setbox\scratchbox\hbox % {\setbox\scratchbox\null % \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua index 44d2367a1..47c93513a 100644 --- a/tex/context/base/mlib-pdf.lua +++ b/tex/context/base/mlib-pdf.lua @@ -7,16 +7,14 @@ if not modules then modules = { } end modules ['mlib-pdf'] = { } local format, concat, gsub = string.format, table.concat, string.gsub -local texsprint = tex.sprint local abs, sqrt, round = math.abs, math.sqrt, math.round local allocate = utilities.storage.allocate local report_mplib = logs.new("mplib") -local mplib = mplib +local mplib, context = mplib, context -local ctxcatcodes = tex.ctxcatcodes local copy_node = node.copy local write_node = node.write @@ -92,10 +90,10 @@ function metapost.flushers.pdf.comment(message) if savedliterals then local last = #savedliterals + 1 savedliterals[last] = message - texsprint(ctxcatcodes,"\\MPLIBtoPDF{",last,"}") + context.MPLIBtoPDF(last) else savedliterals = { message } - texsprint(ctxcatcodes,"\\MPLIBtoPDF{1}") + context.MPLIBtoPDF(1) end end end @@ -103,14 +101,14 @@ end function metapost.flushers.pdf.startfigure(n,llx,lly,urx,ury,message) savedliterals = nil metapost.n = metapost.n + 1 - texsprint(ctxcatcodes,format("\\startMPLIBtoPDF{%s}{%s}{%s}{%s}",llx,lly,urx,ury)) + context.startMPLIBtoPDF(llx,lly,urx,ury) if message then metapost.flushers.pdf.comment(message) end end function metapost.flushers.pdf.stopfigure(message) if message then metapost.flushers.pdf.comment(message) end - texsprint(ctxcatcodes,"\\stopMPLIBtoPDF") - texsprint(ctxcatcodes,"\\ctxlua{metapost.flushreset()}") -- maybe just at the beginning + context.stopMPLIBtoPDF() + context.MPLIBflushreset() -- maybe just at the beginning end function metapost.flushers.pdf.flushfigure(pdfliterals) -- table @@ -119,17 +117,17 @@ function metapost.flushers.pdf.flushfigure(pdfliterals) -- table if savedliterals then local last = #savedliterals + 1 savedliterals[last] = pdfliterals - texsprint(ctxcatcodes,"\\MPLIBtoPDF{",last,"}") + context.MPLIBtoPDF(last) else savedliterals = { pdfliterals } - texsprint(ctxcatcodes,"\\MPLIBtoPDF{1}") + context.MPLIBtoPDF(1) end end end function metapost.flushers.pdf.textfigure(font,size,text,width,height,depth) -- we could save the factor text = gsub(text,".","\\hbox{%1}") -- kerning happens in metapost (i have to check if this is true for mplib) - texsprint(ctxcatcodes,format("\\MPLIBtextext{%s}{%s}{%s}{%s}{%s}",font,size,text,0,-number.dimenfactors.bp*depth)) + context.MPLIBtextext(font,size,text,0,-number.dimenfactors.bp*depth) end local bend_tolerance = 131/65536 @@ -474,7 +472,7 @@ local t = { } local flusher = { startfigure = function() t = { } - texsprint(ctxcatcodes,"\\startnointerference") + context.startnointerference() end, flushfigure = function(literals) for i=1, #literals do @@ -482,7 +480,7 @@ local flusher = { end end, stopfigure = function() - texsprint(ctxcatcodes,"\\stopnointerference") + context.stopnointerference() end } diff --git a/tex/context/base/mlib-pdf.mkiv b/tex/context/base/mlib-pdf.mkiv index 096c47cc6..8506b3b15 100644 --- a/tex/context/base/mlib-pdf.mkiv +++ b/tex/context/base/mlib-pdf.mkiv @@ -90,4 +90,7 @@ \box\scratchbox \endgroup} +\def\MPLIBflushreset + {\ctxlua{metapost.flushreset()}} + \protect \endinput diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua index 9e8ad4ba0..e0592ca02 100644 --- a/tex/context/base/mlib-pps.lua +++ b/tex/context/base/mlib-pps.lua @@ -12,18 +12,16 @@ if not modules then modules = { } end modules ['mlib-pps'] = { -- prescript, pos -- todo: report max textexts local format, gmatch, concat, round, match = string.format, string.gmatch, table.concat, math.round, string.match -local sprint = tex.sprint local tonumber, type = tonumber, type local lpegmatch = lpeg.match local texbox = tex.box -local copy_list = node.copy_list -local free_list = node.flush_list +local copy_list, free_list = node.copy_list, node.flush_list local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming -local ctxcatcodes = tex.ctxcatcodes +local context = context local trace_textexts = false trackers.register("metapost.textexts", function(v) trace_textexts = v end) @@ -242,7 +240,7 @@ function specials.fg(specification,object,result,flusher) -- graphics if sy == 0 then sy = 0.00001 end local before = specification and function() flusher.flushfigure(result) - sprint(ctxcatcodes,format("\\MPLIBfigure{%f}{%f}{%f}{%f}{%f}{%f}{%s}",sx,rx,ry,sy,tx,ty,specification)) + context.MPLIBfigure(sx,rx,ry,sy,tx,ty,specification) object.path = nil return object, { } end @@ -257,8 +255,7 @@ function specials.ps(specification,object,result) -- positions local label = specification x = x - metapost.llx y = metapost.ury - y - -- report_mplib( "todo: position '%s' at (%s,%s) with (%s,%s)",label,x,y,w,h) - sprint(ctxcatcodes,format("\\dosavepositionwhd{%s}{0}{%sbp}{%sbp}{%sbp}{%sbp}{0pt}",label,x,y,w,h)) + context.MPLIBpositionwhd(label,x,y,w,h) return { }, nil, nil, nil end @@ -427,7 +424,7 @@ function specials.tf(specification,object) if trace_textexts then report_mplib("setting textext %s (first pass)",n) end - sprint(ctxcatcodes,format("\\MPLIBsettext{%s}{%s}",n,str)) + context.MPLIBsettext(n,str) metapost.multipass = true end return { }, nil, nil, nil @@ -437,8 +434,8 @@ local factor = 65536*(7227/7200) function metapost.edefsxsy(wd,ht,dp) -- helper for figure local hd = ht + dp - commands.edef("sx",(wd ~= 0 and factor/wd) or 0) - commands.edef("sy",(hd ~= 0 and factor/hd) or 0) + context.setvalue("sx",wd ~= 0 and factor/wd or 0) + context.setvalue("sy",hd ~= 0 and factor/hd or 0) end local function sxsy(wd,ht,dp) -- helper for text @@ -468,7 +465,7 @@ function specials.ts(specification,object,result,flusher) flusher.flushfigure(result) local box = textexts[n] if box then - sprint(ctxcatcodes,format("\\MPLIBgettextscaled{%s}{%s}{%s}",n,sxsy(box.width,box.height,box.depth))) + context.MPLIBgettextscaled(n,sxsy(box.width,box.height,box.depth)) else -- error end @@ -738,7 +735,7 @@ function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,asked if not flushed or not metapost.optimize then -- tricky, we can only ask once for objects and therefore -- we really need a second run when not optimized - sprint(ctxcatcodes,format("\\ctxlua{metapost.graphic_extra_pass(%s)}",askedfig or "false")) + context.MPLIBextrapass(askedfig or "false") end else metapost.process(mpsformat, { @@ -764,7 +761,7 @@ function metapost.graphic_extra_pass(askedfig) current_graphic, nofig or do_end_fig }, false, nil, false, true, askedfig ) - sprint(ctxcatcodes,format("\\ctxlua{metapost.resettextexts()}")) -- must happen afterwards + context.MPLIBresettexts() -- must happen afterwards end local start = [[\starttext]] diff --git a/tex/context/base/mlib-pps.mkiv b/tex/context/base/mlib-pps.mkiv index 2eb0ccad4..d131e9117 100644 --- a/tex/context/base/mlib-pps.mkiv +++ b/tex/context/base/mlib-pps.mkiv @@ -50,4 +50,13 @@ \def\MPLIBgraphictext#1% {\startTEXpage[\c!scale=10000]#1\stopTEXpage} +\def\MPLIBpositionwhd#1#2#3#4#5% + {\dosavepositionwhd{#1}{0}{#2sp}{#3sp}{#4sp}{#5sp}{0sp}} + +\def\MPLIBextrapass#1% + {\ctxlua{metapost.graphic_extra_pass(#1)}} + +\def\MPLIBresettexts + {\ctxlua{metapost.resettextexts()}} + \protect \endinput diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua index a9fbab0bc..2ff0568c1 100644 --- a/tex/context/base/mult-cld.lua +++ b/tex/context/base/mult-cld.lua @@ -68,7 +68,7 @@ local function _flush_(n) end function context.restart() - _stack_, _n_ = { }, 0 + _stack_, _n_ = { }, 0 end context._stack_ = _stack_ @@ -111,43 +111,10 @@ function tex.fprint(...) -- goodie texsprint(currentcatcodes,format(...)) end -local trace_context = logs.new("context") -- here - -function context.trace(intercept) - local normalflush = flush - flush = function(...) - trace_context(concat({...},"",2)) - if not intercept then - normalflush(...) - end - end - context.trace = function() end -end - -function context.getflush() - return flush -end - -function context.setflush(newflush) - local oldflush = flush - flush = newflush or flush - return oldflush -end - -trackers.register("context.flush", function(v) if v then context.trace() end end) -trackers.register("context.intercept", function(v) if v then context.trace(true) end end) -- will become obsolete - ---~ context.trace() - --- beware, we had command as part of the flush and made it "" afterwards so that we could --- keep it there (...,command,...) but that really confuses the tex machinery - local function writer(command,first,...) - if not command then - -- error - elseif first == nil then - flush(currentcatcodes,command) - else +--~ if first == nil then -- we can move the first test to the caller (twice: direct and boolean) +--~ flush(currentcatcodes,command) +--~ else local t = { first, ... } flush(currentcatcodes,command) -- todo: ctx|prt|texcatcodes local direct = false @@ -227,16 +194,18 @@ local function writer(command,first,...) if direct then trace_context("error: direct flushing used in '%s' without following argument",command) end - end +--~ end end ---~ experiments.register("context.writer",function() ---~ writer = newwriter ---~ end) - local function indexer(t,k) - local c = "\\" .. k -- .. " " - local f = function(...) return writer(c,...) end + local c = "\\" .. k + local f = function(first,...) + if first == nil then + flush(currentcatcodes,c) + else + return writer(c,first,...) + end + end t[k] = f return f end @@ -265,9 +234,8 @@ local function caller(t,f,a,...) -- ignored: a ... if f then flush(currentcatcodes,"^^M") - else + elseif a ~= nil then writer("",a,...) - -- trace_context("warning: 'context' gets argument 'false' which is currently unsupported") end elseif typ == "thread" then trace_context("coroutines not supported as we cannot yield across boundaries") @@ -281,9 +249,71 @@ end setmetatable(context, { __index = indexer, __call = caller } ) --- the only non macro: +-- logging + +local trace_context = logs.new("context") -- here +local trace_stack = { } + +local normalflush = flush +local normalwriter = writer +local currenttrace = nil +local nofwriters = 0 +local nofflushes = 0 + +statistics.register("traced context", function() + if nofwriters > 0 or nofflushes > 0 then + return format("writers: %s, flushes: %s, maxstack: %s",nofwriters,nofflushes,_n_) + end +end) + +local tracedwriter = function(...) + nofwriters = nofwriters + 1 + local t, f = { "w : " }, flush + flush = function(...) + t[#t+1] = concat({...},"",2) + normalflush(...) + end + normalwriter(...) + flush = f + currenttrace(concat(t)) +end + +local tracedflush = function(...) + nofflushes = nofflushes + 1 + normalflush(...) + local t = { ... } + t[1] = "f : " -- replaces the catcode + currenttrace(concat(t)) +end + +local function pushlogger(trace) + insert(trace_stack,currenttrace) + currenttrace = trace + flush, writer = tracedflush, tracedwriter +end + +local function poplogger() + currenttrace = remove(trace_stack) + if not currenttrace then + flush, writer = normalflush, normalwriter + end +end + +local function settracing(v) + if v then + pushlogger(trace_context) + else + poplogger() + end +end + +trackers.register("context.trace",settracing) -local trace_cld = false +context.pushlogger = pushlogger +context.poplogger = poplogger +context.settracing = settracing + +local trace_cld = false trackers.register("context.files", function(v) trace_cld = v end) function context.runfile(filename) local foundname = resolvers.findtexfile(file.addsuffix(filename,"cld")) or "" @@ -307,31 +337,15 @@ function context.runfile(filename) end end --- tracking is using the regular mechanism; we need to define --- these 'macro' functions explictly as otherwise they are are --- delayed (as all commands print back to tex, so that tracing --- would be enabled afterwards) +-- some functions -trackers.register("cld.print", function(v) - trace_cld = v - if v then - flush = function(c,...) - texiowrite(...) - texsprint(c,...) - end - else - flush = texsprint +function context.direct(first,...) + if first ~= nil then + return writer("",first,...) end -end) - -function context.enabletrackers (str) trackers.enable (str) end -function context.disabletrackers(str) trackers.disable(str) end - -function context.direct(...) - return writer("",...) end -function context.char(k) +function context.char(k) -- todo: if catcode == letter or other then just the utf if type(k) == "table" then for i=1,#k do context(format([[\char%s\relax]],k[i])) @@ -341,88 +355,29 @@ function context.char(k) end end +function context.chardef(cs,u) + context(format([[\chardef\%s=%s\relax]],k)) +end + function context.par() context([[\par]]) -- no need to add {} there end --- see demo-cld.cld for an example - --- context.starttext(true) --- context.chapter({ "label" }, "title", true) --- context.chapter(function() return { "label" } end, "title", true) --- --- context.startchapter({ title = "test" }, { more = "oeps" }, true) --- --- context.bTABLE(true) --- for i=1,10 do --- context.bTR() --- for i=1,10 do --- context.bTD() --- context("%#2i",math.random(99)) --- context.eTD() --- end --- context.eTR(true) --- end --- context.eTABLE(true) --- --- context.stopchapter(true) --- --- context.stoptext(true) +function context.bgroup() + context("{") +end ---~ Not that useful yet. Maybe something like this when the main loop ---~ is a coroutine. It also does not help taking care of nested calls. ---~ Even worse, it interferes with other mechanisms using context calls. ---~ ---~ local create, yield, resume = coroutine.create, coroutine.yield, coroutine.resume ---~ local getflush, setflush = context.getflush, context.setflush ---~ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes ---~ ---~ function context.direct(f) ---~ local routine = create(f) ---~ local oldflush = getflush() ---~ function newflush(...) ---~ oldflush(...) ---~ yield(true) ---~ end ---~ setflush(newflush) ---~ ---~ -- local function resumecontext() ---~ -- local done = resume(routine) ---~ -- if not done then ---~ -- return ---~ -- end ---~ -- resumecontext() -- stack overflow ... no tail recursion ---~ -- end ---~ -- context.resume = resumecontext ---~ -- texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") ---~ ---~ local function resumecontext() ---~ local done = resume(routine) ---~ if not done then ---~ return ---~ end ---~ -- texsprint(ctxcatcodes,"\\exitloop") ---~ texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") -- can be simple macro call ---~ end ---~ context.resume = resumecontext ---~ -- texsprint(ctxcatcodes,"\\doloop{\\ctxlua{context.resume()}}") -- can be fast loop at the tex end ---~ texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") ---~ ---~ end ---~ ---~ function something() ---~ context("\\setbox0") ---~ context("\\hbox{hans hagen xx}") ---~ context("\\the\\wd0/\\box0") ---~ end ---~ ---~ context.direct(something) +function context.egroup() + context("}") +end --- this might be generalized: register some primitives as: accepting this or that --- we can also speed this up +function context.verbatim(...) + flush(vrbcatcodes,...) +end +-- context.delayed -local delayed = { } context.delayed = delayed -- maybe also global +local delayed = { } context.delayed = delayed -- maybe also store them local function indexer(t,k) local f = function(...) @@ -435,7 +390,6 @@ local function indexer(t,k) return f end - local function caller(t,...) local a = { ... } return function() @@ -445,10 +399,37 @@ end setmetatable(delayed, { __index = indexer, __call = caller } ) ---~ context.test("test 1",context.delayed(" test 2a "),"test 3") ---~ context.test("test 1",context.delayed.test(" test 2b "),"test 3") +-- context.nested --- experimental: +local nested = { } context.nested = nested + +local function indexer(t,k) + local f = function(...) + local t, savedflush = { }, flush + flush = function(c,f,s,...) -- catcodes are ignored + t[#t+1] = s and concat{f,s,...} or f -- optimized for #args == 1 + end + context[k](...) + flush = savedflush + return concat(t) + end + t[k] = f + return f +end + +local function caller(t,...) + local t, savedflush = { }, flush + flush = function(c,f,s,...) -- catcodes are ignored + t[#t+1] = s and concat{f,s,...} or f -- optimized for #args == 1 + end + context(...) + flush = savedflush + return concat(t) +end + +setmetatable(nested, { __index = indexer, __call = caller } ) + +-- metafun local metafun = { } context.metafun = metafun @@ -502,6 +483,7 @@ function metafun.color(name) return format([[\MPcolor{%s}]],name) end +-- metafun.delayed local delayed = { } metafun.delayed = delayed @@ -525,3 +507,62 @@ local function caller(t,...) end setmetatable(delayed, { __index = indexer, __call = caller } ) + +--~ Not that useful yet. Maybe something like this when the main loop +--~ is a coroutine. It also does not help taking care of nested calls. +--~ Even worse, it interferes with other mechanisms using context calls. +--~ +--~ local create, yield, resume = coroutine.create, coroutine.yield, coroutine.resume +--~ local getflush, setflush = context.getflush, context.setflush +--~ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes +--~ +--~ function context.getflush() +--~ return flush +--~ end +--~ +--~ function context.setflush(newflush) +--~ local oldflush = flush +--~ flush = newflush or flush +--~ return oldflush +--~ end +--~ +--~ function context.direct(f) +--~ local routine = create(f) +--~ local oldflush = getflush() +--~ function newflush(...) +--~ oldflush(...) +--~ yield(true) +--~ end +--~ setflush(newflush) +--~ +--~ -- local function resumecontext() +--~ -- local done = resume(routine) +--~ -- if not done then +--~ -- return +--~ -- end +--~ -- resumecontext() -- stack overflow ... no tail recursion +--~ -- end +--~ -- context.resume = resumecontext +--~ -- texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") +--~ +--~ local function resumecontext() +--~ local done = resume(routine) +--~ if not done then +--~ return +--~ end +--~ -- texsprint(ctxcatcodes,"\\exitloop") +--~ texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") -- can be simple macro call +--~ end +--~ context.resume = resumecontext +--~ -- texsprint(ctxcatcodes,"\\doloop{\\ctxlua{context.resume()}}") -- can be fast loop at the tex end +--~ texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") +--~ +--~ end +--~ +--~ function something() +--~ context("\\setbox0") +--~ context("\\hbox{hans hagen xx}") +--~ context("\\the\\wd0/\\box0") +--~ end +--~ +--~ context.direct(something) diff --git a/tex/context/base/mult-cld.mkiv b/tex/context/base/mult-cld.mkiv index 6b94f3f21..7fcb96553 100644 --- a/tex/context/base/mult-cld.mkiv +++ b/tex/context/base/mult-cld.mkiv @@ -11,8 +11,6 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D This is just an idea, maybe a bad one. - \writestatus{loading}{ConTeXt Multilingual Macros / Lua} \registerctxluafile{mult-cld}{1.001} diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua index 943af3837..af2ba0421 100644 --- a/tex/context/base/node-fin.lua +++ b/tex/context/base/node-fin.lua @@ -9,8 +9,6 @@ if not modules then modules = { } end modules ['node-fin'] = { -- this module is being reconstructed local next, type, format = next, type, string.format -local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes local attributes, nodes, node = attributes, nodes, node @@ -63,7 +61,7 @@ end -- function states.flush() -- if #collected > 0 then -- for i=1,#collected do --- texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway +-- context(collected[i]) -- we're in context mode anyway -- end -- collected = { } -- states.collected = collected diff --git a/tex/context/base/node-ser.lua b/tex/context/base/node-ser.lua index c7bc53a3a..fd211b2c8 100644 --- a/tex/context/base/node-ser.lua +++ b/tex/context/base/node-ser.lua @@ -13,8 +13,6 @@ local type, format, concat, rep = type, string.format, table.concat, string.rep local allocate = utilities.storage.allocate -local ctxcatcodes = tex.ctxcatcodes - local nodes, node = nodes, node local traverse = node.traverse @@ -233,26 +231,36 @@ function nodes.serializebox(n,flat,verbose,name) return nodes.serialize(nodes.totable(tex.box[n],flat,verbose),name) end -function nodes.visualizebox(...) - tex.print(ctxcatcodes,"\\starttyping") - tex.print(nodes.serializebox(...)) - tex.print("\\stoptyping") +-- keep: +-- +-- function nodes.visualizebox(...) +-- tex.print(ctxcatcodes,"\\starttyping") +-- tex.print(nodes.serializebox(...)) +-- tex.print("\\stoptyping") +-- end + +function nodes.visualizebox(...) -- to be checked .. will move to module anyway + context.starttyping() + context.pushcatcodes("verbatim") + context(nodes.serializebox(...)) + context.stoptyping() + context.popcatcodes() end -function nodes.list(head,n) -- name might change to nodes.type +function nodes.list(head,n) -- name might change to nodes.type -- to be checked .. will move to module anyway if not n then - tex.print(ctxcatcodes,"\\starttyping") + context.starttyping(true) end while head do local id = head.id - tex.print(rep(" ",n or 0) .. tostring(head) .. "\n") + tex.write(rep(" ",n or 0) .. tostring(head) .. "\n") if id == hlist_code or id == vlist_code then nodes.list(head.list,(n or 0)+1) end head = head.next end if not n then - tex.print("\\stoptyping") + context.stoptyping(true) end end diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua index a5056d88d..8094f3736 100644 --- a/tex/context/base/node-tra.lua +++ b/tex/context/base/node-tra.lua @@ -17,14 +17,12 @@ local format, match, gmatch, concat, rep = string.format, string.match, string.g local lpegmatch = lpeg.match local write_nl = texio.write_nl -local ctxcatcodes = tex.ctxcatcodes - local report_nodes = logs.new("nodes") fonts = fonts or { } nodes = nodes or { } -local fonts, nodes, node = fonts, nodes, node +local fonts, nodes, node, context = fonts, nodes, node, context fonts.tfm = fonts.tfm or { } fonts.ids = fonts.ids or { } @@ -55,7 +53,6 @@ local first_character = node.first_character local node_type = node.type local traverse_nodes = node.traverse -local texsprint = tex.sprint local fontdata = fonts.ids local fontchar = fonts.chr @@ -260,9 +257,9 @@ function step_tracers.features() end end if #t > 0 then - texsprint(ctxcatcodes,concat(t,", ")) + context(concat(t,", ")) else - texsprint(ctxcatcodes,"no features") + context("no features") end return end @@ -273,7 +270,7 @@ end function tracers.fontchar(font,char) local n = new_glyph() n.font, n.char, n.subtype = font, char, 256 - node.write(n) + context(n) end function step_tracers.codes(i,command) @@ -282,14 +279,17 @@ function step_tracers.codes(i,command) local id = c.id if id == glyph_code then if command then - texsprint(ctxcatcodes,format("%s{%s}{%s}",command,c.font,c.char)) + local f, c = c.font,c.char + local d = fontdata[f].descriptions + local d = d and d[c] + context[command](f,c,d and d.class or "") else - texsprint(ctxcatcodes,format("[%s:U+%04X]",c.font,c.char)) + context("[%s:U+%04X]",c.font,c.char) end elseif id == whatsit_code and (c.subtype == localpar_code or c.subtype == dir_code) then - texsprint(ctxcatcodes,format("[%s]",c.dir)) + context("[%s]",c.dir) else - texsprint(ctxcatcodes,format("[%s]",node_type(id))) + context("[%s]",node_type(id)) end c = c.next end @@ -300,11 +300,13 @@ function step_tracers.messages(i,command,split) if list then for i=1,#list do local l = list[i] - if split then + if not command then + context("(%s)",l) + elseif split then local a, b = match(l,"^(.-)%s*:%s*(.*)$") - texsprint(ctxcatcodes,format("%s{%s}{%s}",command,a or l,b or "")) + context[command](a or l or "",b or "") else - texsprint(ctxcatcodes,format("%s{%s}",command,l)) + context[command](l) end end end diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv index 7ef6baea4..8b35a98a7 100644 --- a/tex/context/base/pack-lyr.mkiv +++ b/tex/context/base/pack-lyr.mkiv @@ -426,9 +426,9 @@ % \unexpanded\def\flushlayer[#1]% % {\doifelsevalue{\??ll#1\c!state}\v!next -% {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up +% {\letgvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up % {\doifelsevalue{\??ll#1\c!state}\v!continue -% {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up +% {\letgvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up % {\doifelsevalue{\??ll#1\c!doublesided}\v!yes % {\doifundefinedelse{\@@layerbox#1}% % {\dodoflushlayerA[#1]} diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index 23c6073fb..cc3a34b11 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -2730,7 +2730,7 @@ \v!none=>\letvalue{\??kd#1\c!left }\relax % new \letvalue{\??kd#1\c!right}\relax % new \settrue\framedtextlocationnone]% - \letvalue{\??kd#1\c!location}\empty + \letvalueempty{\??kd#1\c!location}% % removed 06/2001 % \forgetparindent % added 06/2001 [see demo-bbv] diff --git a/tex/context/base/page-flt.lua b/tex/context/base/page-flt.lua index 282ca0cc5..e3357a97e 100644 --- a/tex/context/base/page-flt.lua +++ b/tex/context/base/page-flt.lua @@ -11,7 +11,6 @@ if not modules then modules = { } end modules ['page-flt'] = { local insert, remove = table.insert, table.remove local find = string.find local setdimen, setbox, setcount, texbox = tex.setdimen, tex.setbox, tex.setcount, tex.box -local texwrite, texsprint, ctxcatcodes = tex.write, tex.sprint, tex.ctxcatcodes local copy_node_list = node.copy_list @@ -48,7 +47,7 @@ function floats.stacked(which) -- floats.thenofstacked end function floats.thestacked(which) - return texwrite(#stacks[which or default]) + return context(#stacks[which or default]) end function floats.push() @@ -168,7 +167,7 @@ end function floats.thevar(name,default) local value = last and last.data[name] or default if value and value ~= "" then - texsprint(ctxcatcodes,value) + context(value) end end @@ -246,7 +245,7 @@ function floats.thecheckedpagefloat(packed) end end end - texsprint(ctxcatcodes,result) + context(result) end local method = C((1-S(", :"))^1) diff --git a/tex/context/base/page-lin.lua b/tex/context/base/page-lin.lua index 895f0ec80..186989839 100644 --- a/tex/context/base/page-lin.lua +++ b/tex/context/base/page-lin.lua @@ -12,11 +12,9 @@ local trace_numbers = false trackers.register("lines.numbers", function(v) tra local report_lines = logs.new("lines") -local format = string.format -local texsprint, texwrite, texbox = tex.sprint, tex.write, tex.box -local ctxcatcodes = tex.ctxcatcodes +local texbox = tex.box -local attributes, nodes, node = attributes, nodes, node +local attributes, nodes, node, context = attributes, nodes, node, context nodes.lines = nodes.lines or { } local lines = nodes.lines @@ -107,7 +105,7 @@ filters.line = filters.line or { } function filters.line.default(data) -- helpers.title(data.entries.linenumber or "?",data.metadata) - texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",data.entries.conversion or "numbers",data.entries.linenumber or "0")) + context.convertnumber(data.entries.conversion or "numbers",data.entries.linenumber or "0") end function filters.line.page(data,prefixspec,pagespec) -- redundant @@ -115,7 +113,7 @@ function filters.line.page(data,prefixspec,pagespec) -- redundant end function filters.line.linenumber(data) -- raw - texwrite(data.entries.linenumber or "0") + context(data.entries.linenumber or "0") end -- boxed variant, todo: use number mechanism diff --git a/tex/context/base/page-mar.mkiv b/tex/context/base/page-mar.mkiv index 037dc1298..6a1691a00 100644 --- a/tex/context/base/page-mar.mkiv +++ b/tex/context/base/page-mar.mkiv @@ -484,9 +484,9 @@ % % an alternative: % -% \letvalue{\??im\v!laag\c!offset}\empty -% \letvalue{\??im +\c!offset}\empty -% \letvalue{\??im -\c!offset}\empty +% \letvalueempty{\??im\v!laag\c!offset} +% \letvalueempty{\??im +\c!offset} +% \letvalueempty{\??im -\c!offset} % % \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7 % {\doifnumberelse{#4} diff --git a/tex/context/base/page-txt.mkiv b/tex/context/base/page-txt.mkiv index 2ac9cb6b9..69ef8c270 100644 --- a/tex/context/base/page-txt.mkiv +++ b/tex/context/base/page-txt.mkiv @@ -172,8 +172,8 @@ {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}% {\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}% \else\ifsecondargument % new - \letvalue{\??tk#1\v!text\c!lefttext }\empty - \letvalue{\??tk#1\v!text\c!righttext }\empty + \letvalueempty{\??tk#1\v!text\c!lefttext}% + \letvalueempty{\??tk#1\v!text\c!righttext}% \setvalue{\??tk#1\v!text\c!middletext}{\dosingletexts{#1}\v!text\c!style\c!color\c!width{#2}}% \else \dosixtupleempty\dosetuptexts[#1][\v!text ][][][][]% @@ -367,19 +367,19 @@ \def\doresettextcontent[#1][#2][#3]% header text middle {\ifthirdargument - \letvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}\empty + \letvalueempty{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}% \else\ifsecondargument - \letvalue{\??tk#1#2\c!lefttext }\empty - \letvalue{\??tk#1#2\c!middletext}\empty - \letvalue{\??tk#1#2\c!righttext }\empty + \letvalueempty{\??tk#1#2\c!lefttext}% + \letvalueempty{\??tk#1#2\c!middletext}% + \letvalueempty{\??tk#1#2\c!righttext}% \fi\fi} \let\settext \settextcontent % downward compatibility \let\resettext\resettextcontent % downward compatibility -\setvalue{:\c!middle:\c!text:}{\c!middletext} -\setvalue{:\c!left :\c!text:}{\c!lefttext } -\setvalue{:\c!right :\c!text:}{\c!righttext } +\letvalue{:\c!middle:\c!text:}\c!middletext +\letvalue{:\c!left :\c!text:}\c!lefttext +\letvalue{:\c!right :\c!text:}\c!righttext %D The next series of macros is not that easy to read, %D because they hook into the main page building macros. By diff --git a/tex/context/base/pret-lua.lua b/tex/context/base/pret-lua.lua index 723c019d7..6a74670b2 100644 --- a/tex/context/base/pret-lua.lua +++ b/tex/context/base/pret-lua.lua @@ -14,10 +14,10 @@ local utf = unicode.utf8 local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local utfbyte, utffind = utf.byte, utf.find local byte, sub, find, match = string.byte, string.sub, string.find, string.match -local texsprint, texwrite = tex.sprint, tex.write -local ctxcatcodes = tex.ctxcatcodes +local texwrite = tex.write local buffers = buffers +local context = context local changestate, finishstate = buffers.changestate, buffers.finishstate @@ -95,9 +95,9 @@ end visualizer.styles = { core = "", - base = "\\sl ", - five = "\\sl ", - libs = "\\sl ", + base = "sl ", + five = "sl ", + libs = "sl ", } local styles = visualizer.styles @@ -121,8 +121,9 @@ local function flush_lua_word(state, word) local id = known_words[word] if id then state = changestate(2,state) - if styles[id] then - texsprint(ctxcatcodes,styles[id]) + local style = styles[id] + if style and style ~= "" then + context[style]() end texwrite(word) state = finishstate(state) @@ -145,15 +146,19 @@ end -- we will also provide a proper parser based pretty printer although normaly -- a pretty printer should handle faulty code too (educational purposes) +local space = context.obs + local function written(state,c,i) if c == " " then state = finishstate(state) - texsprint(ctxcatcodes,"\\obs") + space() elseif c == "\t" then state = finishstate(state) - texsprint(ctxcatcodes,"\\obs") + space() if buffers.visualizers.enabletab then - texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength)) + for i=1,i%buffers.visualizers.tablength do + space() + end end else texwrite(c) @@ -172,7 +177,11 @@ function visualizer.flush_line(str, nested) if comment then -- flush the comment and then process the code for c in utfcharacters(comment) do - if c == " " then texsprint(ctxcatcodes,"\\obs") else texwrite(c) end + if c == " " then + space() + else + texwrite(c) + end end state = changestate(states['--'], state) texwrite("]]") @@ -180,7 +189,11 @@ function visualizer.flush_line(str, nested) incomment = false else for c in utfcharacters(str) do - if c == " " then texsprint(ctxcatcodes,"\\obs") else texwrite(c) end + if c == " " then + space() + else + texwrite(c) + end end end comment = nil diff --git a/tex/context/base/pret-mp.lua b/tex/context/base/pret-mp.lua index 2e89588be..c701d63c8 100644 --- a/tex/context/base/pret-mp.lua +++ b/tex/context/base/pret-mp.lua @@ -10,8 +10,7 @@ local utf = unicode.utf8 local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local utfbyte, utffind = utf.byte, utf.find -local texsprint, texwrite = tex.sprint, tex.write -local ctxcatcodes = tex.ctxcatcodes +local texwrite = tex.write local buffers = buffers @@ -114,8 +113,8 @@ visualizer.identifiers.metafun = { visualizer.styles = { primitives = "", - plain = "\\sl", - metafun = "\\sl", + plain = "sl", + metafun = "sl", } local styles = visualizer.styles @@ -161,8 +160,9 @@ local function flush_mp_word(state, word, intex) local id = known_words[word] if id then state = changestate(2,state) - if styles[id] then - texsprint(ctxcatcodes,styles[id]) + local style = styles[id] + if style and style ~= "" then + context[style]() end texwrite(word) state = finishstate(state) @@ -184,6 +184,8 @@ end -- to be considered: visualizer => table [result, instr, incomment, word] +local space = context.obs + function visualizer.flush_line(str,nested) local state, word, instr, intex, incomment = 0, nil, false, false, false buffers.currentcolors = colors @@ -191,7 +193,7 @@ function visualizer.flush_line(str,nested) if c == " " then state, intex = flush_mp_word(state, word, intex) word = nil - texsprint(ctxcatcodes,"\\obs") + space() elseif incomment then texwrite(c) elseif c == '%' then diff --git a/tex/context/base/pret-tex.lua b/tex/context/base/pret-tex.lua index 851155122..0baf576c8 100644 --- a/tex/context/base/pret-tex.lua +++ b/tex/context/base/pret-tex.lua @@ -10,11 +10,10 @@ local utf = unicode.utf8 local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local utfbyte, utffind = utf.byte, utf.find -local rep = string.rep -local texsprint, texwrite = tex.sprint, tex.write -local ctxcatcodes, vrbcatcodes = tex.ctxcatcodes, tex.vrbcatcodes +local texwrite = tex.write local buffers = buffers +local context = context local changestate, finishstate = buffers.changestate, buffers.finishstate @@ -38,6 +37,8 @@ local states = { local chardata = characters.data local is_letter = characters.is_letter +local space = context.obs + function visualizer.flush_line(str,nested) local state, first, i = 0, false, 0 buffers.currentcolors = colors @@ -45,13 +46,15 @@ function visualizer.flush_line(str,nested) i = i + 1 if c == " " then state = finishstate(state) - texsprint(ctxcatcodes,"\\obs") + space() first = false elseif c == "\t" then state = finishstate(state) - texsprint(ctxcatcodes,"\\obs") + space() if buffers.visualizers.enabletab then - texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength)) + for i=1,i%buffers.visualizers.tablength do + space() + end i = 0 end first = false diff --git a/tex/context/base/pret-xml.lua b/tex/context/base/pret-xml.lua index e449d9d98..0a79ed78a 100644 --- a/tex/context/base/pret-xml.lua +++ b/tex/context/base/pret-xml.lua @@ -14,11 +14,10 @@ if not modules then modules = { } end modules ['pret-xml'] = { local utf = unicode.utf8 local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local utfbyte, utffind = utf.byte, utf.find -local rep = string.rep -local texsprint, texwrite = tex.sprint, tex.write -local ctxcatcodes = tex.ctxcatcodes +local texwrite = tex.write local buffers = buffers +local context = context local changestate, finishstate = buffers.changestate, buffers.finishstate @@ -42,6 +41,8 @@ function visualizer.reset() state, intag, dotag, inentity, inquote = 0, false, false, false, false end +local space = context.obs + function visualizer.flush_line(str,nested) buffers.currentcolors = colors for c in utfcharacters(str) do @@ -63,13 +64,15 @@ function visualizer.flush_line(str,nested) texwrite(c) elseif c == " " then state = finishstate(state) - texsprint(ctxcatcodes,"\\obs") + space() intag = false elseif c == "\t" then state = finishstate(state) - texsprint(ctxcatcodes,"\\obs") + space() if buffers.visualizers.enabletab then - texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength)) + for i=1,i%buffers.visualizers.tablength do + space() + end end intag = false elseif c == "<" then diff --git a/tex/context/base/prop-ini.mkiv b/tex/context/base/prop-ini.mkiv index 97d72582e..ada358f6d 100644 --- a/tex/context/base/prop-ini.mkiv +++ b/tex/context/base/prop-ini.mkiv @@ -123,7 +123,7 @@ \getparameters[\??py][#1]% \fi} -\letvalue{\??py\s!empty}\empty +\letvalueempty{\??py\s!empty} % beware, normally \*parameter concerns the current one diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua index f69f8866f..561b8d8f4 100644 --- a/tex/context/base/regi-ini.lua +++ b/tex/context/base/regi-ini.lua @@ -8,9 +8,6 @@ if not modules then modules = { } end modules ['regi-ini'] = { local utf = unicode.utf8 local char, utfchar, gsub = string.char, utf.char, string.gsub -local texsprint = tex.sprint - -local ctxcatcodes = tex.ctxcatcodes --[[ldx-- <p>Regimes take care of converting the input characters into @@ -48,7 +45,7 @@ function regimes.setsynonym(synonym,target) end function regimes.truename(regime) - texsprint(ctxcatcodes,(regime and synonyms[synonym] or regime) or regimes.currentregime) + context((regime and synonyms[synonym] or regime) or regimes.currentregime) end function regimes.load(regime) diff --git a/tex/context/base/s-fnt-10.tex b/tex/context/base/s-fnt-10.tex index 216d9d232..8214946c6 100644 --- a/tex/context/base/s-fnt-10.tex +++ b/tex/context/base/s-fnt-10.tex @@ -17,17 +17,18 @@ local format, sprint = string.format, tex.sprint function fonts.otf.show_all() local tfmdata = fonts.ids[font.current()] if tfmdata and tfmdata.shared then + local NC, NR, char = context.NC, context.NR, context.char local otfdata = tfmdata.shared.otfdata if otfdata and otfdata.luatex then local unicodes = otfdata.luatex.unicodes - sprint(tex.ctxcatcodes,format("\\starttabulate[|l|r|c|]")) + context.starttabulate { "|l|r|c|" } for i, name in ipairs(table.sortedkeys(unicodes)) do local unicode = unicodes[name] if unicode >= 0 then - sprint(tex.ctxcatcodes,format("\\NC %s \\NC %s \\NC \\char%s \\NC\\NR",name,unicode,unicode)) + NC() context(name) NC() context(unicode) NC() char(unicode) NC() NR() end end - sprint(tex.ctxcatcodes,format("\\stoptabulate")) + context.stoptabulate() end end end @@ -35,15 +36,21 @@ end function fonts.show_all() local tfmdata = fonts.ids[font.current()] if tfmdata then + local NC, NR, HL, char, bold, tttf = context.NC, context.NR, context.HL, context.char, context.bold, context.tttf local chars = tfmdata.characters local descs = tfmdata.descriptions or { } local data = characters.data - sprint(tex.ctxcatcodes,format("\\setuptabulate[header=repeat]")) - sprint(tex.ctxcatcodes,format("\\starttabulatehead")) - sprint(tex.ctxcatcodes,"\\NC\\bf unicode\\NC\\bf visual\\NC\\bf index\\NC\\bf glyph\\NC\\bf adobe\\NC\\bf context\\NC\\NR") - sprint(tex.ctxcatcodes,"\\HL") - sprint(tex.ctxcatcodes,format("\\stoptabulatehead")) - sprint(tex.ctxcatcodes,format("\\starttabulate[|l|c|l|p|p|p|]")) + -- context.setuptabulate { header = "repeat" } + context.starttabulatehead() + NC() bold("unicode") + NC() bold("visual") + NC() bold("index") + NC() bold("glyph") + NC() bold("adobe") + NC() bold("context") + NC() NR() + context.stoptabulatehead() + context.starttabulate { "|l|c|l|p|p|p|" } for k, unicode in ipairs(table.sortedkeys(chars)) do -- for unicode, _ in table.sortedpairs(chars) do if unicode >= 0 then @@ -77,22 +84,27 @@ function fonts.show_all() cname = mname end end - sprint(tex.ctxcatcodes,format("\\NC\\tttf U+%05X\\NC\\char%s\\NC\\tttf %05X\\NC\\tttf %s\\NC\\tttf %s\\NC\\tttf %s\\NC\\NR",unicode,unicode,index,gname,aname,cname)) + NC() tttf() context("U+%05X",unicode) + NC() char(unicode) + NC() tttf() context("%05X",index) + NC() tttf() context(gname) + NC() tttf() context(aname) + NC() tttf() context(cname) + NC() NR() end end - sprint(tex.ctxcatcodes,format("\\stoptabulate")) + context.stoptabulate() else - sprint(tex.ctxcatcodes,"problems") + context("problems") end end function fonts.show_glyphs() local tfmdata = fonts.ids[font.current()] if tfmdata then - local chars = tfmdata.characters - for k, v in ipairs(table.sortedkeys(chars)) do + for k, v in ipairs(table.sortedkeys(tfmdata.characters)) do if v >=0 then - sprint(tex.ctxcatcodes,format("\\dontleavehmode{\\strut\\char%s}\\endgraf",v)) + context.showglyph(v) -- local macro end end end @@ -120,6 +132,7 @@ end \def\ShowAllGlyphs#1#2#3% {\bgroup \page + \def\showglyph##1{\dontleavehmode\strut\char##1\relax\par} \font\TestFontA=#1 at 12pt \font\TestFontB=#1 at #2 \setuplayout[style=\TestFontA] @@ -139,7 +152,7 @@ end \starttext -% \ShowCompleteFont{name:dejavusansmono}{10pt}{2} +% \ShowCompleteFont{name:dejavusansmono}{10pt}{1} % \ShowCompleteFont{name:dejavuserif}{10pt}{2} % \ShowCompleteFont{name:officinasansbookitcregular}{10pt}{2} % \ShowCompleteFont{name:officinaserifbookitcregular}{10pt}{2} diff --git a/tex/context/base/s-fnt-11.tex b/tex/context/base/s-fnt-11.tex index 8f855cc72..f2171ecd0 100644 --- a/tex/context/base/s-fnt-11.tex +++ b/tex/context/base/s-fnt-11.tex @@ -26,19 +26,31 @@ function fonts.names.table(pattern,reload,all) local t = fonts.names.list(pattern,reload) if t then - tex.sprint(tex.ctxcatcodes,"\\start\\nonknuthmode\\starttabulate[|T|T|T|T|T|]") - tex.sprint(tex.ctxcatcodes,"\\NC hashname\\NC type\\NC fontname\\NC filename\\NC\\NR\\HL") - for v,tv in table.sortedpairs(t) do - local kind, name, file = tv[1], tv[2], tv[3] - if all or v == string.lower(name) then - if kind and name and file then - tex.sprint(tex.ctxcatcodes,string.format("\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR",v,kind,name,file)) - else - logs.report("font table", "skipping %s", v) + local NC, NR, HL = context.NC, context.NR, context.HL + context.start() + context.nonknuthmode() + context.starttabulate { "|T|T|T|T|T|" } + NC(false,hashname) + NC(false,type) + NC(false,fontname) + NC(false,filename) + NC() NR() HL() + for v,tv in table.sortedpairs(t) do + local kind, name, file = tv[1], tv[2], tv[3] + if all or v == string.lower(name) then + if kind and name and file then + NC(false,v) + NC(false,kind) + NC(false,name) + NC(false,file) + NC() NR() + else + logs.report("font table", "skipping %s", v) + end + end end - end - end - tex.sprint(tex.ctxcatcodes,"\\stoptabulate\\stop") + context.stoptabulate() + context.stop() end end \stopluacode diff --git a/tex/context/base/s-fnt-24.tex b/tex/context/base/s-fnt-24.tex index 073588033..de485557b 100644 --- a/tex/context/base/s-fnt-24.tex +++ b/tex/context/base/s-fnt-24.tex @@ -48,7 +48,7 @@ function fonts.analyzers.cjktest(first,second) if (not first or first == "") or first == k then for kk, vv in next, example do if (not second or second == "") or second == kk then - tex.sprint(tex.ctxcatcodes,string.format("\\ShowChineseCombiChar{%s}{%s}{%s}{%s}",v,vv,k,kk)) + context.ShowChineseCombiChar(v,vv,k,kk) end end end diff --git a/tex/context/base/s-fnt-25.tex b/tex/context/base/s-fnt-25.tex index 6f95d07c6..f04b31c28 100644 --- a/tex/context/base/s-fnt-25.tex +++ b/tex/context/base/s-fnt-25.tex @@ -75,14 +75,14 @@ {mathsymbol: #1~\ruledhbox{\char#2}\par} \startluacode +local concat = table.concat +local format, lower = string.format, string.lower + function document.showmathfont(id,slot) local data = characters.data local tfmdata = fonts.ids[id] local characters = tfmdata.characters local sorted = (slot and { slot }) or table.sortedkeys(characters) - local function report(...) - tex.sprint(tex.ctxcatcodes,string.format(...)) - end local virtual, names = tfmdata.type == "virtual", { } if virtual then for k, v in ipairs(tfmdata.fonts) do @@ -91,17 +91,16 @@ function document.showmathfont(id,slot) end end local round = math.round --- print(table.serialize(names)) -local limited = true + local limited = true for _, s in next, sorted do if not limited or s < 0xF0000 then local char = characters[s] if char then local info = data[s] local cnext, cvert_variants, choriz_variants = char.next, char.vert_variants, char.horiz_variants - report("\\startmathfontlistentry") - report("\\mathfontlistentryhexdectit{U+%05X}{%s}{%s}",s,s,string.lower(info.description or "no description, private to font")) - report("\\mathfontlistentrywdhtdpic{%s}{%s}{%s}{%s}",round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0)) + context.startmathfontlistentry() + context.mathfontlistentryhexdectit(format("U+%05X",s),s,lower(info.description or "no description, private to font")) + context.mathfontlistentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0)) if virtual then local commands = char.commands if commands then @@ -110,24 +109,24 @@ local limited = true local ci = commands[i] if ci[1] == "slot" then local fnt, idx = ci[2], ci[3] - t[#t+1] = string.format("%s/%0X",names[fnt] or fnt,idx) + t[#t+1] = format("%s/%0X",names[fnt] or fnt,idx) end end if #t > 0 then - report("\\mathfontlistentryresource{%s}",table.concat(t,", ")) + context.mathfontlistentryresource(concat(t,", ")) end end end if info.mathclass then - report("\\mathfontlistentryclassname{%s}{%s}",info.mathclass,info.mathname or "no name") + context.mathfontlistentryclassname(info.mathclass,info.mathname or "no name") end if info.mathspec then for i=1,#info.mathspec do - report("\\mathfontlistentryclassname{%s}{%s}",info.mathspec[i].class,info.mathspec[i].name or "no name") + context.mathfontlistentryclassname(info.mathspec[i].class,info.mathspec[i].name or "no name") end end if info.mathsymbol then - report("\\mathfontlistentrysymbol{U+%05X}{%s}",info.mathsymbol,info.mathsymbol) + context.mathfontlistentrysymbol(format("U+%05X",info.mathsymbol),info.mathsymbol) end if cnext then local t, done = { }, { } @@ -137,7 +136,7 @@ local limited = true break else done[cnext] = true - t[#t+1] = string.format("\\mathfontlistentrynext{U+%05X}{%s}",cnext,cnext) + t[#t+1] = context.nested.mathfontlistentrynext(format("U+%05X",cnext),cnext) cnext = characters[cnext] cvert_variants = cnext.vert_variants or cvert_variants choriz_variants = cnext.horiz_variants or choriz_variants @@ -151,29 +150,29 @@ local limited = true if cvert_variants then local t = { } for k, v in next, cvert_variants do - t[#t+1] = string.format("\\fontlistentryvariants{U+%05X}{%s}",v.glyph,v.glyph) + t[#t+1] = context.nested.fontlistentryvariants(format("U+%05X",v.glyph),v.glyph) end cvert_variants = t end if choriz_variants then local t = { } for k, v in next, choriz_variants do - t[#t+1] = string.format("\\fontlistentryvariants{U+%05X}{%s}",v.glyph,v.glyph) + t[#t+1] = context.nested.fontlistentryvariants(format("U+%05X",v.glyph),v.glyph) end choriz_variants = t end local cvariants = choriz_variants or cvert_variants if cvariants and cnext then - report("\\mathfontlistentrynextvariantslist{%s}{%s}",table.concat(cnext," => "),table.concat(cvariants," => ")) + context.mathfontlistentrynextvariantslist(concat(cnext," => "),concat(cvariants," => ")) else if cnext then - report("\\mathfontlistentrynextlist{%s}",table.concat(cnext," => ")) + context.mathfontlistentrynextlist(concat(cnext," => ")) end if cvariants then - report("\\mathfontlistentryvariantslist{%s}",table.concat(cvariants," ")) + context.mathfontlistentryvariantslist(concat(cvariants," ")) end end - report("\\stopmathfontlistentry") + context.stopmathfontlistentry() end end end @@ -184,13 +183,13 @@ end \starttext \setupbodyfont[cambria, 12pt] \showmathfontcharacters - \setupbodyfont[lmvirtual,12pt] \showmathfontcharacters - \setupbodyfont[pxvirtual,12pt] \showmathfontcharacters - \setupbodyfont[txvirtual,12pt] \showmathfontcharacters - \setupbodyfont[palatino, 10pt] \showmathfontcharacters - \setupbodyfont[mathtimes,12pt] \showmathfontcharacters - \setupbodyfont[stix, 12pt] \showmathfontcharacters - \setupbodyfont[xits, 12pt] \showmathfontcharacters - \setupbodyfont[lucida, 12pt] \showmathfontcharacters +% \setupbodyfont[lmvirtual,12pt] \showmathfontcharacters +% \setupbodyfont[pxvirtual,12pt] \showmathfontcharacters +% \setupbodyfont[txvirtual,12pt] \showmathfontcharacters +% \setupbodyfont[palatino, 10pt] \showmathfontcharacters +% \setupbodyfont[mathtimes,12pt] \showmathfontcharacters +% \setupbodyfont[stix, 12pt] \showmathfontcharacters +% \setupbodyfont[xits, 12pt] \showmathfontcharacters +% \setupbodyfont[lucida, 12pt] \showmathfontcharacters \stoptext diff --git a/tex/context/base/s-fnt-30.tex b/tex/context/base/s-fnt-30.tex index 81b6c8d19..1daf6806e 100644 --- a/tex/context/base/s-fnt-30.tex +++ b/tex/context/base/s-fnt-30.tex @@ -15,20 +15,23 @@ function document.show_character_data(n) local n = characters.number(n) local d = characters.data[n] + local NC, NR = context.NC, context.NR if d then local function entry(label,name) - texsprint(tex.ctxcatcodes,format("\\NC %s\\NC %s\\NC\\NR",label,characters.valid(d[name]))) + NC() context(label) + NC() context(characters.valid(d[name]) + NC() NR() end - texsprint(tex.ctxcatcodes,"\\starttabulate[|Tl|Tl|]") - entry("unicode index" , "unicodeslot") - entry("context name" , "contextname") - entry("adobe name" , "adobename") - entry("category" , "category") - entry("description" , "description") - entry("uppercase code", "uccode") - entry("lowercase code", "lccode") - entry("specials" , "specials") - texsprint(tex.ctxcatcodes,"\\stoptabulate ") + context.starttabulate { "|Tl|Tl|]" } + entry("unicode index" , "unicodeslot") + entry("context name" , "contextname") + entry("adobe name" , "adobename") + entry("category" , "category") + entry("description" , "description") + entry("uppercase code", "uccode") + entry("lowercase code", "lccode") + entry("specials" , "specials") + context.stoptabulate() end end \stopluacode diff --git a/tex/context/base/s-inf-01.tex b/tex/context/base/s-inf-01.tex index a2a693ae2..cf8cca80e 100644 --- a/tex/context/base/s-inf-01.tex +++ b/tex/context/base/s-inf-01.tex @@ -15,7 +15,6 @@ \startluacode local format, gsub, find, match = string.format, string.gsub, string.find, string.match - local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local list, size, comp, used, nope = { }, { }, { }, { mkii = { }, mkiv = { } }, { 0, 0, 0, 0 } @@ -105,8 +104,10 @@ function document.context_state_1(what) local max, what, norm = prepare(what) - texsprint(ctxcatcodes,"\\starttabulate[|Tc|T|T|T|T|]") - texsprint(ctxcatcodes,"\\NC category\\NC") + context.starttabulate { "|Tc|T|T|T|T|]" } + context.NC() + context(category) + context.NC() for i, t in ipairs(types) do local n, m = 0, 0 for k, v in pairs(list) do @@ -114,30 +115,35 @@ n = n + nn m = m + (mm or nn) end - texsprint(ctxcatcodes,format("\\Top{%s}{%s}{%s}{%s}\\NC",t,norm(max),n,m)) + context.Top(t,norm(max),n,m) + context.NC() end - texsprint(ctxcatcodes,"\\NC\\NR\\HL") + context.NC() + context.NR() + context.HL() for k, v in table.sortedpairs(what) do local c = (what == size and comp[k]) or nope - local cat = format("%s~%s~~%s",(used.mkii[k] and "ii") or "~~",(used.mkiv[k] and "iv") or "~~",k) - texsprint(ctxcatcodes,"\\NC",cat,"\\NC") + context.NC() + context("%s~%s~~%s",(used.mkii[k] and "ii") or "~~",(used.mkiv[k] and "iv") or "~~",k) + context.NC() for i, t in ipairs(types) do - texsprint(ctxcatcodes,format("\\Bar{%s}{%s}{%s}{%s}\\NC",t,v[i],c[i],norm(v[i]))) + context.Bar(t,v[i],c[i],norm(v[i])) + context.NC() end - texsprint(ctxcatcodes,"\\NR") + context.NR() end - texsprint(ctxcatcodes,"\\stoptabulate") + context.stoptabulate() end function document.context_state_2(what) local max, what, norm = prepare(what) for k, v in table.sortedpairs(what) do local c = (what == size and comp[k]) or nope - texsprint(ctxcatcodes,format("\\StartUp{%s}",k)) + context.StartUp(k) for i, t in ipairs(types) do - texsprint(ctxcatcodes,format("\\Up{%s}{%s}",t,norm(v[i]))) + context.Up(t,norm(v[i])) end - texsprint(ctxcatcodes,"\\StopUp") + context.StopUp() end end diff --git a/tex/context/base/s-reg-01.tex b/tex/context/base/s-reg-01.tex index 123b97384..5ed86cb4e 100644 --- a/tex/context/base/s-reg-01.tex +++ b/tex/context/base/s-reg-01.tex @@ -26,15 +26,26 @@ function regimes.show(regime) regime = regimes.synonyms[regime] or regime local r = regimes.data[regime] if r then - tex.sprint(tc,"\\starttabulate[|rT|T|rT|lT|lT|lT|]") + context.starttabulate { "|rT|T|rT|lT|lT|lT|" } for k, v in ipairs(r) do - tex.sprint(tex.ctxcatcodes, string.format("\\NC %s\\NC\\getvalue{%s}\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR", k, - characters.contextname(v), characters.hexindex(v), characters.contextname(v), - characters.category(v), characters.description(v))) + context.NC() + context(k) + context.NC() + context.getvalue(characters.contextname(v)) + context.NC() + context(characters.hexindex(v)) + context.NC() + context(characters.contextname(v)) + context.NC() + context(characters.category(v)) + context.NC() + context(characters.description(v)) + context.NC() + context.NR() end - tex.sprint(tex.ctxcatcodes,"\\stoptabulate") + context.stoptabulate() else - tex.sprint(tex.ctxcatcodes,"unknown regime " .. regime) + context("unknown regime %s",regime) end end \stopluacode diff --git a/tex/context/base/s-sys-01.tex b/tex/context/base/s-sys-01.tex deleted file mode 100644 index 77d3410c4..000000000 --- a/tex/context/base/s-sys-01.tex +++ /dev/null @@ -1,61 +0,0 @@ -% engine=luatex - -%D \module -%D [ file=s-sys-01, -%D version=2008.03.32, -%D title=\CONTEXT\ Style File, -%D subtitle=Generate List of Math Symbol, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode -function showmath() - local slots = mathematics.slots.traditional - local escape = characters.filters.utf.private.escape - local data = characters.data - tex.sprint(tex.ctxcatcodes,"\\starttabulate[|T|c|T|T|T|T||||]") - local texsprint = tex.sprint -% -- function texsprint(a,b) print(b) end - for _, v in ipairs(table.sortedkeys(slots)) do - local t, d, u = slots[v], data[v], escape(utf.char(v)) - local class, name, description = d.mathclass or "", d.mathname or "" , d.description or "" - if class == "accent" then - u = "" - end - if t[3] and t[4] then - texsprint(tex.ctxcatcodes,string.format( - "\\NC 0x%04X\\NC $%s$\\NC %s\\NC 0x%04X\\NC %s\\NC 0x%04X\\NC %s\\NC %s\\NC %s\\NC\\NR", - v,u,t[1],t[2],t[3],t[4],class,name,description)) - else - texsprint(tex.ctxcatcodes,string.format( - "\\NC 0x%04X\\NC $%s$\\NC %s\\NC 0x%04X\\NC\\NC\\NC %s\\NC %s\\NC %s\\NC\\NR", - v,u,t[1],t[2],class,name,description)) - end - end - tex.sprint(tex.ctxcatcodes,"\\stoptabulate") -end -\stopluacode - -\setuplayout - [backspace=1cm, - topspace=1cm, - footer=1cm, - header=0cm, - height=middle, - width=middle] - -\setupbodyfont - [9pt] - -\setupfootertexts - [] - [math characters -- \pagenumber] - -\starttext -\ctxlua{showmath()} -\stoptext diff --git a/tex/context/base/scrn-int.lua b/tex/context/base/scrn-int.lua index 556ead7c5..7bb1a7a66 100644 --- a/tex/context/base/scrn-int.lua +++ b/tex/context/base/scrn-int.lua @@ -6,9 +6,6 @@ if not modules then modules = { } end modules ['scrn-int'] = { license = "see context related readme files" } -local format = string.format -local texsprint, texcount, ctxcatcodes = tex.sprint, tex.count, tex.ctxcatcodes - interactions = interactions or { } local interactions = interactions @@ -47,7 +44,7 @@ end function attachments.var(label,key) local at = attachments[label] - texsprint(ctxcatcodes,at and at[key] or "") + context(at and at[key] or "") end function soundclips.register(specification) @@ -87,7 +84,7 @@ end function renderings.var(label,key) local rn = renderings[label] - texsprint(ctxcatcodes,rn and rn[key] or "") + context(rn and rn[key] or "") end -- linked lists diff --git a/tex/context/base/scrn-men.mkiv b/tex/context/base/scrn-men.mkiv index 3ab7e3e22..1e987f098 100644 --- a/tex/context/base/scrn-men.mkiv +++ b/tex/context/base/scrn-men.mkiv @@ -93,7 +93,7 @@ \def\dodefineinteractionmenu[#1][#2][#3]% [name] [location] [settings|parent] % right right vertical {\ifsecondargument \ifcsname\??am:\c!list:#2\endcsname \else - \letvalue{\??am:\c!list:#2}\empty + \letvalueempty{\??am:\c!list:#2}% \fi \normalexpanded{\noexpand\addtocommalist{#1}\@EA\noexpand\csname\??am:\c!list:#2\endcsname}% \setvalue{\@@dodolistelement#1}{\def\dosomelistelement{\dodomenulistelement{#1}}}% diff --git a/tex/context/base/spac-hor.lua b/tex/context/base/spac-hor.lua index 6cb6e3f49..09920bd46 100644 --- a/tex/context/base/spac-hor.lua +++ b/tex/context/base/spac-hor.lua @@ -26,7 +26,6 @@ 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 - -- texsprint(ctxcatcodes,"\\space") -- faster context.space() end end diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index 5eb9b3683..d58eaa329 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -22,7 +22,7 @@ if not modules then modules = { } end modules ['spac-ver'] = { local next, type, tonumber = next, type, tonumber local format, gmatch, concat, match, rep = string.format, string.gmatch, table.concat, string.match, string.rep local ceil, floor, max, min, round, abs = math.ceil, math.floor, math.max, math.min, math.round, math.abs -local texsprint, texlists, texdimen, texbox = tex.sprint, tex.lists, tex.dimen, tex.box +local texlists, texdimen, texbox = tex.lists, tex.dimen, tex.box local lpegmatch = lpeg.match local unpack = unpack or table.unpack local points = number.points @@ -30,9 +30,8 @@ local allocate = utilities.storage.allocate local P, C, R, S, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc -local nodes, node, trackers, attributes = nodes, node, trackers, attributes +local nodes, node, trackers, attributes, context = nodes, node, trackers, attributes, context -local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables local starttiming = statistics.starttiming @@ -527,11 +526,6 @@ storage.register("builders/vspacing/data/skip", vspacing.data.skip, "builders.vs do -- todo: interface.variables - local function logger(c,...) - report_vspacing(concat {...}) - texsprint(c,...) - end - vspacing.fixed = false local map = vspacing.data.map @@ -547,7 +541,7 @@ do -- todo: interface.variables -- This will change: just node.write and we can store the values in skips which -- then obeys grouping - local function analyze(str,oldcategory,texsprint) -- we could use shorter names + local function analyze(str,oldcategory) -- we could use shorter names for s in gmatch(str,"([^ ,]+)") do local amount, keyword, detail = lpegmatch(splitter,s) if not keyword then @@ -555,37 +549,37 @@ do -- todo: interface.variables else local mk = map[keyword] if mk then - category = analyze(mk,category,texsprint) + category = analyze(mk,category) elseif keyword == k_fixed then - texsprint(ctxcatcodes,"\\fixedblankskip") + context.fixedblankskip() elseif keyword == k_flexible then - texsprint(ctxcatcodes,"\\flexibleblankskip") + context.flexibleblankskip() elseif keyword == k_category then local category = tonumber(detail) if category then - texsprint(ctxcatcodes,"\\setblankcategory{",category,"}") + context.setblankcategory(category) if category ~= oldcategory then - texsprint(ctxcatcodes,"\\flushblankhandling") + context.flushblankhandling() oldcategory = category end end elseif keyword == k_order and detail then local order = tonumber(detail) if order then - texsprint(ctxcatcodes,"\\setblankorder{",order,"}") + context.setblankorder(order) end elseif keyword == k_penalty and detail then local penalty = tonumber(detail) if penalty then - texsprint(ctxcatcodes,"\\setblankpenalty{",penalty,"}") + context.setblankpenalty(penalty) end else amount = tonumber(amount) or 1 local sk = skip[keyword] if sk then - texsprint(ctxcatcodes,"\\addpredefinedblankskip{",amount,"}{",keyword,"}") + context.addpredefinedblankskip(amount,keyword) else -- no check - texsprint(ctxcatcodes,"\\addaskedblankskip{",amount,"}{",keyword,"}") + context.addaskedblankskip(amount,keyword) end end end @@ -594,10 +588,15 @@ do -- todo: interface.variables end function vspacing.analyze(str) - local texsprint = (trace_vspacing and logger) or texsprint - texsprint(ctxcatcodes,"\\startblankhandling") - analyze(str,1,texsprint) - texsprint(ctxcatcodes,"\\stopblankhandling") + if trace_vspacing then + context.pushlogger(report_vspacing) + end + context.startblankhandling() + analyze(str,1) + context.stopblankhandling() + if trace_vspacing then + context.poplogger() + end end -- diff --git a/tex/context/base/strc-bkm.lua b/tex/context/base/strc-bkm.lua index f9ce93eef..87327618c 100644 --- a/tex/context/base/strc-bkm.lua +++ b/tex/context/base/strc-bkm.lua @@ -14,8 +14,7 @@ if not modules then modules = { } end modules ['strc-bkm'] = { -- we should hook the placement into everystoptext ... needs checking local format, concat, gsub = string.format, table.concat, string.gsub -local texsprint, utfvalues = tex.sprint, string.utfvalues -local ctxcatcodes = tex.ctxcatcodes +local utfvalues = string.utfvalues local settings_to_hash = utilities.parsers.settings_to_hash local codeinjections = backends.codeinjections diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua index b3a36306e..d02fdeb7b 100644 --- a/tex/context/base/strc-blk.lua +++ b/tex/context/base/strc-blk.lua @@ -8,14 +8,13 @@ if not modules then modules = { } end modules ['strc-blk'] = { -- this one runs on top of buffers and structure -local texprint, format, gmatch, find = tex.print, string.format, string.gmatch, string.find +local type = type +local gmatch, find = string.gmatch, string.find local lpegmatch = lpeg.match local settings_to_set, settings_to_array = utilities.parsers.settings_to_set, utilities.parsers.settings_to_array local allocate, mark = utilities.storage.allocate, utilities.storage.mark -local ctxcatcodes = tex.ctxcatcodes - -local structures = structures +local structures, context = structures, context structures.blocks = structures.blocks or { } @@ -36,25 +35,25 @@ end job.register('structures.blocks.collected', tobesaved, initializer) -local printer = (lpeg.patterns.textline/texprint)^0 -- can be shared +local printer = (lpeg.patterns.textline/tex.print)^0 -- can be shared function blocks.print(name,data,hide) if hide then - texprint(ctxcatcodes,format("\\dostarthiddenblock{%s}",name)) + context.dostarthiddenblock(name) else - texprint(ctxcatcodes,format("\\dostartnormalblock{%s}",name)) + context.dostartnormalblock(name) end if type(data) == "table" then for i=1,#data do - texprint(data[i]) + context(data[i]) end else lpegmatch(printer,data) end if hide then - texprint(ctxcatcodes,"\\dostophiddenblock") + context.dostophiddenblock() else - texprint(ctxcatcodes,"\\dostopnormalblock") + context.dostopnormalblock() end end diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index d1048972b..322322e2a 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -27,7 +27,7 @@ local trace_detail = false trackers.register("structures.detail", funct local report_structure = logs.new("structure") -local structures = structures +local structures, context = structures, context local helpers = structures.helpers local documents = structures.documents @@ -156,7 +156,7 @@ function sections.getlevel(name) end function sections.way(way,by) - texsprint(ctxcatcodes,(gsub(way,"^"..by,""))) + context((gsub(way,"^"..by,""))) end function sections.setblock(name) @@ -385,7 +385,7 @@ end function sections.cct() local metadata = data.status[data.depth].metadata - texsprint((metadata and metadata.catcodes) or ctxcatcodes) + context(metadata and metadata.catcodes or ctxcatcodes) end function sections.structuredata(depth,key,default,honorcatcodetable) -- todo: spec table and then also depth @@ -405,20 +405,20 @@ function sections.structuredata(depth,key,default,honorcatcodetable) -- todo: sp local metadata = data.metadata texsprint((metadata and metadata.catcodes) or ctxcatcodes,d) elseif not honorcatcodetable then - texsprint(ctxcatcodes,d) + context(d) elseif type(honorcatcodetable) == "number" then texsprint(honorcatcodetable,d) elseif type(honorcatcodetable) == "string" and honorcatcodetable ~= "" then honorcatcodetable = tex[honorcatcodetable] or ctxcatcodes-- we should move ctxcatcodes to another table, ctx or so texsprint(honorcatcodetable,d) else - texsprint(ctxcatcodes,d) + context(d) end return end end if default then - texsprint(ctxcatcodes,default) + context(default) end end @@ -429,7 +429,7 @@ function sections.userdata(depth,key,default) userdata = userdata and userdata.userdata userdata = (userdata and userdata[key]) or default if userdata then - texsprint(ctxcatcodes,userdata) + context(userdata) end end end @@ -510,8 +510,7 @@ local function process(index,numbers,ownnumbers,criterium,separatorset,conversio if ownnumber ~= "" then sprintprocessor(ctxcatcodes,ownnumber) elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups) - texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number)) - -- context.convertnumber(conversion,number) + context.convertnumber(conversion,number) else local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers") sprintprocessor(ctxcatcodes,theconversion,function(str) @@ -767,8 +766,7 @@ end --~ if ownnumber ~= "" then --~ sprintprocessor(ctxcatcodes,ownnumber) --~ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups) ---~ texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number)) ---~ --~ context.convertnumber(conversion,number) +--~ context.convertnumber(conversion,number) --~ else --~ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers") --~ sprintprocessor(ctxcatcodes,theconversion,function(str) diff --git a/tex/context/base/strc-doc.mkiv b/tex/context/base/strc-doc.mkiv index 154466dfe..972e50f78 100644 --- a/tex/context/base/strc-doc.mkiv +++ b/tex/context/base/strc-doc.mkiv @@ -211,6 +211,7 @@ \def\structurevariable #1{\ctxlua{structures.sections.structuredata(nil,"#1")}} \def\structureuservariable #1{\ctxlua{structures.sections.userdata(nil,"#1")}} \def\structurenumber {\ctxlua{structures.sections.fullnumber()}} +\def\structuretitle {\ctxlua{structures.sections.title()}} \def\structurecatcodedget #1{\ctxlua{structures.sections.structuredata(nil,"#1",nil,true)}} % bad name \def\structuregivencatcodedget#1#2{\ctxlua{structures.sections.structuredata(nil,"#1",nil,\number#2)}} % bad name \def\structureautocatcodedget #1#2{\ctxlua{structures.sections.structuredata(nil,"#1",nil,"#2")}} diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua index 164b60f33..00130b922 100644 --- a/tex/context/base/strc-ini.lua +++ b/tex/context/base/strc-ini.lua @@ -142,8 +142,6 @@ local function simplify(d,nodefault) t[k] = v end end ---~ print(table.serialize(d,"before")) ---~ print(table.serialize(t,"after")) return next(t) and t elseif nodefault then return nil @@ -181,29 +179,29 @@ local tags = { function helpers.title(title,metadata) -- coding is xml is rather old and not that much needed now if title and title ~= "" then -- so it might disappear if metadata then - if metadata.coding == "xml" then -- title can contain raw xml + local xmlsetup = metadata.xmlsetup + if metadata.coding == "xml" then + -- title can contain raw xml local tag = tags[metadata.kind] or tags.generic local xmldata = format("<?xml version='1.0'?><%s>%s</%s>",tag,title,tag) - local command = format("\\xmlprocessbuffer{%s}{%s}{%s}","dummy",tag,metadata.xmlsetup or "") buffers.set(tag,xmldata) if trace_processors then - report_processors("xmldata: %s",xmldata) - report_processors("feeding: %s",command) + report_processors("putting xml data in buffer: %s",xmldata) + report_processors("processing buffer with setup '%s' and tag '%s'",xmlsetup or "",tag) end - texsprint(ctxcatcodes,command) - elseif metadata.xmlsetup then -- title is reference to node (so \xmlraw should have been used) - local command = format("\\xmlsetup{%s}{%s}",title,metadata.xmlsetup) + context.xmlprocessbuffer("dummy",tag,xmlsetup or "") + elseif xmlsetup then -- title is reference to node (so \xmlraw should have been used) if trace_processors then - report_processors("feeding: %s",command) + report_processors("feeding xmlsetup '%s' using node '%s'",xmlsetup,title) end - texsprint(ctxcatcodes,command) + context.xmlsetup(title,metadata.xmlsetup) else local catcodes = metadata.catcodes if catcodes == notcatcodes or catcodes == xmlcatcodes then if trace_processors then report_processors("cct: %s (overloads %s), txt: %s",ctxcatcodes,catcodes,title) end - texsprint(ctxcatcodes,title) -- nasty + context(title) -- nasty else if trace_processors then report_processors("cct: %s, txt: %s",catcodes,title) @@ -217,7 +215,7 @@ function helpers.title(title,metadata) -- coding is xml is rather old and not th end end --- -- -- processors -- -- -- syntax: processor->data +-- -- -- processors -- -- -- syntax: processor->data ... not ok yet local processors = structures.processors @@ -242,7 +240,7 @@ function processors.split(str) end end -function processors.sprint(catcodes,str,fnc,...) +function processors.sprint(catcodes,str,fnc,...) -- not ok: mixed local p, s = lpegmatch(splitter,str) local code if registered[p] then diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua index 428bd8710..9709e7180 100644 --- a/tex/context/base/strc-lst.lua +++ b/tex/context/base/strc-lst.lua @@ -406,8 +406,7 @@ function lists.process(specification) local r = lists.result[i] local m = r.metadata local s = specials and r.numberdata and specials[table.zerostrippedconcat(r.numberdata.numbers,".")] or "" - texsprint(ctxcatcodes,format("\\processlistofstructure{%s}{%s}{%i}{%s}",m.name,m.kind,i,s)) ---~ context.processlistofstructure(m.name,m.kind,i,s) + context.processlistofstructure(m.name,m.kind,i,s) end end @@ -478,7 +477,6 @@ function lists.savedtitle(name,n,tag) local titledata = data.titledata if titledata then helpers.title(titledata[tag] or titledata.title or "",data.metadata) ---~ texsprint(ctxcatcodes,titledata[tag] or titledata.title or "") end end end diff --git a/tex/context/base/strc-not.lua b/tex/context/base/strc-not.lua index 123a03807..a5e9f1ad0 100644 --- a/tex/context/base/strc-not.lua +++ b/tex/context/base/strc-not.lua @@ -8,9 +8,7 @@ if not modules then modules = { } end modules ['strc-not'] = { local format = string.format local next = next -local texsprint, texwrite, texcount = tex.sprint, tex.write, tex.count - -local ctxcatcodes = tex.ctxcatcodes +local texcount = tex.count local trace_notes = false trackers.register("structures.notes", function(v) trace_notes = v end) @@ -33,6 +31,7 @@ local notestates = notes.states local notedata = { } local variables = interfaces.variables +local context = context -- state: store, insert, postpone @@ -51,7 +50,7 @@ function notes.store(tag,n) end state.start = state.start or nnd end - texwrite(#nd) + context(#nd) end local function get(tag,n) @@ -140,7 +139,7 @@ end function notes.getstate(tag) local state = notestates[tag] - texsprint(ctxcatcodes,(state and state.kind ) or "unknown") + context(state and state.kind or "unknown") end function notes.doifcontent(tag) @@ -235,7 +234,7 @@ function notes.deltapage(tag,n) what = 3 end end - texwrite(what) + context(what) end function notes.postpone() @@ -268,7 +267,7 @@ function notes.getsymbolpage(tag,n) if trace_notes then report_notes("note %s of '%s' has page %s",n,tag,p) end - texwrite(p) + context(p) end function notes.getnumberpage(tag,n) @@ -276,7 +275,7 @@ function notes.getnumberpage(tag,n) li = li and li.pagenumber li = li and li.numbers li = li and li[1] - texwrite(li or 0) + context(li or 0) end function notes.flush(tag,whatkind,how) -- store and postpone @@ -291,7 +290,7 @@ function notes.flush(tag,whatkind,how) -- store and postpone report_notes("flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd) end for i=ns,#nd do - texsprint(ctxcatcodes,format("\\handlenoteinsert{%s}{%s}",tag,i)) + context.handlenoteinsert(tag,i) end end state.start = nil @@ -303,20 +302,20 @@ function notes.flush(tag,whatkind,how) -- store and postpone end -- todo: as registers: start, stop, inbetween for i=ns,#nd do --- tricky : trialtypesetting -if how == variables.page then - local rp = get(tag,i) - rp = rp and rp.references - rp = rp and rp.symbolpage or 0 - if rp > texcount.realpageno then - state.start = i - return - end -end + -- tricky : trialtypesetting + if how == variables.page then + local rp = get(tag,i) + rp = rp and rp.references + rp = rp and rp.symbolpage or 0 + if rp > texcount.realpageno then + state.start = i + return + end + end if i > ns then - texsprint(ctxcatcodes,format("\\betweennoteitself{%s}",tag)) + context.betweennoteitself(tag) end - texsprint(ctxcatcodes,format("\\handlenoteitself{%s}{%s}",tag,i)) + context.handlenoteitself(tag,i) end end state.start = nil diff --git a/tex/context/base/strc-num.mkiv b/tex/context/base/strc-num.mkiv index d2ed5dad1..32fcc9e7f 100644 --- a/tex/context/base/strc-num.mkiv +++ b/tex/context/base/strc-num.mkiv @@ -59,8 +59,6 @@ \def\autostructureprefixsegments#1% todo: \c!prefixsegments=\v!auto {2:\thenamedstructureheadlevel{\ctxlua{structures.sections.way("#1\c!way","\v!by")}}} -% \letvalue{\??nn\s!empty}\empty - \def\structurecounterparameter#1#2% {\csname \ifcsname\??nn#1#2\endcsname diff --git a/tex/context/base/strc-pag.lua b/tex/context/base/strc-pag.lua index fde2de942..3dc70b6a3 100644 --- a/tex/context/base/strc-pag.lua +++ b/tex/context/base/strc-pag.lua @@ -9,7 +9,6 @@ if not modules then modules = { } end modules ['strc-pag'] = { local texcount, format = tex.count, string.format local ctxcatcodes = tex.ctxcatcodes -local texsprint, texwrite = tex.sprint, tex.write local allocate, mark = utilities.storage.allocate, utilities.storage.mark local trace_pages = false trackers.register("structures.pages", function(v) trace_pages = v end) @@ -28,6 +27,7 @@ local counters = structures.counters local counterdata = counters.data local variables = interfaces.variables +local context = context -- storage @@ -94,7 +94,7 @@ function pages.number(realdata,pagespec) processors.sprint(ctxcatcodes,starter) end if conversion ~= "" then - texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,userpage)) + context.convertnumber(conversion,userpage) else if conversionset == "" then conversionset = "default" end local theconversion = sets.get("structure:conversions",block,conversionset,1,"numbers") -- to be checked: 1 diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 12b4b2558..459cbb9bb 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['strc-ref'] = { local format, find, gmatch, match, concat = string.format, string.find, string.gmatch, string.match, table.concat local lpegmatch, lpegP, lpegCs = lpeg.match, lpeg.P, lpeg.Cs -local texsprint, texwrite, texcount, texsetcount = tex.sprint, tex.write, tex.count, tex.setcount +local texcount, texsetcount = tex.count, tex.setcount local allocate, mark = utilities.storage.allocate, utilities.storage.mark local setmetatable, rawget = setmetatable, rawget @@ -18,9 +18,9 @@ local trace_referencing = false trackers.register("structures.referencing", fun local report_references = logs.new("references") -local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables local constants = interfaces.constants +local context = context local settings_to_array = utilities.parsers.settings_to_array local unsetvalue = attributes.unsetvalue @@ -188,7 +188,7 @@ function references.setnextinternal(kind,name) end function references.currentorder(kind,name) - texwrite((orders[kind] and orders[kind][name]) or lastorder) + context(orders[kind] and orders[kind][name] or lastorder) end function references.set(kind,prefix,tag,data) @@ -206,7 +206,7 @@ function references.set(kind,prefix,tag,data) tobesaved[prefix] = pd end pd[ref] = data - texsprint(ctxcatcodes,format("\\dofinish%sreference{%s}{%s}",kind,prefix,ref)) + context.dofinishsomereference(kind,prefix,ref) end end end @@ -352,9 +352,9 @@ function references.urls.get(name,method,space) -- method: none, before, after, if u then local url, file = u[1], u[2] if file and file ~= "" then - texsprint(ctxcatcodes,url,"/",file) + context("%s/%s",url,file) else - texsprint(ctxcatcodes,url) + context(url) end end end @@ -379,7 +379,7 @@ end function references.files.get(name,method,space) -- method: none, before, after, both, space: yes/no local f = files[name] if f then - texsprint(ctxcatcodes,f[1]) + context(f[1]) end end @@ -452,7 +452,7 @@ end function references.programs.get(name) local f = programs[name] if f then - texsprint(ctxcatcodes,f[1]) + context(f[1]) end end @@ -470,7 +470,7 @@ end -- shared by urls and files function references.whatfrom(name) - texsprint(ctxcatcodes,(urls[name] and variables.url) or (files[name] and variables.file) or variables.unknown) + context((urls[name] and variables.url) or (files[name] and variables.file) or variables.unknown) end --~ function references.from(name) @@ -478,21 +478,21 @@ end --~ if u then --~ local url, file, description = u[1], u[2], u[3] --~ if description ~= "" then ---~ texsprint(ctxcatcodes,format("\\dofromurldescription{%s}",description)) +--~ context.dofromurldescription(description) --~ -- ok --~ elseif file and file ~= "" then ---~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url .. "/" .. file)) +--~ context.dofromurlliteral(url .. "/" .. file) --~ else ---~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url)) +--~ context(dofromurlliteral,url) --~ end --~ else --~ local f = files[name] --~ if f then --~ local description, file = f[1], f[2] --~ if description ~= "" then ---~ texsprint(ctxcatcodes,format("\\dofromfiledescription{%s}",description)) +--~ context.dofromfiledescription(description) --~ else ---~ texsprint(ctxcatcodes,format("\\dofromfileliteral{%s}",file)) +--~ context.dofromfileliteral(file) --~ end --~ end --~ end @@ -792,25 +792,25 @@ function references.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex if operation then if find(operation,"\\") then -- if o_has_tex then if not done then - texsprint(ctxcatcodes,b) + context(b) done = true end - texsprint(ctxcatcodes,format(o,i,operation)) + context(o,i,operation) end end local arguments = ci.arguments if arguments then if find(arguments,"\\") then -- if a_has_tex then if not done then - texsprint(ctxcatcodes,b) + context(b) done = true end - texsprint(ctxcatcodes,format(a,i,arguments)) + context(a,i,arguments) end end end if done then - texsprint(ctxcatcodes,e) + context(e) end end end @@ -1186,7 +1186,7 @@ end function references.getinternalreference(n) -- n points into list (todo: registers) local l = lists.collected[n] - texsprint(ctxcatcodes,(l and l.references.internal) or n) + context(l and l.references.internal or n) end -- @@ -1195,7 +1195,7 @@ function references.getcurrentmetadata(tag) local data = currentreference and currentreference.i data = data and data.metadata and data.metadata[tag] if data then - texsprint(ctxcatcodes,data) + context(data) end end @@ -1207,16 +1207,9 @@ end references.currentmetadata = currentmetadata function references.getcurrentprefixspec(default) -- todo: message - texsprint(ctxcatcodes,"\\getreferencestructureprefix{", - currentmetadata("kind") or "?", "}{", currentmetadata("name") or "?", "}{", default or "?", "}") + context.getreferencestructureprefix(currentmetadata("kind") or "?",currentmetadata("name") or "?",default or "?") end ---~ function references.getcurrentprefixspec(default) -- we can consider storing the data at the lua end ---~ context.getreferencestructureprefix(currentmetadata("kind"),currentmetadata("name"),default) ---~ end - --- - function references.filter(name,...) -- number page title ... local data = currentreference and currentreference.i if data then @@ -1270,7 +1263,7 @@ function filters.generic.number(data,what,prefixspec) -- todo: spec and then no else local useddata = data.useddata if useddata and useddsta.number then - tex.sprint(tex.ctxcatcodes,useddata.number) + context(useddata.number) end end end @@ -1285,9 +1278,9 @@ function filters.generic.page(data,prefixspec,pagespec) if not number then -- error elseif conversion then - tex.sprint(tex.ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number)) + context.convertnumber(conversion,number) else - tex.sprint(tex.ctxcatcodes,number) + context(number) end else helpers.prefixpage(data,prefixspec,pagespec) @@ -1310,7 +1303,7 @@ function filters.user.unknown(data,name) end local namedata = userdata and userdata[name] if namedata then - texsprint(ctxcatcodes,namedata) + context(namedata) end end end @@ -1318,12 +1311,10 @@ end filters.text = { } function filters.text.title(data) --- texsprint(ctxcatcodes,"[text title]") helpers.title(data.entries.text or "?",data.metadata) end function filters.text.number(data) --- texsprint(ctxcatcodes,"[text number]") helpers.title(data.entries.text or "?",data.metadata) end @@ -1341,7 +1332,7 @@ function filters.section.number(data,what,prefixspec) else local useddata = data.useddata if useddata and useddata.number then - tex.sprint(tex.ctxcatcodes,useddata.number) + context(useddata.number) end end end @@ -1405,7 +1396,7 @@ end function references.realpage() -- special case, we always want result local cs = references.analyze() - texwrite(cs.realpage or 0) + context(cs.realpage or 0) end local plist diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index 437782ff7..19930591d 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -118,6 +118,8 @@ \let\dofinishpagereference\dofinishfullreference \let\dofinishuserreference\dofinishfullreference +\def\dofinishsomereference#1{\executeifdefined{dofinish#1reference}\gobbletwoarguments} + \def\dodosetreference {\ifreferencing \expandafter\dododosetreference diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua index 59356bf30..c5519141f 100644 --- a/tex/context/base/strc-reg.lua +++ b/tex/context/base/strc-reg.lua @@ -7,11 +7,10 @@ if not modules then modules = { } end modules ['strc-reg'] = { } local next, type = next, type -local texwrite, texsprint, texcount = tex.write, tex.sprint, tex.count +local texwrite, texcount = tex.write, tex.count local format, gmatch, concat = string.format, string.gmatch, table.concat local utfchar = utf.char local lpegmatch = lpeg.match -local ctxcatcodes = tex.ctxcatcodes local allocate, mark = utilities.storage.allocate, utilities.storage.mark local trace_registers = false trackers.register("structures.registers", function(v) trace_registers = v end) @@ -34,6 +33,7 @@ local replacements = sorters.replacements local processor_split = processors.split local variables = interfaces.variables +local context = context local matchingtilldepth, numberatdepth = sections.matchingtilldepth, sections.numberatdepth @@ -444,7 +444,7 @@ function registers.userdata(index,name) local data = references.internals[tonumber(index)] data = data and data.userdata and data.userdata[name] if data then - texsprint(ctxcatcodes,data) + context(data) end end @@ -458,58 +458,42 @@ function registers.flush(data,options,prefixspec,pagespec) -- for i=1,#result do -- usedtags[#usedtags+1] = result[i].tag -- end + -- context.setvalue("usedregistertags",concat(usedtags,",")) -- todo: { } and escape special chars -- - -- texsprint(ctxcatcodes,"\\def\\usedregistertags{",concat(usedtags,","),"}") -- todo: { } and escape special chars - -- - texsprint(ctxcatcodes,"\\startregisteroutput") + context.startregisteroutput() local collapse_singles = options.compress == interfaces.variables.yes local collapse_ranges = options.compress == interfaces.variables.all local result = data.result -- todo ownnumber local function pagenumber(entry) local er = entry.references - local proc = entry.processors and entry.processors[2] - texsprint(ctxcatcodes,"\\registeronepage{",er.internal or 0,"}{",er.realpage or 0,"}{") -- internal realpage content - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{") - helpers.prefixpage(entry,prefixspec,pagespec) - texsprint(ctxcatcodes,"}") - else - helpers.prefixpage(entry,prefixspec,pagespec) - end - texsprint(ctxcatcodes,"}") + context.registeronepage( + entry.processors and entry.processors[2] or "", + er.internal or 0, + er.realpage or 0, + function() helpers.prefixpage(entry,prefixspec,pagespec) end + ) end local function pagerange(f_entry,t_entry,is_last) - local er = f_entry.references - local proc = f_entry.processors and f_entry.processors[2] - texsprint(ctxcatcodes,"\\registerpagerange{",er.internal or 0,"}{",er.realpage or 0,"}{") - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{") - helpers.prefixpage(f_entry,prefixspec,pagespec) - texsprint(ctxcatcodes,"}") - else - helpers.prefixpage(f_entry,prefixspec,pagespec) - end - local er = t_entry.references - texsprint(ctxcatcodes,"}{",er.internal or 0,"}{",er.lastrealpage or er.realpage or 0,"}{") - if is_last then - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{") - helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys - texsprint(ctxcatcodes,"}") - else - helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys - end - else - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{") - helpers.prefixpage(t_entry,prefixspec,pagespec) - texsprint(ctxcatcodes,"}") - else - helpers.prefixpage(t_entry,prefixspec,pagespec) + local fer = f_entry.references + local ter = t_entry.references + context.registerpagerange( + f_entry.processors and f_entry.processors[2] or "", + fer.internal or 0, + fer.realpage or 0, + function() + helpers.prefixpage(f_entry,prefixspec,pagespec) + end, + ter.internal or 0, + ter.lastrealpage or ter.realpage or 0, + function() + if is_last then + helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys + else + helpers.prefixpage (t_entry,prefixspec,pagespec) + end end - end - texsprint(ctxcatcodes,"}") + ) end -- -- maybe we can nil the splits and save memory @@ -558,7 +542,7 @@ function registers.flush(data,options,prefixspec,pagespec) local done = { false, false, false, false } local data = sublist.data local d, n = 0, 0 - texsprint(ctxcatcodes,"\\startregistersection{",sublist.tag,"}") + context.startregistersection(sublist.tag) while d < #data do d = d + 1 local entry = data[d] @@ -572,37 +556,25 @@ function registers.flush(data,options,prefixspec,pagespec) if e[i] and e[i] ~= "" then done[i] = e[i] if n == i then - texsprint(ctxcatcodes,"\\stopregisterentries\\startregisterentries{",n,"}") + context.stopregisterentries() + context.startregisterentries(n) else while n > i do n = n - 1 - texsprint(ctxcatcodes,"\\stopregisterentries") + context.stopregisterentries() end while n < i do n = n + 1 - texsprint(ctxcatcodes,"\\startregisterentries{",n,"}") + context.startregisterentries(n) end end local internal = entry.references.internal or 0 local seeparent = entry.references.seeparent or "" + local processor = entry.processors and entry.processors[1] or "" if metadata then - texsprint(ctxcatcodes,"\\registerentry{",internal,"}{",seeparent,"}{") - local proc = entry.processors and entry.processors[1] - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{") - helpers.title(e[i],metadata) - texsprint(ctxcatcodes,"}") - else - helpers.title(e[i],metadata) - end - texsprint(ctxcatcodes,"}") + context.registerentry(processor,internal,seeparent,function() helpers.title(e[i],metadata) end) else - local proc = entry.processors and entry.processors[1] - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{\\registerentry{",internal,"}{",seeindex,"}{",e[i],"}}") - else - texsprint(ctxcatcodes,"\\registerentry{",internal,"}{",seeindex,"}{",e[i],"}") - end + context.registerentry(processor,internal,seeindex,e[i]) end else done[i] = false @@ -611,7 +583,7 @@ function registers.flush(data,options,prefixspec,pagespec) end local kind = entry.metadata.kind if kind == 'entry' then - texsprint(ctxcatcodes,"\\startregisterpages") + context.startregisterpages() --~ collapse_ranges = true if collapse_singles or collapse_ranges then -- we collapse ranges and keep existing ranges as they are @@ -759,29 +731,25 @@ function registers.flush(data,options,prefixspec,pagespec) end end end - texsprint(ctxcatcodes,"\\stopregisterpages") + context.stopregisterpages() elseif kind == 'see' then -- maybe some day more words - texsprint(ctxcatcodes,"\\startregisterseewords") + context.startregisterseewords() local seeindex = entry.references.seeindex or "" local seetext = entry.seeword.text or "" local proc = entry.processors and entry.processors[1] -- todo: metadata like normal entries - if proc then - texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{\\registeroneword{0}{",seeindex,"}{",seetext,"}}") - else - texsprint(ctxcatcodes,"\\registeroneword{0}{",seeindex,"}{",seetext,"}") - end - texsprint(ctxcatcodes,"\\stopregisterseewords") + context.registeroneword(proc or "",0,seeindex,seetext) + context.stopregisterseewords() end end while n > 0 do - texsprint(ctxcatcodes,"\\stopregisterentries") + context.stopregisterentries() n = n - 1 end - texsprint(ctxcatcodes,"\\stopregistersection") + context.stopregistersection() end - texsprint(ctxcatcodes,"\\stopregisteroutput") + context.stopregisteroutput() -- for now, maybe at some point we will do a multipass or so data.result = nil data.metadata.sorted = false diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv index f16c27663..94250767c 100644 --- a/tex/context/base/strc-reg.mkiv +++ b/tex/context/base/strc-reg.mkiv @@ -705,74 +705,74 @@ \def\registeronepagerangeseparator{|\endash|} -\def\withregisterpagecommand#1#2#3% - {\def\currentregisterpageindex{#1}% +\def\withregisterpagecommand#1#2#3#4% + {\def\currentregisterpageindex{#2}% \iflocation - \goto{\registerparameter\c!pagecommand{#3}}[internal(#1)]% + \goto{\registerparameter\c!pagecommand{#4}}[internal(#2)]% \else - \registerparameter\c!pagecommand{#3}% + \registerparameter\c!pagecommand{#4}% \fi} -\def\registeronepage#1#2#3% content +\def\registeronepage#1#2#3#4% #1:processor content {\registerpageseparator \dostarttagged\t!registerpage\empty - \withregisterpagecommand{#1}{#2}{#3}% + \withregisterpagecommand{#1}{#2}{#3}{#4}% \dostoptagged} -\def\registerpagerange#1#2#3#4#5#6% content, content todo: -- configurable +\def\registerpagerange#1#2#3#4#5#6#7% #1:processor content, content todo: -- configurable {\registerpageseparator \dostarttagged\t!registerpagerange\empty \dostarttagged\t!registerfrompage\empty - \withregisterpagecommand{#1}{#2}{#3}% + \withregisterpagecommand{#1}{#2}{#3}{#4}% \dostoptagged \registeronepagerangeseparator \dostarttagged\t!registertopage\empty - \withregisterpagecommand{#4}{#5}{#6}% + \withregisterpagecommand{#1}{#5}{#6}{#7}% \dostoptagged \dostoptagged} -\def\registeroneword#1#2#3% #1:internal #2:seeindex #3:word +\def\registeroneword#1#2#3#4% #1:processor #2:internal #3:seeindex #4:word {\registerpageseparator - \def\currentregisterpageindex{#1}% + \def\currentregisterpageindex{#2}% \dostarttagged\t!registersee\empty \iflocation - \def\currentregisterseeindex{#2}% + \def\currentregisterseeindex{#3}% \else \let\currentregisterseeindex\empty \fi \ifx\currentregisterseeindex\empty - \registerseeword{#3}% + \registerseeword{#1}{#4}% \else % [>\currentregisterseeindex]% - \registerseeword{\goto{#3}[seeindex:\currentregisterseeindex]}% + \registerseeword{#1}{\goto{#4}[seeindex:\currentregisterseeindex]}% \fi \dostoptagged} -\def\doapplyregisterentrycommand#1% +\def\doapplyregisterentrycommand#1#2% processor text {\dostarttagged\t!registerentry\empty \ifx\currentregisterseeindex\empty \else \dontleavehmode % [<\currentregisterseeindex]% \pagereference[seeindex:\currentregisterseeindex]% maybe some day we will support an area \fi - \registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#1}}}% + \applyprocessor{#1}{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#2}}}}% \dostoptagged} -\def\defaultregisterentry#1#2#3% #1:internal #2:seeindex #3:word - {\def\currentregisterpageindex{#1}% +\def\defaultregisterentry#1#2#3#4% #1:processor #2:internal #3:seeindex #4:word + {\def\currentregisterpageindex{#2}% \iflocation - \def\currentregisterseeindex{#2}% + \def\currentregisterseeindex{#3}% \doifelse{\registerparameter\c!interaction}\v!text - {\directgoto{\setlocationcolor\??ia\doapplyregisterentrycommand{#3}}[internal(#1)]} - {\doapplyregisterentrycommand{#3}}% + {\directgoto{\setlocationcolor\??ia\doapplyregisterentrycommand{#1}{#4}}[internal(#2)]} + {\doapplyregisterentrycommand{#1}{#4}}% \else \let\currentregisterseeindex\empty - \doapplyregisterentrycommand{#3}% + \doapplyregisterentrycommand{#1}{#4}% \fi} -\def\defaultregisterseeword#1% +\def\defaultregisterseeword#1#2% processor word {\dostarttagged\t!registersee\empty - \labeltexts\v!see{#1}% + \applyprocessor{#1}{\labeltexts\v!see{#2}}% \dostoptagged} \let\registerseeword \defaultregisterseeword @@ -810,18 +810,18 @@ \setvalue{\??id:\c!symbol:\v!none}% {\let\registerpageseparatorsymbol\empty - \let\registeronepage \gobblethreearguments - \let\registerpagerange \gobblesixarguments} + \let\registeronepage \gobblefourarguments + \let\registerpagerange \gobblesevenarguments} \setvalue{\??id:\c!symbol:1}% {\let\registerpageseparatorsymbol\space - \def\registeronepage {\symbol[1]\gobblethreearguments}% - \def\registerpagerange {\symbol[1]\gobblesixarguments}} + \def\registeronepage {\symbol[1]\gobblefourarguments}% + \def\registerpagerange {\symbol[1]\gobblesevenarguments}} \setvalue{\??id:\c!symbol:2}% {\let\registerpageseparatorsymbol\space - \def\registeronepage {\registerpagebuttonsymbol\gobblethreearguments}% - \def\registerpagerange {\registerpagebuttonsymbol\gobblesixarguments}} + \def\registeronepage {\registerpagebuttonsymbol\gobblefourarguments}% + \def\registerpagerange {\registerpagebuttonsymbol\gobblesevenarguments}} \def\setregisterpagerendering {\doifelse{\registerparameter\c!pagenumber}\v!no @@ -833,8 +833,8 @@ \csname\??id:\c!symbol:\currentregisterpagesymbol\endcsname \else \let\registerpageseparatorsymbol\space - \def\registeronepage {\registerparameter\c!symbol\gobblethreearguments}% - \def\registerpagerange {\registerparameter\c!symbol\gobblesixarguments}% + \def\registeronepage {\registerparameter\c!symbol\gobblefourarguments}% + \def\registerpagerange {\registerparameter\c!symbol\gobblesevenarguments}% \fi\fi} \appendtoks diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv index f815e26c5..c78f0413e 100644 --- a/tex/context/base/strc-ren.mkiv +++ b/tex/context/base/strc-ren.mkiv @@ -77,21 +77,19 @@ % \ifcase\headtimingmode#1\fi % can introduce cr \structureheadparameter\c!commandbefore \placeheadmargintexts + \ifcsname\??nh\currentstructurehead\c!deeptextcommand\endcsname + \expandafter\let\expandafter\deepstructuretitlecommand\csname\??nh\currentstructurehead\c!deeptextcommand\endcsname + \fi \ifconditional\structureheadisdisplay % \ifdisplaysectionhead - \structureheadparameter\c!textcommand% struts can be nilled with \setnostrut - {\setstrut - \begstrut - \ifcase\headtimingmode\hbox{#1}\fi - \executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}% - \endstrut}% \hbox prevents break + % struts can be nilled with \setnostrut, the \hbox prevents break + \structureheadparameter\c!textcommand{\setstrut\begstrut\ifcase\headtimingmode\hbox{#1}\fi#2\endstrut}% \xdef\localheadheight {\the\strutht}% \xdef\localheaddepth {\the\strutdp}% \xdef\localheadlineheight{\the\lineheight}% % == \globallet\localheaddepth\strutdepth \else \ifcase\headtimingmode#1\fi - \structureheadparameter\c!textcommand - {\executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}}% + \structureheadparameter\c!textcommand{#2}% \fi \structureheadparameter\c!commandafter \ifconditional\structureheadisdisplay % \ifdisplaysectionhead @@ -104,16 +102,14 @@ \setupheadcomponentfont\c!numberstyle\c!numbercolor % \getvalue{\??ko\currentstructurehead\c!commandbefore}% strange, why here? moved 21/11/2005 \placeheadmargintexts + \ifcsname\??nh\currentstructurehead\c!deepnumbercommand\endcsname + \expandafter\let\expandafter\deepstructurenumbercommand\csname\??nh\currentstructurehead\c!deeptextcommand\endcsname + \fi \ifconditional\structureheadisdisplay % \ifdisplaysectionhead % can be nilled with \setnostrut - \structureheadparameter\c!numbercommand - {\setstrut - \begstrut - \executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}% - \endstrut}% + \structureheadparameter\c!numbercommand{\setstrut\begstrut#2\endstrut}% \else - \structureheadparameter\c!numbercommand - {\executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}}% + \structureheadparameter\c!numbercommand{#2}% \fi \endgroup} diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index 17846aec0..f872043cb 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -83,7 +83,7 @@ {\global\advance\maxstructuredepth\plusone \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}% \setstructurelevel{#1}{\the\maxstructuredepth}% -% \letvalue{\??nh#1\c!marking}\empty % ? + %\letvalueempty{\??nh#1\c!marking}% ? %\writestatus{structure}{#1\ifx\laststructuresectionname\empty\else\space->\space\laststructuresectionname\fi}% \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}% % this is a rather practical default that we don't want to be part of the parent chain @@ -96,7 +96,7 @@ % so far for these default inheritances \definemarking[#1]% \ifnum\maxstructuredepth>\plusone -% \normalexpanded{\noexpand\couplemarking[#1][\laststructuresectionname]}% so, the child inherits settings from the parent + %\normalexpanded{\noexpand\couplemarking[#1][\laststructuresectionname]}% so, the child inherits settings from the parent \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child \fi \xdef\laststructuresectionname{#1}}} @@ -411,19 +411,31 @@ \currentstructuresynchronize} % \unexpanded\def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo +% \def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode! +% \unexpanded\def\fullstructureheadtitle{\structureautocatcodedget{titledata.title}{\structureheadparameter\s!catcodes}} + +\let\deepstructurenumbercommand\relax +\let\deepstructuretitlecommand \relax \unexpanded\def\fullstructureheadnumber {\edef\currentstructureheadlabeltag{\currentstructureblock\c!label}% \dostarttagged\t!sectionnumber\empty - \labeltexts{\structureheadparameter\currentstructureheadlabeltag}{\structurenumber}% + \labeltexts + {\structureheadparameter\currentstructureheadlabeltag} + {\ifx\deepstructurenumbercommand\relax + \structurenumber + \else + \normalexpanded{\noexpand\deepstructurenumbercommand{\structurenumber}}% + \fi}% \dostoptagged} -% \def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode! -% \unexpanded\def\fullstructureheadtitle{\structureautocatcodedget{titledata.title}{\structureheadparameter\s!catcodes}} - \unexpanded\def\fullstructureheadtitle {\dostarttagged\t!sectiontitle\empty - \ctxlua{structures.sections.title()}% + \ifx\deepstructuretitlecommand\relax + \structuretitle + \else + \normalexpanded{\noexpand\deepstructuretitlecommand{\structuretitle}}% + \fi \dostoptagged} \let\currentstructurehead \empty diff --git a/tex/context/base/strc-syn.lua b/tex/context/base/strc-syn.lua index 005036843..dc8e2e951 100644 --- a/tex/context/base/strc-syn.lua +++ b/tex/context/base/strc-syn.lua @@ -7,11 +7,9 @@ if not modules then modules = { } end modules ['str-syn'] = { } local next, type = next, type -local texwrite, texsprint, format = tex.write, tex.sprint, string.format +local texwrite, format = tex.write, string.format local allocate, mark = utilities.storage.allocate, utilities.storage.mark -local ctxcatcodes = tex.ctxcatcodes - -- interface to tex end local structures = structures @@ -82,7 +80,7 @@ function synonyms.synonym(class,tag) if d then local de = d.definition de.used = true - texsprint(ctxcatcodes,de.synonym) + context(de.synonym) end end @@ -92,7 +90,7 @@ function synonyms.meaning(class,tag) if d then local de = d.definition de.used = true - texsprint(ctxcatcodes,de.meaning) + context(de.meaning) end end @@ -149,24 +147,26 @@ function synonyms.finalize(data,options) data.result = split end -function synonyms.flush(data,options) -- maybe pass the settings differently - local kind = data.metadata.kind -- hack, will be done better ---~ texsprint(ctxcatcodes,format("\\start%soutput",kind)) +-- for now, maybe at some point we will do a multipass or so +-- maybe pass the settings differently + +function synonyms.flush(data,options) + local kind = data.metadata.kind -- hack, will be done better + -- context[format("\\start%soutput",kind)]() local result = data.result local sorted = table.sortedkeys(result) for k=1,#sorted do local letter = sorted[k] local sublist = result[letter] local data = sublist.data ---~ texsprint(ctxcatcodes,format("\\start%ssection{%s}",kind,sublist.tag)) + -- context[format("\\start%ssection",kind)](sublist.tag) for d=1,#data do local entry = data[d].definition - texsprint(ctxcatcodes,format("\\%sentry{%s}{%s}{%s}{%s}",kind,d,entry.tag,entry.synonym,entry.meaning or "")) + context("\\%sentry{%s}{%s}{%s}{%s}",kind,d,entry.tag,entry.synonym,entry.meaning or "") end ---~ texsprint(ctxcatcodes,format("\\stop%ssection",kind)) + -- context[format("\\stop%ssection",kind)]() end ---~ texsprint(ctxcatcodes,format("\\stop%soutput",kind)) - -- for now, maybe at some point we will do a multipass or so + -- context[format("\\stop%soutput",kind)]() data.result = nil data.metadata.sorted = false end diff --git a/tex/context/base/strc-tag.lua b/tex/context/base/strc-tag.lua index 15773b448..f853cdd85 100644 --- a/tex/context/base/strc-tag.lua +++ b/tex/context/base/strc-tag.lua @@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['strc-tag'] = { local insert, remove, unpack, concat = table.insert, table.remove, table.unpack, table.concat local gsub, find, topattern, format = string.gsub, string.find, string.topattern, string.format local lpegmatch = lpeg.match -local texattribute, texsprint, ctxcatcodes = tex.attribute, tex.sprint, tex.ctxcatcodes +local texattribute = tex.attribute local allocate = utilities.storage.allocate local settings_to_hash = utilities.parsers.settings_to_hash diff --git a/tex/context/base/supp-box.mkiv b/tex/context/base/supp-box.mkiv index f1ed751a0..a419e1801 100644 --- a/tex/context/base/supp-box.mkiv +++ b/tex/context/base/supp-box.mkiv @@ -2775,8 +2775,8 @@ % \def\docommand##1{\global\letbeundefined{\@@stacktag#1:##1}}% % \processcommacommand[\getvalue{\@@stacklst#1}]\docommand % \fi -% \global\letvalue{\@@stacklst#1}\empty -% \global\letvalue{\@@stackmax#1}\!!zeropoint} +% \letgvalueempty{\@@stacklst#1}% +% \letgvalue{\@@stackmax#1}\!!zeropoint} % % \def\savebox#1#2% stack name % {\dowithnextbox @@ -2828,7 +2828,7 @@ \ifcsname\@@stacklst#1\endcsname \processcommacommand[\getvalue{\@@stacklst#1}]\docommand \fi - \global\letvalue{\@@stacklst#1}\empty} + \letgvalueempty{\@@stacklst#1}} \def\savebox#1#2% stack name {% beware, \setxvalue defines the cs beforehand so we cannot use the diff --git a/tex/context/base/supp-fil.lua b/tex/context/base/supp-fil.lua index 7ab86a51d..62252bf06 100644 --- a/tex/context/base/supp-fil.lua +++ b/tex/context/base/supp-fil.lua @@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['supp-fil'] = { -- This module will be redone ! +-- context is not defined yet! todo! (we need to load tupp-fil after cld) + --[[ldx-- <p>It's more convenient to manipulate filenames (paths) in <l n='lua'/> than in <l n='tex'/>. These methods have counterparts @@ -15,7 +17,7 @@ at the <l n='tex'/> side.</p> --ldx]]-- local find, gsub, match, format, concat = string.find, string.gsub, string.match, string.format, table.concat -local texsprint, texwrite, ctxcatcodes = tex.sprint, tex.write, tex.ctxcatcodes +local texcount = tex.count local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end) @@ -27,14 +29,14 @@ environment = environment or { } local environment = environment function commands.checkfilename(str) -- "/whatever..." "c:..." "http://..." - commands.chardef("kindoffile",boolean.tonumber(find(str,"^/") or find(str,"[%a]:"))) + texcount.kindoffile = (find(str,"^/") or find(str,"[%a]:") and 1) or 0 end function commands.thesanitizedfilename(str) - texwrite((gsub(str,"\\","/"))) + context((gsub(str,"\\","/"))) end -local def, chardef, testcase = commands.def, commands.chardef, commands.testcase +local testcase = commands.testcase function commands.splitfilename(fullname) local path, name, base, suffix, kind = '', fullname, fullname, '', 0 @@ -46,19 +48,13 @@ function commands.splitfilename(fullname) if b and s then name, suffix = b, s end - if path == "" then - kind = 0 - elseif path == '.' then - kind = 1 - else - kind = 2 - end - def("splitofffull", fullname) - def("splitoffpath", path) - def("splitoffbase", base) - def("splitoffname", name) - def("splitofftype", suffix) - chardef("splitoffkind", kind) + texcount.splitoffkind = (path == "" and 0) or (path == '.' and 1) or 2 + local setvalue = context.setvalue + setvalue("splitofffull", fullname) + setvalue("splitoffpath", path) + setvalue("splitoffbase", base) + setvalue("splitoffname", name) + setvalue("splitofftype", suffix) end function commands.splitfiletype(fullname) @@ -67,14 +63,15 @@ function commands.splitfiletype(fullname) if n and s then name, suffix = n, s end - def("splitofffull", fullname) - def("splitoffpath", "") - def("splitoffname", name) - def("splitofftype", suffix) + local setvalue = context.setvalue + setvalue("splitofffull", fullname) + setvalue("splitoffpath", "") + setvalue("splitoffname", name) + setvalue("splitofftype", suffix) end function commands.doifparentfileelse(n) - testcase(n==environment.jobname or n==environment.jobname..'.tex' or n==environment.outputfilename) + testcase(n == environment.jobname or n == environment.jobname .. '.tex' or n == environment.outputfilename) end -- saves some .15 sec on 12 sec format generation @@ -91,7 +88,7 @@ function commands.doiffileexistelse(name) end function commands.lastexistingfile() - texsprint(ctxcatcodes,lastexistingfile) + context(lastexistingfile) end -- more, we can cache matches @@ -152,7 +149,7 @@ function commands.doreadfile(protocol,path,name) -- better do a split and then p else specification = ((path == "") and format("%s:///%s",protocol,name)) or format("%s:///%s/%s",protocol,path,name) end - texsprint(ctxcatcodes,resolvers.findtexfile(specification)) + context(resolvers.findtexfile(specification)) end -- modules can only have a tex or mkiv suffix or can have a specified one diff --git a/tex/context/base/supp-fil.mkiv b/tex/context/base/supp-fil.mkiv index 33cf3ea78..55b8528ae 100644 --- a/tex/context/base/supp-fil.mkiv +++ b/tex/context/base/supp-fil.mkiv @@ -176,7 +176,7 @@ %D NEW: -\chardef\kindoffile=0 % 0=normal 1=full path spec (or http) / set at the lua end +\newconstant\kindoffile % 0=normal 1=full path spec (or http) / set at the lua end \def\checkfilename#1{\ctxlua{commands.checkfilename([[#1]])}} @@ -454,7 +454,7 @@ %D %D \start \typebuffer \getbuffer \stop -\def\splitoffroot{.} \chardef\splitoffkind\zerocount +\def\splitoffroot{.} \newconstant\splitoffkind \let\splitofffull\empty \let\splitoffpath\empty diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua index 94928dd01..da9269ac3 100644 --- a/tex/context/base/syst-lua.lua +++ b/tex/context/base/syst-lua.lua @@ -81,12 +81,6 @@ function commands.doifinsetelse(a,b) return testcase(false) end -function commands. def (cs,value) texsprint(ctxcatcodes,format( "\\def\\%s{%s}",cs,value)) end -function commands.edef (cs,value) texsprint(ctxcatcodes,format("\\edef\\%s{%s}",cs,value)) end -function commands.gdef (cs,value) texsprint(ctxcatcodes,format("\\gdef\\%s{%s}",cs,value)) end -function commands.xdef (cs,value) texsprint(ctxcatcodes,format("\\xdef\\%s{%s}",cs,value)) end -function commands.chardef(cs,value) texsprint(ctxcatcodes,format("\\chardef\\%s=%s\\relax",cs,value)) end - local pattern = lpeg.patterns.validdimen function commands.doifdimenstringelse(str) diff --git a/tex/context/base/tabl-ntb.mkiv b/tex/context/base/tabl-ntb.mkiv index 80e1ff20d..e2420850d 100644 --- a/tex/context/base/tabl-ntb.mkiv +++ b/tex/context/base/tabl-ntb.mkiv @@ -276,7 +276,7 @@ \processcommalist[#1]\dodosetupTABLE} \def\nopTABLEparameters[#1][#2]% - {\letvalue{\@@tblprefix#1}\empty} + {\letvalueempty{\@@tblprefix#1}} % can be made faster \def\setTABLEparameters[#1][#2]% {\pushTBLparameters diff --git a/tex/context/base/tabl-tbl.mkiv b/tex/context/base/tabl-tbl.mkiv index ca5aa426d..afdf210e1 100644 --- a/tex/context/base/tabl-tbl.mkiv +++ b/tex/context/base/tabl-tbl.mkiv @@ -705,8 +705,8 @@ \c!margin,\c!align,\c!rulecolor,\c!rulethickness,EQ]% \setuvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}% \setuvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}% - \letvalue{\??tt#1-\v!header}\empty - \letvalue{\??tt#1-\v!footer }\empty + \letvalueempty{\??tt#1-\v!header}% + \letvalueempty{\??tt#1-\v!footer}% \else\ifsecondargument \definetabulate[#1][][#2]% \else diff --git a/tex/context/base/toks-ini.lua b/tex/context/base/toks-ini.lua index cb2807b24..7a4c221a4 100644 --- a/tex/context/base/toks-ini.lua +++ b/tex/context/base/toks-ini.lua @@ -34,7 +34,6 @@ a module.</p> local token, tex = token, tex local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes local createtoken = token.create local csname_id = token.csname_id @@ -107,7 +106,7 @@ function collectors.install(tag,end_cs) local t = get_next() local a, b = t[1], t[3] if b == endcs then - texsprint('\\' ..end_cs) + texsprint('\\' ..end_cs) -- to be checked, can be context[end_cs]() return elseif a == call and registered[b] then expand() diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua index 2c0ffb3db..bffcc6c2e 100644 --- a/tex/context/base/trac-log.lua +++ b/tex/context/base/trac-log.lua @@ -394,19 +394,6 @@ function logs.obsolete(old,new) end end -if tex.error then - - function logs.texerrormessage(...) -- for the moment we put this function here - tex.error(format(...), { }) - end - -else - - function logs.texerrormessage(...) -- for the moment we put this function here - local v = format(...) - tex.sprint(tex.ctxcatcodes,"\\errmessage{") - tex.sprint(tex.vrbcatcodes,v) - tex.print(tex.ctxcatcodes,"}") - end - +function logs.texerrormessage(...) -- for the moment we put this function here + tex.error(format(...), { }) end diff --git a/tex/context/base/util-pck.lua b/tex/context/base/util-pck.lua index 585123b5c..cd1fc510e 100644 --- a/tex/context/base/util-pck.lua +++ b/tex/context/base/util-pck.lua @@ -20,9 +20,9 @@ local function hashed(t) local s = { } for k, v in next, t do if type(v) == "table" then - s[#s+1] = k.."={"..hashed(v).."}" + s[#s+1] = k .. "={" .. hashed(v) .. "}" else - s[#s+1] = k.."="..tostring(v) + s[#s+1] = k .. "=" .. tostring(v) end end sort(s) @@ -32,7 +32,7 @@ end local function simplehashed(t) local s = { } for k, v in next, t do - s[#s+1] = k.."="..v + s[#s+1] = k.. "=" .. v end sort(s) return concat(s,",") @@ -41,20 +41,38 @@ end packers.hashed = hashed packers.simplehashed = simplehashed +--~ local function pack(t,keys,hash,index) +--~ for k,v in next, t do +--~ if type(v) == "table" then +--~ pack(v,keys,hash,index) +--~ end +--~ if keys[k] and type(v) == "table" then +--~ local h = hashed(v) +--~ local i = hash[h] +--~ if not i then +--~ i = #index + 1 +--~ index[i] = v +--~ hash[h] = i +--~ end +--~ t[k] = i +--~ end +--~ end +--~ end + local function pack(t,keys,hash,index) for k,v in next, t do if type(v) == "table" then pack(v,keys,hash,index) - end - if keys[k] and type(v) == "table" then - local h = hashed(v) - local i = hash[h] - if not i then - i = #index+1 - index[i] = v - hash[h] = i + if keys[k] then + local h = hashed(v) + local i = hash[h] + if not i then + i = #index + 1 + index[i] = v + hash[h] = i + end + t[k] = i end - t[k] = i end end end diff --git a/tex/context/base/util-prs.lua b/tex/context/base/util-prs.lua index 4580a02b8..a42715d0d 100644 --- a/tex/context/base/util-prs.lua +++ b/tex/context/base/util-prs.lua @@ -14,7 +14,7 @@ parsers.patterns = parsers.patterns or { } local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg local lpegmatch = lpeg.match local concat, format, gmatch = table.concat, string.format, string.gmatch -local tostring, type = tostring, type +local tostring, type, next = tostring, type, next local sortedhash = table.sortedhash local escape, left, right = P("\\"), P('{'), P('}') diff --git a/tex/context/base/util-tab.lua b/tex/context/base/util-tab.lua index 323f3e2c7..6c0ae8970 100644 --- a/tex/context/base/util-tab.lua +++ b/tex/context/base/util-tab.lua @@ -12,6 +12,7 @@ local tables = utilities.tables local format, gmatch = string.format, string.gmatch local concat, insert, remove = table.concat, table.insert, table.remove +local setmetatable = setmetatable function tables.definetable(target) -- defines undefined tables local composed, t = nil, { } diff --git a/tex/context/base/x-ldx.tex b/tex/context/base/x-ldx.tex index 398ca2345..44f936d32 100644 --- a/tex/context/base/x-ldx.tex +++ b/tex/context/base/x-ldx.tex @@ -1,6 +1,6 @@ \doifnotmode{mkiv}{\endinput} -\setupxml[method=mkiv,default=hidden] +\setupxml[default=hidden] \usemodule[x][mathml] @@ -136,11 +136,11 @@ \usemodule[abr-02] -% key -> kw -% dqs -> dq -% sqs -> sq -% line -> ln -% code -> cd +% key -> kw +% dqs -> dq +% sqs -> sq +% line -> ln +% code -> cd % comment -> tx (text) \definetypeface[mainfacenormal] [ss][sans] [iwona] [default] diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index a6ee0673c..4af7af557 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 10/18/10 11:11:34 +-- merge date : 10/19/10 23:03:29 do -- begin closure to overcome local limits and interference @@ -934,13 +934,6 @@ function table.fromhash(t) return h end ---~ print(table.serialize(t), "\n") ---~ print(table.serialize(t,"name"), "\n") ---~ print(table.serialize(t,false), "\n") ---~ print(table.serialize(t,true), "\n") ---~ print(table.serialize(t,"name",true), "\n") ---~ print(table.serialize(t,"name",true,true), "\n") - table.serialize_functions = true table.serialize_compact = true table.serialize_inline = true @@ -1032,8 +1025,8 @@ local function do_serialize(root,name,depth,level,indexed) --~ if v == root then -- circular --~ else - local t = type(v) - if compact and first and type(k) == "number" and k >= first and k <= last then + local t, tk = type(v), type(k) + if compact and first and tk == "number" and k >= first and k <= last then if t == "number" then if hexify then handle(format("%s 0x%04X,",depth,v)) @@ -1075,17 +1068,18 @@ local function do_serialize(root,name,depth,level,indexed) handle(format("%s __p__=nil,",depth)) end elseif t == "number" then - --~ if hexify then - --~ handle(format("%s %s=0x%04X,",depth,key(k),v)) - --~ else - --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g - --~ end - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=0x%04X,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g end + elseif tk == "boolean" then + if hexify then + handle(format("%s [%s]=0x%04X,",depth,tostring(k),v)) + else + handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g + end elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then if hexify then handle(format("%s %s=0x%04X,",depth,k,v)) @@ -1101,26 +1095,28 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "string" then if reduce and tonumber(v) then - --~ handle(format("%s %s=%s,",depth,key(k),v)) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,v)) else handle(format("%s [%s]=%s,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%s,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,v)) else handle(format("%s [%q]=%s,",depth,k,v)) end else - --~ handle(format("%s %s=%q,",depth,key(k),v)) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,v)) else handle(format("%s [%s]=%q,",depth,k,v)) end + elseif tk == "boolean" then + handle(format("%s [%s]=%q,",depth,tostring(k),v)) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,v)) else @@ -1129,13 +1125,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "table" then if not next(v) then - --~ handle(format("%s %s={},",depth,key(k))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={},",depth,k)) else handle(format("%s [%s]={},",depth,k)) end + elseif tk == "boolean" then + handle(format("%s [%s]={},",depth,tostring(k))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={},",depth,k)) else @@ -1144,13 +1141,14 @@ local function do_serialize(root,name,depth,level,indexed) elseif inline then local st = simple_table(v) if st then - --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", "))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", "))) else handle(format("%s [%s]={ %s },",depth,k,concat(st,", "))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", "))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s={ %s },",depth,k,concat(st,", "))) else @@ -1163,13 +1161,14 @@ local function do_serialize(root,name,depth,level,indexed) do_serialize(v,k,depth,level+1) end elseif t == "boolean" then - --~ handle(format("%s %s=%s,",depth,key(k),tostring(v))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%s,",depth,k,tostring(v))) else handle(format("%s [%s]=%s,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%s,",depth,k,tostring(v))) else @@ -1177,13 +1176,14 @@ local function do_serialize(root,name,depth,level,indexed) end elseif t == "function" then if functions then - --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v))) else handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v))) end + elseif tk == "boolean" then + handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=loadstring(%q),",depth,k,dump(v))) else @@ -1191,13 +1191,14 @@ local function do_serialize(root,name,depth,level,indexed) end end else - --~ handle(format("%s %s=%q,",depth,key(k),tostring(v))) - if type(k) == "number" then -- or find(k,"^%d+$") then + if tk == "number" then -- or find(k,"^%d+$") then if hexify then handle(format("%s [0x%04X]=%q,",depth,k,tostring(v))) else handle(format("%s [%s]=%q,",depth,k,tostring(v))) end + elseif tk == "boolean" then -- or find(k,"^%d+$") then + handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v))) elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then handle(format("%s %s=%q,",depth,k,tostring(v))) else @@ -1506,7 +1507,7 @@ function table.sequenced(t,sep,simple) -- hash only end function table.print(...) - print(table.serialize(...)) + table.tohandle(print,...) end end -- closure @@ -3114,7 +3115,7 @@ fontloader.totable = fontloader.to_table -- vtf comes first -- fix comes last -fonts = fonts or { } +fonts = fonts or { } -- we will also have des and fam hashes @@ -3177,9 +3178,9 @@ fonts.definers.specifiers.synonyms = fonts.definers.specifiers.synonyms or { } -- tracing -if not fonts.color then +if not fonts.colors then - fonts.color = allocate { + fonts.colors = allocate { set = function() end, reset = function() end, } @@ -5096,8 +5097,6 @@ local trace_unimapping = false trackers.register("otf.unimapping", function(v) local report_otf = logs.new("load otf") -local ctxcatcodes = tex and tex.ctxcatcodes - --[[ldx-- <p>Eventually this code will disappear because map files are kind of obsolete. Some code may move to runtime or auxiliary modules.</p> @@ -10650,7 +10649,7 @@ local traverse_node_list = node.traverse local fontdata = fonts.ids local state = attributes.private('state') -local fontcolors = fonts.colors +local fontscolors = fonts.colors local fcs = (fontscolors and fontscolors.set) or function() end local fcr = (fontscolors and fontscolors.reset) or function() end @@ -10768,6 +10767,10 @@ local isol_fina_medi_init = { [0x077E] = true, [0x077F] = true, [zwj] = true, } +local mark = { + [0x0650] = true, +} + local arab_warned = { } -- todo: gref @@ -10838,7 +10841,7 @@ function analyzers.methods.arab(head,font,attr) -- maybe make a special version if current.id == glyph_code and current.subtype<256 and current.font == font and not has_attribute(current,state) then done = true local char = current.char - if marks[char] then + if marks[char] or mark[char] then set_attribute(current,state,5) -- mark if trace_analyzing then fcs(current,"font:mark") end elseif isol[char] then -- can be zwj or zwnj too |