diff options
Diffstat (limited to 'tex')
121 files changed, 1135 insertions, 1304 deletions
diff --git a/tex/context/base/attr-col.lua b/tex/context/base/attr-col.lua index 0f40b8b99..1ff1a07ed 100644 --- a/tex/context/base/attr-col.lua +++ b/tex/context/base/attr-col.lua @@ -318,7 +318,7 @@ function colors.value(id) return values[id] end -attributes.colors.handler = nodes.install_attribute_handler { +attributes.colors.handler = nodes.installattributehandler { name = "color", namespace = colors, initializer = states.initialize, @@ -424,7 +424,7 @@ function transparencies.value(id) return values[id] end -attributes.transparencies.handler = nodes.install_attribute_handler { +attributes.transparencies.handler = nodes.installattributehandler { name = "transparency", namespace = transparencies, initializer = states.initialize, @@ -487,7 +487,7 @@ function colorintents.register(stamp) return registered[stamp] or registered.overprint end -attributes.colorintents.handler = nodes.install_attribute_handler { +attributes.colorintents.handler = nodes.installattributehandler { name = "colorintent", namespace = colorintents, initializer = states.initialize, diff --git a/tex/context/base/attr-eff.lua b/tex/context/base/attr-eff.lua index 2dba1b459..4759ad1fa 100644 --- a/tex/context/base/attr-eff.lua +++ b/tex/context/base/attr-eff.lua @@ -60,7 +60,7 @@ function effects.register(effect,stretch,rulethickness) return n end -attributes.effects.handler = nodes.install_attribute_handler { +attributes.effects.handler = nodes.installattributehandler { name = "effect", namespace = effects, initializer = states.initialize, diff --git a/tex/context/base/attr-lay.lua b/tex/context/base/attr-lay.lua index 80e54df77..dd74698ef 100644 --- a/tex/context/base/attr-lay.lua +++ b/tex/context/base/attr-lay.lua @@ -91,7 +91,7 @@ viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in return registered[stamp] -- == n end -attributes.viewerlayers.handler = nodes.install_attribute_handler { +attributes.viewerlayers.handler = nodes.installattributehandler { name = "viewerlayer", namespace = viewerlayers, initializer = initializer, diff --git a/tex/context/base/attr-neg.lua b/tex/context/base/attr-neg.lua index ab62fbab5..ba95382ce 100644 --- a/tex/context/base/attr-neg.lua +++ b/tex/context/base/attr-neg.lua @@ -58,7 +58,7 @@ function negatives.register(stamp) return registered[stamp] or registered.positive end -attributes.negatives.handler = nodes.install_attribute_handler { +attributes.negatives.handler = nodes.installattributehandler { name = "negative", namespace = negatives, initializer = states.initialize, diff --git a/tex/context/base/bibl-bib.lua b/tex/context/base/bibl-bib.lua index 3bf005201..8de1ac23a 100644 --- a/tex/context/base/bibl-bib.lua +++ b/tex/context/base/bibl-bib.lua @@ -16,12 +16,14 @@ local utf = unicode.utf8 local lower, format, gsub, concat = string.lower, string.format, string.gsub, table.concat local next = next local utfchar = utf.char -local lpegmatch = lpeg.match +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local textoutf = characters and characters.tex.toutf local variables = interfaces and interfaces.variables local settings_to_hash = utilities.parsers.settings_to_hash local finalizers = xml.finalizers.tex -local xmlfilter, xmltext = xml.filter, xml.text +local xmlfilter, xmltext, getid = xml.filter, xml.text, lxml.getid + +local P, R, S, C, Cc, Cs, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct local trace_bibxml = false trackers.register("publications.bibxml", function(v) trace_bibtex = v end) @@ -30,9 +32,12 @@ local report_publications = logs.new("publications") bibtex = bibtex or { } local bibtex = bibtex -bibtex.size = 0 -bibtex.definitions = 0 -bibtex.shortcuts = 0 +bibtex.statistics = bibtex.statistics or { } +local bibtexstats = bibtex.statistics + +bibtexstats.nofbytes = 0 +bibtexstats.nofdefinitions = 0 +bibtexstats.nofshortcuts = 0 local defaultshortcuts = { jan = "1", @@ -58,7 +63,7 @@ local entries -- hashed again. local function do_shortcut(tag,key,value) - bibtex.shortcuts = bibtex.shortcuts + 1 + bibtexstats.nofshortcuts = bibtexstats.nofshortcuts + 1 if lower(tag) == "@string" then shortcuts[key] = value end @@ -66,7 +71,7 @@ end local function do_definition(tag,key,tab) -- maybe check entries here (saves memory) if not entries or entries[key] then - bibtex.definitions = bibtex.definitions + 1 + bibtexstats.nofdefinitions = bibtexstats.nofdefinitions + 1 local t = { } for i=1,#tab,2 do t[tab[i]] = tab[i+1] @@ -84,8 +89,6 @@ local function resolve(s) return shortcuts[s] or defaultshortcuts[s] or s -- can be number end -local P, R, S, C, Cc, Cs, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct - local percent = P("%") local start = P("@") local comma = P(",") @@ -104,10 +107,10 @@ local collapsed = (space^1)/ " " local function add(a,b) if b then return a..b else return a end end -local keyword = C((R("az","AZ","09") + S("@_:-"))^1) -- lpeg.C((1-space)^1) +local keyword = C((R("az","AZ","09") + S("@_:-"))^1) -- C((1-space)^1) local s_quoted = ((escape*single) + collapsed + (1-single))^0 local d_quoted = ((escape*double) + collapsed + (1-double))^0 -local balanced = lpeg.patterns.balanced +local balanced = lpegpatterns.balanced local s_value = (single/"") * s_quoted * (single/"") local d_value = (double/"") * d_quoted * (double/"") @@ -119,7 +122,7 @@ local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0 local assignment = spacing * keyword * spacing * equal * spacing * value * spacing local shortcut = keyword * spacing * left * spacing * (assignment * comma^0)^0 * spacing * right -local definition = keyword * spacing * left * spacing * keyword * comma * lpeg.Ct((assignment * comma^0)^0) * spacing * right +local definition = keyword * spacing * left * spacing * keyword * comma * Ct((assignment * comma^0)^0) * spacing * right local comment = keyword * spacing * left * (1-right)^0 * spacing * right local forget = percent^1 * (1-lineending)^0 @@ -130,9 +133,8 @@ local grammar = (space + forget + shortcut/do_shortcut + definition/do_definitio function bibtex.convert(session,content) statistics.starttiming(bibtex) data, shortcuts, entries = session.data, session.shortcuts, session.entries - -- session.size = session.size + #content - bibtex.size = bibtex.size + #content - session.size = session.size + #content + bibtexstats.nofbytes = bibtexstats.nofbytes + #content + session.nofbytes = session.nofbytes + #content lpegmatch(grammar,content or "") statistics.stoptiming(bibtex) end @@ -152,16 +154,16 @@ end function bibtex.new() return { - data = { }, + data = { }, shortcuts = { }, - xml = xml.convert("<?xml version='1.0' standalone='yes'?>\n<bibtex></bibtex>"), - size = 0, - entries = nil, - loaded = false, + xml = xml.convert("<?xml version='1.0' standalone='yes'?>\n<bibtex></bibtex>"), + nofbytes = 0, + entries = nil, + loaded = false, } end -local escaped_pattern = xml.escaped_pattern +local escaped_pattern = lpegpatterns.xml.escaped local ihatethis = { f = "\\f", @@ -243,10 +245,10 @@ function bibtex.toxml(session,options) end statistics.register("bibtex load time", function() - local size = bibtex.size - if size > 0 then + local nofbytes = bibtexstats.nofbytes + if nofbytes > 0 then return format("%s seconds (%s bytes, %s definitions, %s shortcuts)", - statistics.elapsedtime(bibtex),size,bibtex.definitions,bibtex.shortcuts) + statistics.elapsedtime(bibtex),nofbytes,bibtexstats.nofdefinitions,bibtexstats.nofshortcuts) else return nil end @@ -267,14 +269,14 @@ end) --~ local session = bibtex.new() --~ bibtex.convert(session,str) --~ bibtex.toxml(session) ---~ print(session.size,statistics.elapsedtime(bibtex)) +--~ print(session.nofbytes,statistics.elapsedtime(bibtex)) --~ local session = bibtex.new() --~ bibtex.load(session,"IEEEabrv.bib") --~ bibtex.load(session,"IEEEfull.bib") --~ bibtex.load(session,"IEEEexample.bib") --~ bibtex.toxml(session) ---~ print(session.size,statistics.elapsedtime(bibtex)) +--~ print(session.nofbytes,statistics.elapsedtime(bibtex)) --~ local session = bibtex.new() --~ bibtex.load(session,"gut.bib") @@ -287,7 +289,7 @@ end) --~ bibtex.load(session,"texnique.bib") --~ bibtex.load(session,"tugboat.bib") --~ bibtex.toxml(session) ---~ print(session.size,statistics.elapsedtime(bibtex)) +--~ print(session.nofbytes,statistics.elapsedtime(bibtex)) --~ print(table.serialize(session.data)) --~ print(table.serialize(session.shortcuts)) @@ -298,14 +300,16 @@ if not characters then dofile(resolvers.find_file("char-def.lua")) end local chardata = characters.data local concat = table.concat -local P, Ct, lpegmatch = lpeg.P, lpeg.Ct, lpeg.match +local lpeg = lpeg + +local P, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.Ct, lpeg.match, lpeg.patterns local space, comma = P(" "), P(",") local andsplitter = Ct(lpeg.splitat(space^1 * "and" * space^1)) local commasplitter = Ct(lpeg.splitat(space^0 * comma * space^0)) local spacesplitter = Ct(lpeg.splitat(space^1)) -local firstcharacter = lpeg.patterns.utf8byte +local firstcharacter = lpegpatterns.utf8byte local function is_upper(str) local first = lpegmatch(firstcharacter,str) @@ -582,7 +586,7 @@ end local function collectauthoryears(id,list) list = settings_to_hash(list) - id = lxml.get_id(id) + id = getid(id) local found = { } for e in xml.collected(id,"/bibtex/entry") do if list[e.at.tag] then @@ -732,7 +736,7 @@ if commands then end end - function bibtex.singular_or_plural(singular,plural) + function bibtex.singularorplural(singular,plural) if lastconcatsize and lastconcatsize > 1 then texsprint(ctxcatcodes,plural) else diff --git a/tex/context/base/bibl-bib.mkiv b/tex/context/base/bibl-bib.mkiv index 6f2863fd8..0ac60cfe1 100644 --- a/tex/context/base/bibl-bib.mkiv +++ b/tex/context/base/bibl-bib.mkiv @@ -118,9 +118,9 @@ \newtoks \everysetupbibtexsession \setfalse \tracebibtexformat -\unexpanded\def\definebibtexsession {\dosingleargument\dodefinebibtexsession} +\unexpanded\def\definebibtexsession{\dosingleargument\dodefinebibtexsession} \def\preparebibtexsession {\dodoubleempty \dopreparebibtexsession} -\unexpanded\def\setupbibtexsession {\dodoubleargument\dosetupbibtexsession} +\unexpanded\def\setupbibtexsession {\dodoubleargument\dosetupbibtexsession} \def\dodefinebibtexsession [#1]{\edef\currentbibtexsession{#1}% \ctxlua{commands.definebibtexsession("#1")}% @@ -956,7 +956,7 @@ \def\dodobibtexauthoryearref #1{\ctxlua{bibtex.authoryearref ("bibtex:\currentbibtexsession","#1","normal","author")}} \def\dodobibtexauthoryearsref#1{\ctxlua{bibtex.authoryearsref("bibtex:\currentbibtexsession","#1","normal","author")}} -\unexpanded\def\bibtexsingularplural#1#2{\ctxlua{bibtex.singular_or_plural(\!!bs#1\!!es,\!!bs#2\!!es)}} +\unexpanded\def\bibtexsingularplural#1#2{\ctxlua{bibtex.singularorplural(\!!bs#1\!!es,\!!bs#2\!!es)}} \protect \endinput diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua index 70d187f1a..2baae18b0 100644 --- a/tex/context/base/buff-ini.lua +++ b/tex/context/base/buff-ini.lua @@ -869,3 +869,9 @@ end --~ str = [[test 123 test $oeps$]] --~ lpegmatch(pattern,str) + +buffers.obsolete = buffers.obsolete or { } +local obsolete = buffers.obsolete + +buffers.finish_state = buffers.finishstate obsolete.finish_state = buffers.finishstate +buffers.change_state = buffers.finishstate obsolete.change_state = buffers.finishstate diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua index 99afe6ec4..a24de6e23 100644 --- a/tex/context/base/char-ini.lua +++ b/tex/context/base/char-ini.lua @@ -333,13 +333,7 @@ characters.bidi = { on = "Other Neutrals", } -local _empty_table_ = { __index = function(t,k) return "" end } - -function table.set_empty_metatable(t) - setmetatable(t,_empty_table_) -end - -table.set_empty_metatable(data) +table.setemptymetatable(data) -- so each key resolves to "" --[[ldx-- <p>At this point we assume that the big data table is loaded. From this @@ -617,7 +611,7 @@ function characters.remapentity(chr,slot) texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr)) end -characters.active_offset = 0x10000 -- there will be remapped in that byte range +characters.activeoffset = 0x10000 -- there will be remapped in that byte range -- xml.entities = xml.entities or { } -- @@ -632,9 +626,9 @@ characters.active_offset = 0x10000 -- there will be remapped in that byte range -- -- function characters.setmkiientities() -- local entities = xml.entities --- entities.lt = utfchar(characters.active_offset + utfbyte("<")) --- entities.amp = utfchar(characters.active_offset + utfbyte("&")) --- entities.gt = utfchar(characters.active_offset + utfbyte(">")) +-- entities.lt = utfchar(characters.activeoffset + utfbyte("<")) +-- entities.amp = utfchar(characters.activeoffset + utfbyte("&")) +-- entities.gt = utfchar(characters.activeoffset + utfbyte(">")) -- end -- some day we will make a table diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua index 71e2805ad..680d426b0 100644 --- a/tex/context/base/char-utf.lua +++ b/tex/context/base/char-utf.lua @@ -21,7 +21,7 @@ over a string.</p> local utf = unicode.utf8 local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub -local concat, gmatch = table.concat, string.gmatch +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 @@ -152,9 +152,9 @@ end private.set = set +function private.escape (str) return gsub(str,"(.)", escapes) end function private.replace(str) return utfgsub(str,"(.)", low ) end -function private.revert(str) return utfgsub(str,"(.)", high ) end -function private.escape(str) return utfgsub(str,"(.)", escapes) end +function private.revert (str) return utfgsub(str,"(.)", high ) end for ch in gmatch(special,".") do set(ch) end diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 81baf2923..e400dfaa0 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -37,7 +37,7 @@ \let\\=\crlf -% for a while +% for a while as these can be used in user modules \startluacode jobregisters = logs.obsolete("jobregisters", "structures.registers") diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index b9f8747dd..8c0852955 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.08.19 01:08} +\newcontextversion{2010.08.20 00:00} %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.mkiv b/tex/context/base/context.mkiv index 1cf1aeacc..c8271fcb1 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -377,10 +377,7 @@ \to \everyjob \appendtoks - \ctxlua { - statistics.report_storage("log") - statistics.save_fmt_status("\jobname","\contextversion","context.tex") - }% + \ctxlua{statistics.savefmtstatus("\jobname","\contextversion","context.tex")}% can become automatic \to \everydump \protect \errorstopmode \dump \endinput diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 27eb2b55e..351667d9d 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.08.19 01:08} +\edef\contextversion{2010.08.20 00:00} %D For those who want to use this: diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua index 538feb959..c8dc0f73d 100644 --- a/tex/context/base/core-uti.lua +++ b/tex/context/base/core-uti.lua @@ -48,7 +48,7 @@ job.comment(format("version: %1.2f",jobs.version)) function job.initialize(loadname,savename) job.load(loadname) -- has to come after structure is defined ! - luatex.register_stop_actions(function() + luatex.registerstopactions(function() if not status.lasterrorstring or status.lasterrorstring == "" then job.save(savename) end @@ -113,10 +113,10 @@ local jobpacker = packers.new(packlist,1.01) job.pack = true -job._save_, job._load_ = { }, { } -- registers timing +local _save_, _load_ = { }, { } -- registers timing function job.save(filename) - statistics.starttiming(job._save_) + statistics.starttiming(_save_) local f = io.open(filename,'w') if f then for c=1,#comment do @@ -141,11 +141,11 @@ function job.save(filename) end f:close() end - statistics.stoptiming(job._save_) + statistics.stoptiming(_save_) end function job.load(filename) - statistics.starttiming(job._load_) + statistics.starttiming(_load_) local data = io.loaddata(filename) if data and data ~= "" then local version = tonumber(match(data,"^-- version: ([%d%.]+)")) @@ -167,7 +167,7 @@ function job.load(filename) job.packed = nil end end - statistics.stoptiming(job._load_) + statistics.stoptiming(_load_) end -- eventually this will end up in strc-ini @@ -177,8 +177,8 @@ statistics.register("startup time", function() end) statistics.register("jobdata time",function() - if statistics.elapsedindeed(job._save_) or statistics.elapsedindeed(job._load_) then - return format("%s seconds saving, %s seconds loading", statistics.elapsedtime(job._save_), statistics.elapsedtime(job._load_)) + if statistics.elapsedindeed(_save_) or statistics.elapsedindeed(_load_) then + return format("%s seconds saving, %s seconds loading", statistics.elapsedtime(_save_), statistics.elapsedtime(_load_)) end end) diff --git a/tex/context/base/data-con.lua b/tex/context/base/data-con.lua index a38440fbf..05f1b07de 100644 --- a/tex/context/base/data-con.lua +++ b/tex/context/base/data-con.lua @@ -80,7 +80,7 @@ function containers.define(category, subcategory, version, enabled) end function containers.is_usable(container, name) - return container.enabled and caches and caches.iswritable(container.writable, name) + return container.enabled and caches and caches.is_writable(container.writable, name) end function containers.is_valid(container, name) diff --git a/tex/context/base/data-ini.lua b/tex/context/base/data-ini.lua index 80a01c588..63329b6e2 100644 --- a/tex/context/base/data-ini.lua +++ b/tex/context/base/data-ini.lua @@ -87,7 +87,7 @@ end do - local args = environment.original_arguments or arg -- this needs a cleanup + local args = environment.originalarguments or arg -- this needs a cleanup local ownbin = environment.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex" local ownpath = environment.ownpath or os.selfdir diff --git a/tex/context/base/data-lua.lua b/tex/context/base/data-lua.lua index 754dbddb5..f163361fe 100644 --- a/tex/context/base/data-lua.lua +++ b/tex/context/base/data-lua.lua @@ -51,11 +51,11 @@ end local p_libpaths, a_libpaths = { }, { } -function package.append_libpath(...) +function package.appendtolibpath(...) insert(a_libpath,thepath(...)) end -function package.prepend_libpath(...) +function package.prependtolibpath(...) insert(p_libpaths,1,thepath(...)) end @@ -154,3 +154,13 @@ package.loaders[2] = function(name) -- was [#package.loaders+1] end resolvers.loadlualib = require + +-- -- -- -- + +package.obsolete = package.obsolete or { } + +package.append_libpath = appendtolibpath -- will become obsolete +package.prepend_libpath = prependtolibpath -- will become obsolete + +package.obsolete.append_libpath = appendtolibpath -- will become obsolete +package.obsolete.prepend_libpath = prependtolibpath -- will become obsolete diff --git a/tex/context/base/data-tmp.lua b/tex/context/base/data-tmp.lua index ebb5c3e5e..aeca105a0 100644 --- a/tex/context/base/data-tmp.lua +++ b/tex/context/base/data-tmp.lua @@ -60,18 +60,18 @@ local function identify() cachepath = file.collapse_path(cachepath) local valid = isdir(cachepath) if valid then - if file.isreadable(cachepath) then + if file.is_readable(cachepath) then readables[#readables+1] = cachepath - if not writable and file.iswritable(cachepath) then + if not writable and file.is_writable(cachepath) then writable = cachepath end end elseif not writable and caches.force then local cacheparent = file.dirname(cachepath) - if file.iswritable(cacheparent) then + if file.is_writable(cacheparent) then if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then mkdirs(cachepath) - if isdir(cachepath) and file.iswritable(cachepath) then + if isdir(cachepath) and file.is_writable(cachepath) then report_cache("created: %s",cachepath) writable = cachepath readables[#readables+1] = cachepath @@ -92,8 +92,8 @@ local function identify() if cachepath ~= "" then cachepath = resolvers.clean_path(cachepath) local valid = isdir(cachepath) - if valid and file.isreadable(cachepath) then - if not writable and file.iswritable(cachepath) then + if valid and file.is_readable(cachepath) then + if not writable and file.is_writable(cachepath) then readables[#readables+1] = cachepath writable = cachepath break @@ -112,7 +112,7 @@ local function identify() os.exit() end -- why here - writable = dir.expand_name(resolvers.clean_path(writable)) -- just in case + writable = dir.expandname(resolvers.clean_path(writable)) -- just in case -- moved here local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree if tree then @@ -219,7 +219,7 @@ function caches.getfirstreadablefile(filename,...) for i=1,#rd do local path = rd[i] local fullname = file.join(path,filename) - if file.isreadable(fullname) then + if file.is_readable(fullname) then usedreadables[i] = true return fullname, path end @@ -260,9 +260,9 @@ function caches.loaddata(readables,name) return false end -function caches.iswritable(filepath,filename) +function caches.is_writable(filepath,filename) local tmaname, tmcname = caches.setluanames(filepath,filename) - return file.iswritable(tmaname) + return file.is_writable(tmaname) end function caches.savedata(filepath,filename,data,raw) diff --git a/tex/context/base/data-use.lua b/tex/context/base/data-use.lua index 3d2dbe190..75f2ebff2 100644 --- a/tex/context/base/data-use.lua +++ b/tex/context/base/data-use.lua @@ -56,7 +56,7 @@ statistics.register("used cache path", function() return caches.usedpaths() end -- experiment (code will move) -function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname +function statistics.savefmtstatus(texname,formatbanner,sourcefile) -- texname == formatname local enginebanner = status.list().banner if formatbanner and enginebanner and sourcefile then local luvname = file.replacesuffix(texname,"luv") @@ -70,7 +70,7 @@ function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname end end -function statistics.check_fmt_status(texname) +function statistics.checkfmtstatus(texname) local enginebanner = status.list().banner if enginebanner and texname then local luvname = file.replacesuffix(texname,"luv") diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua index e29363c11..8a9fabed1 100644 --- a/tex/context/base/font-afm.lua +++ b/tex/context/base/font-afm.lua @@ -210,7 +210,7 @@ local function get_indexes(data,pfbname) end end -function afm.read_afm(filename) +local function readafm(filename) local ok, afmblob, size = resolvers.loadbinfile(filename) -- has logging -- local ok, afmblob = true, file.readdata(filename) if ok and afmblob then @@ -284,7 +284,7 @@ function afm.load(filename) if not data or data.verbose ~= fonts.verbose or data.size ~= size or data.time ~= time or data.pfbsize ~= pfbsize or data.pfbtime ~= pfbtime then report_afm( "reading %s",filename) - data = afm.read_afm(filename) + data = readafm(filename) if data then -- data.luatex = data.luatex or { } if pfbname ~= "" then @@ -482,7 +482,7 @@ end fonts.formats.afm = "type1" fonts.formats.pfb = "type1" -function afm.copy_to_tfm(data) +local function copytotfm(data) if data then local glyphs = data.glyphs if glyphs then @@ -610,7 +610,7 @@ end afmfeatures.register = register_feature -function afm.set_features(tfmdata) +local function setfeatures(tfmdata) local shared = tfmdata.shared local afmdata = shared.afmdata local features = shared.features @@ -670,7 +670,7 @@ function afm.set_features(tfmdata) end end -function afm.check_features(specification) +local function checkfeatures(specification) local features, done = fonts.define.check(specification.features.normal,afmfeatures.default) if done then specification.features.normal = features @@ -678,7 +678,7 @@ function afm.check_features(specification) end end -function afm.afm_to_tfm(specification) +local function afmtotfm(specification) local afmname = specification.filename or specification.name if specification.forced == "afm" or specification.format == "afm" then -- move this one up if trace_loading then @@ -696,7 +696,7 @@ function afm.afm_to_tfm(specification) if afmname == "" then return nil else - afm.check_features(specification) + checkfeatures(specification) specification = fonts.define.resolve(specification) -- new, was forgotten local features = specification.features.normal local cache_id = specification.hash @@ -705,14 +705,14 @@ function afm.afm_to_tfm(specification) local afmdata = afm.load(afmname) if afmdata and next(afmdata) then add_dimensions(afmdata) - tfmdata = afm.copy_to_tfm(afmdata) + tfmdata = copytotfm(afmdata) if tfmdata and next(tfmdata) then local shared = tfmdata.shared local unique = tfmdata.unique if not shared then shared = { } tfmdata.shared = shared end if not unique then unique = { } tfmdata.unique = unique end shared.afmdata, shared.features = afmdata, features - afm.set_features(tfmdata) + setfeatures(tfmdata) end elseif trace_loading then report_afm("no (valid) afm file found with name %s",afmname) @@ -750,7 +750,7 @@ function tfm.set_normal_feature(specification,name,value) end function tfm.read_from_afm(specification) - local tfmtable = afm.afm_to_tfm(specification) + local tfmtable = afmtotfm(specification) if tfmtable then tfmtable.name = specification.name tfmtable = tfm.scale(tfmtable, specification.size, specification.relativeid) @@ -820,9 +820,6 @@ local function prepare_kerns(tfmdata,kerns,value) end end -afmfeatures.prepare_kerns = prepare_kerns -afmfeatures.prepare_ligatures = prepare_ligatures - -- hm, register? local base_initializers = fonts.initializers.base.afm diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua index 727142db2..f95d78668 100644 --- a/tex/context/base/font-ctx.lua +++ b/tex/context/base/font-ctx.lua @@ -601,7 +601,7 @@ fonts.map.reset() -- resets the default file local nounicode = byte("?") -local function name_to_slot(name) -- maybe some day rawdata +local function nametoslot(name) -- maybe some day rawdata local tfmdata = fonts.ids[font.current()] local shared = tfmdata and tfmdata.shared local fntdata = shared and shared.otfdata or shared.afmdata @@ -618,11 +618,11 @@ local function name_to_slot(name) -- maybe some day rawdata return nounicode end -fonts.name_to_slot = name_to_slot +fonts.nametoslot = nametoslot function fonts.char(n) -- todo: afm en tfm if type(n) == "string" then - n = name_to_slot(n) + n = nametoslot(n) end if type(n) == "number" then texsprint(ctxcatcodes,format("\\char%s ",n)) @@ -631,15 +631,15 @@ end -- this will become obsolete: -fonts.otf.name_to_slot = name_to_slot -fonts.afm.name_to_slot = name_to_slot +fonts.otf.nametoslot = nametoslot +fonts.afm.nametoslot = nametoslot fonts.otf.char = fonts.char fonts.afm.char = fonts.char -- this will change ... -function fonts.show_char_data(n) +function fonts.showchardata(n) local tfmdata = fonts.ids[font.current()] if tfmdata then if type(n) == "string" then @@ -652,7 +652,7 @@ function fonts.show_char_data(n) end end -function fonts.show_font_parameters() +function fonts.showfontparameters() local tfmdata = fonts.ids[font.current()] if tfmdata then local parameters, mathconstants = tfmdata.parameters, tfmdata.MathConstants @@ -699,7 +699,7 @@ function fonts.report_defined_fonts() end end -luatex.register_stop_actions(fonts.report_defined_fonts) +luatex.registerstopactions(fonts.report_defined_fonts) function fonts.report_used_features() -- numbers, setups, merged @@ -722,4 +722,4 @@ function fonts.report_used_features() end end end -luatex.register_stop_actions(fonts.report_used_features) +luatex.registerstopactions(fonts.report_used_features) diff --git a/tex/context/base/font-dum.lua b/tex/context/base/font-dum.lua index 0a9bcd301..bac4f51af 100644 --- a/tex/context/base/font-dum.lua +++ b/tex/context/base/font-dum.lua @@ -263,7 +263,7 @@ end -- bonus -function fonts.otf.name_to_slot(name) +function fonts.otf.nametoslot(name) local tfmdata = fonts.ids[font.current()] if tfmdata and tfmdata.shared then local otfdata = tfmdata.shared.otfdata @@ -274,7 +274,7 @@ end function fonts.otf.char(n) if type(n) == "string" then - n = fonts.otf.name_to_slot(n) + n = fonts.otf.nametoslot(n) end if type(n) == "number" then tex.sprint("\\char" .. n) diff --git a/tex/context/base/font-enh.lua b/tex/context/base/font-enh.lua index 7a585a7d1..27e4e8b75 100644 --- a/tex/context/base/font-enh.lua +++ b/tex/context/base/font-enh.lua @@ -62,10 +62,10 @@ function tfm.enhance(tfmdata,specification) features.encoding = encoding end end - tfm.set_features(tfmdata) + tfm.setfeatures(tfmdata) end -function tfm.set_features(tfmdata) +function tfm.setfeatures(tfmdata) -- todo: no local functions local shared = tfmdata.shared -- local tfmdata = shared.tfmdata diff --git a/tex/context/base/font-gds.lua b/tex/context/base/font-gds.lua index f25458110..80dc0ca55 100644 --- a/tex/context/base/font-gds.lua +++ b/tex/context/base/font-gds.lua @@ -79,7 +79,7 @@ fontgoodies.get = getgoodies local preset_context = fonts.define.specify.preset_context -local function set_goodies(tfmdata,value) +local function setgoodies(tfmdata,value) local goodies = tfmdata.goodies or { } -- future versions might store goodies in the cached instance for filename in gmatch(value,"[^, ]+") do -- we need to check for duplicates @@ -95,13 +95,13 @@ end -- featuresets -local function flattened_features(t,tt) +local function flattenedfeatures(t,tt) -- first set value dominates local tt = tt or { } for i=1,#t do local ti = t[i] if type(ti) == "table" then - flattened_features(ti,tt) + flattenedfeatures(ti,tt) elseif tt[ti] == nil then tt[ti] = true end @@ -109,7 +109,7 @@ local function flattened_features(t,tt) for k, v in next, t do if type(k) ~= "number" then -- not tonumber(k) if type(v) == "table" then - flattened_features(v,tt) + flattenedfeatures(v,tt) elseif tt[k] == nil then tt[k] = v end @@ -118,11 +118,11 @@ local function flattened_features(t,tt) return tt end -fonts.flattened_features = flattened_features +fonts.flattenedfeatures = flattenedfeatures function fontgoodies.prepare_features(goodies,name,set) if set then - local ff = flattened_features(set) + local ff = flattenedfeatures(set) local fullname = goodies.name .. "::" .. name local n, s = preset_context(fullname,"",ff) goodies.featuresets[name] = s -- set @@ -148,7 +148,7 @@ end fontgoodies.register("featureset",initialize) -local function set_featureset(tfmdata,set) +local function setfeatureset(tfmdata,set) local goodies = tfmdata.goodies -- shared ? if goodies then local features = tfmdata.shared.features @@ -259,11 +259,11 @@ table.insert(fonts.triggers, "colorscheme") local base_initializers = fonts.initializers.base.otf local node_initializers = fonts.initializers.node.otf -base_initializers.goodies = set_goodies -node_initializers.goodies = set_goodies +base_initializers.goodies = setgoodies +node_initializers.goodies = setgoodies -base_initializers.featureset = set_featureset -node_initializers.featureset = set_featureset +base_initializers.featureset = setfeatureset +node_initializers.featureset = setfeatureset base_initializers.colorscheme = set_colorscheme node_initializers.colorscheme = set_colorscheme @@ -278,7 +278,7 @@ local function initialize(goodies) local maplines = mathgoodies and mathgoodies.maplines if virtuals then for name, specification in next, virtuals do - mathematics.make_font(name,specification) + mathematics.makefont(name,specification) end end if mapfiles then diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index ef2eadbcb..4b813d7f6 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -3962,8 +3962,8 @@ %D goodies: -\def\showchardata#1{\ctxlua{fonts.show_char_data("#1")}} -\def\showfontdata {\ctxlua{fonts.show_font_parameters()}} +\def\showchardata#1{\ctxlua{fonts.showchardata("#1")}} +\def\showfontdata {\ctxlua{fonts.showfontparameters()}} %D some low level helpers %D diff --git a/tex/context/base/font-otb.lua b/tex/context/base/font-otb.lua index 7c9a28e38..ea46ebdbc 100644 --- a/tex/context/base/font-otb.lua +++ b/tex/context/base/font-otb.lua @@ -263,7 +263,7 @@ local function prepare_base_substitutions(tfmdata,kind,value) -- we can share so end end -local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all +local function preparebasekerns(tfmdata,kind,value) -- todo what kind of kerns, currently all if value then local otfdata = tfmdata.shared.otfdata local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) @@ -333,10 +333,10 @@ local supported_gpos = { 'kern' } -function otf.features.register_base_substitution(tag) +function otf.features.registerbasesubstitution(tag) supported_gsub[#supported_gsub+1] = tag end -function otf.features.register_base_kern(tag) +function otf.features.registerbasekern(tag) supported_gsub[#supported_gpos+1] = tag end @@ -360,7 +360,7 @@ function fonts.initializers.base.otf.features(tfmdata,value) for f=1,#supported_gpos do local feature = supported_gpos[f] local value = features[feature] - prepare_base_kerns(tfmdata,feature,features[feature]) + preparebasekerns(tfmdata,feature,features[feature]) if value then h[#h+1] = feature .. "=" .. tostring(value) end diff --git a/tex/context/base/font-otc.lua b/tex/context/base/font-otc.lua index b57b5b880..3280d8161 100644 --- a/tex/context/base/font-otc.lua +++ b/tex/context/base/font-otc.lua @@ -201,11 +201,11 @@ features['tlig'] = 'TeX Ligatures' features['trep'] = 'TeX Replacements' features['anum'] = 'Arabic Digits' -local register_base_substitution = otf.features.register_base_substitution +local registerbasesubstitution = otf.features.registerbasesubstitution -register_base_substitution('tlig') -register_base_substitution('trep') -register_base_substitution('anum') +registerbasesubstitution('tlig') +registerbasesubstitution('trep') +registerbasesubstitution('anum') -- the functionality is defined elsewhere diff --git a/tex/context/base/font-otd.lua b/tex/context/base/font-otd.lua index 8e770a128..f23ef8eb4 100644 --- a/tex/context/base/font-otd.lua +++ b/tex/context/base/font-otd.lua @@ -20,10 +20,12 @@ otf.features.default = otf.features.default or { } local context_setups = fonts.define.specify.context_setups local context_numbers = fonts.define.specify.context_numbers +-- todo: dynamics namespace + local a_to_script = { } otf.a_to_script = a_to_script local a_to_language = { } otf.a_to_language = a_to_language -function otf.set_dynamics(font,dynamics,attribute) +function otf.setdynamics(font,dynamics,attribute) local features = context_setups[context_numbers[attribute]] -- can be moved to caller if features then local script = features.script or 'dflt' @@ -62,7 +64,7 @@ function otf.set_dynamics(font,dynamics,attribute) tfmdata.shared.features = { } -- end of save local set = fonts.define.check(features,otf.features.default) - dsla = otf.set_features(tfmdata,set) + dsla = otf.setfeatures(tfmdata,set) if trace_dynamics then report_otf("setting dynamics %s: attribute %s, script %s, language %s, set: %s",context_numbers[attribute],attribute,script,language,table.sequenced(set)) end diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 9134f95be..cda1cfdd2 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -1390,7 +1390,7 @@ local lists = { -- why local fonts.manipulators, } -function otf.set_features(tfmdata,features) +function otf.setfeatures(tfmdata,features) local processes = { } if features and next(features) then local mode = tfmdata.mode or features.mode or "base" @@ -1452,52 +1452,6 @@ tfmdata.mode = mode return processes, features end -function otf.otf_to_tfm(specification) - local name = specification.name - local sub = specification.sub - local filename = specification.filename - local format = specification.format - local features = specification.features.normal - local cache_id = specification.hash - local tfmdata = containers.read(tfm.cache,cache_id) ---~ print(cache_id) - if not tfmdata then - local otfdata = otf.load(filename,format,sub,features and features.featurefile) - if otfdata and next(otfdata) then - otfdata.shared = otfdata.shared or { - featuredata = { }, - anchorhash = { }, - initialized = false, - } - tfmdata = otf.copy_to_tfm(otfdata,cache_id) - if tfmdata and next(tfmdata) then - tfmdata.unique = tfmdata.unique or { } - tfmdata.shared = tfmdata.shared or { } -- combine - local shared = tfmdata.shared - shared.otfdata = otfdata - shared.features = features -- default - shared.dynamics = { } - shared.processes = { } - shared.set_dynamics = otf.set_dynamics -- fast access and makes other modules independent - -- this will be done later anyway, but it's convenient to have - -- them already for fast access - tfmdata.luatex = otfdata.luatex - tfmdata.indices = otfdata.luatex.indices - tfmdata.unicodes = otfdata.luatex.unicodes - tfmdata.marks = otfdata.luatex.marks - tfmdata.originals = otfdata.luatex.originals - tfmdata.changed = { } - tfmdata.has_italic = otfdata.metadata.has_italic - if not tfmdata.language then tfmdata.language = 'dflt' end - if not tfmdata.script then tfmdata.script = 'dflt' end - shared.processes, shared.features = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default)) - end - end - containers.write(tfm.cache,cache_id,tfmdata) - end - return tfmdata -end - --~ { --~ ['boundingbox']={ 95, -458, 733, 1449 }, --~ ['class']="base", @@ -1528,7 +1482,7 @@ fonts.formats.ttc = "truetype" fonts.formats.ttf = "truetype" fonts.formats.otf = "opentype" -function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many) +local function copytotfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many) if data then local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { } local luatex = data.luatex @@ -1695,10 +1649,56 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th end end +local function otftotfm(specification) + local name = specification.name + local sub = specification.sub + local filename = specification.filename + local format = specification.format + local features = specification.features.normal + local cache_id = specification.hash + local tfmdata = containers.read(tfm.cache,cache_id) +--~ print(cache_id) + if not tfmdata then + local otfdata = otf.load(filename,format,sub,features and features.featurefile) + if otfdata and next(otfdata) then + otfdata.shared = otfdata.shared or { + featuredata = { }, + anchorhash = { }, + initialized = false, + } + tfmdata = copytotfm(otfdata,cache_id) + if tfmdata and next(tfmdata) then + tfmdata.unique = tfmdata.unique or { } + tfmdata.shared = tfmdata.shared or { } -- combine + local shared = tfmdata.shared + shared.otfdata = otfdata + shared.features = features -- default + shared.dynamics = { } + shared.processes = { } + shared.setdynamics = otf.setdynamics -- fast access and makes other modules independent + -- this will be done later anyway, but it's convenient to have + -- them already for fast access + tfmdata.luatex = otfdata.luatex + tfmdata.indices = otfdata.luatex.indices + tfmdata.unicodes = otfdata.luatex.unicodes + tfmdata.marks = otfdata.luatex.marks + tfmdata.originals = otfdata.luatex.originals + tfmdata.changed = { } + tfmdata.has_italic = otfdata.metadata.has_italic + if not tfmdata.language then tfmdata.language = 'dflt' end + if not tfmdata.script then tfmdata.script = 'dflt' end + shared.processes, shared.features = otf.setfeatures(tfmdata,fonts.define.check(features,otf.features.default)) + end + end + containers.write(tfm.cache,cache_id,tfmdata) + end + return tfmdata +end + otf.features.register('mathsize') -function tfm.read_from_open_type(specification) - local tfmtable = otf.otf_to_tfm(specification) +function tfm.read_from_open_type(specification) -- wrong namespace + local tfmtable = otftotfm(specification) if tfmtable then local otfdata = tfmtable.shared.otfdata tfmtable.name = specification.name diff --git a/tex/context/base/font-oth.lua b/tex/context/base/font-oth.lua index 62ff41c40..448d54b90 100644 --- a/tex/context/base/font-oth.lua +++ b/tex/context/base/font-oth.lua @@ -15,7 +15,7 @@ local collect_lookups = fonts.otf.collect_lookups -- happen when I get the feeling that there is a performance -- penalty involved. -function fonts.otf.get_alternate(tfmdata,k,kind,value) +function fonts.otf.getalternate(tfmdata,k,kind,value) if value then local shared = tfmdata.shared local otfdata = shared and shared.otfdata diff --git a/tex/context/base/font-ott.lua b/tex/context/base/font-ott.lua index 34802de9f..379032f18 100644 --- a/tex/context/base/font-ott.lua +++ b/tex/context/base/font-ott.lua @@ -635,9 +635,9 @@ local baselines = { ['romn'] = 'Roman baseline' } -local to_scripts = table.reverse_hash(scripts ) -local to_languages = table.reverse_hash(languages) -local to_features = table.reverse_hash(features ) +local to_scripts = table.swaphash(scripts ) +local to_languages = table.swaphash(languages) +local to_features = table.swaphash(features ) tables.scripts = scripts tables.languages = languages diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua index 8a18f07b7..39e3df5ea 100644 --- a/tex/context/base/font-syn.lua +++ b/tex/context/base/font-syn.lua @@ -785,10 +785,10 @@ end function names.is_permitted(name) return containers.is_usable(names.cache, name) end -function names.write_data(name,data) +function names.writedata(name,data) containers.write(names.cache,name,data) end -function names.read_data(name) +function names.readdata(name) return containers.read(names.cache,name) end @@ -797,13 +797,13 @@ function names.load(reload,verbose) if reload then if names.is_permitted(names.basename) then names.identify(verbose) - names.write_data(names.basename,names.data) + names.writedata(names.basename,names.data) else report_names("unable to access database cache") end names.saved = true end - local data = names.read_data(names.basename) + local data = names.readdata(names.basename) names.data = data if not names.saved then if not data or not next(data) or not data.specifications or not next(data.specifications) then diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua index c8ad5995e..b1eccca08 100644 --- a/tex/context/base/grph-inc.lua +++ b/tex/context/base/grph-inc.lua @@ -87,7 +87,7 @@ end local validsizes = table.tohash(img.boxes()) local validtypes = table.tohash(img.types()) -function img.check_size(size) +function img.checksize(size) if size then size = gsub(size,"box","") return (validsizes[size] and size) or "crop" @@ -112,7 +112,7 @@ figures.defaultsearch = true figures.defaultwidth = 0 figures.defaultheight = 0 figures.defaultdepth = 0 -figures.n = 0 +figures.nofprocessed = 0 figures.prefer_quality = true -- quality over location figures.localpaths = { @@ -293,7 +293,7 @@ do -- can be determined; at some point the handlers might set them to numbers instead -- local w, h = tonumber(request.width), tonumber(request.height) request.page = math.max(tonumber(request.page) or 1,1) - request.size = img.check_size(request.size) + request.size = img.checksize(request.size) request.object = iv[request.object] == variables.yes request["repeat"] = iv[request["repeat"]] == variables.yes request.preview = iv[request.preview] == variables.yes @@ -666,7 +666,7 @@ figures.identifiers = figures.identifiers or { } local identifiers = figures.identifiers figures.programs = figures.programs or { } -programs = figures.programs +local programs = figures.programs function identifiers.default(data) local dr, du, ds = data.request, data.used, data.status @@ -713,7 +713,7 @@ function figures.scale(data) -- will become lua code return data end function figures.done(data) - figures.n = figures.n + 1 + figures.nofprocessed = figures.nofprocessed + 1 data = data or figures.current() --~ print(table.serialize(figures.current())) local dr, du, ds, nr = data.request, data.used, data.status, figures.boxnumber @@ -1140,9 +1140,9 @@ identifiers.list = { -- tracing statistics.register("graphics processing time", function() - local n = figures.n - if n > 0 then - return format("%s seconds including tex, n=%s", statistics.elapsedtime(figures),n) + local nofprocessed = figures.nofprocessed + if nofprocessed > 0 then + return format("%s seconds including tex, %s processed images", statistics.elapsedtime(figures),nofprocessed) else return nil end diff --git a/tex/context/base/java-ini.lua b/tex/context/base/java-ini.lua index 98c7145af..0c7cdcfa4 100644 --- a/tex/context/base/java-ini.lua +++ b/tex/context/base/java-ini.lua @@ -10,6 +10,8 @@ local format = string.format local concat = table.concat local lpegmatch, lpegP, lpegR, lpegS, lpegC = lpeg.match, lpeg.P, lpeg.R, lpeg.S, lpeg.C +-- todo: don't flush scripts if no JS key + interactions.javascripts = interactions.javascripts or { } local javascripts = interactions.javascripts javascripts.codes = javascripts.codes or { } @@ -89,6 +91,8 @@ end local splitter = lpeg.Ct(lpeg.splitat(lpeg.patterns.commaspacer)) +local used = false + function javascripts.code(name,arguments) local c = codes[name] if c then @@ -99,10 +103,12 @@ function javascripts.code(name,arguments) preambles[p][1] = "now" end end + used = true return code end local f = functions[name] if f then + used = true if arguments then local args = lpegmatch(splitter,arguments) for i=1,#args do -- can be a helper @@ -117,10 +123,12 @@ end function javascripts.flushpreambles() local t = { } - for i=1,#preambles do - local preamble = preambles[i] - if preamble[2] == "now" then - t[#t+1] = { preamble[1], preamble[3] } + if used then + for i=1,#preambles do + local preamble = preambles[i] + if preamble[2] == "now" then + t[#t+1] = { preamble[1], preamble[3] } + end end end return t diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua index 04b3925e7..455f71b53 100644 --- a/tex/context/base/l-dir.lua +++ b/tex/context/base/l-dir.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['l-dir'] = { license = "see context related readme files" } --- dir.expand_name will be merged with cleanpath and collapsepath +-- dir.expandname will be merged with cleanpath and collapsepath local type = type local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub @@ -35,7 +35,7 @@ end -- optimizing for no find (*) does not save time -local function glob_pattern(path,patt,recurse,action) +local function globpattern(path,patt,recurse,action) local ok, scanner if path == "/" then ok, scanner = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe @@ -52,15 +52,15 @@ local function glob_pattern(path,patt,recurse,action) action(full) end elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then - glob_pattern(full,patt,recurse,action) + globpattern(full,patt,recurse,action) end end end end -dir.glob_pattern = glob_pattern +dir.globpattern = globpattern -local function collect_pattern(path,patt,recurse,result) +local function collectpattern(path,patt,recurse,result) local ok, scanner result = result or { } if path == "/" then @@ -79,7 +79,7 @@ local function collect_pattern(path,patt,recurse,result) result[name] = attr end elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then - attr.list = collect_pattern(full,patt,recurse) + attr.list = collectpattern(full,patt,recurse) result[name] = attr end end @@ -87,7 +87,7 @@ local function collect_pattern(path,patt,recurse,result) return result end -dir.collect_pattern = collect_pattern +dir.collectpattern = collectpattern local pattern = Ct { [1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3), @@ -120,7 +120,7 @@ local function glob(str,t) local recurse = find(base,"%*%*") local start = root .. path local result = lpegmatch(filter,start .. base) - glob_pattern(start,result,recurse,t) + globpattern(start,result,recurse,t) end end else @@ -143,7 +143,7 @@ local function glob(str,t) local recurse = find(base,"%*%*") local start = root .. path local result = lpegmatch(filter,start .. base) - glob_pattern(start,result,recurse,action) + globpattern(start,result,recurse,action) return t else return { } @@ -277,7 +277,7 @@ if find(os.getenv("PATH"),";") then -- os.type == "windows" --~ print(dir.mkdirs("///a/b/c")) --~ print(dir.mkdirs("a/bbb//ccc/")) - function dir.expand_name(str) -- will be merged with cleanpath and collapsepath + function dir.expandname(str) -- will be merged with cleanpath and collapsepath local first, nothing, last = match(str,"^(//)(//*)(.*)$") if first then first = dir.current() .. "/" @@ -357,7 +357,7 @@ else --~ print(dir.mkdirs("///a/b/c")) --~ print(dir.mkdirs("a/bbb//ccc/")) - function dir.expand_name(str) -- will be merged with cleanpath and collapsepath + function dir.expandname(str) -- will be merged with cleanpath and collapsepath if not find(str,"^/") then str = currentdir() .. "/" .. str end diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua index 1b4e91f77..edc1dc9e4 100644 --- a/tex/context/base/l-file.lua +++ b/tex/context/base/l-file.lua @@ -8,13 +8,13 @@ if not modules then modules = { } end modules ['l-file'] = { -- needs a cleanup -file = file or { } +file = file or { } local file = file local insert, concat = table.insert, table.concat local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char local lpegmatch = lpeg.match -local getcurrentdir = lfs.currentdir +local getcurrentdir, attributes = lfs.currentdir, lfs.attributes local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc @@ -146,18 +146,18 @@ end --~ print(file.join("http:///a","/y")) --~ print(file.join("//nas-1","/y")) -function file.iswritable(name) - local a = lfs.attributes(name) or lfs.attributes(dirname(name,".")) +function file.is_writable(name) + local a = attributes(name) or attributes(dirname(name,".")) return a and sub(a.permissions,2,2) == "w" end -function file.isreadable(name) - local a = lfs.attributes(name) +function file.is_readable(name) + local a = attributes(name) return a and sub(a.permissions,1,1) == "r" end -file.is_readable = file.isreadable -file.is_writable = file.iswritable +file.isreadable = file.is_readable -- depricated +file.iswritable = file.is_writable -- depricated -- todo: lpeg @@ -189,7 +189,7 @@ end --~ function file.old_collapse_path(str) -- fails on b.c/.. --~ str = gsub(str,"\\","/") --~ if find(str,"/") then ---~ str = gsub(str,"^%./",(gsub(lfs.currentdir(),"\\","/")) .. "/") -- ./xx in qualified +--~ str = gsub(str,"^%./",(gsub(getcurrentdir(),"\\","/")) .. "/") -- ./xx in qualified --~ str = gsub(str,"/%./","/") --~ local n, m = 1, 1 --~ while n > 0 or m > 0 do @@ -418,8 +418,8 @@ end --~ -- todo: --~ --~ if os.type == "windows" then ---~ local currentdir = lfs.currentdir ---~ function lfs.currentdir() +--~ local currentdir = getcurrentdir +--~ function getcurrentdir() --~ return (gsub(currentdir(),"\\","/")) --~ end --~ end diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua index cc04168e9..d0f58b37d 100644 --- a/tex/context/base/l-string.lua +++ b/tex/context/base/l-string.lua @@ -30,7 +30,9 @@ if not string.split then end -local chr_to_esc = { +string.patterns = { } + +local escapes = { ["%"] = "%%", ["."] = "%.", ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", @@ -40,10 +42,10 @@ local chr_to_esc = { ["{"] = "%{", ["}"] = "%}" } -string.chr_to_esc = chr_to_esc +string.patterns.escapes = escapes function string:esc() -- variant 2 - return (gsub(self,"(.)",chr_to_esc)) + return (gsub(self,"(.)",escapes)) end function string:unquote() @@ -110,21 +112,6 @@ function string:enhance(pattern,action) return self, n end -local chr_to_hex, hex_to_chr = { }, { } - -for i=0,255 do - local c, h = char(i), format("%02X",i) - chr_to_hex[c], hex_to_chr[h] = h, c -end - -function string:to_hex() - return (gsub(self or "","(.)",chr_to_hex)) -end - -function string:from_hex() - return (gsub(self or "","(..)",hex_to_chr)) -end - if not string.characters then local function nextchar(str, index) @@ -144,8 +131,6 @@ if not string.characters then end --- we can use format for this (neg n) - function string:rpadd(n,chr) local m = n-#self if m > 0 then @@ -166,18 +151,6 @@ end string.padd = string.rpadd -function string:split_settings() -- no {} handling, see l-aux for lpeg variant - if find(self,"=") then - local t = { } - for k,v in gmatch(self,"(%a+)=([^%,]*)") do - t[k] = v - end - return t - else - return nil - end -end - local patterns_escapes = { ["-"] = "%-", ["."] = "%.", @@ -190,7 +163,7 @@ local patterns_escapes = { ["]"] = "%]", } -function string:pattesc() +function string:escapedpattern() return (gsub(self,".",patterns_escapes)) end @@ -201,7 +174,7 @@ local simple_escapes = { ["*"] = ".*", } -function string:simpleesc() +function string:partialescapedpattern() return (gsub(self,".",simple_escapes)) end diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua index 67216d1f5..331bd9ca0 100644 --- a/tex/context/base/l-table.lua +++ b/tex/context/base/l-table.lua @@ -264,15 +264,11 @@ function table.is_empty(t) -- obolete, use inline code instead return not t or not next(t) end -function table.one_entry(t) -- obolete, use inline code instead +function table.has_one_entry(t) local n = next(t) return n and not next(t,n) end ---~ function table.starts_at(t) -- obsolete, not nice anyway ---~ return ipairs(t,1)(t,0) ---~ end - function table.tohash(t,value) local h = { } if t then @@ -694,7 +690,7 @@ function table.unnest(t) -- bad name return f end -table.flatten_one_level = table.unnest +table.flattenonelevel = table.unnest -- a better one: @@ -714,51 +710,6 @@ end table.flattened = flattened --- the next three may disappear - -function table.remove_value(t,value) -- todo: n - if value then - for i=1,#t do - if t[i] == value then - remove(t,i) - -- remove all, so no: return - end - end - end -end - -function table.insert_before_value(t,value,str) - if str then - if value then - for i=1,#t do - if t[i] == value then - insert(t,i,str) - return - end - end - end - insert(t,1,str) - elseif value then - insert(t,1,value) - end -end - -function table.insert_after_value(t,value,str) - if str then - if value then - for i=1,#t do - if t[i] == value then - insert(t,i+1,str) - return - end - end - end - t[#t+1] = str - elseif value then - t[#t+1] = value - end -end - local function are_equal(a,b,n,m) -- indexed if a and b and #a == #b then n = n or 1 @@ -873,7 +824,7 @@ function table.hexed(t,seperator) return concat(tt,seperator or " ") end -function table.reverse_hash(h) -- needs another name +function table.swaphash(h) -- needs another name local r = { } for k,v in next, h do r[v] = lower(gsub(k," ","")) @@ -891,36 +842,6 @@ function table.reverse(t) return tt end -function table.insert_before_value(t,value,extra) - for i=1,#t do - if t[i] == extra then - remove(t,i) - end - end - for i=1,#t do - if t[i] == value then - insert(t,i,extra) - return - end - end - insert(t,1,extra) -end - -function table.insert_after_value(t,value,extra) - for i=1,#t do - if t[i] == extra then - remove(t,i) - end - end - for i=1,#t do - if t[i] == value then - insert(t,i+1,extra) - return - end - end - insert(t,#t+1,extra) -end - function table.sequenced(t,sep,simple) -- hash only local s = { } for k, v in sortedhash(t) do diff --git a/tex/context/base/lang-wrd.lua b/tex/context/base/lang-wrd.lua index 43e91f09d..5e6cf7934 100644 --- a/tex/context/base/lang-wrd.lua +++ b/tex/context/base/lang-wrd.lua @@ -34,7 +34,7 @@ local kerncodes = nodes.kerncodes local glyph_node = nodecodes.glyph local disc_node = nodecodes.disc -local kern_no de = nodecodes.kern +local kern_node = nodecodes.kern local kerning_code = kerncodes.kerning diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua index f05dcaa85..01c791d69 100644 --- a/tex/context/base/lpdf-fld.lua +++ b/tex/context/base/lpdf-fld.lua @@ -13,6 +13,7 @@ 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) @@ -40,6 +41,7 @@ local pdfstring = lpdf.string local pdfconstant = lpdf.constant local pdftoeight = lpdf.toeight local pdfflushobject = lpdf.flushobject +local pdfsharedobject = lpdf.sharedobject local pdfreserveobject = lpdf.reserveobject local nodepool = nodes.pool @@ -193,10 +195,10 @@ local function fieldsurrounding(specification) alternative, a = "tf", s.tf end local tag = style .. alternative - size = string.todimen(size) + size = todimen(size) local stream = pdfstream { pdfconstant(tag), - format("%0.4f Tf",(size and (number.dimenfactors.bp * size)) or 12), + format("%0.4f Tf",(size and (bpfactor * size)) or 12), } usedfonts[tag] = a -- the name -- add color to stream: 0 g @@ -252,7 +254,7 @@ local function fieldappearances(specification) local appearance = pdfdictionary { -- cache this one N = registeredsymbol(n), R = registeredsymbol(r), D = registeredsymbol(d), } - return lpdf.sharedobj(tostring(appearance)) + return pdfsharedobject(tostring(appearance)) end local function fieldstates(specification,forceyes,values,default) @@ -314,7 +316,7 @@ local function fieldstates(specification,forceyes,values,default) R = pdfdictionary { [forceyes or yesr] = registeredsymbol(yesr), Off = registeredsymbol(offr) }, D = pdfdictionary { [forceyes or yesd] = registeredsymbol(yesd), Off = registeredsymbol(offd) } } - local appearanceref = lpdf.sharedobj(tostring(appearance)) + local appearanceref = pdfsharedobject(tostring(appearance)) return appearanceref, default end @@ -668,7 +670,6 @@ function methods.line(name,specification,variant,extras) F = fieldplus(specification), Ff = fieldflag(specification), OC = fieldlayer(specification), - MK = fieldsurrounding(specification), -- needed ? DA = fieldsurrounding(specification), AA = fieldactions(specification), FT = pdf_tx, @@ -690,7 +691,6 @@ function methods.line(name,specification,variant,extras) F = fieldplus(specification), DA = fieldattributes(specification), OC = fieldlayer(specification), - MK = fieldsurrounding(specification), DA = fieldsurrounding(specification), AA = fieldactions(specification), Q = fieldalignment(specification), @@ -870,13 +870,14 @@ function methods.sub(name,specification,variant) -- enhance(specification,"Radio,RadiosInUnison") enhance(specification,"RadiosInUnison") -- maybe also PushButton as acrobat does local d = pdfdictionary { - T = parent.name, - FT = pdf_btn, - Rect = pdf_no_rect, - F = fieldplus(specification), - Ff = fieldflag(specification), - H = pdf_n, - V = default, + Subtype = pdf_widget, + T = parent.name, + FT = pdf_btn, + Rect = pdf_no_rect, + F = fieldplus(specification), + Ff = fieldflag(specification), + H = pdf_n, + V = default, } save_parent(parent,specification,d) end diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua index 55da04da4..07e1962cd 100644 --- a/tex/context/base/lpdf-ini.lua +++ b/tex/context/base/lpdf-ini.lua @@ -409,7 +409,7 @@ function lpdf.flushobject(name,data) end end -function lpdf.sharedobj(content) +function lpdf.sharedobject(content) local r = cache[content] if not r then r = pdfreference(pdfimmediateobject(content)) diff --git a/tex/context/base/lpdf-tag.lua b/tex/context/base/lpdf-tag.lua index 48140f53d..4e297b91c 100644 --- a/tex/context/base/lpdf-tag.lua +++ b/tex/context/base/lpdf-tag.lua @@ -386,8 +386,7 @@ function nodeinjections.addtags(head) end function codeinjections.enabletags(tg,lb) - taglist = tg - usedlabels = lb + taglist, usedlabels = tg, lb structures.tags.handler = nodeinjections.addtags tasks.enableaction("shipouts","structures.tags.handler") tasks.enableaction("shipouts","nodes.handlers.accessibility") diff --git a/tex/context/base/luat-cbk.lua b/tex/context/base/luat-cbk.lua index 9ecf64264..454c89425 100644 --- a/tex/context/base/luat-cbk.lua +++ b/tex/context/base/luat-cbk.lua @@ -53,40 +53,31 @@ local delayed = table.tohash { } -if not callback.original_register then - - callback.original_register = register_callback - - local original_register = register_callback - - if trace_calls then +if trace_calls then - local functions = { } + local functions = { } + local original = register_callback - register_callback = function(name,func) - if type(func) == "function" then - if functions[name] then - functions[name] = func - return find_callback(name) - else - functions[name] = func - local cnuf = function(...) - list[name] = list[name] + 1 - return functions[name](...) - end - return original_register(name,cnuf) - end + register_callback = function(name,func) + if type(func) == "function" then + if functions[name] then + functions[name] = func + return find_callback(name) else - return original_register(name,func) + functions[name] = func + local cnuf = function(...) + list[name] = list[name] + 1 + return functions[name](...) + end + return original(name,cnuf) end + else + return original(name,func) end - end end -callback.register = register_callback - local function frozen_message(what,name) report_callbacks("not %s frozen '%s' (%s)",what,name,frozen[name]) end @@ -133,7 +124,7 @@ end function callbacks.freeze(name,freeze) freeze = type(freeze) == "string" and freeze if find(name,"%*") then - local pattern = name -- string.simpleesc(name) + local pattern = name -- string.partialescapedpattern(name) for name, _ in next, list do if find(name,pattern) then frozen[name] = freeze or frozen[name] or "frozen" diff --git a/tex/context/base/luat-cnf.lua b/tex/context/base/luat-cnf.lua index 8d9c33739..4e723afee 100644 --- a/tex/context/base/luat-cnf.lua +++ b/tex/context/base/luat-cnf.lua @@ -15,7 +15,7 @@ texconfig.shell_escape = 't' luatex = luatex or { } local luatex = luatex -luatex.variablenames = { +local variablenames = { -- most of this becomes obsolete 'buf_size', -- 3000 'dvi_buf_size', -- 16384 'error_line', -- 79 @@ -36,21 +36,19 @@ luatex.variablenames = { 'strings_free', -- 100 } -function luatex.variables() - local t = { } - for _,v in next, luatex.variablenames do - local x = resolvers.var_value(v) - t[v] = tonumber(x) or x +local function initialize() + local t, var_value = { }, resolvers.var_value + for i=1,#variablenames do + local name = variablenames[i] + local value = var_value(name) + value = tonumber(value) or value + texconfig[name], t[name] = value, value end + initialize = nil return t end -if not luatex.variables_set then - for k, v in next, luatex.variables() do - texconfig[k] = v - end - luatex.variables_set = true -end +luatex.variables = initialize() local stub = [[ @@ -160,7 +158,7 @@ local function makestub() "-- this file is generated, don't change it\n", "-- configuration (can be overloaded later)\n" } - for _,v in next, luatex.variablenames do + for _,v in next, variablenames do local tv = texconfig[v] if tv and tv ~= "" then t[#t+1] = format("texconfig.%s=%s",v,tv) @@ -170,8 +168,3 @@ local function makestub() end lua.registerfinalizer(makestub,"create stub file") - --- to be moved here: --- --- statistics.report_storage("log") --- statistics.save_fmt_status("\jobname","\contextversion","context.tex") diff --git a/tex/context/base/luat-dum.lua b/tex/context/base/luat-dum.lua index 614c7d8f8..a8eed5d88 100644 --- a/tex/context/base/luat-dum.lua +++ b/tex/context/base/luat-dum.lua @@ -104,7 +104,7 @@ do cachepaths = string.split(cachepaths,os.type == "windows" and ";" or ":") for i=1,#cachepaths do - if file.iswritable(cachepaths[i]) then + if file.is_writable(cachepaths[i]) then writable = file.join(cachepaths[i],"luatex-cache") lfs.mkdir(writable) writable = file.join(writable,caches.namespace) @@ -114,7 +114,7 @@ do end for i=1,#cachepaths do - if file.isreadable(cachepaths[i]) then + if file.is_readable(cachepaths[i]) then readables[#readables+1] = file.join(cachepaths[i],"luatex-cache",caches.namespace) end end @@ -157,9 +157,9 @@ local function makefullname(path,name) end end -function caches.iswritable(path,name) +function caches.is_writable(path,name) local fullname = makefullname(path,name) - return fullname and file.iswritable(fullname) + return fullname and file.is_writable(fullname) end function caches.loaddata(paths,name) diff --git a/tex/context/base/luat-env.lua b/tex/context/base/luat-env.lua index 975950118..5fa9550f7 100644 --- a/tex/context/base/luat-env.lua +++ b/tex/context/base/luat-env.lua @@ -77,7 +77,7 @@ local mt = { setmetatable(environment,mt) -function environment.initialize_arguments(arg) +function environment.initializearguments(arg) local arguments, files = { }, { } environment.arguments, environment.files, environment.sortedflags = arguments, files, nil for index=1,#arg do @@ -131,11 +131,11 @@ function environment.argument(name,partial) return nil end -function environment.split_arguments(separator) -- rather special, cut-off before separator +function environment.splitarguments(separator) -- rather special, cut-off before separator local done, before, after = false, { }, { } - local original_arguments = environment.original_arguments - for k=1,#original_arguments do - local v = original_arguments[k] + local originalarguments = environment.originalarguments + for k=1,#originalarguments do + local v = originalarguments[k] if not done and v == separator then done = true elseif done then @@ -147,8 +147,8 @@ function environment.split_arguments(separator) -- rather special, cut-off befor return before, after end -function environment.reconstruct_commandline(arg,noquote) - arg = arg or environment.original_arguments +function environment.reconstructcommandline(arg,noquote) + arg = arg or environment.originalarguments if noquote and #arg == 1 then local a = arg[1] a = resolvers.resolve(a) @@ -198,9 +198,10 @@ if arg then newarg[i] = arg[i] end - environment.initialize_arguments(newarg) - environment.original_arguments = newarg - environment.raw_arguments = arg + environment.initializearguments(newarg) + + environment.originalarguments = newarg + environment.rawarguments = arg arg = { } -- prevent duplicate handling diff --git a/tex/context/base/luat-fmt.lua b/tex/context/base/luat-fmt.lua index 14727d894..13f751215 100644 --- a/tex/context/base/luat-fmt.lua +++ b/tex/context/base/luat-fmt.lua @@ -41,7 +41,7 @@ function environment.make_format(name) else logs.simple("using tex source file: %s",fulltexsourcename) end - local texsourcepath = dir.expand_name(file.dirname(fulltexsourcename)) -- really needed + local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed -- check specification local specificationname = file.replacesuffix(fulltexsourcename,"lus") local fullspecificationname = resolvers.find_file(specificationname,"tex") or "" diff --git a/tex/context/base/luat-iop.lua b/tex/context/base/luat-iop.lua index 5d0d1f6c9..e6f8a7433 100644 --- a/tex/context/base/luat-iop.lua +++ b/tex/context/base/luat-iop.lua @@ -29,10 +29,10 @@ local function o_permit (name) out_permitted[#out_permitted+1] = name end ioinp.inhibit, ioinp.permit = i_inhibit, o_permit ioout.inhibit, ioout.permit = o_inhibit, o_permit -local blocked_openers = { } -- *.open(name,method) +local blockedopeners = { } -- *.open(name,method) -function io.register_opener(func) - blocked_openers[#blocked_openers+1] = func +function io.registeropener(func) + blockedopeners[#blockedopeners+1] = func end local function checked(name,blocked,permitted) @@ -50,7 +50,7 @@ local function checked(name,blocked,permitted) return true end -function io.finalize_openers(func) +function io.finalizeopeners(func) if #out_blocked > 0 or #inp_blocked > 0 then local open = func -- why not directly? return function(name,method) @@ -78,7 +78,7 @@ end --~ io.inp.inhibit('/winnt/') --~ io.inp.permit('c:/windows/wmsetup.log') ---~ io.open = io.finalize_openers(io.open) +--~ io.open = io.finalizeopeners(io.open) --~ f = io.open('.tex') print(f) --~ f = io.open('tufte.tex') print(f) diff --git a/tex/context/base/luat-lua.lua b/tex/context/base/luat-lua.lua index b964bf8e8..50492540d 100644 --- a/tex/context/base/luat-lua.lua +++ b/tex/context/base/luat-lua.lua @@ -10,11 +10,7 @@ if lua then do local delayed = { } - function lua.delay(f) - delayed[#delayed+1] = f - end - - function lua.flush_delayed(...) + local function flushdelayed(...) local t = delayed delayed = { } for i=1, #t do @@ -22,8 +18,12 @@ if lua then do end end + function lua.delay(f) + delayed[#delayed+1] = f + end + function lua.flush(...) - tex.sprint("\\directlua0{lua.flush_delayed(",table.concat({...},','),")}") + tex.sprint("\\directlua{flushdelayed(",table.concat({...},','),")}") end end end diff --git a/tex/context/base/luat-run.lua b/tex/context/base/luat-run.lua index 00ed54bfd..46173ecf8 100644 --- a/tex/context/base/luat-run.lua +++ b/tex/context/base/luat-run.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['luat-run'] = { } local format, rpadd = string.format, string.rpadd +local insert = table.insert local trace_lua_dump = false trackers .register("system.dump", function(v) trace_lua_dump = v end) @@ -15,32 +16,32 @@ local report_lua_dump = logs.new("lua dump actions") luatex = luatex or { } local luatex = luatex -local start_actions = { } -local stop_actions = { } +local startactions = { } +local stopactions = { } -function luatex.register_start_actions(...) table.insert(start_actions, ...) end -function luatex.register_stop_actions (...) table.insert(stop_actions, ...) end +function luatex.registerstartactions(...) insert(startactions, ...) end +function luatex.registerstopactions (...) insert(stopactions, ...) end -luatex.show_tex_stat = luatex.show_tex_stat or function() end -luatex.show_job_stat = luatex.show_job_stat or statistics.show_job_stat +luatex.showtexstat = luatex.showtexstat or function() end +luatex.showjobstat = luatex.showjobstat or statistics.showjobstat local function start_run() if logs.start_run then logs.start_run() end - for _, action in next, start_actions do - action() + for i=1,#startactions do + startactions[i]() end end local function stop_run() - for _, action in next, stop_actions do - action() + for i=1,#stopactions do + stopactions[i]() end - if luatex.show_job_stat then + if luatex.showjobstat then statistics.show(logs.report_job_stat) end - if luatex.show_tex_stat then + if luatex.showtexstat then for k,v in next, status.list() do logs.report_tex_stat(k,v) end @@ -66,6 +67,8 @@ end local function pre_dump_actions() lua.finalize(trace_lua_dump and report_lua_dump or nil) + statistics.reportstorage("log") + -- statistics.savefmtstatus("\jobname","\contextversion","context.tex") end -- this can be done later diff --git a/tex/context/base/luat-sto.lua b/tex/context/base/luat-sto.lua index f234a0628..0c810021d 100644 --- a/tex/context/base/luat-sto.lua +++ b/tex/context/base/luat-sto.lua @@ -113,7 +113,7 @@ if lua.bytedata then storage.register("lua/bytedata",lua.bytedata,"lua.bytedata") end -function statistics.report_storage(whereto) +function statistics.reportstorage(whereto) whereto = whereto or "term and log" write_nl(whereto," ","stored tables:"," ") for k,v in table.sortedhash(storage.data) do diff --git a/tex/context/base/lxml-aux.lua b/tex/context/base/lxml-aux.lua index 4ac3f0359..f2e3ee61e 100644 --- a/tex/context/base/lxml-aux.lua +++ b/tex/context/base/lxml-aux.lua @@ -15,8 +15,9 @@ local report_xml = logs.new("xml") local xml = xml -local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name +local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name local xmlinheritedconvert = xml.inheritedconvert +local xmlapplylpath = xml.applylpath local type = type local insert, remove = table.insert, table.remove @@ -77,10 +78,8 @@ function xml.withelement(e,n,handle) -- slow end end -xml.elements_only = xml.collected - -function xml.each_element(root,pattern,handle,reverse) - local collected = xmlparseapply({ root },pattern) +function xml.each(root,pattern,handle,reverse) + local collected = xmlapplylpath({ root },pattern) if collected then if reverse then for c=#collected,1,-1 do @@ -95,10 +94,8 @@ function xml.each_element(root,pattern,handle,reverse) end end -xml.process_elements = xml.each_element - -function xml.process_attributes(root,pattern,handle) - local collected = xmlparseapply({ root },pattern) +function xml.processattributes(root,pattern,handle) + local collected = xmlapplylpath({ root },pattern) if collected and handle then for c=1,#collected do handle(collected[c].at) @@ -113,12 +110,12 @@ end -- are these still needed -> lxml-cmp.lua -function xml.collect_elements(root, pattern) - return xmlparseapply({ root },pattern) +function xml.collect(root, pattern) + return xmlapplylpath({ root },pattern) end -function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle - local collected = xmlparseapply({ root },pattern) +function xml.collecttexts(root, pattern, flatten) -- todo: variant with handle + local collected = xmlapplylpath({ root },pattern) if collected and flatten then local xmltostring = xml.tostring for c=1,#collected do @@ -129,7 +126,7 @@ function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle end function xml.collect_tags(root, pattern, nonamespace) - local collected = xmlparseapply({ root },pattern) + local collected = xmlapplylpath({ root },pattern) if collected then local t = { } for c=1,#collected do @@ -153,7 +150,7 @@ end local no_root = { no_root = true } -function xml.redo_ni(d) +local function redo_ni(d) for k=1,#d do local dk = d[k] if type(dk) == "table" then @@ -199,8 +196,8 @@ local function copiedelement(element,newparent) end end -function xml.delete_element(root,pattern) - local collected = xmlparseapply({ root },pattern) +function xml.delete(root,pattern) + local collected = xmlapplylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -211,15 +208,15 @@ function xml.delete_element(root,pattern) end local d = p.dt remove(d,e.ni) - xml.redo_ni(d) -- can be made faster and inlined + redo_ni(d) -- can be made faster and inlined end end end end -function xml.replace_element(root,pattern,whatever) +function xml.replace(root,pattern,whatever) local element = root and xmltoelement(whatever,root) - local collected = element and xmlparseapply({ root },pattern) + local collected = element and xmlapplylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -230,7 +227,7 @@ function xml.replace_element(root,pattern,whatever) end local d = p.dt d[e.ni] = copiedelement(element,p) - xml.redo_ni(d) -- probably not needed + redo_ni(d) -- probably not needed end end end @@ -238,7 +235,7 @@ end local function inject_element(root,pattern,whatever,prepend) local element = root and xmltoelement(whatever,root) - local collected = element and xmlparseapply({ root },pattern) + local collected = element and xmlapplylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -261,7 +258,7 @@ local function inject_element(root,pattern,whatever,prepend) else d[k].dt = be end - xml.redo_ni(d) + redo_ni(d) end end end @@ -269,7 +266,7 @@ end local function insert_element(root,pattern,whatever,before) -- todo: element als functie local element = root and xmltoelement(whatever,root) - local collected = element and xmlparseapply({ root },pattern) + local collected = element and xmlapplylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -279,24 +276,23 @@ local function insert_element(root,pattern,whatever,before) -- todo: element als k = k + 1 end insert(d,k,copiedelement(element,r)) - xml.redo_ni(d) + redo_ni(d) end end end -xml.insert_element = insert_element -xml.insert_element_after = insert_element -xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end -xml.inject_element = inject_element -xml.inject_element_after = inject_element -xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end +xml.insert_element = insert_element +xml.insertafter = insert_element +xml.insertbefore = function(r,p,e) insert_element(r,p,e,true) end +xml.injectafter = inject_element +xml.injectbefore = function(r,p,e) inject_element(r,p,e,true) end local function include(xmldata,pattern,attribute,recursive,loaddata) -- parse="text" (default: xml), encoding="" (todo) -- attribute = attribute or 'href' pattern = pattern or 'include' loaddata = loaddata or io.loaddata - local collected = xmlparseapply({ xmldata },pattern) + local collected = xmlapplylpath({ xmldata },pattern) if collected then for c=1,#collected do local ek = collected[c] @@ -339,65 +335,8 @@ end xml.include = include ---~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away ---~ local collected = xmlparseapply({ xmldata },pattern) ---~ if collected then ---~ local xmltostring = xml.tostring ---~ for c=1,#collected do ---~ local e = collected[c] ---~ local data = manipulator(xmltostring(e)) ---~ if data == "" then ---~ epdt[e.ni] = "" ---~ else ---~ local xi = xmlinheritedconvert(data,xmldata) ---~ if not xi then ---~ epdt[e.ni] = "" ---~ else ---~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi) ---~ end ---~ end ---~ end ---~ end ---~ end - ---~ xml.manipulate = manipulate - -function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space ! - local collected = xmlparseapply({ root },pattern) - if collected then - for i=1,#collected do - local e = collected[i] - local edt = e.dt - if edt then - local t = { } - for i=1,#edt do - local str = edt[i] - if type(str) == "string" then - if str == "" then - -- stripped - else - if nolines then - str = gsub(str,"[ \n\r\t]+"," ") - end - if str == "" then - -- stripped - else - t[#t+1] = str - end - end - else - --~ str.ni = i - t[#t+1] = str - end - end - e.dt = t - end - end - end -end - -function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing - local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now +function xml.strip(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing + local collected = xmlapplylpath({ root },pattern) -- beware, indices no longer are valid now if collected then for i=1,#collected do local e = collected[i] @@ -468,7 +407,7 @@ function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all le end end -local function rename_space(root, oldspace, newspace) -- fast variant +local function renamespace(root, oldspace, newspace) -- fast variant local ndt = #root.dt for i=1,ndt or 0 do local e = root[i] @@ -481,16 +420,16 @@ local function rename_space(root, oldspace, newspace) -- fast variant end local edt = e.dt if edt then - rename_space(edt, oldspace, newspace) + renamespace(edt, oldspace, newspace) end end end end -xml.rename_space = rename_space +xml.renamespace = renamespace -function xml.remap_tag(root, pattern, newtg) - local collected = xmlparseapply({ root },pattern) +function xml.remaptag(root, pattern, newtg) + local collected = xmlapplylpath({ root },pattern) if collected then for c=1,#collected do collected[c].tg = newtg @@ -498,8 +437,8 @@ function xml.remap_tag(root, pattern, newtg) end end -function xml.remap_namespace(root, pattern, newns) - local collected = xmlparseapply({ root },pattern) +function xml.remapnamespace(root, pattern, newns) + local collected = xmlapplylpath({ root },pattern) if collected then for c=1,#collected do collected[c].ns = newns @@ -507,8 +446,8 @@ function xml.remap_namespace(root, pattern, newns) end end -function xml.check_namespace(root, pattern, newns) - local collected = xmlparseapply({ root },pattern) +function xml.checknamespace(root, pattern, newns) + local collected = xmlapplylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -519,8 +458,8 @@ function xml.check_namespace(root, pattern, newns) end end -function xml.remap_name(root, pattern, newtg, newns, newrn) - local collected = xmlparseapply({ root },pattern) +function xml.remapname(root, pattern, newtg, newns, newrn) + local collected = xmlapplylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -533,15 +472,31 @@ end <p>Here are a few synonyms.</p> --ldx]]-- -xml.each = xml.each_element -xml.process = xml.process_element -xml.strip = xml.strip_whitespace -xml.collect = xml.collect_elements -xml.all = xml.collect_elements - -xml.insert = xml.insert_element_after -xml.inject = xml.inject_element_after -xml.after = xml.insert_element_after -xml.before = xml.insert_element_before -xml.delete = xml.delete_element -xml.replace = xml.replace_element +xml.all = xml.each +xml.insert = xml.insertafter +xml.inject = xml.injectafter +xml.after = xml.insertafter +xml.before = xml.insertbefore +xml.process = xml.each + +-- obsolete + +xml.obsolete = xml.obsolete or { } +local obsolete = xml.obsolete + +xml.strip_whitespace = xml.strip obsolete.strip_whitespace = xml.strip +xml.collect_elements = xml.collect obsolete.collect_elements = xml.collect +xml.delete_element = xml.delete obsolete.delete_element = xml.delete +xml.replace_element = xml.replace obsolete.replace_element = xml.replacet +xml.each_element = xml.each obsolete.each_element = xml.each +xml.process_elements = xml.process obsolete.process_elements = xml.process +xml.insert_element_after = xml.insertafter obsolete.insert_element_after = xml.insertafter +xml.insert_element_before = xml.insertbefore obsolete.insert_element_before = xml.insertbefore +xml.inject_element_after = xml.injectafter obsolete.inject_element_after = xml.injectafter +xml.inject_element_before = xml.injectbefore obsolete.inject_element_before = xml.injectbefore +xml.process_attributes = xml.processattributes obsolete.process_attributes = xml.processattributes +xml.collect_texts = xml.collecttexts obsolete.collect_texts = xml.collecttexts +xml.inject_element = xml.inject obsolete.inject_element = xml.inject +xml.remap_tag = xml.remaptag obsolete.remap_tag = xml.remaptag +xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname +xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace diff --git a/tex/context/base/lxml-ctx.lua b/tex/context/base/lxml-ctx.lua index cbd3c6727..04f1c58e0 100644 --- a/tex/context/base/lxml-ctx.lua +++ b/tex/context/base/lxml-ctx.lua @@ -41,8 +41,8 @@ function xml.ctx.tshow(specification) if not string.find(xmlpattern,"^[%a]+://") then xmlpattern = "xml://" .. pattern end - parsed = xml.parse_pattern(xmlpattern) - titlecommand = specification.title or "type" + local parsed = xml.lpath(xmlpattern) + local titlecommand = specification.title or "type" if parsed.state then context[titlecommand]("pattern: " .. pattern .. " (".. parsed.state .. ")") else @@ -88,9 +88,9 @@ function xml.ctx.tshow(specification) context.stoptabulate() if xmlroot and xmlroot ~= "" then if not loaded[xmlroot] then - loaded[xmlroot] = { xml.convert(buffers.content(xmlroot) or "") } + loaded[xmlroot] = xml.convert(buffers.content(xmlroot) or "") end - local collected = xml.parse_apply(loaded[xmlroot],xmlpattern) + local collected = xml.filter(loaded[xmlroot],xmlpattern) if collected then local tc = type(collected) if not tc then diff --git a/tex/context/base/lxml-dir.lua b/tex/context/base/lxml-dir.lua index 0bc79877b..bcb846bba 100644 --- a/tex/context/base/lxml-dir.lua +++ b/tex/context/base/lxml-dir.lua @@ -7,9 +7,8 @@ if not modules then modules = { } end modules ['lxml-dir'] = { } local format, gsub = string.format, string.gsub -local get_id = lxml.id +local getid = lxml.getid local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes -local xmlparseapply = xml.parse_apply --~ <?xml version="1.0" standalone="yes"?> --~ <!-- demo.cdx --> @@ -42,7 +41,7 @@ local function load_setup(filename) if fullname ~= "" then filename = fullname end - local collection = xmlparseapply({ get_id(xml.load(filename)) },"directive") + local collection = xmlparseapply({ getid(xml.load(filename)) },"directive") if collection then local valid = 0 for i=1,#collection do @@ -66,7 +65,7 @@ local function load_setup(filename) end local function handle_setup(category,root,attribute,element) - root = get_id(root) + root = getid(root) if attribute then local value = root.at[attribute] if value then diff --git a/tex/context/base/lxml-ent.lua b/tex/context/base/lxml-ent.lua index d92e48365..487d13983 100644 --- a/tex/context/base/lxml-ent.lua +++ b/tex/context/base/lxml-ent.lua @@ -34,18 +34,18 @@ storage.register("xml/entities",xml.entities,"xml.entities") -- this will move t local entities = xml.entities -- this is a shared hash -xml.unknown_any_entity_format = nil -- has to be per xml +xml.placeholders.unknown_any_entity = nil -- has to be per xml local parsedentity = xml.parsedentitylpeg -function xml.register_entity(key,value) +function xml.registerentity(key,value) entities[key] = value if trace_entities then report_xml("registering entity '%s' as: %s",key,value) end end -function xml.resolved_entity(str) +function xml.resolvedentity(str) local e = entities[str] if e then local te = type(e) diff --git a/tex/context/base/lxml-inf.lua b/tex/context/base/lxml-inf.lua index 6862c476b..834d152fd 100644 --- a/tex/context/base/lxml-inf.lua +++ b/tex/context/base/lxml-inf.lua @@ -8,8 +8,8 @@ if not modules then modules = { } end modules ['lxml-inf'] = { -- This file will be loaded runtime by x-pending.tex. - local xmlwithelements = xml.withelements +local getid = lxml.getid local status, stack @@ -42,7 +42,7 @@ end local function get_command_status(id) status, stack = {}, {} if id then - xmlwithelements(get_id(id),get) + xmlwithelements(getid(id),get) return status else local t = { } diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv index 99e9dd7ac..8bc154df4 100644 --- a/tex/context/base/lxml-ini.mkiv +++ b/tex/context/base/lxml-ini.mkiv @@ -69,8 +69,8 @@ \def\xmlelement #1#2{\ctxlua{lxml.element("#1",#2)}} \def\xmlregisterns #1#2{\ctxlua{xml.registerns("#1","#2")}} % document \def\xmlremapname #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}} % element -\def\xmlremapnamespace #1#2#3{\ctxlua{xml.rename_space(lxml.id("#1"),"#2","#3")}} % document -\def\xmlchecknamespace #1#2#3{\ctxlua{xml.check_namespace(lxml.id("#1"),"#2","#3")}} % element +\def\xmlremapnamespace #1#2#3{\ctxlua{xml.renamespace(lxml.id("#1"),"#2","#3")}} % document +\def\xmlchecknamespace #1#2#3{\ctxlua{xml.checknamespace(lxml.id("#1"),"#2","#3")}} % element \def\xmlsetfunction #1#2#3{\ctxlua{lxml.setaction("#1","#2",#3)}} \def\xmlsetsetup #1#2#3{\ctxlua{lxml.setsetup("#1","#2","#3")}} \def\xmlstrip #1#2{\ctxlua{lxml.strip("#1","#2")}} @@ -263,9 +263,9 @@ \def\inlinemessage #1{\dontleavehmode{\tttf#1}} \def\displaymessage#1{\blank\inlinemessage{#1}\blank} -\def\xmltraceentities - {\ctxlua{xml.set_text_cleanup(lxml.trace_text_entities)}% - \appendtoks\ctxlua{lxml.show_text_entities()}\to\everygoodbye} +% \def\xmltraceentities % settextcleanup is not defined +% {\ctxlua{xml.settextcleanup(lxml.trace_text_entities)}% +% \appendtoks\ctxlua{lxml.showtextentities()}\to\everygoodbye} % processing instructions @@ -296,9 +296,9 @@ {\ifcase\xmlprocessingmode % unset \or - \ctxlua{lxml.set_command_to_text("#1")}% 1 + \ctxlua{lxml.setcommandtotext("#1")}% 1 \or - \ctxlua{lxml.set_command_to_none("#1")}% 2 + \ctxlua{lxml.setcommandtonone("#1")}% 2 \else % unset \fi} @@ -353,8 +353,8 @@ \let\isolatedentity\firstofoneargument -\def\xmlsetentity#1#2{\ctxlua{xml.register_entity('#1',\!!bs\detokenize{#2}\!!es)}} -\def\xmltexentity#1#2{\ctxlua{xml.register_entity('#1',\!!bs\detokenize{\isolatedentity{#2}}\!!es)}} +\def\xmlsetentity#1#2{\ctxlua{xml.registerentity('#1',\!!bs\detokenize{#2}\!!es)}} +\def\xmltexentity#1#2{\ctxlua{xml.registerentity('#1',\!!bs\detokenize{\isolatedentity{#2}}\!!es)}} % \xmlsetentity{tex}{\TEX{}} % {} needed @@ -405,7 +405,7 @@ % \stopextendcatcodetable % % \ctxlua { % entities are remembered in the format -% characters.remapentity("<",characters.active_offset + utf.byte("<")) -% characters.remapentity("&",characters.active_offset + utf.byte("&")) -% characters.remapentity(">",characters.active_offset + utf.byte(">")) +% characters.remapentity("<",characters.activeoffset + utf.byte("<")) +% characters.remapentity("&",characters.activeoffset + utf.byte("&")) +% characters.remapentity(">",characters.activeoffset + utf.byte(">")) % } diff --git a/tex/context/base/lxml-lpt.lua b/tex/context/base/lxml-lpt.lua index 2db7a4a23..954e72194 100644 --- a/tex/context/base/lxml-lpt.lua +++ b/tex/context/base/lxml-lpt.lua @@ -11,7 +11,7 @@ if not modules then modules = { } end modules ['lxml-pth'] = { local concat, remove, insert = table.concat, table.remove, table.insert local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep -local lpegmatch = lpeg.match +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns -- beware, this is not xpath ... e.g. position is different (currently) and -- we have reverse-sibling as reversed preceding sibling @@ -56,14 +56,20 @@ local xml = xml local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end local lpathcached = 0 function xml.lpathcached() return lpathcached end -xml.functions = xml.functions or { } -- internal -xml.expressions = xml.expressions or { } -- in expressions -xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection) -xml.specialhandler = xml.specialhandler or { } +xml.functions = xml.functions or { } -- internal +local functions = xml.functions -local functions = xml.functions -local expressions = xml.expressions -local finalizers = xml.finalizers +xml.expressions = xml.expressions or { } -- in expressions +local expressions = xml.expressions + +xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection) +local finalizers = xml.finalizers + +xml.specialhandler = xml.specialhandler or { } +local specialhandler = xml.specialhandler + +lpegpatterns.xml = lpegpatterns.xml or { } +local xmlpatterns = lpegpatterns.xml finalizers.xml = finalizers.xml or { } finalizers.tex = finalizers.tex or { } @@ -676,7 +682,7 @@ local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes local special_2 = P("/") * Cc(register_auto_self) local special_3 = P("") * Cc(register_auto_self) -local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside +local pathparser = Ct { "patterns", -- can be made a bit faster by moving pattern outside patterns = spaces * V("protocol") * spaces * ( ( V("special") * spaces * P(-1) ) + @@ -748,6 +754,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou } +xmlpatterns.pathparser = pathparser + local cache = { } local function nodesettostring(set,nodetest) @@ -784,11 +792,11 @@ end xml.nodesettostring = nodesettostring -local parse_pattern -- we have a harmless kind of circular reference +local lpath -- we have a harmless kind of circular reference local function lshow(parsed) if type(parsed) == "string" then - parsed = parse_pattern(parsed) + parsed = lpath(parsed) end local s = table.serialize_functions -- ugly table.serialize_functions = false -- ugly @@ -807,7 +815,7 @@ local function add_comment(p,str) end end -parse_pattern = function (pattern) -- the gain of caching is rather minimal +lpath = function (pattern) -- the gain of caching is rather minimal lpathcalls = lpathcalls + 1 if type(pattern) == "table" then return pattern @@ -816,7 +824,7 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal if parsed then lpathcached = lpathcached + 1 else - parsed = lpegmatch(parser,pattern) + parsed = lpegmatch(pathparser,pattern) if parsed then parsed.pattern = pattern local np = #parsed @@ -864,6 +872,8 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal end end +xml.lpath = lpath + -- we can move all calls inline and then merge the trace back -- technically we can combine axis and the next nodes which is -- what we did before but this a bit cleaner (but slower too) @@ -988,7 +998,7 @@ local function normal_apply(list,parsed,nofparsed,order) return collected end -local function parse_apply(list,pattern) +local function applylpath(list,pattern) -- we avoid an extra call local parsed = cache[pattern] if parsed then @@ -998,7 +1008,7 @@ local function parse_apply(list,pattern) lpathcalls = lpathcalls + 1 parsed = pattern else - parsed = parse_pattern(pattern) or pattern + parsed = lpath(pattern) or pattern end if not parsed then return @@ -1007,7 +1017,7 @@ local function parse_apply(list,pattern) if nofparsed == 0 then return -- something is wrong end - local one = list[1] + local one = list[1] -- we could have a third argument: isroot and list or list[1] or whatever we like ... todo if not one then return -- something is wrong elseif not trace_lpath then @@ -1019,13 +1029,15 @@ local function parse_apply(list,pattern) end end +xml.applylpath = applylpath -- takes a table as first argment, which is what xml.filter will do + -- internal (parsed) expressions.child = function(e,pattern) - return parse_apply({ e },pattern) -- todo: cache + return applylpath({ e },pattern) -- todo: cache end expressions.count = function(e,pattern) - local collected = parse_apply({ e },pattern) -- todo: cache + local collected = applylpath({ e },pattern) -- todo: cache return (collected and #collected) or 0 end @@ -1035,7 +1047,7 @@ expressions.oneof = function(s,...) -- slow local t = {...} for i=1,#t do if s == t[i] then return true end end return false end expressions.error = function(str) - xml.error_handler("unknown function in lpath expression",tostring(str or "?")) + xml.errorhandler("unknown function in lpath expression",tostring(str or "?")) return false end expressions.undefined = function(s) @@ -1065,7 +1077,7 @@ expressions.boolean = toboolean local function traverse(root,pattern,handle) report_lpath("use 'xml.selection' instead for '%s'",pattern) - local collected = parse_apply({ root },pattern) + local collected = applylpath({ root },pattern) if collected then for c=1,#collected do local e = collected[c] @@ -1076,7 +1088,7 @@ local function traverse(root,pattern,handle) end local function selection(root,pattern,handle) - local collected = parse_apply({ root },pattern) + local collected = applylpath({ root },pattern) if collected then if handle then for c=1,#collected do @@ -1088,19 +1100,12 @@ local function selection(root,pattern,handle) end end -xml.parse_parser = parser -xml.parse_pattern = parse_pattern -xml.parse_apply = parse_apply xml.traverse = traverse -- old method, r, d, k xml.selection = selection -- new method, simple handle -local lpath = parse_pattern - -xml.lpath = lpath - -function xml.cached_patterns() - return cache -end +--~ function xml.cachedpatterns() +--~ return cache +--~ end -- generic function finalizer (independant namespace) @@ -1117,8 +1122,8 @@ local function dofunction(collected,fnc) end end -xml.finalizers.xml["function"] = dofunction -xml.finalizers.tex["function"] = dofunction +finalizers.xml["function"] = dofunction +finalizers.tex["function"] = dofunction -- functions @@ -1215,7 +1220,7 @@ end --ldx]]-- function xml.filter(root,pattern) -- no longer funny attribute handling here - return parse_apply({ root },pattern) + return applylpath({ root },pattern) end --[[ldx-- @@ -1237,7 +1242,7 @@ end local wrap, yield = coroutine.wrap, coroutine.yield function xml.elements(root,pattern,reverse) -- r, d, k - local collected = parse_apply({ root },pattern) + local collected = applylpath({ root },pattern) if collected then if reverse then return wrap(function() for c=#collected,1,-1 do @@ -1253,7 +1258,7 @@ function xml.elements(root,pattern,reverse) -- r, d, k end function xml.collected(root,pattern,reverse) -- e - local collected = parse_apply({ root },pattern) + local collected = applylpath({ root },pattern) if collected then if reverse then return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end) diff --git a/tex/context/base/lxml-mis.lua b/tex/context/base/lxml-mis.lua index 78297b592..94a26b974 100644 --- a/tex/context/base/lxml-mis.lua +++ b/tex/context/base/lxml-mis.lua @@ -6,12 +6,16 @@ if not modules then modules = { } end modules ['lxml-mis'] = { license = "see context related readme files" } +local xml, lpeg, string = xml, lpeg, string + local concat = table.concat local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring local format, gsub, match = string.format, string.gsub, string.match -local lpegmatch = lpeg.match +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns +local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs -local xml = xml +lpegpatterns.xml = lpegpatterns.xml or { } +local xmlpatterns = lpegpatterns.xml --[[ldx-- <p>The following helper functions best belong to the <t>lxml-ini</t> @@ -37,7 +41,7 @@ end --~ xml.gsub = xmlgsub -function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual +function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual if d and k then local dkm = d[k-1] if dkm and type(dkm) == "string" then @@ -54,8 +58,6 @@ end --~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end --~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>" -local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs - -- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg -- -- 1021:0335:0287:0247 @@ -80,9 +82,9 @@ local unescaped = Cs(normal * (special * normal)^0) local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0) -xml.escaped_pattern = escaped -xml.unescaped_pattern = unescaped -xml.cleansed_pattern = cleansed +xmlpatterns.escaped = escaped +xmlpatterns.unescaped = unescaped +xmlpatterns.cleansed = cleansed function xml.escaped (str) return lpegmatch(escaped,str) end function xml.unescaped(str) return lpegmatch(unescaped,str) end diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua index e368764ad..270c83e5a 100644 --- a/tex/context/base/lxml-tab.lua +++ b/tex/context/base/lxml-tab.lua @@ -161,8 +161,8 @@ function xml.setproperty(root,k,v) getmetatable(root).__index[k] = v end -function xml.check_error(top,toclose) - return "" +function xml.checkerror(top,toclose) + return "" -- can be set end local function add_attribute(namespace,tag,value) @@ -218,9 +218,9 @@ local function add_end(spacing, namespace, tag) local toclose = remove(stack) top = stack[#stack] if #stack < 1 then - errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "") + errorstr = format("nothing to close with %s %s", tag, xml.checkerror(top,toclose) or "") elseif toclose.tg ~= tag then -- no namespace check - errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "") + errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.checkerror(top,toclose) or "") end dt = top.dt dt[#dt+1] = toclose @@ -272,9 +272,13 @@ local function attribute_specification_error(str) return str end -function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end -function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end -function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end +xml.placeholders = { + unknown_dec_entity = function(str) return (str == "" and "&error;") or format("&%s;",str) end, + unknown_hex_entity = function(str) return format("&#x%s;",str) end, + unknown_any_entity = function(str) return format("&#x%s;",str) end, +} + +local placeholders = xml.placeholders local function fromhex(s) local n = tonumber(s,16) @@ -331,7 +335,7 @@ local function handle_hex_entity(str) report_xml("utfize, converting hex entity &#x%s; into %s",str,h) end elseif utfize then - h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or "" + h = (n and utfchar(n)) or xml.unknown_hex_entity(str) or "" if not n then report_xml("utfize, ignoring hex entity &#x%s;",str) elseif trace_entities then @@ -358,7 +362,7 @@ local function handle_dec_entity(str) report_xml("utfize, converting dec entity &#%s; into %s",str,d) end elseif utfize then - d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or "" + d = (n and utfchar(n)) or placeholders.unknown_dec_entity(str) or "" if not n then report_xml("utfize, ignoring dec entity &#%s;",str) elseif trace_entities then @@ -395,8 +399,9 @@ local function handle_any_entity(str) end a = lpegmatch(parsedentity,a) or a else - if xml.unknown_any_entity_format then - a = xml.unknown_any_entity_format(str) or "" + local unknown_any_entity = placeholders.unknown_any_entity + if unknown_any_entity then + a = unknown_any_entity(str) or "" end if a then if trace_entities then @@ -611,13 +616,13 @@ local function xmlconvert(data, settings) if errorstr and errorstr ~= "" then result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } } setmetatable(stack, mt) - local error_handler = settings.error_handler - if error_handler == false then + local errorhandler = settings.error_handler + if errorhandler == false then -- no error message else - error_handler = error_handler or xml.error_handler - if error_handler then - xml.error_handler("load",errorstr) + errorhandler = errorhandler or xml.errorhandler + if errorhandler then + xml.errorhandler("load",errorstr) end end else @@ -677,7 +682,7 @@ function xml.is_valid(root) return root and not root.error end -xml.error_handler = (logs and logs.report) or (input and logs.report) or print +xml.errorhandler = (logs and logs.report) or (input and logs.report) or print --[[ldx-- <p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua index 6aef2fc24..19614770e 100644 --- a/tex/context/base/lxml-tex.lua +++ b/tex/context/base/lxml-tex.lua @@ -36,8 +36,9 @@ local texsprint, texprint, texwrite = tex.sprint, tex.print, tex.write local texcatcodes, ctxcatcodes, vrbcatcodes, notcatcodes = tex.texcatcodes, tex.ctxcatcodes, tex.vrbcatcodes, tex.notcatcodes local xmlelements, xmlcollected, xmlsetproperty = xml.elements, xml.collected, xml.setproperty -local xmlparseapply, xmlwithelements = xml.parse_apply, xml.withelements +local xmlwithelements = xml.withelements local xmlserialize, xmlcollect, xmltext, xmltostring = xml.serialize, xml.collect, xml.text, xml.tostring +local xmlapplylpath = xml.applylpath local variables = (interfaces and interfaces.variables) or { } @@ -80,14 +81,14 @@ local xmltextcapture = ( space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ? space^0 * newline * space^0 * Cc(" ") / texsprint + content / function(str) return texsprint(notcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes - entity / xml.resolved_entity + entity / xml.resolvedentity )^0 local ctxtextcapture = ( space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ? space^0 * newline * space^0 * Cc(" ") / texsprint + content / function(str) return texsprint(ctxcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes - entity / xml.resolved_entity + entity / xml.resolvedentity )^0 local forceraw, rawroot = false, nil @@ -142,23 +143,23 @@ local function toverbatim(str) if aftercommand then texsprint(texcatcodes,aftercommand,"{}") end end -function lxml.set_verbatim(before,after,obeyedline,obeyedspace) +function lxml.setverbatim(before,after,obeyedline,obeyedspace) beforecommand, aftercommand, linecommand, spacecommand = before, after, obeyedline, obeyedspace end local obeycdata = true -function lxml.set_cdata() +function lxml.setcdata() obeycdata = true end -function lxml.reset_cdata() +function lxml.resetcdata() obeycdata = false end -- cdata and verbatim -lxml.set_verbatim("\\xmlcdatabefore", "\\xmlcdataafter", "\\xmlcdataobeyedline", "\\xmlcdataobeyedspace") +lxml.setverbatim("\\xmlcdatabefore", "\\xmlcdataafter", "\\xmlcdataobeyedline", "\\xmlcdataobeyedspace") -- local capture = (space^0*newline)^0 * capture * (space+newline)^0 * -1 @@ -194,7 +195,7 @@ function lxml.splitid(id) end end -local function get_id(id, qualified) +local function getid(id, qualified) if id then local lid = loaded[id] if lid then @@ -233,8 +234,8 @@ local function get_id(id, qualified) end end -lxml.id = get_id -lxml.get_id = get_id +lxml.id = getid -- we provide two names as locals can already use such +lxml.getid = getid -- names and we don't want clashes function lxml.root(id) return loaded[id] @@ -245,7 +246,7 @@ end local nofindices = 0 local function addindex(name,check_sum,force) - local root = get_id(name) + local root = getid(name) if root and (not root.index or force) then -- weird, only called once local n, index, maxindex, check = 0, root.index or { }, root.maxindex or 0, root.check or { } local function nest(root) @@ -284,27 +285,27 @@ lxml.addindex = addindex -- another cache -local function lxmlparseapply(id,pattern) -- better inline, saves call - return xmlparseapply({ get_id(id) }, pattern) +local function lxmlapplylpath(id,pattern) -- better inline, saves call + return xmlapplylpath({ getid(id) }, pattern) end -lxml.filter = lxmlparseapply +lxml.filter = lxmlapplylpath function lxml.filterlist(list,pattern) for s in gmatch(list,"[^, ]+") do -- we could cache a table - lxmlparseapply(s,pattern) + xmlapplylpath({ getid(s) }, pattern) end end lxml["function"] = function(id,name) local f = xml.functions[name] - return f and f(get_id(id)) + return f and f(getid(id)) end -- rather new, indexed storage (backward refs), maybe i will merge this function lxml.checkindex(name) - local root = get_id(name) + local root = getid(name) return (root and root.index) or 0 end @@ -381,7 +382,7 @@ end function lxml.include(id,pattern,attribute,recurse) starttiming(xml) - local root = get_id(id) + local root = getid(id) xml.include(root,pattern,attribute,recurse,function(filename) if filename then filename = commands.preparedfile(filename) @@ -553,7 +554,7 @@ function lxml.serialize(root) end function lxml.setaction(id,pattern,action) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then for c=1,#collected do collected[c].command = action @@ -619,7 +620,7 @@ xml.cprint = cprint local xmlcprint = cprint -- now we can flush function lxml.main(id) - xmlserialize(get_id(id),xmltexhandler) -- the real root (@rt@) + xmlserialize(getid(id),xmltexhandler) -- the real root (@rt@) end --~ -- lines (untested) @@ -675,12 +676,12 @@ end local setups = { } -function lxml.set_command_to_text(id) - xmlwithelements(get_id(id),to_text) +function lxml.setcommandtotext(id) + xmlwithelements(getid(id),to_text) end -function lxml.set_command_to_none(id) - xmlwithelements(get_id(id),to_none) +function lxml.setcommandtonone(id) + xmlwithelements(getid(id),to_none) end function lxml.installsetup(what,document,setup,where) @@ -704,12 +705,12 @@ function lxml.installsetup(what,document,setup,where) if trace_loading then commands.writestatus("lxml","inserting setup %s for %s before %s",setup,document,where) end - table.insert_before_value(sd,setup,where) + table.insertbeforevalue(sd,setup,where) elseif what == 4 then if trace_loading then commands.writestatus("lxml","inserting setup %s for %s after %s",setup,document,where) end - table.insert_after_value(sd,setup,where) + table.insertaftervalue(sd,setup,where) end end @@ -759,7 +760,7 @@ end function lxml.setsetup(id,pattern,setup) if not setup or setup == "" or setup == "*" or setup == "-" or setup == "+" then - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then if trace_setups then for c=1, #collected do @@ -802,7 +803,7 @@ function lxml.setsetup(id,pattern,setup) else local a, b = match(setup,"^(.+:)([%*%-])$") if a and b then - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then if trace_setups then for c=1, #collected do @@ -847,7 +848,7 @@ function lxml.setsetup(id,pattern,setup) report_lxml("no lpath matches for %s",pattern) end else - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then if trace_setups then for c=1, #collected do @@ -1134,7 +1135,7 @@ end -- local function verbatim(id,before,after) - local root = get_id(id) + local root = getid(id) if root then if before then texsprint(ctxcatcodes,before,"[",root.tg or "?","]") end lxml.toverbatim(xmltostring(root.dt)) @@ -1153,21 +1154,21 @@ lxml.verbatim = verbatim -- helpers function lxml.first(id,pattern) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then first(collected) end end function lxml.last(id,pattern) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then last(collected) end end function lxml.all(id,pattern) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then all(collected) end @@ -1175,18 +1176,18 @@ end function lxml.count(id,pattern) -- always needs to produce a result so no test here - count(lxmlparseapply(id,pattern)) + count(xmlapplylpath({ getid(id) }, pattern)) end function lxml.attribute(id,pattern,a,default) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then attribute(collected,a,default) end end function lxml.raw(id,pattern) -- the content, untouched by commands - local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id) + local collected = (pattern and xmlapplylpath({ getid(id) }, pattern)) or getid(id) if collected then texsprint(xmltostring(collected[1].dt)) end @@ -1194,11 +1195,11 @@ end function lxml.context(id,pattern) -- the content, untouched by commands if not pattern then - local collected = get_id(id) + local collected = getid(id) -- texsprint(ctxcatcodes,collected.dt[1]) ctx_text(collected.dt[1]) else - local collected = lxmlparseapply(id,pattern) or get_id(id) + local collected = xmlapplylpath({ getid(id) }, pattern) or getid(id) if collected and #collected > 0 then texsprint(ctxcatcodes,collected[1].dt) end @@ -1206,7 +1207,7 @@ function lxml.context(id,pattern) -- the content, untouched by commands end function lxml.text(id,pattern) - local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id) + local collected = (pattern and xmlapplylpath({ getid(id) }, pattern)) or getid(id) if collected then text(collected) end @@ -1215,40 +1216,40 @@ end lxml.content = text function lxml.position(id,pattern,n) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then position(collected,n) end end function lxml.chainattribute(id,pattern,a,default) - local collected = lxmlparseapply(id,pattern) + local collected = xmlapplylpath({ getid(id) }, pattern) if collected then chainattribute(collected,a,default) end end function lxml.concatrange(id,pattern,start,stop,separator,lastseparator,textonly) -- test this on mml - concatrange(lxmlparseapply(id,pattern),start,stop,separator,lastseparator,textonly) + concatrange(xmlapplylpath({ getid(id) }, pattern),start,stop,separator,lastseparator,textonly) end function lxml.concat(id,pattern,separator,lastseparator,textonly) - concatrange(lxmlparseapply(id,pattern),false,false,separator,lastseparator,textonly) + concatrange(xmlapplylpath({ getid(id) }, pattern),false,false,separator,lastseparator,textonly) end function lxml.element(id,n) - position(lxmlparseapply(id,"/*"),n) + position(xmlapplylpath({ getid(id) },"/*"),n) end lxml.index = lxml.position function lxml.pos(id) - local root = get_id(id) + local root = getid(id) texwrite((root and root.ni) or 0) end function lxml.att(id,a,default) - local root = get_id(id) + local root = getid(id) if root then local at = root.at local str = (at and at[a]) or default @@ -1261,7 +1262,7 @@ function lxml.att(id,a,default) end function lxml.name(id) -- or remapped name? -> lxml.info, combine - local r = get_id(id) + local r = getid(id) local ns = r.rn or r.ns or "" if ns ~= "" then texsprint(ns,":",r.tg) @@ -1271,20 +1272,20 @@ function lxml.name(id) -- or remapped name? -> lxml.info, combine end function lxml.match(id) -- or remapped name? -> lxml.info, combine - texsprint(get_id(id).mi or 0) + texsprint(getid(id).mi or 0) end function lxml.tag(id) -- tag vs name -> also in l-xml tag->name - texsprint(get_id(id).tg or "") + texsprint(getid(id).tg or "") end function lxml.namespace(id) -- or remapped name? - local root = get_id(id) + local root = getid(id) texsprint(root.rn or root.ns or "") end function lxml.flush(id) - id = get_id(id) + id = getid(id) local dt = id and id.dt if dt then xmlsprint(dt) @@ -1292,7 +1293,7 @@ function lxml.flush(id) end function lxml.snippet(id,i) - local e = get_id(id) + local e = getid(id) if e then local edt = e.dt if edt then @@ -1302,12 +1303,12 @@ function lxml.snippet(id,i) end function lxml.direct(id) - xmlsprint(get_id(id)) + xmlsprint(getid(id)) end function lxml.command(id,pattern,cmd) - local i, p = get_id(id,true) - local collected = lxmlparseapply(i,pattern) + local i, p = getid(id,true) + local collected = xmlapplylpath({ getid(i) }, pattern) if collected then local rootname = p or i.name for c=1,#collected do @@ -1325,11 +1326,11 @@ end -- loops function lxml.collected(id,pattern,reverse) - return xmlcollected(get_id(id),pattern,reverse) + return xmlcollected(getid(id),pattern,reverse) end function lxml.elements(id,pattern,reverse) - return xmlelements(get_id(id),pattern,reverse) + return xmlelements(getid(id),pattern,reverse) end -- obscure ones @@ -1342,16 +1343,16 @@ local found, empty = xml.found, xml.empty local doif, doifnot, doifelse = commands.doif, commands.doifnot, commands.doifelse -function lxml.doif (id,pattern) doif (found(get_id(id),pattern)) end -function lxml.doifnot (id,pattern) doifnot (found(get_id(id),pattern)) end -function lxml.doifelse (id,pattern) doifelse(found(get_id(id),pattern)) end -function lxml.doiftext (id,pattern) doif (not empty(get_id(id),pattern)) end -function lxml.doifnottext (id,pattern) doifnot (not empty(get_id(id),pattern)) end -function lxml.doifelsetext (id,pattern) doifelse(not empty(get_id(id),pattern)) end +function lxml.doif (id,pattern) doif (found(getid(id),pattern)) end +function lxml.doifnot (id,pattern) doifnot (found(getid(id),pattern)) end +function lxml.doifelse (id,pattern) doifelse(found(getid(id),pattern)) end +function lxml.doiftext (id,pattern) doif (not empty(getid(id),pattern)) end +function lxml.doifnottext (id,pattern) doifnot (not empty(getid(id),pattern)) end +function lxml.doifelsetext (id,pattern) doifelse(not empty(getid(id),pattern)) end -- special case: "*" and "" -> self else lpath lookup ---~ function lxml.doifelseempty(id,pattern) doifelse(isempty(get_id(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern +--~ function lxml.doifelseempty(id,pattern) doifelse(isempty(getid(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern -- status info @@ -1397,15 +1398,15 @@ end) -- misc function lxml.nonspace(id,pattern) -- slow, todo loop - xmltprint(xmlcollect(get_id(id),pattern,true)) + xmltprint(xmlcollect(getid(id),pattern,true)) end function lxml.strip(id,pattern,nolines,anywhere) - xml.strip(get_id(id),pattern,nolines,anywhere) + xml.strip(getid(id),pattern,nolines,anywhere) end function lxml.stripped(id,pattern,nolines) - local str = xmltext(get_id(id),pattern) or "" + local str = xmltext(getid(id),pattern) or "" str = gsub(str,"^%s*(.-)%s*$","%1") if nolines then str = gsub(str,"%s+"," ") @@ -1414,5 +1415,9 @@ function lxml.stripped(id,pattern,nolines) end function lxml.delete(id,pattern) - xml.delete(get_id(id),pattern) + xml.delete(getid(id),pattern) end + +lxml.obsolete = { } + +lxml.get_id = getid lxml.obsolete.get_id = getid diff --git a/tex/context/base/m-punk.mkiv b/tex/context/base/m-punk.mkiv index 5b1486c81..7d8815c4b 100644 --- a/tex/context/base/m-punk.mkiv +++ b/tex/context/base/m-punk.mkiv @@ -97,7 +97,7 @@ function metapost.characters.process(mpxformat, name, instances, scalefactor) -- we can use a format per font local data = io.loaddata(resolvers.find_file(name)) metapost.reset(mpxformat) - metapost.set_outer_color(2) -- no outer color and no reset either + metapost.setoutercolor(2) -- no outer color and no reset either lists = { } for i=1,instances do characters, descriptions = { }, { } diff --git a/tex/context/base/m-timing.tex b/tex/context/base/m-timing.tex index 55185b0b2..e5c315c74 100644 --- a/tex/context/base/m-timing.tex +++ b/tex/context/base/m-timing.tex @@ -53,7 +53,7 @@ end \startnotmode[no-timing] \appendtoks\ctxlua{moduledata.progress.store()}\to\everystarttext \appendtoks\ctxlua{moduledata.progress.store()}\to\everyshipout - \ctxlua{luatex.register_stop_actions(function() moduledata.progress.save() end)} + \ctxlua{luatex.registerstopactions(function() moduledata.progress.save() end)} \stopnotmode \def\ShowNamedUsage#1#2#3% diff --git a/tex/context/base/math-def.mkiv b/tex/context/base/math-def.mkiv index af7166f80..ce6bdb23d 100644 --- a/tex/context/base/math-def.mkiv +++ b/tex/context/base/math-def.mkiv @@ -19,7 +19,7 @@ \startluacode mathematics.define() - mathematics.register_xml_entities() + mathematics.xml.registerentities() \stopluacode % special .. todo diff --git a/tex/context/base/math-ent.lua b/tex/context/base/math-ent.lua index d387f9ee5..53a68ab0f 100644 --- a/tex/context/base/math-ent.lua +++ b/tex/context/base/math-ent.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['math-ent'] = { -- this might go into char-def -mathematics.entities={ +mathematics.xml.entities={ ["Aacute"]=0x000C1, ["aacute"]=0x000E1, ["Abreve"]=0x00102, @@ -2100,5 +2100,4 @@ mathematics.entities={ ["plusminus"]=0x000B1, ["minusplus"]=0x02213, ["cdots"]=0x2026, - } diff --git a/tex/context/base/math-ini.lua b/tex/context/base/math-ini.lua index 73a6725bb..9efc8ce64 100644 --- a/tex/context/base/math-ini.lua +++ b/tex/context/base/math-ini.lua @@ -273,11 +273,13 @@ function mathematics.utfmathfiller(chr, default) tex.sprint(cmd or default or "") end -mathematics.entities = mathematics.entities or { } +-- xml -function mathematics.register_xml_entities() +mathematics.xml = { entities = { } } + +function mathematics.xml.registerentities() local entities = xml.entities - for name, unicode in next, mathematics.entities do + for name, unicode in next, mathematics.xml.entities do if not entities[name] then entities[name] = utfchar(unicode) end diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv index 729e10443..203d88156 100644 --- a/tex/context/base/math-ini.mkiv +++ b/tex/context/base/math-ini.mkiv @@ -73,9 +73,9 @@ \let\mathgreeknormal\mathgreekupright \let\mathgreeknone \mathgreekdefault -\def\setmathattribute#1#2{\ifmmode\ctxlua{mathematics.sync_a_both ("#1","#2")}\fi} -\def\setmathalphabet #1{\ifmmode\ctxlua{mathematics.sync_a_name ("#1")}\fi} -\def\setmathstyle #1{\ifmmode\ctxlua{mathematics.sync_a_style("#1")}\fi} +\def\setmathattribute#1#2{\ifmmode\ctxlua{mathematics.syncboth ("#1","#2")}\fi} +\def\setmathalphabet #1{\ifmmode\ctxlua{mathematics.syncname ("#1")}\fi} +\def\setmathstyle #1{\ifmmode\ctxlua{mathematics.syncstyle("#1")}\fi} \unexpanded\def\mr {\setmathattribute{regular}{tf}} diff --git a/tex/context/base/math-map.lua b/tex/context/base/math-map.lua index 9b1a925cd..0a3611cca 100644 --- a/tex/context/base/math-map.lua +++ b/tex/context/base/math-map.lua @@ -347,12 +347,12 @@ alphabets.serif = alphabets.regular alphabets.type = alphabets.monospaced alphabets.teletype = alphabets.monospaced -function mathematics.to_a_style(attribute) +function mathematics.tostyle(attribute) local r = mathremap[attribute] return r and r.style or "tf" end -function mathematics.to_a_name(attribute) +function mathematics.toname(attribute) local r = mathremap[attribute] return r and r.alphabet or "regular" end @@ -361,13 +361,13 @@ end local mathalphabet = attributes.private("mathalphabet") -function mathematics.sync_a_both(alphabet,style) +function mathematics.syncboth(alphabet,style) local data = alphabets[alphabet or "regular"] or alphabets.regular data = data[style or "tf"] or data.tf texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet] end -function mathematics.sync_a_style(style) +function mathematics.syncstyle(style) --~ local r = mathremap[mathalphabet] local r = mathremap[texattribute[mathalphabet]] local alphabet = r and r.alphabet or "regular" @@ -375,7 +375,7 @@ function mathematics.sync_a_style(style) texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet] end -function mathematics.sync_a_name(alphabet) +function mathematics.syncname(alphabet) --~ local r = mathremap[mathalphabet] local r = mathremap[texattribute[mathalphabet]] local style = r and r.style or "tf" @@ -393,7 +393,7 @@ local remapping = { [3] = { what = "italic", tf = "it", bf = "bi" }, -- italic } -function mathematics.remap_alphabets(char,mathalphabet,mathgreek) +function mathematics.remapalphabets(char,mathalphabet,mathgreek) if mathgreek > 0 then local lc, uc = floor(mathgreek/10), mathgreek % 10 -- 2 == upright 3 == italic if lc > 1 or uc > 1 then diff --git a/tex/context/base/math-noa.lua b/tex/context/base/math-noa.lua index cb0b7a1e6..50052c65c 100644 --- a/tex/context/base/math-noa.lua +++ b/tex/context/base/math-noa.lua @@ -130,7 +130,7 @@ local function report_remap(tag,id,old,new,extra) report_noads("remapping %s in font %s from U+%04X (%s) to U+%04X (%s)%s",tag,id,old,utfchar(old),new,utfchar(new),extra or "") end -local remap_alphabets = mathematics.remap_alphabets +local remapalphabets = mathematics.remapalphabets local fcs = fonts.color.set -- we can have a global famdata == fonts.famdata and chrdata == fonts.chrdata @@ -171,7 +171,7 @@ processors.relocate[math_char] = function(pointer) set_attribute(pointer,mathalphabet,0) end local char = pointer.char - local newchar = remap_alphabets(char,a,g) + local newchar = remapalphabets(char,a,g) if newchar then local fam = pointer.fam local id = font_of_family(fam) @@ -346,7 +346,7 @@ table.insert(fonts.triggers,"mathalternates") fonts.initializers.base.otf.mathalternates = fonts.initializers.common.mathalternates fonts.initializers.node.otf.mathalternates = fonts.initializers.common.mathalternates -local get_alternate = fonts.otf.get_alternate +local getalternate = fonts.otf.getalternate local mathalternate = attributes.private("mathalternate") @@ -370,7 +370,7 @@ alternate[math_char] = function(pointer) local mathalternatesattributes = tfmdata.shared.mathalternatesattributes if mathalternatesattributes then local what = mathalternatesattributes[a] - local alt = get_alternate(tfmdata,pointer.char,what.feature,what.value) + local alt = getalternate(tfmdata,pointer.char,what.feature,what.value) if alt then pointer.char = alt end diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua index 71eb6c76e..9213ab6ee 100644 --- a/tex/context/base/math-vfu.lua +++ b/tex/context/base/math-vfu.lua @@ -690,7 +690,7 @@ function fonts.vf.math.define(specification,set) return main end -function mathematics.make_font(name, set) +function mathematics.makefont(name, set) fonts.define.methods[name] = function(specification) return fonts.vf.math.define(specification,set) end diff --git a/tex/context/base/meta-ini.mkii b/tex/context/base/meta-ini.mkii index e7c6d218e..c7bad9ebf 100644 --- a/tex/context/base/meta-ini.mkii +++ b/tex/context/base/meta-ini.mkii @@ -612,10 +612,10 @@ \def\initializeMPgraphics {\bgroup \initializeMPgraphicfile - \ifx\bufferprefix\empty\else - \let\bufferprefix\empty - \initializeMPgraphicfile - \fi +% \ifx\bufferprefix\empty\else +% \let\bufferprefix\empty +% \initializeMPgraphicfile +% \fi \egroup} %D Loading specific \METAPOST\ related definitions is diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index 3d1d87b1c..adc2e5aac 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -1234,7 +1234,7 @@ % can be faster, just \appendtoks - \ctxlua{metapost.set_outer_color(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}% + \ctxlua{metapost.setoutercolor(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}% \to \everyMPgraphic \startMPinitializations diff --git a/tex/context/base/metatex.tex b/tex/context/base/metatex.tex index d99f75ead..8f149d2e5 100644 --- a/tex/context/base/metatex.tex +++ b/tex/context/base/metatex.tex @@ -155,6 +155,12 @@ \pdfoutput\plusone +% too + +\appendtoks + \ctxlua{statistics.savefmtstatus("\jobname","\metatexversion","metatex.tex")}% can become automatic +\to \everydump + % done \errorstopmode \dump \endinput diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua index 27e27eadb..a4f7f3137 100644 --- a/tex/context/base/mlib-pdf.lua +++ b/tex/context/base/mlib-pdf.lua @@ -69,7 +69,7 @@ local savedliterals = nil local mpsliteral = nodes.pool.register(node.new("whatsit",8)) -- pdfliteral -function metapost.flush_literal(d) -- \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}} +function metapost.flushliteral(d) -- \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}} if savedliterals then local literal = copy_node(mpsliteral) literal.data = savedliterals[d] @@ -79,7 +79,7 @@ function metapost.flush_literal(d) -- \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_l end end -function metapost.flush_reset() +function metapost.flushreset() -- will become obsolete and internal savedliterals = nil end @@ -107,7 +107,7 @@ end function metapost.flushers.pdf.stopfigure(message) if message then metapost.flushers.pdf.comment(message) end texsprint(ctxcatcodes,"\\stopMPLIBtoPDF") - texsprint(ctxcatcodes,"\\ctxlua{metapost.flush_reset()}") -- maybe just at the beginning + texsprint(ctxcatcodes,"\\ctxlua{metapost.flushreset()}") -- maybe just at the beginning end function metapost.flushers.pdf.flushfigure(pdfliterals) -- table diff --git a/tex/context/base/mlib-pdf.mkiv b/tex/context/base/mlib-pdf.mkiv index 2e098730e..096c47cc6 100644 --- a/tex/context/base/mlib-pdf.mkiv +++ b/tex/context/base/mlib-pdf.mkiv @@ -15,7 +15,7 @@ \registerctxluafile{mlib-pdf}{1.001} -\def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}} +\def\MPLIBtoPDF#1{\ctxlua{metapost.flushliteral(#1)}} \def\MPLIBboundingbox#1#2#3#4% {\xdef\MPllx{#1}% diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua index 97b336a63..d930b8f9b 100644 --- a/tex/context/base/mlib-pps.lua +++ b/tex/context/base/mlib-pps.lua @@ -18,6 +18,8 @@ local lpegmatch = lpeg.match local texbox = tex.box local copy_list = node.copy_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 @@ -70,7 +72,7 @@ local registercolor, registerspotcolor = colors.register, colors.registerspotcol local transparencies = attributes.transparencies local registertransparency = transparencies.register -function metapost.set_outer_color(mode,colormodel,colorattribute,transparencyattribute) +function metapost.setoutercolor(mode,colormodel,colorattribute,transparencyattribute) -- has always to be called before conversion -- todo: transparency (not in the mood now) outercolormode = mode @@ -101,8 +103,6 @@ local function checked_color_pair(color) end end -metapost.checked_color_pair = checked_color_pair - function metapost.colorinitializer() innercolor = outercolor innertransparency = outertransparency @@ -391,15 +391,7 @@ metapost.multipass = false local textexts = { } -function metapost.free_boxes() -- todo: mp direct list ipv box - -- for i = metapost.first_box,metapost.last_box do - -- local b = texbox[i] - -- if b then - -- texbox[i] = nil -- no node.flush_list(b) needed, else double free error - -- else - -- break - -- end - -- end +local function free_boxes() -- todo: mp direct list ipv box for n, box in next, textexts do local tn = textexts[n] if tn then @@ -627,64 +619,58 @@ function metapost.colorconverter() return models[colors.model] or gray end -do +local btex = P("btex") +local etex = P(" etex") +local vtex = P("verbatimtex") +local ttex = P("textext") +local gtex = P("graphictext") +local multipass = P("forcemultipass") +local spacing = S(" \n\r\t\v")^0 +local dquote = P('"') - local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs +local found, forced = false, false - local btex = P("btex") - local etex = P(" etex") - local vtex = P("verbatimtex") - local ttex = P("textext") - local gtex = P("graphictext") - local multipass = P("forcemultipass") - local spacing = S(" \n\r\t\v")^0 - local dquote = P('"') +local function convert(str) + found = true + return "rawtextext(\"" .. str .. "\")" -- centered +end +local function ditto(str) + return "\" & ditto & \"" +end +local function register() + found = true +end +local function force() + forced = true +end - local found, forced = false, false +local texmess = (dquote/ditto + (1 - etex))^0 - local function convert(str) - found = true - return "rawtextext(\"" .. str .. "\")" -- centered - end - local function ditto(str) - return "\" & ditto & \"" - end - local function register() - found = true - end - local function force() - forced = true - end +local function ignore(s) + report_mplib("ignoring verbatim tex: %s",s) + return "" +end - local texmess = (dquote/ditto + (1 - etex))^0 +local parser = P { + [1] = Cs((V(2)/register + V(4)/ignore + V(3)/convert + V(5)/force + 1)^0), + [2] = ttex + gtex, + [3] = btex * spacing * Cs(texmess) * etex, + [4] = vtex * spacing * Cs(texmess) * etex, + [5] = multipass, -- experimental, only for testing +} - local function ignore(s) - report_mplib("ignoring verbatim tex: %s",s) - return "" - end +-- currently a a one-liner produces less code - local parser = P { - [1] = Cs((V(2)/register + V(4)/ignore + V(3)/convert + V(5)/force + 1)^0), - [2] = ttex + gtex, - [3] = btex * spacing * Cs(texmess) * etex, - [4] = vtex * spacing * Cs(texmess) * etex, - [5] = multipass, -- experimental, only for testing - } - - -- currently a a one-liner produces less code - - local parser = Cs(( - (ttex + gtex)/register - + (btex * spacing * Cs(texmess) * etex)/convert - + (vtex * spacing * Cs(texmess) * etex)/ignore - + 1 - )^0) - - function metapost.check_texts(str) - found, forced = false, false - return lpegmatch(parser,str), found, forced - end +local parser = Cs(( + (ttex + gtex)/register + + (btex * spacing * Cs(texmess) * etex)/convert + + (vtex * spacing * Cs(texmess) * etex)/ignore + + 1 +)^0) +local function check_texts(str) + found, forced = false, false + return lpegmatch(parser,str), found, forced end local factor = 65536*(7227/7200) @@ -707,7 +693,7 @@ local do_begin_fig = "; beginfig(1); " local do_end_fig = "; endfig ;" local do_safeguard = ";" -function metapost.text_texts_data() +function metapost.texttextsdata() local t, n = { }, 0 --~ for i = metapost.first_box, metapost.last_box do --~ n = n + 1 @@ -735,11 +721,11 @@ metapost.method = 1 -- 1:dumb 2:clever function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,askedfig) local nofig = (askedfig and "") or false local done_1, done_2, forced_1, forced_2 - str, done_1, forced_1 = metapost.check_texts(str) + str, done_1, forced_1 = check_texts(str) if not preamble or preamble == "" then preamble, done_2, forced_2 = "", false, false else - preamble, done_2, forced_2 = metapost.check_texts(preamble) + preamble, done_2, forced_2 = check_texts(preamble) end -- metapost.textext_current = metapost.first_box metapost.intermediate.needed = false @@ -779,7 +765,7 @@ function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,asked }, false, nil, false, false, askedfig ) end -- here we could free the textext boxes - metapost.free_boxes() + free_boxes() end function metapost.graphic_extra_pass(askedfig) @@ -788,7 +774,7 @@ function metapost.graphic_extra_pass(askedfig) metapost.process(current_format, { nofig or do_begin_fig, no_trial_run, - concat(metapost.text_texts_data()," ;\n"), + concat(metapost.texttextsdata()," ;\n"), current_initializations, do_safeguard, current_graphic, diff --git a/tex/context/base/mult-aux.lua b/tex/context/base/mult-aux.lua index 997760a37..be2d282b6 100644 --- a/tex/context/base/mult-aux.lua +++ b/tex/context/base/mult-aux.lua @@ -22,6 +22,9 @@ local meaning = "@@@@" local data = { } function namespaces.define(namespace,settings) + if trace_namespaces then + report_namespaces("installing namespace '%s' with settings '%s'",namespace,settings) + end if data[namespace] then report_namespaces("namespace '%s' is already taken",namespace) end @@ -35,29 +38,29 @@ function namespaces.define(namespace,settings) if not name or name == "" then report_namespaces("provide a (command) name in namespace '%s'",namespace) end - local self = prefix .. namespace + local self = "\\" .. prefix .. namespace context.unprotect() -- context.installnamespace(namespace) - context("\\def\\%s%s{%s%s}",prefix,self,meaning,namespace) + context("\\def\\%s%s{%s%s}",prefix,namespace,meaning,namespace) if trace_namespaces then - report_namespaces("installing namespace '%s' for '%s'",namespace,name) + report_namespaces("using namespace '%s' for '%s'",namespace,name) end local parent = ns.parent or "" if parent ~= "" then if trace_namespaces then report_namespaces("namespace '%s' for '%s' uses parent '%s'",namespace,name,parent) end - parent = prefix .. parent + parent = "\\" .. prefix .. parent -- todo: check if defined end context.installparameterhandler(self,name) if trace_namespaces then report_namespaces("installing parameter handler for '%s'",name) - end + end context.installparameterhashhandler(self,name) if trace_namespaces then report_namespaces("installing parameterhash handler for '%s'",name) - end + end local style = ns.style if style == v_yes then context.installattributehandler(self,name) diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv index 295b0a71c..54971d6a5 100644 --- a/tex/context/base/mult-aux.mkiv +++ b/tex/context/base/mult-aux.mkiv @@ -65,7 +65,8 @@ \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}} % always root \def\installparameterhandler#1#2% - {\normalexpanded + {%\message{\detokenize{#1}/\detokenize{#2}}% + \normalexpanded {\doinstallparameterhandler {\noexpand#1}% \??aa \expandafter\noexpand\csname current#2\endcsname @@ -163,30 +164,40 @@ \def\installnamespace#1% {\setvalue{????#1}{@@@@#1}} -% \start -% -% \enabletrackers[interfaces.namespaces] +% \enabletrackers[interfaces.namespaces,context.flush] % % \definenamespace -% [ws] +% [xy] % [type=module, -% comment=letter module, +% comment=test module, % version=1, -% name=letter, +% name=test, % style=yes, % command=yes, % setup=list, -% parent=ws-common] +% parent=xy] +% +% \unprotect +% \getparameters +% [\????xy] +% [text=] +% \protect +% +% \definetest[one] +% +% \starttext +% +% “\testparameter{text}” % -% \ttx \listnamespaces +% \setuptest[text=foo] % -% \defineletter[mine][whatever=true] \setupletter[mine][whatever=true] +% “\testparameter{text}” % -% \namedletterparameter{mine}{whatever} +% \setuptest[one][text=bar] % -% \def\currentletter{mine} \letterparameter{whatever} +% “\testparameter{text}” % -% \stop +% \stoptext \def\definenamespace{\dodoubleargument\dodefinenamespace} diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua index ac746b28b..7244b0d7e 100644 --- a/tex/context/base/mult-cld.lua +++ b/tex/context/base/mult-cld.lua @@ -16,11 +16,22 @@ if not modules then modules = { } end modules ['mult-cld'] = { -- Todo: optional checking against interface -- Todo: coroutine trickery -context = context or { } +context = context or { } +local context = context local format, concat = string.format, table.concat local next, type, tostring = next, type, tostring -local texsprint, texiowrite, texcount, ctxcatcodes = tex.sprint, texio.write, tex.count, tex.ctxcatcodes +local insert, remove = table.insert, table.remove + +local tex = tex + +local texsprint = tex.sprint +local texprint = tex.print +local texiowrite = texio.write +local texcount = tex.count +local ctxcatcodes = tex.ctxcatcodes +local prtcatcodes = tex.prtcatcodes +local vrbcatcodes = tex.vrbcatcodes local flush = texsprint or function(cct,...) print(concat{...}) end @@ -49,10 +60,43 @@ context._stack_ = _stack_ context._store_ = _store_ context._flush_ = _flush_ +-- Should we keep the catcodes with the function? + +local catcodestack = { } +local currentcatcodes = ctxcatcodes + +function context.pushcatcodes(c) + insert(catcodestack,currentcatcodes) + currentcatcodes = c +end + +function context.popcatcodes() + currentcatcodes = remove(catcodestack) or currentcatcodes +end + +function context.unprotect() + insert(catcodestack,currentcatcodes) + currentcatcodes = prtcatcodes +end + +function context.protect() + currentcatcodes = remove(catcodestack) or currentcatcodes +end + function tex.fprint(...) -- goodie - texsprint(ctxcatcodes,format(...)) + texsprint(currentcatcodes,format(...)) end +--~ function context.direct(...) +--~ context.flush(...) +--~ end + +--~ function context.verbose(...) +--~ context.flush(vrbcatcodes,...) +--~ end + +local trace_context = logs.new("context") -- here + function context.trace(intercept) local normalflush = flush flush = function(c,...) @@ -67,69 +111,11 @@ 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) -local trace_context = logs.new("context") - -local function writer(k,...) -- we can optimize for 1 argument - if k then - flush(ctxcatcodes,k) - local t = { ... } - local nt = #t - if nt > 0 then - for i=1,nt do - local ti = t[i] - local typ = type(ti) - if ti == nil then - -- next - elseif typ == "string" or typ == "number" then - flush(ctxcatcodes,"{",ti,"}") - elseif typ == "table" then - local tn = #ti - if tn > 0 then - for j=1,tn do - local tj = ti[j] - if type(tj) == "function" then - ti[j] = "\\mkivflush{" .. _store_(tj) .. "}" - end - end - flush(ctxcatcodes,"[",concat(ti,","),"]") - else - flush(ctxcatcodes,"[") - local done = false - for k, v in next, ti do - if done then - flush(ctxcatcodes,",",k,'=',v) - else - flush(ctxcatcodes,k,'=',v) - done = true - end - end - flush(ctxcatcodes,"]") - end - elseif typ == "function" then - flush(ctxcatcodes,"{\\mkivflush{" .. _store_(ti) .. "}}") - -- elseif typ == "boolean" then - -- flush(ctxcatcodes,"\n") - elseif ti == true then - flush(ctxcatcodes,"\n") - elseif typ == false then - -- if force == "direct" then - flush(ctxcatcodes,tostring(ti)) - -- end - elseif typ == "thread" then - trace_context("coroutines not supported as we cannot yeild across boundaries") - else - trace_context("error: %s gets a weird argument %s",k,tostring(ti)) - end - end - end - end -end - -local function newwriter(command,first,...) -- 5% faster than just ... and separate flush of command +local function writer(command,first,...) -- 5% faster than just ... and separate flush of command if not command then -- error elseif not first then - flush(ctxcatcodes,command) + flush(currentcatcodes,command) else local t = { first, ... } for i=1,#t do @@ -139,28 +125,28 @@ local function newwriter(command,first,...) -- 5% faster than just ... and separ local ti = t[i] local typ = type(ti) if ti == nil then - flush(ctxcatcodes,command) + flush(currentcatcodes,command) elseif typ == "string" or typ == "number" then - flush(ctxcatcodes,command,"{",ti,"}") + flush(currentcatcodes,command,"{",ti,"}") elseif typ == "table" then local tn = #ti if tn == 0 then local done = false for k, v in next, ti do if done then - flush(ctxcatcodes,",",k,'=',v) + flush(currentcatcodes,",",k,'=',v) else - flush(ctxcatcodes,command,"[",k,'=',v) + flush(currentcatcodes,command,"[",k,'=',v) done = true end end - flush(ctxcatcodes,"]") + flush(currentcatcodes,"]") elseif tn == 1 then -- some 20% faster than the next loop local tj = ti[1] if type(tj) == "function" then - flush(ctxcatcodes,command,"[\\mkivflush{",_store_(tj),"}]") + flush(currentcatcodes,command,"[\\mkivflush{",_store_(tj),"}]") else - flush(ctxcatcodes,command,"[",tj,"]") + flush(currentcatcodes,command,"[",tj,"]") end else -- is concat really faster than flushes here? for j=1,tn do @@ -169,32 +155,32 @@ local function newwriter(command,first,...) -- 5% faster than just ... and separ ti[j] = "\\mkivflush{" .. _store_(tj) .. "}" end end - flush(ctxcatcodes,command,"[",concat(ti,","),"]") + flush(currentcatcodes,command,"[",concat(ti,","),"]") end elseif typ == "function" then - flush(ctxcatcodes,command,"{\\mkivflush{",_store_(ti),"}}") + flush(currentcatcodes,command,"{\\mkivflush{",_store_(ti),"}}") -- elseif typ == "boolean" then - -- flush(ctxcatcodes,"\n") + -- flush(currentcatcodes,"\n") elseif ti == true then - flush(ctxcatcodes,command,"\n") + flush(currentcatcodes,command,"\n") elseif typ == false then -- if force == "direct" then - flush(ctxcatcodes,command,tostring(ti)) + flush(currentcatcodes,command,tostring(ti)) -- end elseif typ == "thread" then - flush(ctxcatcodes,command) - trace_context("coroutines not supported as we cannot yeild across boundaries") + flush(currentcatcodes,command) + trace_context("coroutines not supported as we cannot yield across boundaries") else - flush(ctxcatcodes,command) + flush(currentcatcodes,command) trace_context("error: %s gets a weird argument %s",command,tostring(ti)) end end end end -experiments.register("context.writer",function() - writer = newwriter -end) +--~ experiments.register("context.writer",function() +--~ writer = newwriter +--~ end) -- -- -- @@ -209,13 +195,13 @@ local function caller(t,f,a,...) if not t then -- so we don't need to test in the calling (slower but often no issue) elseif a then - flush(ctxcatcodes,format(f,a,...)) + flush(currentcatcodes,format(f,a,...)) elseif type(f) == "function" then - flush(ctxcatcodes,"{\\mkivflush{" .. _store_(f) .. "}}") + flush(currentcatcodes,"{\\mkivflush{" .. _store_(f) .. "}}") elseif f then - flush(ctxcatcodes,f) + flush(currentcatcodes,f) else - flush(ctxcatcodes,"\n") + flush(currentcatcodes,"\n") end end diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua index 84b60232c..943af3837 100644 --- a/tex/context/base/node-fin.lua +++ b/tex/context/base/node-fin.lua @@ -117,7 +117,7 @@ end -- nodes.process_attribute = process_attribute -function nodes.install_attribute_handler(plugin) -- we need to avoid this nested function +function nodes.installattributehandler(plugin) -- we need to avoid this nested function return function(head) return process_attribute(head,plugin) end @@ -165,7 +165,7 @@ end --~ end --~ ]] --~ ---~ function nodes.install_attribute_handler(plugin) -- we need to avoid this nested function +--~ function nodes.installattributehandler(plugin) -- we need to avoid this nested function --~ plugindata[plugin.name] = plugin --~ local str = format(template,plugin.name) --~ return loadstring(str)() diff --git a/tex/context/base/node-fnt.lua b/tex/context/base/node-fnt.lua index 3c98785e5..c35a42840 100644 --- a/tex/context/base/node-fnt.lua +++ b/tex/context/base/node-fnt.lua @@ -58,7 +58,7 @@ function handlers.characters(head) if shared then local dynamics = shared.dynamics if dynamics then - local d = shared.set_dynamics(font,dynamics,attr) -- still valid? + local d = shared.setdynamics(font,dynamics,attr) if d then used[attr] = d a = a + 1 diff --git a/tex/context/base/node-par.lua b/tex/context/base/node-par.lua index ef387cd55..b153ec6d6 100644 --- a/tex/context/base/node-par.lua +++ b/tex/context/base/node-par.lua @@ -14,32 +14,35 @@ local parbuilders = builders.paragraphs parbuilders.constructors = parbuilders.constructors or { } local constructors = parbuilders.constructors -parbuilders.names = parbuilders.names or { } -local names = parbuilders.names +constructors.names = constructors.names or { } +local names = constructors.names -parbuilders.numbers = parbuilders.numbers or { } -local numbers = parbuilders.numbers +constructors.numbers = constructors.numbers or { } +local numbers = constructors.numbers + +constructors.methods = constructors.methods or { } +local methods = constructors.methods local p_attribute = attributes.numbers['parbuilder'] or 999 -parbuilders.attribute = p_attribute +constructors.attribute = p_attribute local has_attribute = node.has_attribute local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming -storage.register("builders/paragraphs/names", names, "builders.paragraphs.names") -storage.register("builders/paragraphs/numbers", numbers, "builders.paragraphs.numbers") +storage.register("builders/paragraphs/constructors/names", names, "builders.paragraphs.constructors.names") +storage.register("builders/paragraphs/constructors/numbers", numbers, "builders.paragraphs.constructors.numbers") local report_parbuilders = logs.new("parbuilders") local mainconstructor = nil -- not stored in format -function parbuilders.register(name,number) +function constructors.register(name,number) names[number] = name numbers[name] = number end -function parbuilders.setmain(name) +function constructors.set(name) mainconstructor = numbers[name] end @@ -49,19 +52,19 @@ end -- false : idem but dangerous -- head : list of valid vmode nodes with last being hlist -function parbuilders.constructor(head,followed_by_display) +function constructors.handler(head,followed_by_display) if type(head) == "boolean" then return head else local attribute = has_attribute(head,p_attribute) or mainconstructor if attribute then - local constructor = names[attribute] - if constructor then - local handler = constructor and constructors[constructor] + local method = names[attribute] + if method then + local handler = methods[method] if handler then return handler(head,followed_by_display) else - report_parbuilders("handler '%s' is not defined",tostring(constructor)) + report_parbuilders("contructor method '%s' is not defined",tostring(method)) return true -- let tex break end end @@ -72,13 +75,13 @@ end -- just for testing -function constructors.default(head,followed_by_display) +function constructors.methods.default(head,followed_by_display) return true -- let tex break end -- also for testing (no surrounding spacing done) -function constructors.oneline(head,followed_by_display) +function constructors.methods.oneline(head,followed_by_display) return node.hpack(head) end @@ -89,11 +92,11 @@ end -- todo: enable one as main -local actions = parbuilders.constructor +local actions = constructors.handler local enabled = false -function parbuilders.enable () enabled = true end -function parbuilders.disable() enabled = false end +function constructors.enable () enabled = true end +function constructors.disable() enabled = false end local function processor(head,followed_by_display) if enabled then diff --git a/tex/context/base/node-par.mkiv b/tex/context/base/node-par.mkiv index 4db097c92..28c8931d3 100644 --- a/tex/context/base/node-par.mkiv +++ b/tex/context/base/node-par.mkiv @@ -40,7 +40,7 @@ \unexpanded\def\defineparbuilder[#1]% {\global\advance\nofparbuilders\plusone - \ctxlua{builders.paragraphs.register("#1",\number\nofparbuilders)}% + \ctxlua{builders.paragraphs.constructors.register("#1",\number\nofparbuilders)}% \setxvalue{\??ng:#1}{\attribute\parbuilderattribute\nofparbuilders}} \unexpanded\def\startparbuilder[#1]% @@ -56,7 +56,7 @@ \checkparbuilders} \def\setmainparbuilder[#1]% - {\ctxlua{builders.paragraphs.setmain("#1")}} + {\ctxlua{builders.paragraphs.constructors.set("#1")}} % no high level interface, after all implementing a linebreaker is not something that % the average user will do @@ -65,8 +65,8 @@ \defineparbuilder[oneline] % just for testing \defineparbuilder[basic] % just for testing -\def\enableparbuilders {\ctxlua{builders.paragraphs.enable ()}} -\def\disableparbuilders{\ctxlua{builders.paragraphs.disable()}} +\def\enableparbuilders {\ctxlua{builders.paragraphs.constructors.enable ()}} +\def\disableparbuilders{\ctxlua{builders.paragraphs.constructors.disable()}} \def\checkparbuilders % can be more efficient as we don't want to do this to often {\ifcase\attribute\parbuilderattribute diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua index 2f4575598..40dd82c4d 100644 --- a/tex/context/base/node-ref.lua +++ b/tex/context/base/node-ref.lua @@ -562,7 +562,7 @@ statistics.register("interactive elements", function() end end) -function references.enable_interaction() +function references.enableinteraction() tasks.enableaction("shipouts","nodes.references.handler") tasks.enableaction("shipouts","nodes.destinations.handler") end diff --git a/tex/context/base/node-rul.lua b/tex/context/base/node-rul.lua index eb388a6d9..a8f59c37e 100644 --- a/tex/context/base/node-rul.lua +++ b/tex/context/base/node-rul.lua @@ -121,7 +121,7 @@ local checkdir = true -- omkeren class en level -> scheelt functie call in analyse -local function process_words(attribute,data,flush,head,parent) -- we have hlistdir and local dir +local function processwords(attribute,data,flush,head,parent) -- we have hlistdir and local dir local n = head if n then local f, l, a, d, i, class @@ -167,7 +167,7 @@ local function process_words(attribute,data,flush,head,parent) -- we have hlistd end local list = n.list if list then - n.list = process_words(attribute,data,flush,list,n) + n.list = processwords(attribute,data,flush,list,n) end elseif checkdir and id == whatsit_code and n.subtype == dir_code then -- only changes in dir, we assume proper boundaries if f and a then @@ -206,7 +206,7 @@ local function process_words(attribute,data,flush,head,parent) -- we have hlistd end end -nodes.process_words = process_words +nodes.processwords = processwords -- @@ -297,7 +297,7 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a return head end -local process = nodes.process_words +local process = nodes.processwords nodes.rules.handler = function(head) return process(a_ruled,data,flush_ruled,head) end @@ -353,7 +353,7 @@ local function flush_shifted(head,first,last,data,level,parent,strip) -- not tha return head end -local process = nodes.process_words +local process = nodes.processwords nodes.shifts.handler = function(head) return process(a_shifted,data,flush_shifted,head) end diff --git a/tex/context/base/node-ser.lua b/tex/context/base/node-ser.lua index 0b8b2212e..0ef074397 100644 --- a/tex/context/base/node-ser.lua +++ b/tex/context/base/node-ser.lua @@ -265,7 +265,7 @@ function nodes.print(head,n) end end -function nodes.check_for_leaks(sparse) +function nodes.checkforleaks(sparse) local l = { } local q = node.usedlist() for p in traverse(q) do diff --git a/tex/context/base/node-spl.lua b/tex/context/base/node-spl.lua index db279b73f..bd641817c 100644 --- a/tex/context/base/node-spl.lua +++ b/tex/context/base/node-spl.lua @@ -74,7 +74,6 @@ local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming local process_characters = nodes.handlers.characters local inject_kerns = nodes.handlers.injectkerns -local set_dynamics = fonts.otf.set_dynamics local fontdata = fonts.ids local parbuilders = builders.paragraphs @@ -239,7 +238,7 @@ function splitters.split(head) } if trace_split then report_splitter( "cached %4i: font: %s, attribute: %s, word: %s, direction: %s", n, - font, attribute, nodes.list_to_utf(list,true), rlmode) + font, attribute, nodes.listtoutf(list,true), rlmode) end cache[n] = c local solution = solutions[attribute] @@ -336,13 +335,14 @@ local function doit(word,list,best,width,badness,line,set,listdir) end local font = found.font local dynamics = found.dynamics + local shared = fontdata[font].shared if not dynamics then -- we cache this - dynamics = fontdata[font].shared.dynamics + dynamics = shared.dynamics found.dynamics = dynamics end local processors = found[featurenumber] if not processors then -- we cache this too - processors = set_dynamics(font,dynamics,featurenumber) + processors = shared.setdynamics(font,dynamics,featurenumber) found[featurenumber] = processors end for i=1,#processors do -- often more than 1 diff --git a/tex/context/base/node-tra.lua b/tex/context/base/node-tra.lua index 16829a1e5..dd6a49d4b 100644 --- a/tex/context/base/node-tra.lua +++ b/tex/context/base/node-tra.lua @@ -352,7 +352,7 @@ function nodes.show_list(head, message) end end -function nodes.check_glyphs(head,message) +function nodes.checkglyphs(head,message) local t = { } for g in traverse_id(glyph_code,head) do t[#t+1] = format("U+%04X:%s",g.char,g.subtype) @@ -428,7 +428,7 @@ function nodes.report(t,done) end end -function nodes.pack_list(head) +function nodes.packlist(head) local t = { } for n in traverse(head) do t[#t+1] = tostring(n) @@ -491,7 +491,7 @@ end nodes.show_simple_list = function(h,depth) show_simple_list(h,depth,0) end -function nodes.list_to_utf(h,joiner) +function nodes.listtoutf(h,joiner) local joiner = (joiner ==true and utfchar(0x200C)) or joiner -- zwnj local w = { } while h do diff --git a/tex/context/base/scrn-nav.mkiv b/tex/context/base/scrn-nav.mkiv index 207530b83..bc27cd973 100644 --- a/tex/context/base/scrn-nav.mkiv +++ b/tex/context/base/scrn-nav.mkiv @@ -197,7 +197,7 @@ \def\enableinteractivereferences {\ifproductionrun - \ctxlua{structures.references.enable_interaction()}% + \ctxlua{structures.references.enableinteraction()}% \globallet\enableinteractivereferences\relax \fi} diff --git a/tex/context/base/scrp-cjk.lua b/tex/context/base/scrp-cjk.lua index e17d4e967..7c1310528 100644 --- a/tex/context/base/scrp-cjk.lua +++ b/tex/context/base/scrp-cjk.lua @@ -28,13 +28,13 @@ local prestat = attributes.private('prestat') scripts.cjk = scripts.cjk or { } -local kind_to_number = scripts.kind_to_number -local number_to_kind = scripts.number_to_kind -local hash = scripts.hash -local cjk = scripts.cjk +local kindtonumber = scripts.kindtonumber +local numbertokind = scripts.numbertokind +local hash = scripts.hash +local cjk = scripts.cjk -local fontdata = fonts.identifiers -local quaddata = fonts.quads +local fontdata = fonts.identifiers +local quaddata = fonts.quads -- raggedleft is controlled by leftskip and we might end up with a situation where -- the intercharacter spacing interferes with this; the solution is to patch the @@ -326,7 +326,7 @@ local function process(head,first,last) local upcoming, id = first.next, first.id if id == glyph_code then local a = has_attribute(first,prestat) - local current = number_to_kind[a] + local current = numbertokind[a] local action = injectors[previous] if action then action = action[current] @@ -346,7 +346,7 @@ local function process(head,first,last) local pid, nid = p.id, n.id if pid == glyph_code and nid == glyph_code then local pa, na = has_attribute(p,prestat), has_attribute(n,prestat) - local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na] + local pcjk, ncjk = pa and numbertokind[pa], na and numbertokind[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" or pcjk == "other" or ncjk == "other" @@ -529,7 +529,7 @@ local function process(head,first,last) local upcoming, id = first.next, first.id if id == glyph_code then local a = has_attribute(first,prestat) - local current = number_to_kind[a] + local current = numbertokind[a] local action = injectors[previous] if action then action = action[current] @@ -549,7 +549,7 @@ local function process(head,first,last) local pid, nid = p.id, n.id if pid == glyph_code and nid == glyph_code then local pa, na = has_attribute(p,prestat), has_attribute(n,prestat) - local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na] + local pcjk, ncjk = pa and numbertokind[pa], na and numbertokind[na] if not pcjk or not ncjk or pcjk == "korean" or ncjk == "korean" or pcjk == "other" or ncjk == "other" diff --git a/tex/context/base/scrp-ini.lua b/tex/context/base/scrp-ini.lua index bff12def8..949bbe2a7 100644 --- a/tex/context/base/scrp-ini.lua +++ b/tex/context/base/scrp-ini.lua @@ -197,7 +197,7 @@ scripts.colors = { -- todo: just named colors local colors = scripts.colors -local number_to_kind = { +local numbertokind = { "korean", "chinese", "full_width_open", @@ -211,7 +211,7 @@ local number_to_kind = { "jamo_final", } -local kind_to_number = { +local kindtonumber = { korean = 1, chinese = 2, full_width_open = 3, @@ -225,8 +225,8 @@ local kind_to_number = { jamo_final = 11, } -scripts.kind_to_number = kind_to_number -scripts.number_to_kind = number_to_kind +scripts.kindtonumber = kindtonumber +scripts.numbertokind = numbertokind -- no, this time loading the lua always precedes the definitions -- @@ -254,7 +254,7 @@ end local function colorize(start,stop) for n in traverse_id(glyph_code,start) do - local kind = number_to_kind[has_attribute(n,prestat)] + local kind = numbertokind[has_attribute(n,prestat)] if kind then local ac = colors[kind] if ac then @@ -322,7 +322,7 @@ function scripts.preprocess(head) if originals then c = originals[c] or c end local h = hash[c] if h then - set_attribute(start,prestat,kind_to_number[h]) + set_attribute(start,prestat,kindtonumber[h]) if not first then first, last = start, start else diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua index 38c28aaa6..2bafe8e5e 100644 --- a/tex/context/base/sort-ini.lua +++ b/tex/context/base/sort-ini.lua @@ -27,10 +27,10 @@ local splitters = { } local entries = { } local mappings = { } local replacements = { } -local ignored_offset = 0x10000 -local replacement_offset = 0x10000 -local digits_offset = 0x20000 -local digits_maximum = 0xFFFFF +local ignoredoffset = 0x10000 +local replacementoffset = 0x10000 +local digitsoffset = 0x20000 +local digitsmaximum = 0xFFFFF sorters = { comparers = comparers, @@ -38,10 +38,12 @@ sorters = { entries = entries, mappings = mappings, replacements = replacements, - ignored_offset = ignored_offset, - replacement_offset = replacement_offset, - digits_offset = digits_offset, - digits_maximum = digits_maximum, + constants = { + ignoredoffset = ignoredoffset, + replacementoffset = replacementoffset, + digitsoffset = digitsoffset, + digitsmaximum = digitsmaximum, + } } local ssorters = sorters @@ -146,9 +148,9 @@ local function numify(s) end local function numify(s) - s = digits_offset + tonumber(s) - if s > digits_maximum then - s = digits_maximum + s = digitsoffset + tonumber(s) + if s > digitsmaximum then + s = digitsmaximum end return utfchar(s) end @@ -240,7 +242,7 @@ local function pack(entry) local tt, li = { }, split[i].s for j=1,#li do local lij = li[j] - tt[j] = utfbyte(lij) > ignored_offset and "[]" or lij + tt[j] = utfbyte(lij) > ignoredoffset and "[]" or lij end t[i] = concat(tt) end @@ -249,7 +251,7 @@ local function pack(entry) local t, li = { }, split.s for j=1,#li do local lij = li[j] - t[j] = utfbyte(lij) > ignored_offset and "[]" or lij + t[j] = utfbyte(lij) > ignoredoffset and "[]" or lij end return concat(t) end @@ -283,7 +285,7 @@ end -- some day we can have a characters.upper and characters.lower -function sorters.add_uppercase_replacements(what) +function sorters.adduppercasereplacements(what) local rep, new = replacements[what], { } for i=1,#rep do local r = rep[i] @@ -297,7 +299,7 @@ function sorters.add_uppercase_replacements(what) end end -function sorters.add_uppercase_entries(what) +function sorters.adduppercaseentries(what) local ent, new = entries[what], { } for k, v in next, ent do local u = chardata[utfbyte(k)].uccode @@ -310,7 +312,7 @@ function sorters.add_uppercase_entries(what) end end -function sorters.add_uppercase_mappings(what,offset) +function sorters.adduppercasemappings(what,offset) local map, new, offset = mappings[what], { }, offset or 0 for k, v in next, map do local u = chardata[utfbyte(k)].uccode diff --git a/tex/context/base/sort-lan.lua b/tex/context/base/sort-lan.lua index 227b3ee7c..31824c964 100644 --- a/tex/context/base/sort-lan.lua +++ b/tex/context/base/sort-lan.lua @@ -17,15 +17,15 @@ local ub = utf.byte local sorters = sorters -local mappings = sorters.mappings -local entries = sorters.entries -local replacements = sorters.replacements +local mappings = sorters.mappings +local entries = sorters.entries +local replacements = sorters.replacements -local add_uppercase_replacements = sorters.add_uppercase_replacements -local add_uppercase_entries = sorters.add_uppercase_entries -local add_uppercase_mappings = sorters.add_uppercase_mappings +local adduppercasereplacements = sorters.adduppercasereplacements +local adduppercaseentries = sorters.adduppercaseentries +local adduppercasemappings = sorters.adduppercasemappings -local replacement_offset = sorters.replacement_offset +local replacementoffset = sorters.constants.replacementoffset -- english @@ -76,8 +76,8 @@ mappings ['nl'] = mappings['en'] -- czech -local cz_ch = uc(replacement_offset + 1) -local cz_CH = uc(replacement_offset + 2) +local cz_ch = uc(replacementoffset + 1) +local cz_CH = uc(replacementoffset + 2) replacements['cz'] = { [1] = { "ch", cz_ch } @@ -171,8 +171,8 @@ mappings['cz'] = { [uc(0x017E)] = 81, -- zcaron } -add_uppercase_entries ("cz") -add_uppercase_mappings("cz") -- 1 can be option (but then we need a runtime variant) +adduppercaseentries ("cz") +adduppercasemappings("cz") -- 1 can be option (but then we need a runtime variant) entries ['cz'][cz_CH] = entries ['cz'][cz_ch] mappings['cz'][cz_CH] = mappings['cz'][cz_ch] @@ -197,7 +197,7 @@ mappings ['DIN 5007-1'] = mappings['en'] -- DIN 5007-2 -replacements['DIN 5007-2'] = { -- todo: add_uppercase_replacements +replacements['DIN 5007-2'] = { -- todo: adduppercasereplacements { "ä", 'ae' }, { "ö", 'oe' }, { "ü", 'ue' }, @@ -206,7 +206,7 @@ replacements['DIN 5007-2'] = { -- todo: add_uppercase_replacements { "Ü", 'Ue' }, } ---~ add_uppercase_replacements('DIN 5007-2') +--~ adduppercasereplacements('DIN 5007-2') entries ['DIN 5007-2'] = entries ['en'] mappings ['DIN 5007-2'] = mappings['en'] @@ -269,8 +269,8 @@ mappings['de-AT'] = { -- ["W"] = 52, ["X"] = 54, ["Y"] = 56, ["Z"] = 58, } -add_uppercase_entries ('de-AT') -add_uppercase_mappings('de-AT',1) +adduppercaseentries ('de-AT') +adduppercasemappings('de-AT',1) -- finish (by Wolfgang Schuster) @@ -292,8 +292,8 @@ mappings['fi'] = { ["z"] = 51, ["å"] = 53, ["ä"] = 55, ["ö"] = 57, } -add_uppercase_entries ("fi") -add_uppercase_mappings("fi") +adduppercaseentries ("fi") +adduppercasemappings("fi") -- slovenian -- @@ -317,32 +317,32 @@ mappings['sl'] = { ["ž"] = 61, } -add_uppercase_entries ("sl") -add_uppercase_mappings("sl") -- cf. MM +adduppercaseentries ("sl") +adduppercasemappings("sl") -- cf. MM sorters.replacements["pl"] = { -- no replacements } sorters.entries["pl"] = { - ["a"] = "a", ["ą"] = "ą", ["b"] = "b", ["c"] = "c", ["ć"] = "ć", - ["d"] = "d", ["e"] = "e", ["ę"] = "ę", ["f"] = "f", ["g"] = "g", - ["h"] = "h", ["i"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l", - ["ł"] = "ł", ["m"] = "m", ["n"] = "n", ["ń"] = "ń", ["o"] = "o", - ["ó"] = "ó", ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", - ["ś"] = "ś", ["t"] = "t", ["u"] = "u", ["v"] = "v", ["w"] = "w", - ["x"] = "x", ["y"] = "y", ["z"] = "z", ["ź"] = "ź", ["ż"] = "ż", + ["a"] = "a", ["ą"] = "ą", ["b"] = "b", ["c"] = "c", ["ć"] = "ć", + ["d"] = "d", ["e"] = "e", ["ę"] = "ę", ["f"] = "f", ["g"] = "g", + ["h"] = "h", ["i"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l", + ["ł"] = "ł", ["m"] = "m", ["n"] = "n", ["ń"] = "ń", ["o"] = "o", + ["ó"] = "ó", ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", + ["ś"] = "ś", ["t"] = "t", ["u"] = "u", ["v"] = "v", ["w"] = "w", + ["x"] = "x", ["y"] = "y", ["z"] = "z", ["ź"] = "ź", ["ż"] = "ż", } sorters.mappings["pl"] = { - ["a"] = 1, ["ą"] = 2, ["b"] = 3, ["c"] = 4, ["ć"] = 5, - ["d"] = 6, ["e"] = 7, ["ę"] = 8, ["f"] = 9, ["g"] = 10, - ["h"] = 11, ["i"] = 12, ["j"] = 13, ["k"] = 14, ["l"] = 15, - ["ł"] = 16, ["m"] = 17, ["n"] = 18, ["ń"] = 19, ["o"] = 20, - ["ó"] = 21, ["p"] = 22, ["q"] = 23, ["r"] = 24, ["s"] = 25, - ["ś"] = 26, ["t"] = 27, ["u"] = 28, ["v"] = 29, ["w"] = 30, - ["x"] = 31, ["y"] = 32, ["z"] = 33, ["ź"] = 34, ["ż"] = 35, + ["a"] = 1, ["ą"] = 2, ["b"] = 3, ["c"] = 4, ["ć"] = 5, + ["d"] = 6, ["e"] = 7, ["ę"] = 8, ["f"] = 9, ["g"] = 10, + ["h"] = 11, ["i"] = 12, ["j"] = 13, ["k"] = 14, ["l"] = 15, + ["ł"] = 16, ["m"] = 17, ["n"] = 18, ["ń"] = 19, ["o"] = 20, + ["ó"] = 21, ["p"] = 22, ["q"] = 23, ["r"] = 24, ["s"] = 25, + ["ś"] = 26, ["t"] = 27, ["u"] = 28, ["v"] = 29, ["w"] = 30, + ["x"] = 31, ["y"] = 32, ["z"] = 33, ["ź"] = 34, ["ż"] = 35, } -add_uppercase_entries ('pl') -add_uppercase_mappings('pl',1) +adduppercaseentries ('pl') +adduppercasemappings('pl',1) diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index aa166a2f7..6ca229d2a 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -72,7 +72,7 @@ local node_ids_to_string = nodes.ids_to_string local hpack_node = node.hpack local vpack_node = node.vpack local writable_spec = nodes.writable_spec -local list_to_utf = nodes.list_to_utf +local listtoutf = nodes.listtoutf local nodepool = nodes.pool @@ -163,7 +163,7 @@ local function listtohash(str) end end -function vspacing.define_snap_method(name,method) +function vspacing.definesnapmethod(name,method) local n = #snapmethods + 1 local t = listtohash(method) snapmethods[n] = t @@ -732,7 +732,7 @@ local discard, largest, force, penalty, add, disable, nowhite, goback, together --~ local function free_glue_node(n) free_node(n.spec) free_node(n) end -function vspacing.snap_box(n,how) +function vspacing.snapbox(n,how) local sv = snapmethods[how] if sv then local box = texbox[n] @@ -749,14 +749,14 @@ function vspacing.snap_box(n,how) -- assume that the box is already snapped if trace_vsnapping then report_snapper("box list already snapped at (%s,%s): %s", - ht,dp,list_to_utf(list)) + ht,dp,listtoutf(list)) end else local h, d, ch, cd, lines = snap_hlist("box",box,sv,ht,dp) box.height, box.depth = ch, cd if trace_vsnapping then report_snapper("box list snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines): %s", - h,d,ch,cd,sv.name,sv.specification,"direct",lines,list_to_utf(list)) + h,d,ch,cd,sv.name,sv.specification,"direct",lines,listtoutf(list)) end set_attribute(box, snap_method,0) -- set_attribute(list,snap_method,0) -- yes or no @@ -837,7 +837,7 @@ local function collapser(head,where,what,trace,snap,snap_method) -- maybe also p -- end elseif s == 0 then if trace_vsnapping then - report_snapper("mvl %s not snapped, already done: %s",nodecodes[id],list_to_utf(list)) + report_snapper("mvl %s not snapped, already done: %s",nodecodes[id],listtoutf(list)) end else local sv = snapmethods[s] @@ -847,17 +847,17 @@ local function collapser(head,where,what,trace,snap,snap_method) -- maybe also p local ht, dp = current.height, current.depth -- assume that the box is already snapped if trace_vsnapping then - report_snapper("mvl list already snapped at (%s,%s): %s",ht,dp,list_to_utf(list)) + report_snapper("mvl list already snapped at (%s,%s): %s",ht,dp,listtoutf(list)) end else local h, d, ch, cd, lines = snap_hlist("mvl",current,sv) if trace_vsnapping then report_snapper("mvl %s snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines): %s", - nodecodes[id],h,d,ch,cd,sv.name,sv.specification,where,lines,list_to_utf(list)) + nodecodes[id],h,d,ch,cd,sv.name,sv.specification,where,lines,listtoutf(list)) end end elseif trace_vsnapping then - report_snapper("mvl %s not snapped due to unknown snap specification: %s",nodecodes[id],list_to_utf(list)) + report_snapper("mvl %s not snapped due to unknown snap specification: %s",nodecodes[id],listtoutf(list)) end set_attribute(current,snap_method,0) end @@ -1246,7 +1246,7 @@ function nodes.handlers.vboxspacing(head,where) return head end -function nodes.collapse_vbox(n) -- for boxes but using global snap_method +function nodes.collapsevbox(n) -- for boxes but using global snap_method local list = texbox[n].list if list then -- starttiming(vspacing) diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv index e7d54975a..db80c6e36 100644 --- a/tex/context/base/spac-ver.mkiv +++ b/tex/context/base/spac-ver.mkiv @@ -1368,7 +1368,7 @@ \def\installsnapvalues#1#2% todo: a proper define {\edef\currentsnapper{#1:#2}% \ifcsname\currentsnapper\endcsname \else - \setevalue\currentsnapper{\ctxlua{builders.vspacing.define_snap_method("#1","#2")}}% + \setevalue\currentsnapper{\ctxlua{builders.vspacing.definesnapmethod("#1","#2")}}% \fi \setevalue{\??gr:#1}{\attribute\snapmethodattribute\csname\currentsnapper\endcsname\space}} @@ -1501,10 +1501,10 @@ \def\dododosnaptogrid#1% {\ifvbox\nextbox % this will go away - \ctxlua{nodes.collapse_vbox(\number\nextbox)}% isn't that already done? + \ctxlua{nodes.collapsevbox(\number\nextbox)}% isn't that already done? \fi \doifelsenothing{#1}{\setsnapvalue\v!normal}{\autosetsnapvalue{#1}}% - \ctxlua{builders.vspacing.snap_box(\number\nextbox,\number\attribute\snapmethodattribute)}% + \ctxlua{builders.vspacing.snapbox(\number\nextbox,\number\attribute\snapmethodattribute)}% \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}% \egroup} diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua index dc2abf17e..5d6d90da9 100644 --- a/tex/context/base/strc-blk.lua +++ b/tex/context/base/strc-blk.lua @@ -84,7 +84,7 @@ function blocks.select(state,name,tag,criterium) local all = tag == "" local tags = not all and settings_to_set(tag) local hide = state == "process" - local n = sections.number_at_depth(criterium) + local n = sections.numberatdepth(criterium) local result = lists.filter_collected("all", criterium, n, collected, { }) for i=1,#result do local ri = result[i] diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index a40c69b99..660dd61f3 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -347,7 +347,7 @@ function sections.setnumber(depth,n) end end -function sections.number_at_depth(depth) +function sections.numberatdepth(depth) return data.numbers[tonumber(depth) or sections.getlevel(depth) or 0] or 0 end @@ -355,7 +355,7 @@ function sections.numbers() return data.numbers end -function sections.matching_till_depth(depth,numbers,parentnumbers) +function sections.matchingtilldepth(depth,numbers,parentnumbers) local dn = parentnumbers or data.numbers local ok = false for i=1,depth do diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua index 85917375a..1810369a5 100644 --- a/tex/context/base/strc-ini.lua +++ b/tex/context/base/strc-ini.lua @@ -34,10 +34,10 @@ local report_processors = logs.new("processors") -- move this -commands = commands or { } +commands = commands or { } local commands = commands -function commands.first_in_list(str) +function commands.firstinlist(str) local first = match(str,"^([^,]+),") texsprint(ctxcatcodes,first or str) end diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua index 4a46cc130..2cba90fe8 100644 --- a/tex/context/base/strc-lst.lua +++ b/tex/context/base/strc-lst.lua @@ -47,7 +47,7 @@ references.specials = references.specials or { } local cached, pushed = lists.cached, { } local variables = interfaces.variables -local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth +local matchingtilldepth, numberatdepth = sections.matchingtilldepth, sections.numberatdepth local function initializer() -- create a cross reference between internal references @@ -308,7 +308,7 @@ local function filter_collected(names, criterium, number, collected, forced, nes else -- sectionname, number -- not the same as register local depth = sections.getlevel(criterium) - local number = tonumber(number) or number_at_depth(depth) or 0 + local number = tonumber(number) or numberatdepth(depth) or 0 if trace_lists then local t = sections.numbers() detail = format("depth: %s, number: %s, numbers: %s, startset: %s",depth,number,(#t>0 and concat(t,".",1,depth)) or "?",#collected) @@ -324,7 +324,7 @@ local function filter_collected(names, criterium, number, collected, forced, nes local metadata = v.metadata local cnumbers = sectionnumber.numbers if cnumbers then - if (all or names[metadata.name or false]) and #cnumbers >= depth and matching_till_depth(depth,cnumbers,parent) then + if (all or names[metadata.name or false]) and #cnumbers >= depth and matchingtilldepth(depth,cnumbers,parent) then result[#result+1] = v end end diff --git a/tex/context/base/strc-lst.mkiv b/tex/context/base/strc-lst.mkiv index a09d61c55..8578b7157 100644 --- a/tex/context/base/strc-lst.mkiv +++ b/tex/context/base/strc-lst.mkiv @@ -156,7 +156,7 @@ {\ctxlua{structures.lists.analyze("#1","#2","#3")}} \def\firststructureelementinlist#1% - {\ctxlua{commands.first_in_list("#1")}} + {\ctxlua{commands.firstinlist("#1")}} \def\structurelistsize {\ctxlua{structures.lists.size()}} diff --git a/tex/context/base/strc-not.mkii b/tex/context/base/strc-not.mkii index a47d796e0..ec38410d4 100644 --- a/tex/context/base/strc-not.mkii +++ b/tex/context/base/strc-not.mkii @@ -534,7 +534,7 @@ \unexpanded\def\setnotetext{\dotripleempty\dosetnote[0]} \def\dosetnote[#1][#2][#3]% - {\unskip + {\removeunwantedspaces \def\currentnote{#2}% \dochecknote % sometimes needed for local notes \ifcase#1\relax diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 3e0fefc51..398afefba 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -963,26 +963,26 @@ end -- -function references.get_current_metadata(tag) +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) end end -local function current_metadata(tag) +local function currentmetadata(tag) local data = currentreference and currentreference.i return data and data.metadata and data.metadata[tag] end -references.current_metadata = current_metadata +references.currentmetadata = currentmetadata -function references.get_current_prefixspec(default) -- todo: message +function references.getcurrentprefixspec(default) -- todo: message texsprint(ctxcatcodes,"\\getreferencestructureprefix{", - current_metadata("kind") or "?", "}{", current_metadata("name") or "?", "}{", default or "?", "}") + currentmetadata("kind") or "?", "}{", currentmetadata("name") or "?", "}{", default or "?", "}") end ---~ function references.get_current_prefixspec(default) -- we can consider storing the data at the lua end ---~ context.getreferencestructureprefix(current_metadata("kind"),current_metadata("name"),default) +--~ function references.getcurrentprefixspec(default) -- we can consider storing the data at the lua end +--~ context.getreferencestructureprefix(currentmetadata("kind"),currentmetadata("name"),default) --~ end -- diff --git a/tex/context/base/strc-ref.mkiv b/tex/context/base/strc-ref.mkiv index 4a0231961..d5dadc63c 100644 --- a/tex/context/base/strc-ref.mkiv +++ b/tex/context/base/strc-ref.mkiv @@ -1946,8 +1946,8 @@ % \def\getreferencestructureprefixspec#1% we can save one call by moving this to the lua end % {\getreferencestructureprefix -% {\ctxlua{structures.references.get_current_metadata("kind")}} -% {\ctxlua{structures.references.get_current_metadata("name")}} +% {\ctxlua{structures.references.getcurrentmetadata("kind")}} +% {\ctxlua{structures.references.getcurrentmetadata("name")}} % {#1}} % \def\currentreferencedefault % {\ctxlua{structures.references.filter("default",\getreferencestructureprefixspec\v!default)}} @@ -1955,7 +1955,7 @@ % this is shortcut for: \def\currentreferencedefault - {\ctxlua{structures.references.filter("default",\ctxlua{structures.references.get_current_prefixspec("\v!default")})}} + {\ctxlua{structures.references.filter("default",\ctxlua{structures.references.getcurrentprefixspec("\v!default")})}} \protect \endinput diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua index 1da64d6c1..2b6b6e30c 100644 --- a/tex/context/base/strc-reg.lua +++ b/tex/context/base/strc-reg.lua @@ -37,8 +37,7 @@ local processor_split = processors.split local variables = interfaces.variables -local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth - +local matchingtilldepth, numberatdepth = sections.matchingtilldepth, sections.numberatdepth -- some day we will share registers and lists (although there are some conceptual -- differences in the application of keywords) @@ -140,7 +139,7 @@ local function filter_collected(names,criterium,number,collected,prevmode) else -- sectionname, number -- beware, this works ok for registers local depth = sections.getlevel(criterium) - local number = tonumber(number) or number_at_depth(depth) or 0 + local number = tonumber(number) or numberatdepth(depth) or 0 if trace_registers then detail = format("depth: %s, number: %s, numbers: %s, startset: %s",depth,number,concat(sections.numbers(),".",1,depth),#collected) end @@ -154,7 +153,7 @@ local function filter_collected(names,criterium,number,collected,prevmode) local metadata = v.metadata local cnumbers = sectionnumber.numbers if cnumbers then - if (all or hash[metadata.name or false]) and #cnumbers >= depth and matching_till_depth(depth,cnumbers) then + if (all or hash[metadata.name or false]) and #cnumbers >= depth and matchingtilldepth(depth,cnumbers) then result[#result+1] = v end end diff --git a/tex/context/base/strc-tag.lua b/tex/context/base/strc-tag.lua index 981a336b9..2df387e73 100644 --- a/tex/context/base/strc-tag.lua +++ b/tex/context/base/strc-tag.lua @@ -32,19 +32,18 @@ local tags = structures.tags tags.taglist = taglist -- can best be hidden function tags.start(tag,label,detail) ---~ labels[label or tag] = tag labels[tag] = label ~= "" and label or tag if detail and detail ~= "" then tag = tag .. ":" .. detail end if not enabled then - codeinjections.enabletags(tags,labels) + codeinjections.enabletags(taglist,labels) enabled = true end local n = (ids[tag] or 0) + 1 ids[tag] = n chain[#chain+1] = tag .. "-" .. n -- insert(chain,tag .. ":" .. n) - local t = #tags + 1 + local t = #taglist + 1 stack[#stack+1] = t -- insert(stack,t) taglist[t] = { unpack(chain) } -- we can add key values for alt and actualtext if needed texattribute[a_tagged] = t @@ -76,7 +75,7 @@ end statistics.register("structure elements", function() if enabled then - return format("%s element chains identified",#tags) + return format("%s element chains identified",#taglist) else return nil end @@ -84,7 +83,7 @@ end) directives.register("backend.addtags", function(v) if not enabled then - codeinjections.enabletags(tags,labels) + codeinjections.enabletags(taglist,labels) enabled = true end end) diff --git a/tex/context/base/syst-mes.mkiv b/tex/context/base/syst-mes.mkiv index 310f21040..586d8bb8c 100644 --- a/tex/context/base/syst-mes.mkiv +++ b/tex/context/base/syst-mes.mkiv @@ -27,7 +27,7 @@ % no xml logging in format generation \everyjob {% we can redefine at the lua end ! - \doif {\ctxlua{tex.sprint(logs.get_method())}} {xml} {% + \doif {\ctxlua{tex.sprint(logs.getmethod())}} {xml} {% \long\def\writebanner #1{\writestring {<m t='banner'>#1</m>}}% \long\def\writestatus#1#2{\writestring {<m t='#1'>#2</m>}}% \long\def\message #1{\normalmessage{<m t='message'>#1</m>}}% diff --git a/tex/context/base/trac-deb.lua b/tex/context/base/trac-deb.lua index b631450f8..7e8f089a0 100644 --- a/tex/context/base/trac-deb.lua +++ b/tex/context/base/trac-deb.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['trac-deb'] = { local lpeg = lpeg local lpegmatch = lpeg.match -local format, concat = string.format, table.concat +local format, concat, match = string.format, table.concat, string.match local tonumber, tostring = tonumber, tostring local texdimen, textoks, texcount = tex.dimen, tex.toks, tex.count @@ -92,10 +92,29 @@ function tracers.knownlist(name) return l and #l > 0 end -function tracers.showlines(filename,linenumber,offset) +function tracers.showlines(filename,linenumber,offset,errorstr) local data = io.loaddata(filename) local lines = data and string.splitlines(data) if lines and #lines > 0 then + -- this does not work yet as we cannot access the last lua error + -- table.print(status.list()) + -- this will be a plugin sequence + local what, where = match(errorstr,"LuaTeX error <main (%a+) instance>:(%d+)") + if what and where then + -- lua error: linenumber points to last line + local start, stop = "\\start" .. what .. "code", "\\stop" .. what .. "code" + if lines[linenumber] == start then + local n = linenumber + for i=n,1,-1 do + if lines[i] == start then + local n = i + tonumber(where) + if n <= linenumber then + linenumber = n + end + end + end + end + end offset = tonumber(offset) or 10 linenumber = tonumber(linenumber) or 10 local start = math.max(linenumber - offset,1) @@ -124,8 +143,9 @@ function tracers.printerror(offset) -- currently we still get the error message printed to the log/console so we -- add a bit of spacing around our variant texio.write_nl("\n") - report_system("error on line %s in file %s: %s ...\n",linenumber,filename,status.lasterrorstring or "?") -- lua error? - texio.write_nl(tracers.showlines(filename,linenumber,offset),"\n") + local errorstr = status.lasterrorstring or "?" + report_system("error on line %s in file %s: %s ...\n",linenumber,filename,errorstr) -- lua error? + texio.write_nl(tracers.showlines(filename,linenumber,offset,errorstr),"\n") end end @@ -194,7 +214,7 @@ local debugger = utilities.debugger local function trace_calls(n) debugger.enable() - luatex.register_stop_actions(function() + luatex.registerstopactions(function() debugger.disable() debugger.savestats(tex.jobname .. "-luacalls.log",tonumber(n)) end) diff --git a/tex/context/base/trac-inf.lua b/tex/context/base/trac-inf.lua index ad50af4c8..7a4c336ae 100644 --- a/tex/context/base/trac-inf.lua +++ b/tex/context/base/trac-inf.lua @@ -135,10 +135,10 @@ function statistics.show(reporter) end end -function statistics.show_job_stat(tag,data,n) +function statistics.showjobstat(tag,data,n) if type(data) == "table" then for i=1,#data do - statistics.show_job_stat(tag,data[i],n) + statistics.showjobstat(tag,data[i],n) end else texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data)) diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua index 3b75b390a..2c0ffb3db 100644 --- a/tex/context/base/trac-log.lua +++ b/tex/context/base/trac-log.lua @@ -51,13 +51,13 @@ local functions = { local method = "nop" -function logs.set_method(newmethod) +function logs.setmethod(newmethod) method = newmethod -- a direct copy might be faster but let's try this for a while setmetatable(logs, { __index = logs[method] }) end -function logs.get_method() +function logs.getmethod() return method end @@ -144,7 +144,7 @@ function texlog.stop_page_number() io.flush() end -texlog.report_job_stat = statistics and statistics.show_job_stat +texlog.report_job_stat = statistics and statistics.showjobstat -- xml logging @@ -237,12 +237,12 @@ end if tex and (tex.jobname or tex.formatname) then -- todo: this can be set in mtxrun ... or maybe we should just forget about this alternative format if (os.getenv("mtx.directives.logmethod") or os.getenv("mtx_directives_logmethod")) == "xml" then - logs.set_method('xml') + logs.setmethod('xml') else - logs.set_method('tex') + logs.setmethod('tex') end else - logs.set_method('nop') + logs.setmethod('nop') end -- logging in runners -> these are actually the nop loggers diff --git a/tex/context/base/trac-set.lua b/tex/context/base/trac-set.lua index 54ef22ee5..4cb1b65d1 100644 --- a/tex/context/base/trac-set.lua +++ b/tex/context/base/trac-set.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['trac-set'] = { -- might become u local type, next, tostring = type, next, tostring local concat = table.concat -local format, find, lower, gsub, simpleesc = string.format, string.find, string.lower, string.gsub, string.simpleesc +local format, find, lower, gsub, partialescapedpattern = string.format, string.find, string.lower, string.gsub, string.partialescapedpattern local is_boolean = string.is_boolean local settings_to_hash = utilities.parsers.settings_to_hash @@ -84,7 +84,7 @@ local function set(t,what,newvalue) for name, functions in next, data do if done[name] then -- prevent recursion due to wildcards - elseif find(name,simpleesc(w)) then + elseif find(name,partialescapedpattern(w)) then done[name] = true for i=1,#functions do functions[i](value) diff --git a/tex/context/base/trac-tex.lua b/tex/context/base/trac-tex.lua index 8435efafd..dbd35b56e 100644 --- a/tex/context/base/trac-tex.lua +++ b/tex/context/base/trac-tex.lua @@ -18,7 +18,7 @@ function trackers.save_hash() saved = texhashtokens() end -function trackers.dump_hash(filename,delta) +function trackers.dumphashtofile(filename,delta) local list, hash, command_name = { }, texhashtokens(), token.command_name for name, token in next, hash do if not delta or not saved[name] then @@ -42,7 +42,7 @@ local delta = nil local function dump_hash(wanteddelta) if delta == nil then saved = saved or texhashtokens() -- no need for trackers.dump_hash - luatex.register_stop_actions(1,function() dump_hash(nil,wanteddelta) end) -- at front + luatex.registerstopactions(1,function() dump_hash(nil,wanteddelta) end) -- at front end delta = wanteddelta end diff --git a/tex/context/base/typo-brk.lua b/tex/context/base/typo-brk.lua index 7a193a6af..87645e05a 100644 --- a/tex/context/base/typo-brk.lua +++ b/tex/context/base/typo-brk.lua @@ -239,7 +239,7 @@ function breakpoints.set(n) breakpoints.set(n) end -breakpoints.handler = nodes.install_attribute_handler { +breakpoints.handler = nodes.installattributehandler { name = "breakpoint", namespace = breakpoints, processor = process, diff --git a/tex/context/base/typo-cap.lua b/tex/context/base/typo-cap.lua index bcb4fbd6e..6e244b9b9 100644 --- a/tex/context/base/typo-cap.lua +++ b/tex/context/base/typo-cap.lua @@ -267,7 +267,7 @@ function cases.set(n) texattribute[a_cases] = m * 100 + n end -cases.handler = nodes.install_attribute_handler { +cases.handler = nodes.installattributehandler { name = "case", namespace = cases, processor = process, diff --git a/tex/context/base/typo-dig.lua b/tex/context/base/typo-dig.lua index 4e94f7185..36954a233 100644 --- a/tex/context/base/typo-dig.lua +++ b/tex/context/base/typo-dig.lua @@ -138,7 +138,7 @@ function digits.set(n) texattribute[a_digits] = m * 100 + n end -digits.handler = nodes.install_attribute_handler { +digits.handler = nodes.installattributehandler { name = "digits", namespace = digits, processor = process, diff --git a/tex/context/base/typo-dir.lua b/tex/context/base/typo-dir.lua index 7fae75975..931e6c90c 100644 --- a/tex/context/base/typo-dir.lua +++ b/tex/context/base/typo-dir.lua @@ -446,7 +446,7 @@ function directions.set(n) directions.set(n) end -directions.handler = nodes.install_attribute_handler { +directions.handler = nodes.installattributehandler { name = "directions", namespace = directions, processor = directions.process, diff --git a/tex/context/base/typo-krn.lua b/tex/context/base/typo-krn.lua index effbd01f6..97a6f61a4 100644 --- a/tex/context/base/typo-krn.lua +++ b/tex/context/base/typo-krn.lua @@ -246,7 +246,7 @@ local function process(namespace,attribute,head) return do_process(namespace,attribute,head) -- no direct map, because else fourth argument is tail == true end -kerns.handler = nodes.install_attribute_handler { +kerns.handler = nodes.installattributehandler { name = "kern", namespace = kerns, processor = process, diff --git a/tex/context/base/typo-spa.lua b/tex/context/base/typo-spa.lua index 75cc64728..c375b9fb5 100644 --- a/tex/context/base/typo-spa.lua +++ b/tex/context/base/typo-spa.lua @@ -171,7 +171,7 @@ function spacings.set(id) texattribute[a_spacings] = id end -spacings.handler = nodes.install_attribute_handler { +spacings.handler = nodes.installattributehandler { name = "spacing", namespace = spacings, processor = process, diff --git a/tex/context/base/util-seq.lua b/tex/context/base/util-seq.lua index 3f27221fe..415918a44 100644 --- a/tex/context/base/util-seq.lua +++ b/tex/context/base/util-seq.lua @@ -45,23 +45,23 @@ end function sequencers.prependgroup(t,group,where) local list, order = t.list, t.order - table.remove_value(order,group) - table.insert_before_value(order,where,group) + table.removevalue(order,group) + table.insertbeforevalue(order,where,group) list[group] = { } end function sequencers.appendgroup(t,group,where) local list, order = t.list, t.order - table.remove_value(order,group) - table.insert_after_value(order,where,group) + table.removevalue(order,group) + table.insertaftervalue(order,where,group) list[group] = { } end function sequencers.prependaction(t,group,action,where,kind,force) local g = t.list[group] if g and (force or validaction(action)) then - table.remove_value(g,action) - table.insert_before_value(g,where,action) + table.removevalue(g,action) + table.insertbeforevalue(g,where,action) t.kind[action] = kind end end @@ -69,8 +69,8 @@ end function sequencers.appendaction(t,group,action,where,kind,force) local g = t.list[group] if g and (force or validaction(action)) then - table.remove_value(g,action) - table.insert_after_value(g,where,action) + table.removevalue(g,action) + table.insertaftervalue(g,where,action) t.kind[action] = kind end end @@ -87,7 +87,7 @@ end function sequencers.removeaction(t,group,action,force) local g = t.list[group] if g and (force or validaction(action)) then - table.remove_value(g,action) + table.removevalue(g,action) end end diff --git a/tex/context/base/util-tab.lua b/tex/context/base/util-tab.lua index c9a0923a5..323f3e2c7 100644 --- a/tex/context/base/util-tab.lua +++ b/tex/context/base/util-tab.lua @@ -10,7 +10,8 @@ utilities = utilities or {} utilities.tables = utilities.tables or { } local tables = utilities.tables -local concat, format, gmatch = table.concat, string.format, string.gmatch +local format, gmatch = string.format, string.gmatch +local concat, insert, remove = table.concat, table.insert, table.remove function tables.definetable(target) -- defines undefined tables local composed, t = nil, { } @@ -32,3 +33,50 @@ function tables.accesstable(target) end return t end + +function table.removevalue(t,value) -- todo: n + if value then + for i=1,#t do + if t[i] == value then + remove(t,i) + -- remove all, so no: return + end + end + end +end + +function table.insertbeforevalue(t,value,extra) + for i=1,#t do + if t[i] == extra then + remove(t,i) + end + end + for i=1,#t do + if t[i] == value then + insert(t,i,extra) + return + end + end + insert(t,1,extra) +end + +function table.insertaftervalue(t,value,extra) + for i=1,#t do + if t[i] == extra then + remove(t,i) + end + end + for i=1,#t do + if t[i] == value then + insert(t,i+1,extra) + return + end + end + insert(t,#t+1,extra) +end + +local _empty_table_ = { __index = function(t,k) return "" end } + +function table.setemptymetatable(t) + setmetatable(t,_empty_table_) +end diff --git a/tex/context/base/x-mathml.lua b/tex/context/base/x-mathml.lua index 2ee3cd090..9ea128ef3 100644 --- a/tex/context/base/x-mathml.lua +++ b/tex/context/base/x-mathml.lua @@ -12,7 +12,7 @@ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local format, lower, find, gsub = string.format, string.lower, string.find, string.gsub local utfchar, utffind, utfgmatch, utfgsub = utf.char, utf.find, utf.gmatch, utf.gsub local xmlsprint, xmlcprint, xmltext, xmlcontent = xml.sprint, xml.cprint, xml.text, xml.content -local lxmltext, get_id = lxml.text, lxml.get_id +local lxmltext, getid = lxml.text, lxml.getid local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local lpegmatch = lpeg.match @@ -468,18 +468,18 @@ end function lxml.mml.mn(id,pattern) -- maybe at some point we need to interpret the number, but -- currently we assume an upright font - local str = xmlcontent(get_id(id)) or "" + local str = xmlcontent(getid(id)) or "" str = gsub(str,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen) texsprint(ctxcatcodes,(gsub(str,".",n_replacements))) end function lxml.mml.mo(id) - local str = xmlcontent(get_id(id)) or "" + local str = xmlcontent(getid(id)) or "" texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements))) end function lxml.mml.mi(id) - local str = xmlcontent(get_id(id)) or "" + local str = xmlcontent(getid(id)) or "" -- str = gsub(str,"^%s*(.-)%s*$","%1") local rep = i_replacements[str] if rep then @@ -490,7 +490,7 @@ function lxml.mml.mi(id) end function lxml.mml.mfenced(id) -- multiple separators - id = get_id(id) + id = getid(id) local left, right, separators = id.at.open or "(", id.at.close or ")", id.at.separators or "," local l, r = l_replacements[left], r_replacements[right] texsprint(ctxcatcodes,"\\enabledelimiter") @@ -610,7 +610,7 @@ local frametypes = { -- crazy element ... should be a proper structure instead of such a mess function lxml.mml.mcolumn(root) - root = get_id(root) + root = getid(root) local matrix, numbers = { }, 0 local function collect(m,e) local tag = e.tg @@ -707,7 +707,7 @@ local spacesplitter = lpeg.Ct(lpeg.splitat(" ")) function lxml.mml.mtable(root) -- todo: align, rowspacing, columnspacing, rowlines, columnlines - root = get_id(root) + root = getid(root) local at = root.at local rowalign = at.rowalign local columnalign = at.columnalign @@ -764,7 +764,7 @@ function lxml.mml.mtable(root) end function lxml.mml.csymbol(root) - root = get_id(root) + root = getid(root) local at = root.at local encoding = at.encoding or "" local hash = url.hashed(lower(at.definitionUrl or "")) @@ -776,7 +776,7 @@ function lxml.mml.csymbol(root) end function lxml.mml.menclosepattern(root) - root = get_id(root) + root = getid(root) local a = root.at.notation if a and a ~= "" then texsprint("mml:enclose:",gsub(a," +",",mml:enclose:")) diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index f2a22d983..e37ed7638 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 : 08/19/10 01:08:29 +-- merge date : 08/20/10 00:00:51 do -- begin closure to overcome local limits and interference @@ -36,7 +36,9 @@ if not string.split then end -local chr_to_esc = { +string.patterns = { } + +local escapes = { ["%"] = "%%", ["."] = "%.", ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", @@ -46,10 +48,10 @@ local chr_to_esc = { ["{"] = "%{", ["}"] = "%}" } -string.chr_to_esc = chr_to_esc +string.patterns.escapes = escapes function string:esc() -- variant 2 - return (gsub(self,"(.)",chr_to_esc)) + return (gsub(self,"(.)",escapes)) end function string:unquote() @@ -116,21 +118,6 @@ function string:enhance(pattern,action) return self, n end -local chr_to_hex, hex_to_chr = { }, { } - -for i=0,255 do - local c, h = char(i), format("%02X",i) - chr_to_hex[c], hex_to_chr[h] = h, c -end - -function string:to_hex() - return (gsub(self or "","(.)",chr_to_hex)) -end - -function string:from_hex() - return (gsub(self or "","(..)",hex_to_chr)) -end - if not string.characters then local function nextchar(str, index) @@ -150,8 +137,6 @@ if not string.characters then end --- we can use format for this (neg n) - function string:rpadd(n,chr) local m = n-#self if m > 0 then @@ -172,18 +157,6 @@ end string.padd = string.rpadd -function string:split_settings() -- no {} handling, see l-aux for lpeg variant - if find(self,"=") then - local t = { } - for k,v in gmatch(self,"(%a+)=([^%,]*)") do - t[k] = v - end - return t - else - return nil - end -end - local patterns_escapes = { ["-"] = "%-", ["."] = "%.", @@ -196,7 +169,7 @@ local patterns_escapes = { ["]"] = "%]", } -function string:pattesc() +function string:escapedpattern() return (gsub(self,".",patterns_escapes)) end @@ -207,7 +180,7 @@ local simple_escapes = { ["*"] = ".*", } -function string:simpleesc() +function string:partialescapedpattern() return (gsub(self,".",simple_escapes)) end @@ -922,15 +895,11 @@ function table.is_empty(t) -- obolete, use inline code instead return not t or not next(t) end -function table.one_entry(t) -- obolete, use inline code instead +function table.has_one_entry(t) local n = next(t) return n and not next(t,n) end ---~ function table.starts_at(t) -- obsolete, not nice anyway ---~ return ipairs(t,1)(t,0) ---~ end - function table.tohash(t,value) local h = { } if t then @@ -1352,7 +1321,7 @@ function table.unnest(t) -- bad name return f end -table.flatten_one_level = table.unnest +table.flattenonelevel = table.unnest -- a better one: @@ -1372,51 +1341,6 @@ end table.flattened = flattened --- the next three may disappear - -function table.remove_value(t,value) -- todo: n - if value then - for i=1,#t do - if t[i] == value then - remove(t,i) - -- remove all, so no: return - end - end - end -end - -function table.insert_before_value(t,value,str) - if str then - if value then - for i=1,#t do - if t[i] == value then - insert(t,i,str) - return - end - end - end - insert(t,1,str) - elseif value then - insert(t,1,value) - end -end - -function table.insert_after_value(t,value,str) - if str then - if value then - for i=1,#t do - if t[i] == value then - insert(t,i+1,str) - return - end - end - end - t[#t+1] = str - elseif value then - t[#t+1] = value - end -end - local function are_equal(a,b,n,m) -- indexed if a and b and #a == #b then n = n or 1 @@ -1531,7 +1455,7 @@ function table.hexed(t,seperator) return concat(tt,seperator or " ") end -function table.reverse_hash(h) -- needs another name +function table.swaphash(h) -- needs another name local r = { } for k,v in next, h do r[v] = lower(gsub(k," ","")) @@ -1549,36 +1473,6 @@ function table.reverse(t) return tt end -function table.insert_before_value(t,value,extra) - for i=1,#t do - if t[i] == extra then - remove(t,i) - end - end - for i=1,#t do - if t[i] == value then - insert(t,i,extra) - return - end - end - insert(t,1,extra) -end - -function table.insert_after_value(t,value,extra) - for i=1,#t do - if t[i] == extra then - remove(t,i) - end - end - for i=1,#t do - if t[i] == value then - insert(t,i+1,extra) - return - end - end - insert(t,#t+1,extra) -end - function table.sequenced(t,sep,simple) -- hash only local s = { } for k, v in sortedhash(t) do @@ -1613,13 +1507,13 @@ if not modules then modules = { } end modules ['l-file'] = { -- needs a cleanup -file = file or { } +file = file or { } local file = file local insert, concat = table.insert, table.concat local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char local lpegmatch = lpeg.match -local getcurrentdir = lfs.currentdir +local getcurrentdir, attributes = lfs.currentdir, lfs.attributes local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc @@ -1751,18 +1645,18 @@ end --~ print(file.join("http:///a","/y")) --~ print(file.join("//nas-1","/y")) -function file.iswritable(name) - local a = lfs.attributes(name) or lfs.attributes(dirname(name,".")) +function file.is_writable(name) + local a = attributes(name) or attributes(dirname(name,".")) return a and sub(a.permissions,2,2) == "w" end -function file.isreadable(name) - local a = lfs.attributes(name) +function file.is_readable(name) + local a = attributes(name) return a and sub(a.permissions,1,1) == "r" end -file.is_readable = file.isreadable -file.is_writable = file.iswritable +file.isreadable = file.is_readable -- depricated +file.iswritable = file.is_writable -- depricated -- todo: lpeg @@ -1794,7 +1688,7 @@ end --~ function file.old_collapse_path(str) -- fails on b.c/.. --~ str = gsub(str,"\\","/") --~ if find(str,"/") then ---~ str = gsub(str,"^%./",(gsub(lfs.currentdir(),"\\","/")) .. "/") -- ./xx in qualified +--~ str = gsub(str,"^%./",(gsub(getcurrentdir(),"\\","/")) .. "/") -- ./xx in qualified --~ str = gsub(str,"/%./","/") --~ local n, m = 1, 1 --~ while n > 0 or m > 0 do @@ -2023,8 +1917,8 @@ end --~ -- todo: --~ --~ if os.type == "windows" then ---~ local currentdir = lfs.currentdir ---~ function lfs.currentdir() +--~ local currentdir = getcurrentdir +--~ function getcurrentdir() --~ return (gsub(currentdir(),"\\","/")) --~ end --~ end @@ -2364,7 +2258,7 @@ do cachepaths = string.split(cachepaths,os.type == "windows" and ";" or ":") for i=1,#cachepaths do - if file.iswritable(cachepaths[i]) then + if file.is_writable(cachepaths[i]) then writable = file.join(cachepaths[i],"luatex-cache") lfs.mkdir(writable) writable = file.join(writable,caches.namespace) @@ -2374,7 +2268,7 @@ do end for i=1,#cachepaths do - if file.isreadable(cachepaths[i]) then + if file.is_readable(cachepaths[i]) then readables[#readables+1] = file.join(cachepaths[i],"luatex-cache",caches.namespace) end end @@ -2417,9 +2311,9 @@ local function makefullname(path,name) end end -function caches.iswritable(path,name) +function caches.is_writable(path,name) local fullname = makefullname(path,name) - return fullname and file.iswritable(fullname) + return fullname and file.is_writable(fullname) end function caches.loaddata(paths,name) @@ -2527,7 +2421,7 @@ function containers.define(category, subcategory, version, enabled) end function containers.is_usable(container, name) - return container.enabled and caches and caches.iswritable(container.writable, name) + return container.enabled and caches and caches.is_writable(container.writable, name) end function containers.is_valid(container, name) @@ -4825,9 +4719,9 @@ local baselines = { ['romn'] = 'Roman baseline' } -local to_scripts = table.reverse_hash(scripts ) -local to_languages = table.reverse_hash(languages) -local to_features = table.reverse_hash(features ) +local to_scripts = table.swaphash(scripts ) +local to_languages = table.swaphash(languages) +local to_features = table.swaphash(features ) tables.scripts = scripts tables.languages = languages @@ -6916,7 +6810,7 @@ local lists = { -- why local fonts.manipulators, } -function otf.set_features(tfmdata,features) +function otf.setfeatures(tfmdata,features) local processes = { } if features and next(features) then local mode = tfmdata.mode or features.mode or "base" @@ -6978,52 +6872,6 @@ tfmdata.mode = mode return processes, features end -function otf.otf_to_tfm(specification) - local name = specification.name - local sub = specification.sub - local filename = specification.filename - local format = specification.format - local features = specification.features.normal - local cache_id = specification.hash - local tfmdata = containers.read(tfm.cache,cache_id) ---~ print(cache_id) - if not tfmdata then - local otfdata = otf.load(filename,format,sub,features and features.featurefile) - if otfdata and next(otfdata) then - otfdata.shared = otfdata.shared or { - featuredata = { }, - anchorhash = { }, - initialized = false, - } - tfmdata = otf.copy_to_tfm(otfdata,cache_id) - if tfmdata and next(tfmdata) then - tfmdata.unique = tfmdata.unique or { } - tfmdata.shared = tfmdata.shared or { } -- combine - local shared = tfmdata.shared - shared.otfdata = otfdata - shared.features = features -- default - shared.dynamics = { } - shared.processes = { } - shared.set_dynamics = otf.set_dynamics -- fast access and makes other modules independent - -- this will be done later anyway, but it's convenient to have - -- them already for fast access - tfmdata.luatex = otfdata.luatex - tfmdata.indices = otfdata.luatex.indices - tfmdata.unicodes = otfdata.luatex.unicodes - tfmdata.marks = otfdata.luatex.marks - tfmdata.originals = otfdata.luatex.originals - tfmdata.changed = { } - tfmdata.has_italic = otfdata.metadata.has_italic - if not tfmdata.language then tfmdata.language = 'dflt' end - if not tfmdata.script then tfmdata.script = 'dflt' end - shared.processes, shared.features = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default)) - end - end - containers.write(tfm.cache,cache_id,tfmdata) - end - return tfmdata -end - --~ { --~ ['boundingbox']={ 95, -458, 733, 1449 }, --~ ['class']="base", @@ -7054,7 +6902,7 @@ fonts.formats.ttc = "truetype" fonts.formats.ttf = "truetype" fonts.formats.otf = "opentype" -function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many) +local function copytotfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many) if data then local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { } local luatex = data.luatex @@ -7221,10 +7069,56 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th end end +local function otftotfm(specification) + local name = specification.name + local sub = specification.sub + local filename = specification.filename + local format = specification.format + local features = specification.features.normal + local cache_id = specification.hash + local tfmdata = containers.read(tfm.cache,cache_id) +--~ print(cache_id) + if not tfmdata then + local otfdata = otf.load(filename,format,sub,features and features.featurefile) + if otfdata and next(otfdata) then + otfdata.shared = otfdata.shared or { + featuredata = { }, + anchorhash = { }, + initialized = false, + } + tfmdata = copytotfm(otfdata,cache_id) + if tfmdata and next(tfmdata) then + tfmdata.unique = tfmdata.unique or { } + tfmdata.shared = tfmdata.shared or { } -- combine + local shared = tfmdata.shared + shared.otfdata = otfdata + shared.features = features -- default + shared.dynamics = { } + shared.processes = { } + shared.setdynamics = otf.setdynamics -- fast access and makes other modules independent + -- this will be done later anyway, but it's convenient to have + -- them already for fast access + tfmdata.luatex = otfdata.luatex + tfmdata.indices = otfdata.luatex.indices + tfmdata.unicodes = otfdata.luatex.unicodes + tfmdata.marks = otfdata.luatex.marks + tfmdata.originals = otfdata.luatex.originals + tfmdata.changed = { } + tfmdata.has_italic = otfdata.metadata.has_italic + if not tfmdata.language then tfmdata.language = 'dflt' end + if not tfmdata.script then tfmdata.script = 'dflt' end + shared.processes, shared.features = otf.setfeatures(tfmdata,fonts.define.check(features,otf.features.default)) + end + end + containers.write(tfm.cache,cache_id,tfmdata) + end + return tfmdata +end + otf.features.register('mathsize') -function tfm.read_from_open_type(specification) - local tfmtable = otf.otf_to_tfm(specification) +function tfm.read_from_open_type(specification) -- wrong namespace + local tfmtable = otftotfm(specification) if tfmtable then local otfdata = tfmtable.shared.otfdata tfmtable.name = specification.name @@ -7336,10 +7230,12 @@ otf.features.default = otf.features.default or { } local context_setups = fonts.define.specify.context_setups local context_numbers = fonts.define.specify.context_numbers +-- todo: dynamics namespace + local a_to_script = { } otf.a_to_script = a_to_script local a_to_language = { } otf.a_to_language = a_to_language -function otf.set_dynamics(font,dynamics,attribute) +function otf.setdynamics(font,dynamics,attribute) local features = context_setups[context_numbers[attribute]] -- can be moved to caller if features then local script = features.script or 'dflt' @@ -7378,7 +7274,7 @@ function otf.set_dynamics(font,dynamics,attribute) tfmdata.shared.features = { } -- end of save local set = fonts.define.check(features,otf.features.default) - dsla = otf.set_features(tfmdata,set) + dsla = otf.setfeatures(tfmdata,set) if trace_dynamics then report_otf("setting dynamics %s: attribute %s, script %s, language %s, set: %s",context_numbers[attribute],attribute,script,language,table.sequenced(set)) end @@ -7730,7 +7626,7 @@ local function prepare_base_substitutions(tfmdata,kind,value) -- we can share so end end -local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all +local function preparebasekerns(tfmdata,kind,value) -- todo what kind of kerns, currently all if value then local otfdata = tfmdata.shared.otfdata local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language) @@ -7800,10 +7696,10 @@ local supported_gpos = { 'kern' } -function otf.features.register_base_substitution(tag) +function otf.features.registerbasesubstitution(tag) supported_gsub[#supported_gsub+1] = tag end -function otf.features.register_base_kern(tag) +function otf.features.registerbasekern(tag) supported_gsub[#supported_gpos+1] = tag end @@ -7827,7 +7723,7 @@ function fonts.initializers.base.otf.features(tfmdata,value) for f=1,#supported_gpos do local feature = supported_gpos[f] local value = features[feature] - prepare_base_kerns(tfmdata,feature,features[feature]) + preparebasekerns(tfmdata,feature,features[feature]) if value then h[#h+1] = feature .. "=" .. tostring(value) end @@ -11062,11 +10958,11 @@ features['tlig'] = 'TeX Ligatures' features['trep'] = 'TeX Replacements' features['anum'] = 'Arabic Digits' -local register_base_substitution = otf.features.register_base_substitution +local registerbasesubstitution = otf.features.registerbasesubstitution -register_base_substitution('tlig') -register_base_substitution('trep') -register_base_substitution('anum') +registerbasesubstitution('tlig') +registerbasesubstitution('trep') +registerbasesubstitution('anum') -- the functionality is defined elsewhere @@ -12134,7 +12030,7 @@ end -- bonus -function fonts.otf.name_to_slot(name) +function fonts.otf.nametoslot(name) local tfmdata = fonts.ids[font.current()] if tfmdata and tfmdata.shared then local otfdata = tfmdata.shared.otfdata @@ -12145,7 +12041,7 @@ end function fonts.otf.char(n) if type(n) == "string" then - n = fonts.otf.name_to_slot(n) + n = fonts.otf.nametoslot(n) end if type(n) == "number" then tex.sprint("\\char" .. n) |