diff options
Diffstat (limited to 'tex')
98 files changed, 1471 insertions, 1558 deletions
diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua index 8b64ead8d..c975c715a 100644 --- a/tex/context/base/anch-pos.lua +++ b/tex/context/base/anch-pos.lua @@ -14,6 +14,7 @@ more efficient.</p> local concat, format = table.concat, string.format local texprint, ctxcatcodes = tex.print, tex.ctxcatcodes +local lpegmatch = lpeg.match jobpositions = jobpositions or { } jobpositions.collected = jobpositions.collected or { } @@ -150,7 +151,7 @@ function jobpositions.MPplus(id,n,default) else local split = jpi[0] if not split then - split = splitter:match(jpi[7]) + split = lpegmatch(splitter,jpi[7]) jpi[0] = split end texprint(ctxcatcodes,split[n] or default) diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua index b9e6b74ad..3b46db0b4 100644 --- a/tex/context/base/back-pdf.lua +++ b/tex/context/base/back-pdf.lua @@ -54,7 +54,7 @@ end function nodeinjections.spotcolor(n,f,d,p) if type(p) == "string" then - p = p:gsub(","," ") -- brr misuse of spot + p = gsub(p,","," ") -- brr misuse of spot end return register(pdfliteral(format("/%s cs /%s CS %s SCN %s scn",n,n,p,p))) end diff --git a/tex/context/base/bibl-bib.lua b/tex/context/base/bibl-bib.lua index 028202ec2..4172e2408 100644 --- a/tex/context/base/bibl-bib.lua +++ b/tex/context/base/bibl-bib.lua @@ -14,6 +14,7 @@ in a convenient way. Actually handling the data takes place elsewhere.</p> local lower, format = string.lower, string.format local next = next +local lpegmatch = lpeg.match bibtex = bibtex or { } @@ -101,7 +102,7 @@ function bibtex.convert(session,content) data, shortcuts, entries = session.data, session.shortcuts, session.entries -- session.size = session.size + #content bibtex.size = bibtex.size + #content - grammar:match(content or "") + lpegmatch(grammar,content or "") statistics.stoptiming(bibtex) end @@ -138,7 +139,7 @@ function bibtex.toxml(session) if not entries or entries[name] then result[#result+1] = format(" <e n='%s'>",name) for key, value in next, entry do - value = escaped_pattern:match(value) + value = lpegmatch(escaped_pattern,value) if value ~= "" then result[#result+1] = format(" <v n='%s'>%s</v>",key,value) end diff --git a/tex/context/base/buff-ini.lua b/tex/context/base/buff-ini.lua index 753c4a326..1199b47cf 100644 --- a/tex/context/base/buff-ini.lua +++ b/tex/context/base/buff-ini.lua @@ -28,10 +28,11 @@ local concat, texsprint, texprint, texwrite = table.concat, tex.sprint, tex.prin local utfbyte, utffind, utfgsub = utf.byte, utf.find, utf.gsub local type, next = type, next local huge = math.huge -local byte, sub, find, char, gsub, rep, lower, format = string.byte, string.sub, string.find, string.char, string.gsub, string.rep, string.lower, string.format +local byte, sub, find, char, gsub, rep, lower, format, gmatch = string.byte, string.sub, string.find, string.char, string.gsub, string.rep, string.lower, string.format, string.gmatch local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables +local lpegmatch = lpeg.match local data, flags, hooks, visualizers = buffers.data, buffers.flags, buffers.hooks, buffers.visualizers @@ -70,11 +71,11 @@ function buffers.grab(name,begintag,endtag,bufferdata) buffers.level = buffers.level - 1 else if dn == "" then - dn = bufferdata:sub(1,#bufferdata-1) + dn = sub(bufferdata,1,#bufferdata-1) else - dn = dn .. "\n" .. bufferdata:sub(1,#bufferdata-1) + dn = dn .. "\n" .. sub(bufferdata,1,#bufferdata-1) end - dn = dn:gsub("[\010\013]$","") + dn = gsub(dn,"[\010\013]$","") if flags.store_as_table then dn = dn:splitlines() end @@ -185,7 +186,7 @@ end function buffers.typeline(str,n,m,line) n = n + 1 buffers.verbatimbreak(n,m) - if str:find("%S") then + if find(str,"%S") then line = line + 1 hooks.begin_of_line(line) hooks.flush_line(hooks.line(str)) @@ -252,7 +253,7 @@ function buffers.get(name) texprint(b[i]) end else - printer:match(b) + lpegmatch(printer,b) end end end @@ -284,7 +285,7 @@ function buffers.collect(names,separator) -- no print end end else - for name in names:gmatch("[^,%s]+") do + for name in gmatch(names,"[^,%s]+") do local c = content(name,separator) if c ~= "" then t[#t+1] = c @@ -453,7 +454,7 @@ function default.line(str) end function default.flush_line(str) - str = str:gsub(" *[\n\r]+ *"," ") + str = gsub(str," *[\n\r]+ *"," ") if visualizers.obeyspace then for c in utfcharacters(str) do if c == " " then @@ -493,7 +494,7 @@ buffers.commands.nested = "\\switchslantedtype " -- todo : utf + faster, direct print and such. no \\char, vrb catcodes, see end function visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess - str = str:gsub(" *[\n\r]+ *"," ") + str = gsub(str," *[\n\r]+ *"," ") local result, c, nested, i = "", "", 0, 1 local commands = buffers.commands -- otherwise wrong commands while i < #str do -- slow @@ -516,7 +517,7 @@ function visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess c = sub(str,i,i) if c == " " then result = result .. "\\obs " - elseif c:find("%a") then + elseif find(c,"%a") then result = result .. c else result = result .. "\\char" .. byte(c) .. " " @@ -661,6 +662,6 @@ end --~ str = [[test 123 test $oeps$]] ---~ pattern:match(str) +--~ lpegmatch(pattern,str) diff --git a/tex/context/base/chem-ini.lua b/tex/context/base/chem-ini.lua index a4af57256..908749092 100644 --- a/tex/context/base/chem-ini.lua +++ b/tex/context/base/chem-ini.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['chem-ini'] = { } local format, texsprint = string.format, tex.sprint +local lpegmatch = lpeg.match local trace_molecules = false trackers.register("chemistry.molecules", function(v) trace_molecules = v end) @@ -60,15 +61,15 @@ local parser = lpeg.Cs((csname + lowhigh + highlow + low + high + sign + any chemicals.moleculeparser = parser -- can be used to avoid functioncall function chemicals.molecule(str) - return parser:match(str) + return lpegmatch(parser,str) end function commands.molecule(str) if trace_molecules then - local rep = parser:match(str) + local rep = lpegmatch(parser,str) logs.report("chemistry", "molecule %s => %s",str,rep) texsprint(ctxcatcodes,rep) else - texsprint(ctxcatcodes,parser:match(str)) + texsprint(ctxcatcodes,lpegmatch(parser,str)) end end diff --git a/tex/context/base/chem-str.lua b/tex/context/base/chem-str.lua index 1a68450f9..b151ab2a0 100644 --- a/tex/context/base/chem-str.lua +++ b/tex/context/base/chem-str.lua @@ -17,6 +17,7 @@ local format, gmatch, match, lower, gsub = string.format, string.gmatch, string. local concat, insert, remove = table.concat, table.insert, table.remove local apply = structure.processors.apply local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes +local lpegmatch = lpeg.match local variables = interfaces.variables @@ -154,7 +155,7 @@ function chemicals.define(name,spec,text) end local metacode, kind, keys, bonds, max, txt, textsize, rot, pstack -local molecule = chemicals.molecule -- or use chemicals.moleculeparser:match(...) +local molecule = chemicals.molecule -- or use lpegmatch(chemicals.moleculeparser,...) local function fetch(txt) local st = stack[txt] @@ -197,12 +198,12 @@ local pattern = lpeg.Cc(false) * lpeg.Cc(false) * lpeg.Cc(false) * text ) ---~ local n, operation, index, upto, set, text = pattern:match("RZ1357") +--~ local n, operation, index, upto, set, text = lpegmatch(pattern,"RZ1357") ---~ print(pattern:match("RZ=x")) 1 RZ false false false x ---~ print(pattern:match("RZ1=x")) 1 RZ 1 false false x ---~ print(pattern:match("RZ1..3=x")) 1 RZ 1 3 false x ---~ print(pattern:match("RZ13=x")) 1 RZ false false table x +--~ print(lpegmatch(pattern,"RZ=x")) 1 RZ false false false x +--~ print(lpegmatch(pattern,"RZ1=x")) 1 RZ 1 false false x +--~ print(lpegmatch(pattern,"RZ1..3=x")) 1 RZ 1 3 false x +--~ print(lpegmatch(pattern,"RZ13=x")) 1 RZ false false table x local function process(spec,text,n,rulethickness,rulecolor,offset) insert(stack,{ spec=spec, text=text, n=n }) @@ -216,7 +217,7 @@ local function process(spec,text,n,rulethickness,rulecolor,offset) process(di.spec,di.text,1,rulethickness,rulecolor) end else - local rep, operation, special, index, upto, set, text = pattern:match(s) + local rep, operation, special, index, upto, set, text = lpegmatch(pattern,s) if operation == "pb" then insert(pstack,kind) metacode[#metacode+1] = syntax.pb.direct diff --git a/tex/context/base/colo-ini.lua b/tex/context/base/colo-ini.lua index 9f4331a1b..ac68df495 100644 --- a/tex/context/base/colo-ini.lua +++ b/tex/context/base/colo-ini.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['colo-ini'] = { } local concat = table.concat -local format, gmatch, gsub, lower, match = string.format, string.gmatch, string.gsub, string.lower, string.match +local format, gmatch, gsub, lower, match, find = string.format, string.gmatch, string.gsub, string.lower, string.match, string.find local texsprint = tex.sprint local ctxcatcodes = tex.ctxcatcodes @@ -232,7 +232,7 @@ function colors.isblack(ca) -- maybe commands end function colors.definespotcolor(name,parent,str,global) - if parent == "" or parent:find("=") then + if parent == "" or find(parent,"=") then colors.registerspotcolor(name, parent) elseif name ~= parent then local cp = attributes_list[a_color][parent] diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index a4157ada6..f256094f7 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -63,12 +63,6 @@ % \writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}} % \writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}} -\startluacode - statistics.register("result saved in file", function() - return string.format( "%s.%s", "\outputfilename", (tex.pdfoutput>0 and "pdf") or "dvi") - end) -\stopluacode - %D For the moment we report some statistics. Later this will become an option, %D but for now we need this information. diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 663a96ab3..9e7e2cd50 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{2009.12.26 22:23} +\newcontextversion{2009.12.29 22:32} %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 51f5d92d4..36f4f375d 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -315,6 +315,8 @@ \loadmarkfile{page-app} \loadmarkfile{meta-fig} +\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented) + \loadcorefile{lang-spa} \loadmarkfile{bibl-bib} diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 14cbe60b3..25374601e 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{2009.12.26 22:23} +\edef\contextversion{2009.12.29 22:32} %D For those who want to use this: diff --git a/tex/context/base/core-def.mkiv b/tex/context/base/core-def.mkiv index 04bd7c09e..9f9d5b927 100644 --- a/tex/context/base/core-def.mkiv +++ b/tex/context/base/core-def.mkiv @@ -48,7 +48,7 @@ %appendtoks \page[\v!last] \page \to \everybye % moved to core-job, we need to do this cleaner \appendtoks \ifarrangingpages\poparrangedpages\fi \to \everybye -\appendtoks \registerfileinfo[end]\jobname \to \everybye +%appendtoks \registerfileinfo[end]\jobfilename \to \everybye \appendtoks \MPLIBallocate{1000} \to \everydump diff --git a/tex/context/base/core-env.mkiv b/tex/context/base/core-env.mkiv index 941914272..2d717df9a 100644 --- a/tex/context/base/core-env.mkiv +++ b/tex/context/base/core-env.mkiv @@ -193,8 +193,11 @@ \fi \endcsname\empty} % takes one argument -\def\setupwithargument#1% - {\csname\??su:\ifcsname\??su:#1\endcsname#1\else\letterpercent\fi\endcsname} +% \def\setupwithargument#1% +% {\csname\??su:\ifcsname\??su:#1\endcsname#1\else\letterpercent\fi\endcsname} + +\edef\setupwithargument#1% saves a few expansions + {\noexpand\csname\??su:\noexpand\ifcsname\??su:#1\endcsname#1\noexpand\else\letterpercent\noexpand\fi\endcsname} \let\directsetup\dosetups diff --git a/tex/context/base/core-job.lua b/tex/context/base/core-job.lua index df334573a..d557818bb 100644 --- a/tex/context/base/core-job.lua +++ b/tex/context/base/core-job.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['core-job'] = { local texsprint, texprint, texwrite = tex.sprint, tex.print, tex.write local ctxcatcodes, texcatcodes = tex.ctxcatcodes, tex.texcatcodes -local lower, format, find, gmatch = string.lower, string.format, string.find, string.gmatch +local lower, format, find, gmatch, gsub, match = string.lower, string.format, string.find, string.gmatch, string.gsub, string.match local concat = table.concat -- main code @@ -102,11 +102,11 @@ local function convertexamodes(str) local label = e.at and e.at.label if label and label ~= "" then local data = xml.text(e) - local mode = label:match("^mode:(.+)$") + local mode = match(label,"^mode:(.+)$") if mode then texsprint(ctxcatcodes,format("\\enablemode[%s:%s]",mode,data)) end - texsprint(ctxcatcodes,format("\\setvariable{exa:variables}{%s}{%s}",label,data:gsub("([{}])","\\%1"))) + texsprint(ctxcatcodes,format("\\setvariable{exa:variables}{%s}{%s}",label,gsub(data,"([{}])","\\%1"))) end end end diff --git a/tex/context/base/core-job.mkiv b/tex/context/base/core-job.mkiv index 131d15578..acf96c7a8 100644 --- a/tex/context/base/core-job.mkiv +++ b/tex/context/base/core-job.mkiv @@ -117,7 +117,7 @@ \def\starttext {\doateverystarttext \ifcase\textlevel - \registerfileinfo[begin]\jobname + \registerfileinfo[begin]\jobfilename \fi \global\advance\textlevel\plusone} @@ -130,6 +130,9 @@ %\the\everybye % %\the\everygoodbye % == \end (new) %\expandafter\normalend % +\ifcase\textlevel + \registerfileinfo[end]\jobfilename +\fi \expandafter\finalend \fi} diff --git a/tex/context/base/core-sys.lua b/tex/context/base/core-sys.lua index f530896fa..c5aa89d98 100644 --- a/tex/context/base/core-sys.lua +++ b/tex/context/base/core-sys.lua @@ -16,3 +16,7 @@ function commands.updatefilenames(inputfilename,outputfilename) environment.inputfilebarename = removesuffix(basename(inputfilename)) environment.inputfilesuffix = lower(extname(inputfilename)) end + +statistics.register("result saved in file", function() + return string.format( "%s.%s", environment.outputfilename, (tex.pdfoutput>0 and "pdf") or "dvi") +end) diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua index c20e7b274..c1cf0627c 100644 --- a/tex/context/base/core-uti.lua +++ b/tex/context/base/core-uti.lua @@ -17,7 +17,7 @@ utility file under different setups, we now load a table once. This saves much runtime but at the cost of more memory usage.</p> --ldx]]-- -local sort, concat, format = table.sort, table.concat, string.format +local sort, concat, format, match = table.sort, table.concat, string.format, string.match local next, type, tostring = next, type, tostring local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes @@ -236,7 +236,7 @@ function job.load(filename) statistics.starttiming(job._load_) local data = io.loaddata(filename) if data and data ~= "" then - local version = tonumber(data:match("^-- version: ([%d%.]+)")) + local version = tonumber(match(data,"^-- version: ([%d%.]+)")) if version ~= jobs.version then logs.report("job","version mismatch with jobfile: %s <> %s", version or "?", jobs.version) else diff --git a/tex/context/base/data-crl.lua b/tex/context/base/data-crl.lua index bc9ff98b5..55b1a8fad 100644 --- a/tex/context/base/data-crl.lua +++ b/tex/context/base/data-crl.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['data-crl'] = { license = "see context related readme files" } +local gsub = string.gsub + curl = curl or { } curl.cached = { } @@ -14,9 +16,9 @@ curl.cachepath = caches.definepath("curl") local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders function curl.fetch(protocol, name) - local cachename = curl.cachepath() .. "/" .. name:gsub("[^%a%d%.]+","-") --- cachename = cachename:gsub("[\\/]", io.fileseparator) - cachename = cachename:gsub("[\\]", "/") -- cleanup + local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-") +-- cachename = gsub(cachename,"[\\/]", io.fileseparator) + cachename = gsub(cachename,"[\\]", "/") -- cleanup if not curl.cached[name] then if not io.exists(cachename) then curl.cached[name] = cachename diff --git a/tex/context/base/data-res.lua b/tex/context/base/data-res.lua index be4193e6a..67bb7cf88 100644 --- a/tex/context/base/data-res.lua +++ b/tex/context/base/data-res.lua @@ -36,6 +36,7 @@ if not modules then modules = { } end modules ['data-inp'] = { local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys local next, type = next, type +local lpegmatch = lpeg.match local trace_locating, trace_detail, trace_expansions = false, false, false @@ -813,7 +814,7 @@ function resolvers.generators.tex(specification) full = spec end for name in directory(full) do - if not weird:match(name) then + if not lpegmatch(weird,name) then local mode = attributes(full..name,'mode') if mode == 'file' then if path then @@ -1579,7 +1580,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- try to find in tree (no suffix manipulation), here we search for the -- matching last part of the name local basename = file.basename(filename) - local pattern = (filename .. "$"):gsub("([%.%-])","%%%1") + local pattern = gsub(filename .. "$","([%.%-])","%%%1") local savedformat = instance.format local format = savedformat or "" if format == "" then @@ -1600,7 +1601,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- for r=1,#resolved do local rr = resolved[r] - if rr:find(pattern) then + if find(rr,pattern) then result[#result+1], ok = rr, true end end @@ -1610,7 +1611,7 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan -- local filelist = collect_files({basename}) -- for f=1,#filelist do -- local ff = filelist[f][3] or "" - -- if ff:find(pattern) then + -- if find(ff,pattern) then -- result[#result+1], ok = ff, true -- end -- end @@ -2067,7 +2068,7 @@ function resolvers.with_files(pattern,handle) end function resolvers.locate_format(name) - local barename, fmtname = name:gsub("%.%a+$",""), "" + local barename, fmtname = gsub(name,"%.%a+$",""), "" if resolvers.usecache then local path = file.join(caches.setpath("formats")) -- maybe platform fmtname = file.join(path,barename..".fmt") or "" diff --git a/tex/context/base/data-tex.lua b/tex/context/base/data-tex.lua index e0f6c8019..0f2be3962 100644 --- a/tex/context/base/data-tex.lua +++ b/tex/context/base/data-tex.lua @@ -32,6 +32,7 @@ function finders.generic(tag,filename,filetype) end end +--~ local lpegmatch = lpeg.match --~ local getlines = lpeg.Ct(lpeg.linebyline) local input_translator, utf_translator, user_translator = nil, nil, nil @@ -102,7 +103,7 @@ function openers.text_opener(filename,file_handle,tag) logs.report("fileio","%s opener, file '%s' opened",tag,filename) end -- todo: file;name -> freeze / eerste regel scannen -> freeze - --~ local data = getlines:match(file_handle:read("*a")) + --~ local data = lpegmatch(getlines,file_handle:read("*a")) --~ local n = 0 t = { reader = function() -- self diff --git a/tex/context/base/data-tmf.lua b/tex/context/base/data-tmf.lua index e02f7f866..7421eacfc 100644 --- a/tex/context/base/data-tmf.lua +++ b/tex/context/base/data-tmf.lua @@ -6,19 +6,22 @@ if not modules then modules = { } end modules ['data-tmf'] = { license = "see context related readme files" } +local find, gsub, match = string.find, string.gsub, string.match +local getenv, setenv = os.getenv, os.setenv + -- loads *.tmf files in minimal tree roots (to be optimized and documented) function resolvers.check_environment(tree) logs.simpleline() - os.setenv('TMP', os.getenv('TMP') or os.getenv('TEMP') or os.getenv('TMPDIR') or os.getenv('HOME')) - os.setenv('TEXOS', os.getenv('TEXOS') or ("texmf-" .. os.platform)) - os.setenv('TEXPATH', (tree or "tex"):gsub("\/+$",'')) - os.setenv('TEXMFOS', os.getenv('TEXPATH') .. "/" .. os.getenv('TEXOS')) + setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME')) + setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform)) + setenv('TEXPATH', gsub(tree or "tex","\/+$",'')) + setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS')) logs.simpleline() - logs.simple("preset : TEXPATH => %s", os.getenv('TEXPATH')) - logs.simple("preset : TEXOS => %s", os.getenv('TEXOS')) - logs.simple("preset : TEXMFOS => %s", os.getenv('TEXMFOS')) - logs.simple("preset : TMP => %s", os.getenv('TMP')) + logs.simple("preset : TEXPATH => %s", getenv('TEXPATH')) + logs.simple("preset : TEXOS => %s", getenv('TEXOS')) + logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS')) + logs.simple("preset : TMP => %s", getenv('TMP')) logs.simple('') end @@ -26,27 +29,27 @@ function resolvers.load_environment(name) -- todo: key=value as well as lua local f = io.open(name) if f then for line in f:lines() do - if line:find("^[%%%#]") then + if find(line,"^[%%%#]") then -- skip comment else - local key, how, value = line:match("^(.-)%s*([<=>%?]+)%s*(.*)%s*$") + local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$") if how then - value = value:gsub("%%(.-)%%", function(v) return os.getenv(v) or "" end) + value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end) if how == "=" or how == "<<" then - os.setenv(key,value) + setenv(key,value) elseif how == "?" or how == "??" then - os.setenv(key,os.getenv(key) or value) + setenv(key,getenv(key) or value) elseif how == "<" or how == "+=" then - if os.getenv(key) then - os.setenv(key,os.getenv(key) .. io.fileseparator .. value) + if getenv(key) then + setenv(key,getenv(key) .. io.fileseparator .. value) else - os.setenv(key,value) + setenv(key,value) end elseif how == ">" or how == "=+" then - if os.getenv(key) then - os.setenv(key,value .. io.pathseparator .. os.getenv(key)) + if getenv(key) then + setenv(key,value .. io.pathseparator .. getenv(key)) else - os.setenv(key,value) + setenv(key,value) end end end diff --git a/tex/context/base/data-tre.lua b/tex/context/base/data-tre.lua index 74630b69b..a56040ccc 100644 --- a/tex/context/base/data-tre.lua +++ b/tex/context/base/data-tre.lua @@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['data-tre'] = { -- \input tree://oeps1/**/oeps.tex +local find, gsub = string.find, string.gsub + local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders local done, found = { }, { } @@ -25,9 +27,9 @@ function finders.tree(specification,filetype) hash = dir.glob(pattern) done[path] = hash end - local pattern = "/" .. name:gsub("([%.%-%+])", "%%%1") .. "$" + local pattern = "/" .. gsub(name,"([%.%-%+])", "%%%1") .. "$" for k, v in pairs(hash) do - if v:find(pattern) then + if find(v,pattern) then found[specification] = v return v end diff --git a/tex/context/base/data-use.lua b/tex/context/base/data-use.lua index 4e5aa553c..123cc0eb8 100644 --- a/tex/context/base/data-use.lua +++ b/tex/context/base/data-use.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-use'] = { license = "see context related readme files" } -local format, lower, gsub = string.format, string.lower, string.gsub +local format, lower, gsub, find = string.format, string.lower, string.gsub, string.find local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) @@ -62,9 +62,9 @@ function resolvers.automount(usecache) if f then for line in f:lines() do if line then - if line:find("^[%%#%-]") then -- or %W + if find(line,"^[%%#%-]") then -- or %W -- skip - elseif line:find("^zip://") then + elseif find(line,"^zip://") then if trace_locating then logs.report("fileio","mounting %s",line) end diff --git a/tex/context/base/data-zip.lua b/tex/context/base/data-zip.lua index 16d56ce8b..7d2fc8664 100644 --- a/tex/context/base/data-zip.lua +++ b/tex/context/base/data-zip.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['data-zip'] = { license = "see context related readme files" } -local format, find = string.format, string.find +local format, find, match = string.format, string.find, string.match local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) @@ -222,7 +222,7 @@ function resolvers.register_zip_file(z,tree) end local register, n = resolvers.register_file, 0 for i in z:files() do - local path, name = i.filename:match(filter) + local path, name = match(i.filename,filter) if path then if name and name ~= '' then register(files, name, path) diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua index 7ad3801dd..60da808bb 100644 --- a/tex/context/base/font-afm.lua +++ b/tex/context/base/font-afm.lua @@ -21,7 +21,8 @@ local trace_features = false trackers.register("afm.features", function(v) trac local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end) local trace_loading = false trackers.register("afm.loading", function(v) trace_loading = v end) -local format, match, gmatch, lower = string.format, string.match, string.gmatch, string.lower +local format, match, gmatch, lower, gsub = string.format, string.match, string.gmatch, string.lower, string.gsub +local lpegmatch = lpeg.match fonts = fonts or { } fonts.afm = fonts.afm or { } @@ -88,7 +89,7 @@ local pattern = ( c * s^1 * ( local function scan_comment(str) fd = { } - pattern:match(str) + lpegmatch(pattern,str) return fd end @@ -219,21 +220,21 @@ function afm.read_afm(filename) filename = file.removesuffix(file.basename(filename)) } } - afmblob = afmblob:gsub("StartCharMetrics(.-)EndCharMetrics", function(charmetrics) + afmblob = gsub(afmblob,"StartCharMetrics(.-)EndCharMetrics", function(charmetrics) if trace_loading then logs.report("load afm","loading char metrics") end get_charmetrics(data,charmetrics,vector) return "" end) - afmblob = afmblob:gsub("StartKernPairs(.-)EndKernPairs", function(kernpairs) + afmblob = gsub(afmblob,"StartKernPairs(.-)EndKernPairs", function(kernpairs) if trace_loading then logs.report("load afm","loading kern pairs") end get_kernpairs(data,kernpairs) return "" end) - afmblob = afmblob:gsub("StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics) + afmblob = gsub(afmblob,"StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics) if trace_loading then logs.report("load afm","loading variables") end diff --git a/tex/context/base/font-cid.lua b/tex/context/base/font-cid.lua index 57bfcd378..d1c727af2 100644 --- a/tex/context/base/font-cid.lua +++ b/tex/context/base/font-cid.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['font-cid'] = { local format, match, lower = string.format, string.match, string.lower local tonumber = tonumber +local lpegmatch = lpeg.match local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) @@ -61,7 +62,7 @@ function fonts.cid.load(filename) local data = io.loaddata(filename) if data then unicodes, names = { }, { } - grammar:match(data) + lpegmatch(grammar,data) local supplement, registry, ordering = match(filename,"^(.-)%-(.-)%-()%.(.-)$") return { supplement = supplement, diff --git a/tex/context/base/font-col.lua b/tex/context/base/font-col.lua index 596a4946c..d313357a2 100644 --- a/tex/context/base/font-col.lua +++ b/tex/context/base/font-col.lua @@ -10,6 +10,7 @@ if not modules then modules = { } end modules ['font-col'] = { local format, gmatch, texsprint, type = string.format, string.gmatch, tex.sprint, type local traverse_id, first_character = node.traverse_id, node.first_character +local lpegmatch = lpeg.match local ctxcatcodes = tex.ctxcatcodes @@ -166,7 +167,7 @@ function collections.prepare(name) local f = d[i] local name = f.font local scale = f.rscale or 1 - if okay:match(name) then + if lpegmatch(okay,name) then texsprint(ctxcatcodes,format("\\doclonefonta{%s}{%s}",name,scale)) -- define with unique specs else texsprint(ctxcatcodes,format("\\doclonefontb{%s}{%s}",name,scale)) -- define with inherited specs diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua index 2f63b3a8d..1233f075d 100644 --- a/tex/context/base/font-ctx.lua +++ b/tex/context/base/font-ctx.lua @@ -11,6 +11,7 @@ if not modules then modules = { } end modules ['font-ctx'] = { local texsprint, count = tex.sprint, tex.count local format, concat, gmatch, match, find, lower, gsub = string.format, table.concat, string.gmatch, string.match, string.find, string.lower, string.gsub local tostring, next, type = tostring, next, type +local lpegmatch = lpeg.match local ctxcatcodes = tex.ctxcatcodes @@ -48,7 +49,7 @@ name*context specification function specify.predefined(specification) local detail = specification.detail if detail ~= "" then - -- detail = detail:gsub("["..define.splitsymbols.."].*$","") -- get rid of *whatever specs and such + -- detail = gsub(detail,"["..define.splitsymbols.."].*$","") -- get rid of *whatever specs and such if define.methods[detail] then -- since these may be appended at the specification.features.vtf = { preset = detail } -- tex end by default end @@ -295,7 +296,7 @@ local get_specification = define.get_specification function define.command_1(str) statistics.starttiming(fonts) - local fullname, size = splitpattern:match(str) + local fullname, size = lpegmatch(splitpattern,str) local lookup, name, sub, method, detail = get_specification(fullname) if not name then logs.report("define font","strange definition '%s'",str) @@ -307,7 +308,7 @@ function define.command_1(str) end -- we can also use a count for the size if size and size ~= "" then - local mode, size = sizepattern:match(size) + local mode, size = lpegmatch(sizepattern,size) if size and mode then count.scaledfontmode = mode texsprint(ctxcatcodes,"\\def\\somefontsize{",size,"}") diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua index 65c74d48f..9a007b991 100644 --- a/tex/context/base/font-def.lua +++ b/tex/context/base/font-def.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['font-def'] = { local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower local tostring, next = tostring, next +local lpegmatch = lpeg.match local trace_defining = false trackers .register("fonts.defining", function(v) trace_defining = v end) local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end) @@ -108,7 +109,7 @@ define.add_lookup("name") define.add_lookup("spec") function define.get_specification(str) - return splitter:match(str) + return lpegmatch(splitter,str) end function define.register_split(symbol,action) diff --git a/tex/context/base/font-ext.lua b/tex/context/base/font-ext.lua index f13408efd..efbe50e89 100644 --- a/tex/context/base/font-ext.lua +++ b/tex/context/base/font-ext.lua @@ -100,6 +100,8 @@ only used with <l n='afm'/> files.</p> --~ smallcaps = lpeg.Cs((1-smallcaps)^1) * smallcaps^1 --~ oldstyle = lpeg.Cs((1-oldstyle )^1) * oldstyle ^1 --~ +--~ local lpegmatch = lpeg.match +--~ --~ function initializers.common.encoding(tfmdata,value) --~ if value then --~ local afmdata = tfmdata.shared.afmdata @@ -111,7 +113,7 @@ only used with <l n='afm'/> files.</p> --~ local characters = tfmdata.characters --~ local unicodes = afmdata.luatex.unicodes --~ local function remap(pattern,name) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then --~ local oldchr, newchr = unicodes[p], unicodes[name] --~ if oldchr and newchr and type(oldchr) == "number" and type(newchr) == "number" then @@ -145,7 +147,7 @@ only used with <l n='afm'/> files.</p> --~ for u, _ in next, characters do --~ local name = descriptions[u].name --~ if name then ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then --~ local oldchr, newchr = unicodes[p], unicodes[name] --~ if oldchr and newchr and type(oldchr) == "number" and type(newchr) == "number" then diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua index 4cb4976db..9e85516d6 100644 --- a/tex/context/base/font-map.lua +++ b/tex/context/base/font-map.lua @@ -6,7 +6,8 @@ if not modules then modules = { } end modules ['font-map'] = { license = "see context related readme files" } -local match, format, find, concat = string.match, string.format, string.find, table.concat +local match, format, find, concat, gsub = string.match, string.format, string.find, table.concat, string.gsub +local lpegmatch = lpeg.match local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) @@ -88,7 +89,7 @@ function fonts.map.load_file(filename, entries, encodings) -- print(line) else local extend, slant, name, fullname, fontfile, encoding - line = line:gsub('"(.+)"', function(s) + line = gsub(line,'"(.+)"', function(s) extend = find(s,'"([^"]+) ExtendFont"') slant = find(s,'"([^"]+) SlantFont"') return "" @@ -169,7 +170,7 @@ end --~ local parser = fonts.map.make_name_parser("Japan1") --~ local parser = fonts.map.make_name_parser() --~ local function test(str) ---~ local b, a = parser:match(str) +--~ local b, a = lpegmatch(parser,str) --~ print((a and table.serialize(b)) or b) --~ end --~ test("a.sc") diff --git a/tex/context/base/font-mis.lua b/tex/context/base/font-mis.lua index 2c809bc3d..043560565 100644 --- a/tex/context/base/font-mis.lua +++ b/tex/context/base/font-mis.lua @@ -11,7 +11,7 @@ local lower, strip = string.lower, string.strip fonts.otf = fonts.otf or { } -fonts.otf.version = fonts.otf.version or 2.641 +fonts.otf.version = fonts.otf.version or 2.642 fonts.otf.pack = true fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true) diff --git a/tex/context/base/font-otb.lua b/tex/context/base/font-otb.lua index 127d4c218..675c124e1 100644 --- a/tex/context/base/font-otb.lua +++ b/tex/context/base/font-otb.lua @@ -9,6 +9,7 @@ if not modules then modules = { } end modules ['font-otb'] = { local concat = table.concat local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip local type, next, tonumber, tostring = type, next, tonumber, tostring +local lpegmatch = lpeg.match local otf = fonts.otf local tfm = fonts.tfm @@ -69,7 +70,7 @@ local function resolve_ligatures(tfmdata,ligatures,kind) for k,v in next, ligatures do local lig = v[1] if not done[lig] then - local ligs = split_at_space:match(lig) + local ligs = lpegmatch(split_at_space,lig) if #ligs == 2 then local uc = v[2] local c, f, s = characters[uc], ligs[1], ligs[2] @@ -177,9 +178,84 @@ function prepare_base_substitutions(tfmdata,kind,value) -- we can share some cod local characters = tfmdata.characters local descriptions = tfmdata.descriptions local changed = tfmdata.changed + -- + local actions = { + substitution = function(p,lookup,k,glyph,unicode) + local pv = p[2] -- p.variant + if pv then + local upv = unicodes[pv] + if upv then + if type(upv) == "table" then + upv = upv[1] + end + if characters[upv] then + if trace_baseinit and trace_singles then + logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv)) + end + changed[k] = upv + end + end + end + end, + alternate = function(p,lookup,k,glyph,unicode) + local pc = p[2] -- p.components + if pc then + -- a bit optimized ugliness + if value == 1 then + pc = lpegmatch(splitter,pc) + elseif value == 2 then + local a, b = lpegmatch(splitter,pc) + pc = b or a + else + pc = { lpegmatch(splitter,pc) } + pc = pc[value] or pc[#pc] + end + if pc then + local upc = unicodes[pc] + if upc then + if type(upc) == "table" then + upc = upc[1] + end + if characters[upc] then + if trace_baseinit and trace_alternatives then + logs.report("define otf","%s: base alternate %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upc)) + end + changed[k] = upc + end + end + end + end + end, + ligature = function(p,lookup,k,glyph,unicode) + local pc = p[2] + if pc then + if trace_baseinit and trace_ligatures then + local upc = { lpegmatch(splitter,pc) } + for i=1,#upc do upc[i] = unicodes[upc[i]] end + -- we assume that it's no table + logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k)) + end + ligatures[#ligatures+1] = { pc, k } + end + end, + } + -- for k,c in next, characters do local glyph = descriptions[k] - local lookups = glyph.lookups + local lookups = glyph.slookups + if lookups then + for l=1,#lookuplist do + local lookup = lookuplist[l] + local p = lookups[lookup] + if p then + local a = actions[p[1]] + if a then + a(p,lookup,k,glyph,unicode) + end + end + end + end + local lookups = glyph.mlookups if lookups then for l=1,#lookuplist do local lookup = lookuplist[l] @@ -187,62 +263,9 @@ function prepare_base_substitutions(tfmdata,kind,value) -- we can share some cod if ps then for i=1,#ps do local p = ps[i] - local t = p[1] - if t == 'substitution' then - local pv = p[2] -- p.variant - if pv then - local upv = unicodes[pv] - if upv then - if type(upv) == "table" then - upv = upv[1] - end - if characters[upv] then - if trace_baseinit and trace_singles then - logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv)) - end - changed[k] = upv - end - end - end - elseif t == 'alternate' then - local pc = p[2] -- p.components - if pc then - -- a bit optimized ugliness - if value == 1 then - pc = splitter:match(pc) - elseif value == 2 then - local a, b = splitter:match(pc) - pc = b or a - else - pc = { splitter:match(pc) } - pc = pc[value] or pc[#pc] - end - if pc then - local upc = unicodes[pc] - if upc then - if type(upc) == "table" then - upc = upc[1] - end - if characters[upc] then - if trace_baseinit and trace_alternatives then - logs.report("define otf","%s: base alternate %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upc)) - end - changed[k] = upc - end - end - end - end - elseif t == 'ligature' and not changed[k] then - local pc = p[2] - if pc then - if trace_baseinit and trace_ligatures then - local upc = { splitter:match(pc) } - for i=1,#upc do upc[i] = unicodes[upc[i]] end - -- we assume that it's no table - logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k)) - end - ligatures[#ligatures+1] = { pc, k } - end + local a = actions[p[1]] + if a then + a(p,lookup,k,glyph,unicode) end end end diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index e2f0f5b62..bf5acadcd 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -11,6 +11,7 @@ local utf = unicode.utf8 local concat, getn, utfbyte = table.concat, table.getn, utf.byte local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip local type, next, tonumber, tostring = type, next, tonumber, tostring +local lpegmatch = lpeg.match local trace_private = false trackers.register("otf.private", function(v) trace_private = v end) local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) @@ -83,7 +84,7 @@ otf.features.default = otf.features.default or { } otf.enhancers = otf.enhancers or { } otf.glists = { "gsub", "gpos" } -otf.version = 2.641 -- beware: also sync font-mis.lua +otf.version = 2.642 -- beware: also sync font-mis.lua otf.pack = true -- beware: also sync font-mis.lua otf.syncspace = true otf.notdef = false @@ -207,6 +208,7 @@ local enhancers = { "reorganize mark classes", "reorganize kerns", -- moved here "flatten glyph lookups", "flatten anchor tables", "flatten feature tables", + "simplify glyph lookups", -- some saving "prepare luatex tables", "analyse features", "rehash features", "analyse anchors", "analyse marks", "analyse unicodes", "analyse subtables", @@ -503,11 +505,11 @@ local separator = lpeg.S("_.") local other = lpeg.C((1 - separator)^1) local ligsplitter = lpeg.Ct(other * (separator * other)^0) ---~ print(table.serialize(ligsplitter:match("this"))) ---~ print(table.serialize(ligsplitter:match("this.that"))) ---~ print(table.serialize(ligsplitter:match("japan1.123"))) ---~ print(table.serialize(ligsplitter:match("such_so_more"))) ---~ print(table.serialize(ligsplitter:match("such_so_more.that"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"this"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"this.that"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that"))) otf.enhancers["analyse unicodes"] = function(data,filename) local tounicode16, tounicode16sequence = fonts.map.tounicode16, fonts.map.tounicode16sequence @@ -545,13 +547,13 @@ otf.enhancers["analyse unicodes"] = function(data,filename) -- cidmap heuristics, beware, there is no guarantee for a match unless -- the chain resolves if (not unicode) and usedmap then - local foundindex = oparser:match(name) + local foundindex = lpegmatch(oparser,name) if foundindex then unicode = cidcodes[foundindex] -- name to number if not unicode then local reference = cidnames[foundindex] -- number to name if reference then - local foundindex = oparser:match(reference) + local foundindex = lpegmatch(oparser,reference) if foundindex then unicode = cidcodes[foundindex] if unicode then @@ -559,7 +561,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end end if not unicode then - local foundcodes, multiple = uparser:match(reference) + local foundcodes, multiple = lpegmatch(uparser,reference) if foundcodes then if multiple then originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true @@ -574,7 +576,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end -- a.whatever or a_b_c.whatever or a_b_c (no numbers) if not unicode then - local split = ligsplitter:match(name) + local split = lpegmatch(ligsplitter,name) local nplit = (split and #split) or 0 if nplit == 0 then -- skip @@ -607,7 +609,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end -- last resort if not unicode then - local foundcodes, multiple = uparser:match(name) + local foundcodes, multiple = lpegmatch(uparser,name) if foundcodes then if multiple then originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true @@ -1193,8 +1195,9 @@ end otf.enhancers["flatten glyph lookups"] = function(data,filename) for k, v in next, data.glyphs do - if v.lookups then - for kk, vv in next, v.lookups do + local lookups = v.lookups + if lookups then + for kk, vv in next, lookups do for kkk=1,#vv do local vvv = vv[kkk] local s = vvv.specification @@ -1244,6 +1247,31 @@ otf.enhancers["flatten glyph lookups"] = function(data,filename) end end +otf.enhancers["simplify glyph lookups"] = function(data,filename) + for k, v in next, data.glyphs do + local lookups = v.lookups + if lookups then + local slookups, mlookups + for kk, vv in next, lookups do + if #vv == 1 then + if not slookups then + slookups = { } + v.slookups = slookups + end + slookups[kk] = vv[1] + else + if not mlookups then + mlookups = { } + v.mlookups = mlookups + end + mlookups[kk] = vv + end + end + v.lookups = nil + end + end +end + otf.enhancers["flatten anchor tables"] = function(data,filename) for k, v in next, data.glyphs do if v.anchors then @@ -1484,7 +1512,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th local variants = m.horiz_variants if variants then local c = char - for n in variants:gmatch("[^ ]+") do + for n in gmatch(variants,"[^ ]+") do local un = unicodes[n] if un and u ~= un then c.next = un @@ -1496,7 +1524,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th local variants = m.vert_variants if variants then local c = char - for n in variants:gmatch("[^ ]+") do + for n in gmatch(variants,"[^ ]+") do local un = unicodes[n] if un and u ~= un then c.next = un diff --git a/tex/context/base/font-otn.lua b/tex/context/base/font-otn.lua index e58d7730d..efafa30c6 100644 --- a/tex/context/base/font-otn.lua +++ b/tex/context/base/font-otn.lua @@ -2275,142 +2275,153 @@ local function prepare_lookups(tfmdata) -- we can change the otf table after loading but then we need to adapt base mode -- as well (no big deal) -- - for unicode, glyph in next, descriptions do - local lookups = glyph.lookups - if lookups then - for lookup, whatever in next, lookups do - for i=1,#whatever do -- normaly one - local p = whatever[i] - local what = p[1] - if what == 'substitution' then - local old, new = unicode, unicodes[p[2]] - if type(new) == "table" then - new = new[1] - end - local s = single[lookup] - if not s then s = { } single[lookup] = s end - s[old] = new ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new) ---~ end - break - elseif what == 'multiple' then - local old, new = unicode, { } - local m = multiple[lookup] - if not m then m = { } multiple[lookup] = m end - m[old] = new - for pc in gmatch(p[2],"[^ ]+") do - local upc = unicodes[pc] - if type(upc) == "number" then - new[#new+1] = upc - else - new[#new+1] = upc[1] - end - end ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," ")) ---~ end + local action = { + substitution = function(p,lookup,k,glyph,unicode) + local old, new = unicode, unicodes[p[2]] + if type(new) == "table" then + new = new[1] + end + local s = single[lookup] + if not s then s = { } single[lookup] = s end + s[old] = new + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new) + --~ end + end, + multiple = function (p,lookup,k,glyph,unicode) + local old, new = unicode, { } + local m = multiple[lookup] + if not m then m = { } multiple[lookup] = m end + m[old] = new + for pc in gmatch(p[2],"[^ ]+") do + local upc = unicodes[pc] + if type(upc) == "number" then + new[#new+1] = upc + else + new[#new+1] = upc[1] + end + end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," ")) + --~ end + end, + alternate = function(p,lookup,k,glyph,unicode) + local old, new = unicode, { } + local a = alternate[lookup] + if not a then a = { } alternate[lookup] = a end + a[old] = new + for pc in gmatch(p[2],"[^ ]+") do + local upc = unicodes[pc] + if type(upc) == "number" then + new[#new+1] = upc + else + new[#new+1] = upc[1] + end + end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|")) + --~ end + end, + ligature = function (p,lookup,k,glyph,unicode) + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name) + --~ end + local first = true + local t = ligature[lookup] + if not t then t = { } ligature[lookup] = t end + for s in gmatch(p[2],"[^ ]+") do + if first then + local u = unicodes[s] + if not u then + logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name) break - elseif what == 'alternate' then - local old, new = unicode, { } - local a = alternate[lookup] - if not a then a = { } alternate[lookup] = a end - a[old] = new - for pc in gmatch(p[2],"[^ ]+") do - local upc = unicodes[pc] - if type(upc) == "number" then - new[#new+1] = upc - else - new[#new+1] = upc[1] - end + elseif type(u) == "number" then + if not t[u] then + t[u] = { { } } end ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|")) ---~ end - break - elseif what == "ligature" then ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name) ---~ end - local first = true - local t = ligature[lookup] - if not t then t = { } ligature[lookup] = t end - for s in gmatch(p[2],"[^ ]+") do - if first then - local u = unicodes[s] - if not u then - logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name) - break - elseif type(u) == "number" then - if not t[u] then - t[u] = { { } } - end - t = t[u] - else - local tt = t - local tu - for i=1,#u do - local u = u[i] - if i==1 then - if not t[u] then - t[u] = { { } } - end - tu = t[u] - t = tu - else - if not t[u] then - tt[u] = tu - end - end - end + t = t[u] + else + local tt = t + local tu + for i=1,#u do + local u = u[i] + if i==1 then + if not t[u] then + t[u] = { { } } end - first = false + tu = t[u] + t = tu else - s = unicodes[s] - local t1 = t[1] - if not t1[s] then - t1[s] = { { } } + if not t[u] then + tt[u] = tu end - t = t1[s] end end - t[2] = unicode - elseif what == 'position' then - -- not used - local s = position[lookup] - if not s then s = { } position[lookup] = s end - s[unicode] = p[2] -- direct pointer to kern spec - elseif what == 'pair' then - local s = pair[lookup] - if not s then s = { } pair[lookup] = s end - local others = s[unicode] - if not others then others = { } s[unicode] = others end - -- todo: fast check for space - local two = p[2] - local upc = unicodes[two] - if not upc then - for pc in gmatch(two,"[^ ]+") do - local upc = unicodes[pc] - if type(upc) == "number" then - others[upc] = p -- direct pointer to main table - else - for i=1,#upc do - others[upc[i]] = p -- direct pointer to main table - end - end - end - elseif type(upc) == "number" then - others[upc] = p -- direct pointer to main table - else - for i=1,#upc do - others[upc[i]] = p -- direct pointer to main table - end + end + first = false + else + s = unicodes[s] + local t1 = t[1] + if not t1[s] then + t1[s] = { { } } + end + t = t1[s] + end + end + t[2] = unicode + end, + position = function(p,lookup,k,glyph,unicode) + -- not used + local s = position[lookup] + if not s then s = { } position[lookup] = s end + s[unicode] = p[2] -- direct pointer to kern spec + end, + pair = function(p,lookup,k,glyph,unicode) + local s = pair[lookup] + if not s then s = { } pair[lookup] = s end + local others = s[unicode] + if not others then others = { } s[unicode] = others end + -- todo: fast check for space + local two = p[2] + local upc = unicodes[two] + if not upc then + for pc in gmatch(two,"[^ ]+") do + local upc = unicodes[pc] + if type(upc) == "number" then + others[upc] = p -- direct pointer to main table + else + for i=1,#upc do + others[upc[i]] = p -- direct pointer to main table end ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode) ---~ end end end + elseif type(upc) == "number" then + others[upc] = p -- direct pointer to main table + else + for i=1,#upc do + others[upc[i]] = p -- direct pointer to main table + end + end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode) + --~ end + end, + } + -- + for unicode, glyph in next, descriptions do + local lookups = glyph.slookups + if lookups then + for lookup, p in next, lookups do + action[p[1]](p,lookup,k,glyph,unicode) + end + end + local lookups = glyph.mlookups + if lookups then + for lookup, whatever in next, lookups do + for i=1,#whatever do -- normaly one + local p = whatever[i] + action[p[1]](p,lookup,k,glyph,unicode) + end end end local list = glyph.mykerns @@ -2419,9 +2430,9 @@ local function prepare_lookups(tfmdata) local k = kerns[lookup] if not k then k = { } kerns[lookup] = k end k[unicode] = krn -- ref to glyph, saves lookup ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode) ---~ end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode) + --~ end end end local oanchor = glyph.anchors @@ -2435,9 +2446,9 @@ local function prepare_lookups(tfmdata) local f = mark[lookup] if not f then f = { } mark[lookup] = f end f[unicode] = anchors -- ref to glyph, saves lookup ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode) ---~ end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode) + --~ end end end end @@ -2449,9 +2460,9 @@ local function prepare_lookups(tfmdata) local f = cursive[lookup] if not f then f = { } cursive[lookup] = f end f[unicode] = anchors -- ref to glyph, saves lookup ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode) ---~ end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode) + --~ end end end end diff --git a/tex/context/base/font-otp.lua b/tex/context/base/font-otp.lua index 3cdc80737..6c4ad0f8c 100644 --- a/tex/context/base/font-otp.lua +++ b/tex/context/base/font-otp.lua @@ -98,7 +98,13 @@ function fonts.otf.enhancers.pack(data) local pack = (pass == 1 and pack_1) or pack_2 for k, v in next, data.glyphs do v.boundingbox = pack(v.boundingbox) - local l = v.lookups + local l = v.slookups + if l then + for k,v in next, l do + l[k] = pack(v) + end + end + local l = v.mlookups if l then for k,v in next, l do for kk=1,#v do @@ -250,7 +256,7 @@ function fonts.otf.enhancers.pack(data) if a then v.anchors = pack(a) end - local l = v.lookups + local l = v.mlookups if l then for k,v in next, l do for kk=1,#v do @@ -279,7 +285,13 @@ function fonts.otf.enhancers.unpack(data) if t then for k, v in next, data.glyphs do local tv = t[v.boundingbox] if tv then v.boundingbox = tv end - local l = v.lookups + local l = v.slookups + if l then + for k,v in next, l do + local tv = t[v] if tv then l[k] = tv end + end + end + local l = v.mlookups if l then for k,v in next, l do for i=1,#v do @@ -418,3 +430,208 @@ function fonts.otf.enhancers.unpack(data) end end end + + + +function fonts.otf.enhancers.unpack(data) + if data then + local t = data.tables + if t then + local unpacked = { } + for k, v in next, data.glyphs do + local tv = t[v.boundingbox] if tv then v.boundingbox = tv end + local l = v.slookups + if l then + for k,v in next, l do + local tv = t[v] if tv then l[k] = tv end + end + end + local l = v.mlookups + if l then + for k,v in next, l do + for i=1,#v do + local vi = v[i] + local tv = t[vi] + if tv then + v[i] = tv + if unpacked[tv] then + vi = false + else + unpacked[tv], vi = true, tv + end + end + if vi then + local what = vi[1] + if what == "pair" then + local tv = t[vi[3]] if tv then vi[3] = tv end + local tv = t[vi[4]] if tv then vi[4] = tv end + elseif what == "position" then + local tv = t[vi[2]] if tv then vi[2] = tv end + end + end + end + end + end + local m = v.mykerns + if m then + local tm = t[m] + if tm then + v.mykerns = tm + if unpacked[tm] then + m = false + else + unpacked[tm], m = true, tm + end + end + if m then + for k,v in next, m do + local tv = t[v] if tv then m[k] = tv end + end + end + end + local m = v.math + if m then + local mk = m.kerns + if mk then + local tm = t[mk] + if tm then + m.kerns = tm + if unpacked[tm] then + mk = false + else + unpacked[tm], mk = true, tm + end + end + if mk then + for k,v in next, mk do + local tv = t[v] if tv then mk[k] = tv end + end + end + end + end + local a = v.anchors + if a then + local ta = t[a] + if ta then + v.anchors = ta + if not unpacked[ta] then + unpacked[ta], a = true, ta + else + a = false + end + end + if a then + for k,v in next, a do + if k == "baselig" then + for kk, vv in next, v do + for kkk=1,#vv do + local tv = t[vv[kkk]] if tv then vv[kkk] = tv end + end + end + else + for kk, vv in next, v do + local tv = t[vv] if tv then v[kk] = tv end + end + end + end + end + end + end + if data.lookups then + for k, v in next, data.lookups do + local r = v.rules + if r then + for kk, vv in next, r do + local l = vv.lookups + if l then + local tv = t[l] if tv then vv.lookups = tv end + end + local c = vv.coverage + if c then + local cc = c.before if cc then local tv = t[cc] if tv then c.before = tv end end + cc = c.after if cc then local tv = t[cc] if tv then c.after = tv end end + cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end + end + local c = vv.reversecoverage + if c then + local cc = c.before if cc then local tv = t[cc] if tv then c.before = tv end end + cc = c.after if cc then local tv = t[cc] if tv then c.after = tv end end + cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end + end + end + end + end + end + local luatex = data.luatex + if luatex then + local la = luatex.anchor_to_lookup + if la then + for lookup, ldata in next, la do + local tv = t[ldata] if tv then la[lookup] = tv end + end + end + local la = luatex.lookup_to_anchor + if la then + for lookup, ldata in next, la do + local tv = t[ldata] if tv then la[lookup] = tv end + end + end + local ls = luatex.sequences + if ls then + for feature, fdata in next, ls do + local flags = fdata.flags + if flags then + local tv = t[flags] if tv then fdata.flags = tv end + end + local subtables = fdata.subtables + if subtables then + local tv = t[subtables] if tv then fdata.subtables = tv end + end + local features = fdata.features + if features then + local tv = t[features] + if tv then + fdata.features = tv + if not unpacked[tv] then + unpacked[tv], features = true, tv + else + features = false + end + end + if features then + for script, sdata in next, features do + local tv = t[sdata] if tv then features[script] = tv end + end + end + end + end + end + local ls = luatex.lookups + if ls then + for lookups, fdata in next, ls do + local flags = fdata.flags + if flags then + local tv = t[flags] if tv then fdata.flags = tv end + end + local subtables = fdata.subtables + if subtables then + local tv = t[subtables] if tv then fdata.subtables = tv end + end + end + end + local lf = luatex.features + if lf then + for _, g in next, fonts.otf.glists do + local gl = lf[g] + if gl then + for feature, spec in next, gl do + local tv = t[spec] if tv then gl[feature] = tv end + end + end + end + end + end + data.tables = nil + end + end +end diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua index 9f84c2637..a3b61af31 100644 --- a/tex/context/base/font-syn.lua +++ b/tex/context/base/font-syn.lua @@ -12,6 +12,7 @@ local next, tonumber = next, tonumber local gsub, lower, match, find, lower, upper = string.gsub, string.lower, string.match, string.find, string.lower, string.upper local find, gmatch = string.find, string.gmatch local concat, sort, format = table.concat, table.sort, string.format +local lpegmatch = lpeg.match local trace_names = false trackers.register("fonts.names", function(v) trace_names = v end) local trace_warnings = false trackers.register("fonts.warnings", function(v) trace_warnings = v end) @@ -106,10 +107,10 @@ local analyser = Cs ( local splitter = lpeg.splitat("-") function names.splitspec(askedname) - local name, weight, style, width = splitter:match(askedname) - weight = weight and weights:match(weight) or weight - style = style and styles :match(style) or style - width = width and widths :match(width) or width + local name, weight, style, width = lpegmatch(splitter,askedname) + weight = weight and lpegmatch(weights,weight) or weight + style = style and lpegmatch(styles, style) or style + width = width and lpegmatch(widths, width) or width if trace_names then logs.report("fonts","requested name '%s' split in name '%s', weight '%s', style '%s' and width '%s'",askedname,name or '',weight or '',style or '',width or '') end @@ -125,7 +126,7 @@ end local function analysespec(somename) if somename then analysed_table = { } - local name = analyser:match(somename) + local name = lpegmatch(analyser,somename) return name, analysed_table[1], analysed_table[2],analysed_table[3] end end diff --git a/tex/context/base/font-xtx.lua b/tex/context/base/font-xtx.lua index 8aecae8d9..574221b5d 100644 --- a/tex/context/base/font-xtx.lua +++ b/tex/context/base/font-xtx.lua @@ -9,6 +9,7 @@ if not modules then modules = { } end modules ['font-xtx'] = { local texsprint, count = tex.sprint, tex.count local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower local tostring, next = tostring, next +local lpegmatch = lpeg.match local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) @@ -88,7 +89,7 @@ local pattern = (filename + fontname) * subvalue^0 * crapspec^0 * options^0 function fonts.define.specify.colonized(specification) -- xetex mode list = { } - pattern:match(specification.specification) + lpegmatch(pattern,specification.specification) for k, v in next, list do list[k] = v:is_boolean() if type(list[a]) == "nil" then diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua index 5d2f1bab7..d605168c8 100644 --- a/tex/context/base/grph-inc.lua +++ b/tex/context/base/grph-inc.lua @@ -33,7 +33,8 @@ The TeX-Lua mix is suboptimal. This has to do with the fact that we cannot run TeX code from within Lua. Some more functionality will move to Lua. ]]-- -local texsprint, format, lower, find, match = tex.sprint, string.format, string.lower, string.find, string.match +local format, lower, find, match, gsub, gmatch = string.format, string.lower, string.find, string.match, string.gsub, string.gmatch +local texsprint = tex.sprint local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables @@ -70,7 +71,7 @@ local validtypes = table.tohash(img.types()) function img.check_size(size) if size then - size = size:gsub("box","") + size = gsub(size,"box","") return (validsizes[size] and size) or "crop" else return "crop" @@ -184,7 +185,7 @@ function figures.setpaths(locationset,pathlist) last_locationset = locationset end if h[iv["global"]] then - for s in pathlist:gmatch("([^, ]+)") do + for s in gmatch(pathlist,"([^, ]+)") do if not table.contains(t,s) then t[#t+1] = s end diff --git a/tex/context/base/java-ini.lua b/tex/context/base/java-ini.lua index 9e3679bbf..f64a8a18f 100644 --- a/tex/context/base/java-ini.lua +++ b/tex/context/base/java-ini.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['java-ini'] = { } local format = string.format +local lpegmatch = lpeg.match javascripts = javascripts or { } javascripts.codes = javascripts.codes or { } @@ -42,18 +43,18 @@ local parsepreamble = name * ((used * name) + lpeg.Cc("")) * spaces * script local parsefunctions = (fname + any)^0 function javascripts.storecode(str) - local name, uses, script = parsecode:match(str) + local name, uses, script = lpegmatch(parsecode,str) if name and name ~= "" then javascripts.codes[name] = { uses, script } end end function javascripts.storepreamble(str) -- now later - local name, used, script = parsepreamble:match(str) + local name, used, script = lpegmatch(parsepreamble,str) if name and name ~= "" then preambles[#preambles+1] = { name, used, script } preambled[name] = #preambles - parsefunctions:match(script) + lpegmatch(parsefunctions,script) end end @@ -61,7 +62,7 @@ function javascripts.setpreamble(name,script) -- now later if name and name ~= "" then preambles[#preambles+1] = { name, "now", script } preambled[name] = #preambles - parsefunctions:match(script) + lpegmatch(parsefunctions,script) end end @@ -73,7 +74,7 @@ function javascripts.addtopreamble(name,script) -- now later else preambles[#preambles+1] = { name, "now", script } preambled[name] = #preambles - parsefunctions:match(script) + lpegmatch(parsefunctions,script) end end end diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua index e422a2313..1ff5c086e 100644 --- a/tex/context/base/l-aux.lua +++ b/tex/context/base/l-aux.lua @@ -10,6 +10,7 @@ aux = aux or { } local concat, format, gmatch = table.concat, string.format, string.gmatch local tostring, type = tostring, type +local lpegmatch = lpeg.match local space = lpeg.P(' ') local equal = lpeg.P("=") @@ -59,9 +60,9 @@ function aux.settings_to_hash(str,existing) if str and str ~= "" then hash = existing or { } if moretolerant then - pattern_b_s:match(str) + lpegmatch(pattern_b_s,str) else - pattern_a_s:match(str) + lpegmatch(pattern_a_s,str) end return hash else @@ -72,7 +73,7 @@ end function aux.settings_to_hash_tolerant(str,existing) if str and str ~= "" then hash = existing or { } - pattern_b_s:match(str) + lpegmatch(pattern_b_s,str) return hash else return { } @@ -82,7 +83,7 @@ end function aux.settings_to_hash_strict(str,existing) if str and str ~= "" then hash = existing or { } - pattern_c_s:match(str) + lpegmatch(pattern_c_s,str) return next(hash) and hash else return nil @@ -101,7 +102,7 @@ function aux.settings_to_array(str) if not str or str == "" then return { } else - return pattern:match(str) + return lpegmatch(pattern,str) end end @@ -113,7 +114,7 @@ local value = lpeg.P(lpeg.Carg(1)*value) / set local pattern = value*(separator*value)^0 * lpeg.Carg(1) function aux.add_settings_to_array(t,str) - return pattern:match(str, nil, t) + return lpegmatch(pattern,str,nil,t) end function aux.hash_to_string(h,separator,yes,no,strict,omit) @@ -165,7 +166,7 @@ local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace local pattern = lpeg.Ct((space + value)^0) function aux.arguments_to_table(str) - return pattern:match(str) + return lpegmatch(pattern,str) end -- temporary here @@ -201,11 +202,11 @@ local stripper = lpeg.Cs((number + 1)^0) --~ collectgarbage("collect") --~ str = string.rep(sample,10000) --~ local ts = os.clock() ---~ stripper:match(str) ---~ print(#str, os.clock()-ts, stripper:match(sample)) +--~ lpegmatch(stripper,str) +--~ print(#str, os.clock()-ts, lpegmatch(stripper,sample)) function aux.strip_zeros(str) - return stripper:match(str) + return lpegmatch(stripper,str) end function aux.definetable(target) -- defines undefined tables diff --git a/tex/context/base/l-dimen.lua b/tex/context/base/l-dimen.lua index 00e96586f..e15e29463 100644 --- a/tex/context/base/l-dimen.lua +++ b/tex/context/base/l-dimen.lua @@ -16,6 +16,7 @@ table.</p> --ldx]]-- local format, match, gsub, type, setmetatable = string.format, string.match, string.gsub, type, setmetatable +local lpegmatch = lpeg.match number = number or { } @@ -145,7 +146,7 @@ function string:todimen() if type(self) == "number" then return self else - local value, unit = pattern:match(self) + local value, unit = lpegmatch(pattern,self) print(value,unit) return value/unit end @@ -193,7 +194,7 @@ function dimen(a) if a then local ta= type(a) if ta == "string" then - local value, unit = pattern:match(a) + local value, unit = lpegmatch(pattern,a) if type(unit) == "function" then k = value/unit() else @@ -360,7 +361,7 @@ function dimen(a) if k then a = k else - local value, unit = pattern:match(a) + local value, unit = lpegmatch(pattern,a) if type(unit) == "function" then k = value/unit() else @@ -384,7 +385,7 @@ function string:todimen() else local k = known[self] if not k then - local value, unit = pattern:match(self) + local value, unit = lpegmatch(pattern,self) if value and unit then k = value/unit else diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua index 7ee565b30..3760db2c1 100644 --- a/tex/context/base/l-dir.lua +++ b/tex/context/base/l-dir.lua @@ -7,7 +7,8 @@ if not modules then modules = { } end modules ['l-dir'] = { } local type = type -local find, gmatch = string.find, string.gmatch +local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub +local lpegmatch = lpeg.match dir = dir or { } @@ -100,14 +101,14 @@ local function glob(str,t) t[#t+1] = str return t else - local split = pattern:match(str) + local split = lpegmatch(pattern,str) if split then local t = t or { } local action = action or function(name) t[#t+1] = name end local root, path, base = split[1], split[2], split[3] local recurse = find(base,"%*%*") local start = root .. path - local result = filter:match(start .. base) + local result = lpegmatch(filter,start .. base) glob_pattern(start,result,recurse,action) return t else @@ -188,13 +189,13 @@ if string.find(os.getenv("PATH"),";") then end local first, middle, last local drive = false - first, middle, last = str:match("^(//)(//*)(.*)$") + first, middle, last = match(str,"^(//)(//*)(.*)$") if first then -- empty network path == local path else - first, last = str:match("^(//)/*(.-)$") + first, last = match(str,"^(//)/*(.-)$") if first then - middle, last = str:match("([^/]+)/+(.-)$") + middle, last = match(str,"([^/]+)/+(.-)$") if middle then pth = "//" .. middle else @@ -202,11 +203,11 @@ if string.find(os.getenv("PATH"),";") then last = "" end else - first, middle, last = str:match("^([a-zA-Z]:)(/*)(.-)$") + first, middle, last = match(str,"^([a-zA-Z]:)(/*)(.-)$") if first then pth, drive = first .. middle, true else - middle, last = str:match("^(/*)(.-)$") + middle, last = match(str,"^(/*)(.-)$") if not middle then last = str end @@ -241,33 +242,33 @@ if string.find(os.getenv("PATH"),";") then --~ print(dir.mkdirs("a/bbb//ccc/")) function dir.expand_name(str) - local first, nothing, last = str:match("^(//)(//*)(.*)$") + local first, nothing, last = match(str,"^(//)(//*)(.*)$") if first then first = lfs.currentdir() .. "/" - first = first:gsub("\\","/") + first = gsub(first,"\\","/") end if not first then - first, last = str:match("^(//)/*(.*)$") + first, last = match(str,"^(//)/*(.*)$") end if not first then - first, last = str:match("^([a-zA-Z]:)(.*)$") + first, last = match(str,"^([a-zA-Z]:)(.*)$") if first and not find(last,"^/") then local d = lfs.currentdir() if lfs.chdir(first) then first = lfs.currentdir() - first = first:gsub("\\","/") + first = gsub(first,"\\","/") end lfs.chdir(d) end end if not first then first, last = lfs.currentdir(), str - first = first:gsub("\\","/") + first = gsub(first,"\\","/") end - last = last:gsub("//","/") - last = last:gsub("/%./","/") - last = last:gsub("^/*","") - first = first:gsub("/*$","") + last = gsub(last,"//","/") + last = gsub(last,"/%./","/") + last = gsub(last,"^/*","") + first = gsub(first,"/*$","") if last == "" then return first else @@ -288,7 +289,7 @@ else end end end - str = str:gsub("/+","/") + str = gsub(str,"/+","/") if find(str,"^/") then pth = "/" for s in gmatch(str,"[^/]+") do @@ -326,8 +327,8 @@ else if not find(str,"^/") then str = lfs.currentdir() .. "/" .. str end - str = str:gsub("//","/") - str = str:gsub("/%./","/") + str = gsub(str,"//","/") + str = gsub(str,"/%./","/") return str end diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua index be42727c0..c95ef658c 100644 --- a/tex/context/base/l-file.lua +++ b/tex/context/base/l-file.lua @@ -11,7 +11,8 @@ if not modules then modules = { } end modules ['l-file'] = { file = file or { } local concat = table.concat -local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub +local find, gmatch, match, gsub, sub = string.find, string.gmatch, string.match, string.gsub, string.sub +local lpegmatch = lpeg.match function file.removesuffix(filename) return (gsub(filename,"%.[%a%d]+$","")) @@ -69,12 +70,12 @@ end function file.iswritable(name) local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,".")) - return a and a.permissions:sub(2,2) == "w" + return a and sub(a.permissions,2,2) == "w" end function file.isreadable(name) local a = lfs.attributes(name) - return a and a.permissions:sub(1,1) == "r" + return a and sub(a.permissions,1,1) == "r" end file.is_readable = file.isreadable @@ -149,27 +150,27 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1 --~ function file.extname(name) ---~ return pattern:match(name) or "" +--~ return lpegmatch(pattern,name) or "" --~ end --~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1) --~ function file.removesuffix(name) ---~ return pattern:match(name) +--~ return lpegmatch(pattern,name) --~ end --~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1 --~ function file.basename(name) ---~ return pattern:match(name) or name +--~ return lpegmatch(pattern,name) or name --~ end --~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1 --~ function file.dirname(name) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then ---~ return name:sub(1,p-2) +--~ return sub(name,1,p-2) --~ else --~ return "" --~ end @@ -178,7 +179,7 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1 --~ function file.addsuffix(name, suffix) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then --~ return name --~ else @@ -189,9 +190,9 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1 --~ function file.replacesuffix(name,suffix) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then ---~ return name:sub(1,p-2) .. "." .. suffix +--~ return sub(name,1,p-2) .. "." .. suffix --~ else --~ return name .. "." .. suffix --~ end @@ -200,11 +201,11 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1 --~ function file.nameonly(name) ---~ local a, b = pattern:match(name) +--~ local a, b = lpegmatch(pattern,name) --~ if b then ---~ return name:sub(a,b-2) +--~ return sub(name,a,b-2) --~ elseif a then ---~ return name:sub(a) +--~ return sub(name,a) --~ else --~ return name --~ end @@ -238,11 +239,11 @@ local rootbased = lpeg.P("/") + letter*lpeg.P(":") -- ./name ../name /name c: :// name/name function file.is_qualified_path(filename) - return qualified:match(filename) ~= nil + return lpegmatch(qualified,filename) ~= nil end function file.is_rootbased_path(filename) - return rootbased:match(filename) ~= nil + return lpegmatch(rootbased,filename) ~= nil end local slash = lpeg.S("\\/") @@ -255,7 +256,7 @@ local base = lpeg.C((1-suffix)^0) local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc("")) function file.splitname(str) -- returns drive, path, base, suffix - return pattern:match(str) + return lpegmatch(pattern,str) end -- function test(t) for k, v in pairs(t) do print(v, "=>", file.splitname(v)) end end diff --git a/tex/context/base/l-io.lua b/tex/context/base/l-io.lua index 0d0357039..5a126da7b 100644 --- a/tex/context/base/l-io.lua +++ b/tex/context/base/l-io.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['l-io'] = { license = "see context related readme files" } -local byte = string.byte +local byte, find, gsub = string.byte, string.find, string.gsub if string.find(os.getenv("PATH"),";") then io.fileseparator, io.pathseparator = "\\", ";" @@ -164,7 +164,7 @@ function io.ask(question,default,options) end io.write(string.format(" ")) local answer = io.read() - answer = answer:gsub("^%s*(.*)%s*$","%1") + answer = gsub(answer,"^%s*(.*)%s*$","%1") if answer == "" and default then return default elseif not options then @@ -177,7 +177,7 @@ function io.ask(question,default,options) end local pattern = "^" .. answer for _,v in pairs(options) do - if v:find(pattern) then + if find(v,pattern) then return v end end diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua index d1e0dfafb..9e761e4b3 100644 --- a/tex/context/base/l-lpeg.lua +++ b/tex/context/base/l-lpeg.lua @@ -9,6 +9,7 @@ if not modules then modules = { } end modules ['l-lpeg'] = { lpeg = require("lpeg") local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc +local match = lpeg.match --~ l-lpeg.lua : @@ -61,15 +62,15 @@ local content = (empty + nonempty)^1 local capture = Ct(content^0) function string:splitlines() - return capture:match(self) + return match(capture,self) end lpeg.linebyline = content -- better make a sublibrary ---~ local p = lpeg.splitat("->",false) print(p:match("oeps->what->more")) -- oeps what more ---~ local p = lpeg.splitat("->",true) print(p:match("oeps->what->more")) -- oeps what->more ---~ local p = lpeg.splitat("->",false) print(p:match("oeps")) -- oeps ---~ local p = lpeg.splitat("->",true) print(p:match("oeps")) -- oeps +--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more +--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more +--~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps +--~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps local splitters_s, splitters_m = { }, { } @@ -100,7 +101,7 @@ function string:split(separator) c = Ct(splitat(separator)) cache[separator] = c end - return c:match(self) + return match(c,self) end local cache = { } @@ -113,7 +114,7 @@ function string:checkedsplit(separator) c = Ct(separator^0 * other * (separator^1 * other)^0) cache[separator] = c end - return c:match(self) + return match(c,self) end --~ function lpeg.L(list,pp) diff --git a/tex/context/base/l-md5.lua b/tex/context/base/l-md5.lua index 8640ad54e..27955ef9b 100644 --- a/tex/context/base/l-md5.lua +++ b/tex/context/base/l-md5.lua @@ -57,7 +57,7 @@ end function file.loadchecksum(name) if md5 then local data = io.loaddata(name .. ".md5") - return data and data:gsub("%s","") + return data and (gsub(data,"%s","")) end return nil end diff --git a/tex/context/base/l-number.lua b/tex/context/base/l-number.lua index 39ca2c6b6..a1249f055 100644 --- a/tex/context/base/l-number.lua +++ b/tex/context/base/l-number.lua @@ -6,14 +6,16 @@ if not modules then modules = { } end modules ['l-number'] = { license = "see context related readme files" } -local format, foor, insert = string.format, math.floor, table.insert +local tostring = tostring +local format, floor, insert, match = string.format, math.floor, table.insert, string.match +local lpegmatch = lpeg.match number = number or { } -- a,b,c,d,e,f = number.toset(100101) function number.toset(n) - return (tostring(n)):match("(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)") + return match(tostring(n),"(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)") end function number.toevenhex(n) @@ -39,7 +41,7 @@ end local one = lpeg.C(1-lpeg.S(''))^1 function number.toset(n) - return one:match(tostring(n)) + return lpegmatch(one,tostring(n)) end function number.bits(n,zero) diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua index d9ae41af7..25b8f8e98 100644 --- a/tex/context/base/l-string.lua +++ b/tex/context/base/l-string.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['l-string'] = { } local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower +local lpegmatch = lpeg.match -- some functions may disappear as they are not used anywhere @@ -77,9 +78,19 @@ function string:limit(n,sentinel) end end -function string:strip() -- the .- is quite efficient --- return match(self,"^%s*(.-)%s*$") or "" - return match(self,'^%s*(.*%S)') or '' -- posted on lua list +--~ function string:strip() -- the .- is quite efficient +--~ -- return match(self,"^%s*(.-)%s*$") or "" +--~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list +--~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)') +--~ end + +do -- roberto's variant: + local space = lpeg.S(" \t\v\n") + local nospace = 1 - space + local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0) + function string.strip(str) + return lpegmatch(stripper,str) or "" + end end function string:is_empty() @@ -216,7 +227,7 @@ end local pattern = lpeg.Ct(lpeg.C(1)^0) function string:totable() - return pattern:match(self) + return lpegmatch(pattern,self) end --~ for _, str in ipairs { diff --git a/tex/context/base/l-url.lua b/tex/context/base/l-url.lua index 5d899e69e..1d282a178 100644 --- a/tex/context/base/l-url.lua +++ b/tex/context/base/l-url.lua @@ -6,8 +6,9 @@ if not modules then modules = { } end modules ['l-url'] = { license = "see context related readme files" } -local char, gmatch = string.char, string.gmatch +local char, gmatch, gsub = string.char, string.gmatch, string.gsub local tonumber, type = tonumber, type +local lpegmatch = lpeg.match -- from the spec (on the web): -- @@ -40,7 +41,7 @@ local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0 local parser = lpeg.Ct(scheme * authority * path * query * fragment) function url.split(str) - return (type(str) == "string" and parser:match(str)) or str + return (type(str) == "string" and lpegmatch(parser,str)) or str end function url.hashed(str) @@ -57,7 +58,7 @@ end function url.filename(filename) local t = url.hashed(filename) - return (t.scheme == "file" and t.path:gsub("^/([a-zA-Z])([:|])/)","%1:")) or filename + return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename end function url.query(str) diff --git a/tex/context/base/l-utils.lua b/tex/context/base/l-utils.lua index 313381065..a5bc9d796 100644 --- a/tex/context/base/l-utils.lua +++ b/tex/context/base/l-utils.lua @@ -8,6 +8,9 @@ if not modules then modules = { } end modules ['l-utils'] = { -- hm, quite unreadable +local gsub = string.gsub +local concat = table.concat + if not utils then utils = { } end if not utils.merger then utils.merger = { } end if not utils.lua then utils.lua = { } end @@ -45,7 +48,7 @@ function utils.merger._self_load_(name) end if data and utils.merger.strip_comment then -- saves some 20K - data = data:gsub("%-%-~[^\n\r]*[\r\n]", "") + data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "") end return data or "" end @@ -63,7 +66,7 @@ end function utils.merger._self_swap_(data,code) if data ~= "" then - return (data:gsub(utils.merger.pattern, function(s) + return (gsub(data,utils.merger.pattern, function(s) return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n" end, 1)) else @@ -73,8 +76,8 @@ end --~ stripper: --~ ---~ data = string.gsub(data,"%-%-~[^\n]*\n","") ---~ data = string.gsub(data,"\n\n+","\n") +--~ data = gsub(data,"%-%-~[^\n]*\n","") +--~ data = gsub(data,"\n\n+","\n") function utils.merger._self_libs_(libs,list) local result, f, frozen = { }, nil, false @@ -84,7 +87,7 @@ function utils.merger._self_libs_(libs,list) local foundpath = nil for _, lib in ipairs(libs) do for _, pth in ipairs(list) do - pth = string.gsub(pth,"\\","/") -- file.clean_path + pth = gsub(pth,"\\","/") -- file.clean_path utils.report("checking library path %s",pth) local name = pth .. "/" .. lib if lfs.isfile(name) then @@ -110,15 +113,15 @@ function utils.merger._self_libs_(libs,list) end end if #right > 0 then - utils.report("merged libraries: %s",table.concat(right," ")) + utils.report("merged libraries: %s",concat(right," ")) end if #wrong > 0 then - utils.report("skipped libraries: %s",table.concat(wrong," ")) + utils.report("skipped libraries: %s",concat(wrong," ")) end else utils.report("no valid library path found") end - return table.concat(result, "\n\n") + return concat(result, "\n\n") end function utils.merger.selfcreate(libs,list,target) diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua index c251ab1a6..505c0a00e 100644 --- a/tex/context/base/lang-ini.lua +++ b/tex/context/base/lang-ini.lua @@ -10,8 +10,9 @@ if not modules then modules = { } end modules ['lang-ini'] = { local utf = unicode.utf8 -local find, lower, format, utfchar = string.find, string.lower, string.format, utf.char +local find, lower, format, match, utfchar = string.find, string.lower, string.format, string.match, utf.char local concat = table.concat +local lpegmatch = lpeg.match if lang.use_new then lang.use_new(true) end @@ -36,8 +37,8 @@ local langdata = languages.hyphenation.data --~ local function filter(filename,what) --~ local data = io.loaddata(resolvers.find_file(filename)) ---~ local data = data:match(string.format("\\%s%%s*(%%b{})",what or "patterns")) ---~ return data:match("{%s*(.-)%s*}") or "" +--~ local data = match(data,string.format("\\%s%%s*(%%b{})",what or "patterns")) +--~ return match(data,"{%s*(.-)%s*}") or "" --~ end -- loading the 26 languages that we normally load in mkiv, the string based variant @@ -59,7 +60,7 @@ local function filterpatterns(filename) if find(filename,"%.rpl") then return io.loaddata(resolvers.find_file(filename)) or "" else - return parser:match(io.loaddata(resolvers.find_file(filename)) or "") + return lpegmatch(parser,io.loaddata(resolvers.find_file(filename)) or "") end end @@ -70,7 +71,7 @@ local function filterexceptions(filename) if find(filename,"%.rhl") then return io.loaddata(resolvers.find_file(filename)) or "" else - return parser:match(io.loaddata(resolvers.find_file(filename)) or {}) -- "" ? + return lpegmatch(parser,io.loaddata(resolvers.find_file(filename)) or {}) -- "" ? end end @@ -304,7 +305,7 @@ do local data = io.loaddata(filename) or "" local words = languages.words.data[tag] or {} parser = (spacing + word/function(s) words[s] = true end)^0 - parser:match(data) + lpegmatch(parser,data) languages.words.data[tag] = words statistics.stoptiming(languages) end diff --git a/tex/context/base/lpdf-fld.lua b/tex/context/base/lpdf-fld.lua index b0823b478..9c82d04ac 100644 --- a/tex/context/base/lpdf-fld.lua +++ b/tex/context/base/lpdf-fld.lua @@ -11,6 +11,7 @@ if not modules then modules = { } end modules ['lpdf-fld'] = { -- some optimizations removed (will come bakc if needed) local gmatch, lower, format = string.gmatch, string.lower, string.format +local lpegmatch = lpeg.match local trace_fields = false trackers.register("widgets.fields", function(v) trace_fields = v end) @@ -237,12 +238,12 @@ local function fieldstates(specification,forceyes,values,default) else yes, off = v[1], v[2] end - local yesshown, yesvalue = splitter:match(yes) + local yesshown, yesvalue = lpegmatch(splitter,yes) if not (yesshown and yesvalue) then yesshown = yes, yes end yes = aux.settings_to_array(yesshown) - local offshown, offvalue = splitter:match(off) + local offshown, offvalue = lpegmatch(splitter,off) if not (offshown and offvalue) then offshown = off, off end @@ -293,7 +294,7 @@ local function fieldoptions(specification) local v = aux.settings_to_array(values) for i=1,#v do local vi = v[i] - local shown, value = splitter:match(vi) + local shown, value = lpegmatch(splitter,vi) if shown and value then v[i] = pdfarray { pdfunicode(value), shown } else @@ -364,7 +365,7 @@ end local function predefinesymbols(specification) local values = specification.values if values then - local a, b = splitter:match(values) + local a, b = lpegmatch(splitter,values) codeinjections.presetsymbollist(a or values) end end @@ -375,7 +376,7 @@ function codeinjections.getdefaultfieldvalue(name) local values = f.values local default = f.default if not default or default == "" then - local a, b = splitter:match(values) + local a, b = lpegmatch(splitter,values) values = a or values for name in gmatch(list,"[^, ]+") do default = name diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua index 437fa4c8a..d71bfc6d7 100644 --- a/tex/context/base/lpdf-ini.lua +++ b/tex/context/base/lpdf-ini.lua @@ -13,6 +13,7 @@ local char, byte, format, gsub, concat = string.char, string.byte, string.format local utfvalues = string.utfvalues local texwrite = tex.write local sind, cosd = math.sind, math.cosd +local lpegmatch = lpeg.match local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end) local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end) @@ -54,7 +55,7 @@ local function toeight(str) -- if not str or str == "" then -- return "()" -- else - -- return escaped:match(str) + -- return lpegmatch(escaped,str) -- end -- -- no need for escaping .. just use unicode instead @@ -71,7 +72,7 @@ local function cleaned(str) if not str or str == "" then return "()" else - return escaped:match(str) + return lpegmatch(escaped,str) end end diff --git a/tex/context/base/luat-cnf.lua b/tex/context/base/luat-cnf.lua index bbb00509a..ae132e4e6 100644 --- a/tex/context/base/luat-cnf.lua +++ b/tex/context/base/luat-cnf.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['luat-cnf'] = { license = "see context related readme files" } -local format, concat = string.format, table.concat +local format, concat, find = string.format, table.concat, string.find luatex = luatex or { } @@ -26,7 +26,7 @@ function luatex.variables() local t, x = { }, nil for _,v in next, luatex.variablenames do x = resolvers.var_value(v) - if x and x:find("^%d+$") then + if x and find(x,"^%d+$") then t[v] = tonumber(x) end end diff --git a/tex/context/base/luat-env.lua b/tex/context/base/luat-env.lua index f06e61867..0be764e7c 100644 --- a/tex/context/base/luat-env.lua +++ b/tex/context/base/luat-env.lua @@ -14,7 +14,8 @@ if not modules then modules = { } end modules ['luat-env'] = { local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) -local format = string.format +local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find +local unquote, quote = string.unquote, string.quote -- precautions @@ -50,11 +51,11 @@ function environment.initialize_arguments(arg) environment.arguments, environment.files, environment.sortedflags = arguments, files, nil for index, argument in pairs(arg) do if index > 0 then - local flag, value = argument:match("^%-+(.-)=(.-)$") + local flag, value = match(argument,"^%-+(.-)=(.-)$") if flag then - arguments[flag] = string.unquote(value or "") + arguments[flag] = unquote(value or "") else - flag = argument:match("^%-+(.+)") + flag = match(argument,"^%-+(.+)") if flag then arguments[flag] = true else @@ -89,8 +90,8 @@ function environment.argument(name,partial) end -- example of potential clash: ^mode ^modefile for _,v in ipairs(sortedflags) do - if name:find(v) then - return arguments[v:sub(2,#v)] + if find(name,v) then + return arguments[sub(v,2,#v)] end end end @@ -116,16 +117,16 @@ function environment.reconstruct_commandline(arg,noquote) if noquote and #arg == 1 then local a = arg[1] a = resolvers.resolve(a) - a = a:unquote() + a = unquote(a) return a elseif next(arg) then local result = { } for _,a in ipairs(arg) do -- ipairs 1 .. #n a = resolvers.resolve(a) - a = a:unquote() - a = a:gsub('"','\\"') -- tricky - if a:find(" ") then - result[#result+1] = a:quote() + a = unquote(a) + a = gsub(a,'"','\\"') -- tricky + if find(a," ") then + result[#result+1] = quote(a) else result[#result+1] = a end @@ -142,13 +143,13 @@ if arg then local newarg, instring = { }, false for index, argument in ipairs(arg) do - if argument:find("^\"") then - newarg[#newarg+1] = argument:gsub("^\"","") - if not argument:find("\"$") then + if find(argument,"^\"") then + newarg[#newarg+1] = gsub(argument,"^\"","") + if not find(argument,"\"$") then instring = true end - elseif argument:find("\"$") then - newarg[#newarg] = newarg[#newarg] .. " " .. argument:gsub("\"$","") + elseif find(argument,"\"$") then + newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","") instring = false elseif instring then newarg[#newarg] = newarg[#newarg] .. " " .. argument diff --git a/tex/context/base/luat-exe.lua b/tex/context/base/luat-exe.lua index 721e90c73..10cb6678b 100644 --- a/tex/context/base/luat-exe.lua +++ b/tex/context/base/luat-exe.lua @@ -6,6 +6,9 @@ if not modules then modules = { } end modules ['luat-exe'] = { license = "see context related readme files" } +local match, find = string.match, string.find +local concat = table.concat + if not executer then executer = { } end executer.permitted = { } @@ -24,18 +27,18 @@ function executer.finalize() -- todo: os.exec, todo: report ipv print local t, name, arguments = {...}, "", "" if #t == 1 then if type(t[1]) == 'table' then - name, arguments = t[1], table.concat(t," ",2,#t) + name, arguments = t[1], concat(t," ",2,#t) else - name, arguments = t[1]:match("^(.-)%s+(.+)$") + name, arguments = match(t[1],"^(.-)%s+(.+)$") if not (name and arguments) then name, arguments = t[1], "" end end else - name, arguments = t[1], table.concat(t," ",2,#t) + name, arguments = t[1], concat(t," ",2,#t) end for _,v in pairs(executer.permitted) do - if name:find(v) then + if find(name,v) then execute(name .. " " .. arguments) -- print("executed: " .. name .. " " .. arguments) else diff --git a/tex/context/base/luat-sta.lua b/tex/context/base/luat-sta.lua index 12fa18219..cc78851a9 100644 --- a/tex/context/base/luat-sta.lua +++ b/tex/context/base/luat-sta.lua @@ -7,6 +7,9 @@ if not modules then modules = { } end modules ['luat-sta'] = { -- this code is used in the updater +local gmatch, match = string.gmatch, string.match +local type = type + states = states or { } states.data = states.data or { } states.hash = states.hash or { } @@ -35,9 +38,9 @@ function states.set_by_tag(tag,key,value,default,persistent) if d then if type(d) == "table" then local dkey, hkey = key, key - local pre, post = key:match("(.+)%.([^%.]+)$") + local pre, post = match(key,"(.+)%.([^%.]+)$") if pre and post then - for k in pre:gmatch("[^%.]+") do + for k in gmatch(pre,"[^%.]+") do local dk = d[k] if not dk then dk = { } @@ -69,7 +72,7 @@ function states.get_by_tag(tag,key,default) else local d = states.data[tag] if d then - for k in key:gmatch("[^%.]+") do + for k in gmatch(key,"[^%.]+") do local dk = d[k] if dk then d = dk diff --git a/tex/context/base/lxml-ctx.lua b/tex/context/base/lxml-ctx.lua index 0ac12ab3c..d6aeca8d4 100644 --- a/tex/context/base/lxml-ctx.lua +++ b/tex/context/base/lxml-ctx.lua @@ -11,7 +11,6 @@ if not modules then modules = { } end modules ['lxml-ctx'] = { xml.ctx = { } xml.ctx.enhancers = { } - -- hashen function xml.ctx.enhancers.compound(root,lpath,before,tokens,after) -- todo lpeg @@ -48,13 +47,18 @@ function xml.ctx.tshow(specification) context[titlecommand]("pattern: " .. pattern) end context.starttabulate({ "|Tr|Tl|Tp|" } ) - if specification.warning and parsed.comment then - context.NC() - context("!") - context.NC() - context.rlap(parsed.comment) - context.NR() - context.TB() + if specification.warning then + local comment = parsed.comment + if comment then + for k, v in ipairs(comment) do + context.NC() + context("!") + context.NC() + context.rlap(v) + context.NR() + end + context.TB() + end end for p=1,#parsed do local pp = parsed[p] @@ -73,8 +77,8 @@ function xml.ctx.tshow(specification) context(pp.expression) elseif kind == "finalizer" then context("%s(%s)",pp.name,pp.arguments) - elseif kind == "error" and pp.comment then - context(pp.comment) + elseif kind == "error" and pp.error then + context(pp.error) end context.NC() context.NR() diff --git a/tex/context/base/lxml-ent.lua b/tex/context/base/lxml-ent.lua index ee6077a76..193611937 100644 --- a/tex/context/base/lxml-ent.lua +++ b/tex/context/base/lxml-ent.lua @@ -11,6 +11,7 @@ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local utf = unicode.utf8 local byte, format = string.byte, string.format local utfupper, utfchar = utf.upper, utf.char +local lpegmatch = lpeg.match --[[ldx-- <p>We provide (at least here) two entity handlers. The more extensive @@ -52,7 +53,7 @@ function xml.resolved_entity(str) else -- resolve hex and dec, todo: escape # & etc for ctxcatcodes -- normally this is already solved while loading the file - local chr, err = parsedentity:match(str) + local chr, err = lpegmatch(parsedentity,str) if chr then texsprint(ctxcatcodes,chr) elseif err then diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv index 90e60d513..ac30cd129 100644 --- a/tex/context/base/lxml-ini.mkiv +++ b/tex/context/base/lxml-ini.mkiv @@ -63,6 +63,8 @@ \def\xmlnamespace #1{\ctxlua{lxml.namespace("#1")}} \def\xmlnonspace #1#2{\ctxlua{lxml.nonspace("#1","#2")}} \def\xmlraw #1#2{\ctxlua{lxml.raw("#1","#2")}} +\def\xmlcontext #1#2{\ctxlua{lxml.context("#1","#2")}} +\def\xmlflushcontext #1{\ctxlua{lxml.context("#1")}} \def\xmlsnippet #1#2{\ctxlua{lxml.snippet("#1",#2)}} \def\xmlelement #1#2{\ctxlua{lxml.element("#1",#2)}} \def\xmlregisterns #1#2{\ctxlua{xml.registerns("#1","#2")}} % document diff --git a/tex/context/base/lxml-lpt.lua b/tex/context/base/lxml-lpt.lua index 936288d34..8f7d60d9e 100644 --- a/tex/context/base/lxml-lpt.lua +++ b/tex/context/base/lxml-lpt.lua @@ -11,6 +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 -- beware, this is not xpath ... e.g. position is different (currently) and -- we have reverse-sibling as reversed preceding sibling @@ -508,8 +509,7 @@ local cleaner local lp_special = (C(P("name")+P("text")+P("tag")+P("count")+P("child"))) * value / function(t,s) if expressions[t] then - s = s and s ~= "" and cleaner:match(s) ---~ print("!!!",t,s) + s = s and s ~= "" and lpegmatch(cleaner,s) if s and s ~= "" then return "expr." .. t .. "(ll," .. s ..")" else @@ -566,6 +566,31 @@ local template_f_n = [[ -- +local register_self = { kind = "axis", axis = "self" } -- , apply = apply_axis["self"] } +local register_parent = { kind = "axis", axis = "parent" } -- , apply = apply_axis["parent"] } +local register_descendant = { kind = "axis", axis = "descendant" } -- , apply = apply_axis["descendant"] } +local register_child = { kind = "axis", axis = "child" } -- , apply = apply_axis["child"] } +local register_descendant_or_self = { kind = "axis", axis = "descendant-or-self" } -- , apply = apply_axis["descendant-or-self"] } +local register_root = { kind = "axis", axis = "root" } -- , apply = apply_axis["root"] } +local register_ancestor = { kind = "axis", axis = "ancestor" } -- , apply = apply_axis["ancestor"] } +local register_ancestor_or_self = { kind = "axis", axis = "ancestor-or-self" } -- , apply = apply_axis["ancestor-or-self"] } +local register_attribute = { kind = "axis", axis = "attribute" } -- , apply = apply_axis["attribute"] } +local register_namespace = { kind = "axis", axis = "namespace" } -- , apply = apply_axis["namespace"] } +local register_following = { kind = "axis", axis = "following" } -- , apply = apply_axis["following"] } +local register_following_sibling = { kind = "axis", axis = "following-sibling" } -- , apply = apply_axis["following-sibling"] } +local register_preceding = { kind = "axis", axis = "preceding" } -- , apply = apply_axis["preceding"] } +local register_preceding_sibling = { kind = "axis", axis = "preceding-sibling" } -- , apply = apply_axis["preceding-sibling"] } +local register_reverse_sibling = { kind = "axis", axis = "reverse-sibling" } -- , apply = apply_axis["reverse-sibling"] } + +local register_auto_descendant_or_self = { kind = "axis", axis = "auto-descendant-or-self" } -- , apply = apply_axis["auto-descendant-or-self"] } +local register_auto_descendant = { kind = "axis", axis = "auto-descendant" } -- , apply = apply_axis["auto-descendant"] } +local register_auto_self = { kind = "axis", axis = "auto-self" } -- , apply = apply_axis["auto-self"] } +local register_auto_child = { kind = "axis", axis = "auto-child" } -- , apply = apply_axis["auto-child"] } + +local register_initial_child = { kind = "axis", axis = "initial-child" } -- , apply = apply_axis["initial-child"] } + +local register_all_nodes = { kind = "nodes", nodetest = true, nodes = { true, false, false } } + local function errorrunner_e(str,cnv) logs.report("lpath","error in expression: %s => %s",str,cnv) return false @@ -580,7 +605,7 @@ local function register_nodes(nodetest,nodes) end local function register_expression(expression) - local converted = converter:match(expression) + local converted = lpegmatch(converter,expression) local runner = loadstring(format(template_e,converted)) runner = (runner and runner()) or function() errorrunner_e(expression,converted) end return { kind = "expression", expression = expression, converted = converted, evaluator = runner } @@ -612,39 +637,22 @@ local arguments = P { "ar", -- todo: better arg parser -local register_self = { kind = "axis", axis = "self" } -- , apply = apply_axis["self"] } -local register_parent = { kind = "axis", axis = "parent" } -- , apply = apply_axis["parent"] } -local register_descendant = { kind = "axis", axis = "descendant" } -- , apply = apply_axis["descendant"] } -local register_child = { kind = "axis", axis = "child" } -- , apply = apply_axis["child"] } -local register_descendant_or_self = { kind = "axis", axis = "descendant-or-self" } -- , apply = apply_axis["descendant-or-self"] } -local register_root = { kind = "axis", axis = "root" } -- , apply = apply_axis["root"] } -local register_ancestor = { kind = "axis", axis = "ancestor" } -- , apply = apply_axis["ancestor"] } -local register_ancestor_or_self = { kind = "axis", axis = "ancestor-or-self" } -- , apply = apply_axis["ancestor-or-self"] } -local register_attribute = { kind = "axis", axis = "attribute" } -- , apply = apply_axis["attribute"] } -local register_namespace = { kind = "axis", axis = "namespace" } -- , apply = apply_axis["namespace"] } -local register_following = { kind = "axis", axis = "following" } -- , apply = apply_axis["following"] } -local register_following_sibling = { kind = "axis", axis = "following-sibling" } -- , apply = apply_axis["following-sibling"] } -local register_preceding = { kind = "axis", axis = "preceding" } -- , apply = apply_axis["preceding"] } -local register_preceding_sibling = { kind = "axis", axis = "preceding-sibling" } -- , apply = apply_axis["preceding-sibling"] } -local register_reverse_sibling = { kind = "axis", axis = "reverse-sibling" } -- , apply = apply_axis["reverse-sibling"] } - -local register_auto_descendant_or_self = { kind = "axis", axis = "auto-descendant-or-self" } -- , apply = apply_axis["auto-descendant-or-self"] } -local register_auto_descendant = { kind = "axis", axis = "auto-descendant" } -- , apply = apply_axis["auto-descendant"] } -local register_auto_self = { kind = "axis", axis = "auto-self" } -- , apply = apply_axis["auto-self"] } -local register_auto_child = { kind = "axis", axis = "auto-child" } -- , apply = apply_axis["auto-child"] } - -local register_initial_child = { kind = "axis", axis = "initial-child" } -- , apply = apply_axis["initial-child"] } - -local register_all_nodes = { kind = "nodes", nodetest = true, nodes = { true, false, false } } - local function register_error(str) - return { kind = "error", comment = format("unparsed: %s",str) } + return { kind = "error", error = format("unparsed: %s",str) } end +-- there is a difference in * and /*/ and so we need to catch a few special cases + +local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes) -- last one not needed +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 - patterns = spaces * V("protocol") * spaces * V("initial") * spaces * V("step") * spaces * - (P("/") * spaces * V("step") * spaces)^0, + patterns = spaces * V("protocol") * spaces * ( + ( V("special") * spaces * P(-1) ) + + ( V("initial") * spaces * V("step") * spaces * (P("/") * spaces * V("step") * spaces)^0 ) + ), protocol = Cg(V("letters"),"protocol") * P("://") + Cg(Cc(nil),"protocol"), @@ -657,6 +665,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou V("reverse_sibling") + V("preceding_sibling") + V("preceding") + V("ancestor_or_self") + #(1-P(-1)) * Cc(register_auto_child), + special = special_1 + special_2 + special_3, + initial = (P("/") * spaces * Cc(register_initial_child))^-1, error = (P(1)^1) / register_error, @@ -668,7 +678,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou s_descendant_or_self = (P("***/") + P("/")) * Cc(register_descendant_or_self), --- *** is a bonus -- s_descendant_or_self = P("/") * Cc(register_descendant_or_self), s_descendant = P("**") * Cc(register_descendant), - s_child = P("*") * #(1-P(":")) * Cc(register_child ), + s_child = P("*") * #(1-P(":")) * Cc(register_child ), +-- s_child = P("*") * #(P("/")+P(-1)) * Cc(register_child ), s_parent = P("..") * Cc(register_parent ), s_self = P("." ) * Cc(register_self ), s_root = P("^^") * Cc(register_root ), @@ -744,6 +755,8 @@ end xml.nodesettostring = nodesettostring +local parse_pattern -- we have a harmless kind of circular reference + local function lshow(parsed) if type(parsed) == "string" then parsed = parse_pattern(parsed) @@ -756,7 +769,16 @@ end xml.lshow = lshow -local function parse_pattern(pattern) -- the gain of caching is rather minimal +local function add_comment(p,str) + local pc = p.comment + if not pc then + p.comment = { str } + else + pc[#pc+1] = str + end +end + +parse_pattern = function (pattern) -- the gain of caching is rather minimal lpathcalls = lpathcalls + 1 if type(pattern) == "table" then return pattern @@ -765,7 +787,7 @@ local function parse_pattern(pattern) -- the gain of caching is rather minimal if parsed then lpathcached = lpathcached + 1 else - parsed = parser:match(pattern) + parsed = lpegmatch(parser,pattern) if parsed then parsed.pattern = pattern local np = #parsed @@ -774,18 +796,32 @@ local function parse_pattern(pattern) -- the gain of caching is rather minimal logs.report("lpath","parsing error in '%s'",pattern) lshow(parsed) else - -- we could have done this with a more complex parsed but this + -- we could have done this with a more complex parser but this -- is cleaner local pi = parsed[1] if pi.axis == "auto-child" then - parsed.comment = "auto-child replaced by auto-descendant-or-self" - parsed[1] = register_auto_descendant_or_self - --~ parsed.comment = "auto-child replaced by auto-descendant" - --~ parsed[1] = register_auto_descendant + if false then + add_comment(parsed, "auto-child replaced by auto-descendant-or-self") + parsed[1] = register_auto_descendant_or_self + else + add_comment(parsed, "auto-child replaced by auto-descendant") + parsed[1] = register_auto_descendant + end elseif pi.axis == "initial-child" and np > 1 and parsed[2].axis then - parsed.comment = "initial-child removed" -- we could also make it a auto-self + add_comment(parsed, "initial-child removed") -- we could also make it a auto-self remove(parsed,1) end +local np = #parsed -- can have changed +if np > 1 then + local pnp = parsed[np] + if pnp.kind == "nodes" and pnp.nodetest == true then + local nodes = pnp.nodes + if nodes[1] == true and nodes[2] == false and nodes[3] == false then + add_comment(parsed, "redundant final wildcard filter removed") + remove(parsed,np) + end + end +end end else parsed = { pattern = pattern } diff --git a/tex/context/base/lxml-mis.lua b/tex/context/base/lxml-mis.lua index 864ab75a1..480253205 100644 --- a/tex/context/base/lxml-mis.lua +++ b/tex/context/base/lxml-mis.lua @@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['lxml-mis'] = { local concat = table.concat local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring -local format, gsub = string.format, string.gsub +local format, gsub, match = string.format, string.gsub, string.match +local lpegmatch = lpeg.match --[[ldx-- <p>The following helper functions best belong to the <t>lxml-ini</t> @@ -82,9 +83,9 @@ xml.escaped_pattern = escaped xml.unescaped_pattern = unescaped xml.cleansed_pattern = cleansed -function xml.escaped (str) return escaped :match(str) end -function xml.unescaped(str) return unescaped:match(str) end -function xml.cleansed (str) return cleansed :match(str) end +function xml.escaped (str) return lpegmatch(escaped,str) end +function xml.unescaped(str) return lpegmatch(unescaped,str) end +function xml.cleansed (str) return lpegmatch(cleansed,str) end -- this might move diff --git a/tex/context/base/lxml-sor.lua b/tex/context/base/lxml-sor.lua index f2bb756f2..daeb9ec7b 100644 --- a/tex/context/base/lxml-sor.lua +++ b/tex/context/base/lxml-sor.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['lxml-sor'] = { } local format, concat = string.format, table.concat +local lpegmatch = lpeg.match local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes lxml.sorters = lxml.sorters or { } @@ -14,7 +15,7 @@ lxml.sorters = lxml.sorters or { } if not lxml.splitid then local splitter = lpeg.C((1-lpeg.P(":"))^1) * lpeg.P("::") * lpeg.C(lpeg.P(1)^1) function lxml.splitid(id) - local d, i = splitter:match(id) + local d, i = lpegmatch(splitter,id) if d then return d, i else diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua index f38e5ad89..f4ab351e8 100644 --- a/tex/context/base/lxml-tab.lua +++ b/tex/context/base/lxml-tab.lua @@ -30,8 +30,9 @@ xml = xml or { } local concat, remove, insert = table.concat, table.remove, table.insert local type, next, setmetatable, getmetatable, tonumber = type, next, setmetatable, getmetatable, tonumber -local format, lower, find = string.format, string.lower, string.find +local format, lower, find, match = string.format, string.lower, string.find, string.match local utfchar = unicode.utf8.char +local lpegmatch = lpeg.match --[[ldx-- <p>First a hack to enable namespace resolving. A namespace is characterized by @@ -71,7 +72,7 @@ xml.checkns("m","http://www.w3.org/mathml") --ldx]]-- function xml.checkns(namespace,url) - local ns = parse:match(lower(url)) + local ns = lpegmatch(parse,lower(url)) if ns and namespace ~= ns then xml.xmlns[namespace] = ns end @@ -89,7 +90,7 @@ This returns <t>mml</t>. --ldx]]-- function xml.resolvens(url) - return parse:match(lower(url)) or "" + return lpegmatch(parse,lower(url)) or "" end --[[ldx-- @@ -356,7 +357,7 @@ local function handle_any_entity(str) if trace_entities then logs.report("xml","resolved entity &%s; -> %s (internal)",str,a) end - a = parsedentity:match(a) or a + a = lpegmatch(parsedentity,a) or a else if xml.unknown_any_entity_format then a = xml.unknown_any_entity_format(str) or "" @@ -535,13 +536,13 @@ local function xmlconvert(data, settings) if not data or data == "" then errorstr = "empty xml file" elseif utfize or resolve then - if grammar_parsed_text:match(data) then + if lpegmatch(grammar_parsed_text,data) then errorstr = "" else errorstr = "invalid xml file - parsed text" end else - if grammar_unparsed_text:match(data) then + if lpegmatch(grammar_unparsed_text,data) then errorstr = "" else errorstr = "invalid xml file - unparsed text" @@ -592,7 +593,7 @@ function xml.is_valid(root) end function xml.package(tag,attributes,data) - local ns, tg = tag:match("^(.-):?([^:]+)$") + local ns, tg = match(tag,"^(.-):?([^:]+)$") local t = { ns = ns, tg = tg, dt = data or "", at = attributes or {} } setmetatable(t, mt) return t diff --git a/tex/context/base/lxml-tex.lua b/tex/context/base/lxml-tex.lua index 1f0a5d3d2..9726a5661 100644 --- a/tex/context/base/lxml-tex.lua +++ b/tex/context/base/lxml-tex.lua @@ -10,8 +10,9 @@ local utf = unicode.utf8 local utfchar = utf.char local concat, insert, remove, gsub, find = table.concat, table.insert, table.remove -local format, sub, gsub, find, gmatch = string.format, string.sub, string.gsub, string.find, string.gmatch +local format, sub, gsub, find, gmatch, match = string.format, string.sub, string.gsub, string.find, string.gmatch, string.match local type, next, tonumber, tostring = type, next, tonumber, tostring +local lpegmatch = lpeg.match if not tex and not tex.sprint then tex = { @@ -79,6 +80,13 @@ local xmltextcapture = ( entity / xml.resolved_entity )^0 +local ctxtextcapture = ( + space^0 * newline^2 * lpeg.Cc("") / texprint + -- better ^-2 ? + space^0 * newline * space^0 * lpeg.Cc(" ") / texsprint + + content / function(str) return texsprint(ctxcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes + entity / xml.resolved_entity +)^0 + local forceraw, rawroot = false, nil function lxml.startraw() @@ -127,7 +135,7 @@ local xmlverbosecapture = ( local function toverbatim(str) if beforecommand then texsprint(texcatcodes,beforecommand,"{}") end - xmlverbosecapture:match(str) + lpegmatch(xmlverbosecapture,str) if aftercommand then texsprint(texcatcodes,aftercommand,"{}") end end @@ -156,7 +164,7 @@ function lxml.toverbatim(str) -- todo: add this to capture str = gsub(str,"^[ \t]+[\n\r]+","") str = gsub(str,"[ \t\n\r]+$","") - xmlverbosecapture:match(str) + lpegmatch(xmlverbosecapture,str) if aftercommand then texsprint(texcatcodes,aftercommand,"{}") end end @@ -176,7 +184,7 @@ local splitter = lpeg.splitat("::") lxml.idsplitter = splitter function lxml.splitid(id) - local d, i = splitter:match(id) + local d, i = lpegmatch(splitter,id) if d then return d, i else @@ -192,7 +200,7 @@ local function get_id(id, qualified) elseif type(id) == "table" then return id else - local d, i = splitter:match(id) + local d, i = lpegmatch(splitter,id) if d then local ld = loaded[d] if ld then @@ -299,7 +307,7 @@ function lxml.checkindex(name) end function lxml.withindex(name,n,command) -- will change as name is always there now - local i, p = splitter:match(n) + local i, p = lpegmatch(splitter,n) if p then texsprint(ctxcatcodes,"\\xmlw{",command,"}{",n,"}") else @@ -308,7 +316,7 @@ function lxml.withindex(name,n,command) -- will change as name is always there n end function lxml.getindex(name,n) -- will change as name is always there now - local i, p = splitter:match(n) + local i, p = lpegmatch(splitter,n) if p then texsprint(ctxcatcodes,n) else @@ -484,9 +492,9 @@ local value = lpeg.C(lpeg.P(1-(space * -1))^0) local parser = kind * spaces * class * spaces * key * spaces * value pihandlers[#pihandlers+1] = function(str) --- local kind, class, key, value = parser:match(str) +-- local kind, class, key, value = lpegmatch(parser,str) if str then - local a, b, c, d = parser:match(str) + local a, b, c, d = lpegmatch(parser,str) if d then texsprint(ctxcatcodes,"\\xmlcontextdirective{",a",}{",b,"}{",c,"}{",d,"}") end @@ -506,8 +514,12 @@ local function tex_cdata(e,handlers) end end -local function tex_text(e,handlers) - xmltextcapture:match(e) +local function tex_text(e) + lpegmatch(xmltextcapture,e) +end + +local function ctx_text(e) + lpegmatch(ctxtextcapture,e) end local function tex_handle(...) @@ -548,7 +560,7 @@ local function sprint(root) local tr = type(root) if tr == "string" then -- can also be result of lpath -- rawroot = false - xmltextcapture:match(root) + lpegmatch(xmltextcapture,root) elseif tr == "table" then if forceraw then rawroot = root @@ -572,7 +584,7 @@ local function tprint(root) -- we can move sprint inline end end elseif tr == "string" then - xmltextcapture:match(root) + lpegmatch(xmltextcapture,root) end end @@ -582,7 +594,7 @@ local function cprint(root) -- content -- quit elseif type(root) == 'string' then -- rawroot = false - xmltextcapture:match(root) + lpegmatch(xmltextcapture,root) else local rootdt = root.dt if forceraw then @@ -616,7 +628,7 @@ end --~ --~ local xmllineshandler = table.copy(xmltexhandler) --~ ---~ xmllineshandler.handle = function(...) xmllinescapture:match(concat{ ... }) end +--~ xmllineshandler.handle = function(...) lpegmatch(xmllinescapture,concat{ ... }) end --~ --~ function lines(root) --~ if not root then @@ -624,7 +636,7 @@ end --~ -- quit --~ elseif type(root) == 'string' then --~ -- rawroot = false ---~ xmllinescapture:match(root) +--~ lpegmatch(xmllinescapture,root) --~ elseif next(root) then -- tr == 'table' --~ xmlserialize(root,xmllineshandler) --~ end @@ -782,7 +794,7 @@ function lxml.setsetup(id,pattern,setup) logs.report("lxml","no lpath matches for %s",pattern) end else - local a, b = setup:match("^(.+:)([%*%-])$") + local a, b = match(setup,"^(.+:)([%*%-])$") if a and b then local collected = lxmlparseapply(id,pattern) if collected then @@ -1140,6 +1152,19 @@ function lxml.raw(id,pattern) -- the content, untouched by commands end end +function lxml.context(id,pattern) -- the content, untouched by commands + if not pattern then + local collected = get_id(id) + -- texsprint(ctxcatcodes,collected.dt[1]) + ctx_text(collected.dt[1]) + else + local collected = lxmlparseapply(id,pattern) or get_id(id) + if collected then + texsprint(ctxcatcodes,collected[1].dt) + end + end +end + function lxml.text(id,pattern) local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id) if collected then diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua index b33d65bd9..23f8d4de0 100644 --- a/tex/context/base/meta-pdf.lua +++ b/tex/context/base/meta-pdf.lua @@ -10,10 +10,10 @@ if not modules then modules = { } end modules ['meta-pdf'] = { -- meta-pdh.lua but since we no longer want to overload functione we use -- more locals now. This module keeps changing as it is also a testbed. -local concat, format, gsub, find = table.concat, string.format, string.gsub, string.find -local byte, round = string.byte, math.round -local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes +local concat, format, gsub, find, byte, gmatch, match = table.concat, string.format, string.gsub, string.find, string.byte, string.gmatch, string.match +local lpegmatch = lpeg.match +local round = math.round +local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes local pdfrgbcode = lpdf.rgbcode local pdfcmykcode = lpdf.cmykcode @@ -390,7 +390,7 @@ local text = lpegCc("{") * ( local package = lpegCs(spec + text^0) function mps.fshow(str,font,scale) -- lpeg parser - mps.textext(font,scale,package:match(str)) + mps.textext(font,scale,lpegmatch(package,str)) end local cnumber = lpegC(number) @@ -510,9 +510,9 @@ local captures_new = ( space + verbose + procset + preamble )^0 local function parse(m_data) if find(m_data,"%%%%BeginResource: procset mpost") then - captures_new:match(m_data) + lpegmatch(captures_new,m_data) else - captures_old:match(m_data) + lpegmatch(captures_old,m_data) end end diff --git a/tex/context/base/meta-pdh.lua b/tex/context/base/meta-pdh.lua index f6fbbce5a..407b7e5e6 100644 --- a/tex/context/base/meta-pdh.lua +++ b/tex/context/base/meta-pdh.lua @@ -22,10 +22,10 @@ if not modules then modules = { } end modules ['meta-pdf'] = { -- only needed for mp output on disk -local concat, format = table.concat, string.format - -local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes +local concat, format, find, gsub, gmatch = table.concat, string.format, string.find, string.gsub, string.gmatch +local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes +local tostring, tonumber, select = tostring, tonumber, select +local lpegmatch = lpeg.match mptopdf = { } mptopdf.parsers = { } @@ -70,65 +70,65 @@ mptopdf.descapes = { } function mptopdf.descape(str) - str = str:gsub("\\(%d%d%d)",function(n) + str = gsub(str,"\\(%d%d%d)",function(n) return "\\char" .. tonumber(n,8) .. " " end) - return str:gsub("\\([%(%)\\])",mptopdf.descapes) + return gsub(str,"\\([%(%)\\])",mptopdf.descapes) end function mptopdf.steps.descape(str) - str = str:gsub("\\(%d%d%d)",function(n) + str = gsub(str,"\\(%d%d%d)",function(n) return "\\\\char" .. tonumber(n,8) .. " " end) - return str:gsub("\\([%(%)\\])",mptopdf.descapes) + return gsub(str,"\\([%(%)\\])",mptopdf.descapes) end function mptopdf.steps.strip() -- .3 per expr - mptopdf.data = mptopdf.data:gsub("^(.-)%%+Page:.-%c+(.*)%s+%a+%s+%%+EOF.*$", function(preamble, graphic) + mptopdf.data = gsub(mptopdf.data,"^(.-)%%+Page:.-%c+(.*)%s+%a+%s+%%+EOF.*$", function(preamble, graphic) local bbox = "0 0 0 0" - for b in preamble:gmatch("%%%%%a+oundingBox: +(.-)%c+") do + for b in gmatch(preamble,"%%%%%a+oundingBox: +(.-)%c+") do bbox = b end - local name, version = preamble:gmatch("%%%%Creator: +(.-) +(.-) ") + local name, version = gmatch(preamble,"%%%%Creator: +(.-) +(.-) ") mptopdf.version = tostring(version or "0") - if preamble:find("/hlw{0 dtransform") then + if find(preamble,"/hlw{0 dtransform") then mptopdf.shortcuts = true end -- the boundingbox specification needs to come before data, well, not really return bbox .. " boundingbox\n" .. "\nbegindata\n" .. graphic .. "\nenddata\n" end, 1) - mptopdf.data = mptopdf.data:gsub("%%%%MetaPostSpecials: +(.-)%c+", "%1 specials\n", 1) - mptopdf.data = mptopdf.data:gsub("%%%%MetaPostSpecial: +(.-)%c+", "%1 special\n") - mptopdf.data = mptopdf.data:gsub("%%.-%c+", "") + mptopdf.data = gsub(mptopdf.data,"%%%%MetaPostSpecials: +(.-)%c+", "%1 specials\n", 1) + mptopdf.data = gsub(mptopdf.data,"%%%%MetaPostSpecial: +(.-)%c+", "%1 special\n") + mptopdf.data = gsub(mptopdf.data,"%%.-%c+", "") end function mptopdf.steps.cleanup() if not mptopdf.shortcuts then - mptopdf.data = mptopdf.data:gsub("gsave%s+fill%s+grestore%s+stroke", "both") - mptopdf.data = mptopdf.data:gsub("([%d%.]+)%s+([%d%.]+)%s+dtransform%s+exch%s+truncate%s+exch%s+idtransform%s+pop%s+setlinewidth", function(wx,wy) + mptopdf.data = gsub(mptopdf.data,"gsave%s+fill%s+grestore%s+stroke", "both") + mptopdf.data = gsub(mptopdf.data,"([%d%.]+)%s+([%d%.]+)%s+dtransform%s+exch%s+truncate%s+exch%s+idtransform%s+pop%s+setlinewidth", function(wx,wy) if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end end) - mptopdf.data = mptopdf.data:gsub("([%d%.]+)%s+([%d%.]+)%s+dtransform%s+truncate%s+idtransform%s+setlinewidth%s+pop", function(wx,wy) + mptopdf.data = gsub(mptopdf.data,"([%d%.]+)%s+([%d%.]+)%s+dtransform%s+truncate%s+idtransform%s+setlinewidth%s+pop", function(wx,wy) if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end end) end end function mptopdf.steps.convert() - mptopdf.data = mptopdf.data:gsub("%c%((.-)%) (.-) (.-) fshow", function(str,font,scale) + mptopdf.data = gsub(mptopdf.data,"%c%((.-)%) (.-) (.-) fshow", function(str,font,scale) mptopdf.texts[mptopdf.texts+1] = {mptopdf.steps.descape(str), font, scale} return "\n" .. #mptopdf.texts .. " textext" end) - mptopdf.data = mptopdf.data:gsub("%[%s*(.-)%s*%]", function(str) - return str:gsub("%s+"," ") + mptopdf.data = gsub(mptopdf.data,"%[%s*(.-)%s*%]", function(str) + return gsub(str,"%s+"," ") end) local t - mptopdf.data = mptopdf.data:gsub("%s*([^%a]-)%s*(%a+)", function(args,cmd) + mptopdf.data = gsub(mptopdf.data,"%s*([^%a]-)%s*(%a+)", function(args,cmd) if cmd == "textext" then t = mptopdf.texts[tonumber(args)] return "mps.textext(" .. "\"" .. t[2] .. "\"," .. t[3] .. ",\"" .. t[1] .. "\")\n" else - return "mps." .. cmd .. "(" .. args:gsub(" +",",") .. ")\n" + return "mps." .. cmd .. "(" .. gsub(args," +",",") .. ")\n" end end) end @@ -445,7 +445,7 @@ do -- assumes \let\c\char local package = lpeg.Cs(spec + text^0) function mps.fshow(str,font,scale) -- lpeg parser - mps.textext(font,scale,package:match(str)) + mps.textext(font,scale,lpegmatch(package,str)) end end @@ -579,10 +579,10 @@ do local captures_new = ( space + procset + preamble + verbose )^0 function mptopdf.parsers.lpeg() - if mptopdf.data:find("%%%%BeginResource: procset mpost") then - captures_new:match(mptopdf.data) + if find(mptopdf.data,"%%%%BeginResource: procset mpost") then + lpegmatch(captures_new,mptopdf.data) else - captures_old:match(mptopdf.data) + lpegmatch(captures_old,mptopdf.data) end end diff --git a/tex/context/base/mlib-pdf.lua b/tex/context/base/mlib-pdf.lua index 5777bec92..ca405925f 100644 --- a/tex/context/base/mlib-pdf.lua +++ b/tex/context/base/mlib-pdf.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['mlib-pdf'] = { license = "see context related readme files", } -local format, concat = string.format, table.concat +local format, concat, gsub = string.format, table.concat, string.gsub local texsprint = tex.sprint local abs, sqrt, round = math.abs, math.sqrt, math.round @@ -119,7 +119,7 @@ function metapost.flushers.pdf.flushfigure(pdfliterals) -- table end function metapost.flushers.pdf.textfigure(font,size,text,width,height,depth) -- we could save the factor - text = text:gsub(".","\\hbox{%1}") -- kerning happens in metapost (i have to check if this is true for mplib) + text = gsub(text,".","\\hbox{%1}") -- kerning happens in metapost (i have to check if this is true for mplib) texsprint(ctxcatcodes,format("\\MPLIBtextext{%s}{%s}{%s}{%s}{%s}",font,size,text,0,-number.dimenfactors.bp*depth)) end diff --git a/tex/context/base/mlib-pps.lua b/tex/context/base/mlib-pps.lua index f0ee1ec29..c1e1b71c0 100644 --- a/tex/context/base/mlib-pps.lua +++ b/tex/context/base/mlib-pps.lua @@ -12,6 +12,7 @@ if not modules then modules = { } end modules ['mlib-pps'] = { -- prescript, pos local format, gmatch, concat, round, match = string.format, string.gmatch, table.concat, math.round, string.match local sprint = tex.sprint local tonumber, type = tonumber, type +local lpegmatch = lpeg.match local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming @@ -119,7 +120,7 @@ function metapost.specials.register(str) -- only colors logs.report("mplib","problematic special: %s", str or "?") end end ---~ if str:match("^%%%%MetaPostOption: multipass") then +--~ if match(str,"^%%%%MetaPostOption: multipass") then --~ metapost.multipass = true --~ end end @@ -203,11 +204,11 @@ local colorsplitter = lpeg.Ct(lpeg.splitter(":",tonumber)) -- This is also an example of a simple plugin. --~ function metapost.specials.cc(specification,object,result) ---~ object.color = specificationsplitter:match(specification) +--~ object.color = lpegmatch(specificationsplitter,specification) --~ return object, nil, nil, nil --~ end --~ function metapost.specials.cc(specification,object,result) ---~ local c = specificationsplitter:match(specification) +--~ local c = lpegmatch(specificationsplitter,specification) --~ local o = object.color[1] --~ c[1],c[2],c[3],c[4] = o*c[1],o*c[2],o*c[3],o*c[4] --~ return object, nil, nil, nil @@ -276,10 +277,10 @@ function metapost.specials.cs(specification,object,result,flusher) -- spot color nofshades = nofshades + 1 flusher.flushfigure(result) result = { } - local t = specificationsplitter:match(specification) + local t = lpegmatch(specificationsplitter,specification) -- we need a way to move/scale - local ca = colorsplitter:match(t[4]) - local cb = colorsplitter:match(t[8]) + local ca = lpegmatch(colorsplitter,t[4]) + local cb = lpegmatch(colorsplitter,t[8]) if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end local name = format("MplSh%s",nofshades) @@ -348,10 +349,10 @@ function metapost.specials.ls(specification,object,result,flusher) nofshades = nofshades + 1 flusher.flushfigure(result) result = { } - local t = specificationsplitter:match(specification) + local t = lpegmatch(specificationsplitter,specification) -- we need a way to move/scale - local ca = colorsplitter:match(t[4]) - local cb = colorsplitter:match(t[7]) + local ca = lpegmatch(colorsplitter,t[4]) + local cb = lpegmatch(colorsplitter,t[7]) if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end local name = format("MpSh%s",nofshades) @@ -671,7 +672,7 @@ do function metapost.check_texts(str) found, forced = false, false - return parser:match(str), found, forced + return lpegmatch(parser,str), found, forced end end diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua index a2026e865..73ce51c89 100644 --- a/tex/context/base/mlib-run.lua +++ b/tex/context/base/mlib-run.lua @@ -31,11 +31,10 @@ nears zero.</p> local trace_graphics = false trackers.register("metapost.graphics", function(v) trace_graphics = v end) -local format = string.format +local format, gsub, match = string.format, string.gsub, string.match local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming - metapost = metapost or { } metapost.showlog = false @@ -164,8 +163,8 @@ function metapost.checkformat(mpsinput, mpsformat, dirname) if not result.log then metapost.reporterror(result) else - local version = result.log:match(">> *(.-)[\n\r]") or "unknown" - version = version:gsub("[\'\"]","") + local version = match(result.log,">> *(.-)[\n\r]") or "unknown" + version = gsub(version,"[\'\"]","") if version ~= the_version then commands.writestatus("mplib","version mismatch: %s <> %s", version or "unknown", the_version) else diff --git a/tex/context/base/mult-chk.lua b/tex/context/base/mult-chk.lua index b0ee39a77..bdbd1dd22 100644 --- a/tex/context/base/mult-chk.lua +++ b/tex/context/base/mult-chk.lua @@ -7,9 +7,9 @@ if not modules then modules = { } end modules ['mult-chk'] = { } local format = string.format +local lpegmatch = lpeg.match local type = type -local texsprint = tex.sprint -local ctxcatcodes = tex.ctxcatcodes +local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes interfaces = interfaces or { } @@ -59,7 +59,7 @@ function commands.getcheckedparameters(k,p,s) if s and s ~= "" then prefix, kind = p, k keys = k and k ~= "" and interfaces.syntax[k].keys - pattern:match(s) + lpegmatch(pattern,s) end end diff --git a/tex/context/base/mult-ini.lua b/tex/context/base/mult-ini.lua index 1d3be3c87..a1dd5ecfd 100644 --- a/tex/context/base/mult-ini.lua +++ b/tex/context/base/mult-ini.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['mult-ini'] = { } local format, gmatch, gsub = string.format, string.gmatch, string.gsub +local lpegmatch = lpeg.match interfaces = interfaces or { } interfaces.messages = interfaces.messages or { } @@ -33,7 +34,7 @@ function interfaces.setmessage(category,tag,message) m = { } messages[category] = m end - m[tag] = message:gsub("%-%-","%%s") + m[tag] = gsub(message,"%-%-","%%s") end function interfaces.getmessage(category,tag,default) @@ -56,7 +57,7 @@ function interfaces.makemessage(category,tag,arguments) elseif not arguments then return m else - return format(m,messagesplitter:match(arguments)) + return format(m,lpegmatch(messagesplitter,arguments)) end end diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua index 1eb27a81b..8700cb00f 100644 --- a/tex/context/base/regi-ini.lua +++ b/tex/context/base/regi-ini.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['regi-ini'] = { } local utf = unicode.utf8 -local char, utfchar = string.char, utf.char +local char, utfchar, gsub = string.char, utf.char, string.gsub local texsprint = tex.sprint local ctxcatcodes = tex.ctxcatcodes @@ -63,7 +63,7 @@ function regimes.translate(line,regime) if regime and line then local rur = regimes.utf[regime] if rur then - return line:gsub("(.)", rur) -- () redundant + return (gsub(line,"(.)",rur)) -- () redundant end end return line diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index b1eac73ba..8700eccce 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -19,6 +19,7 @@ local next, type, tonumber = next, type, tonumber local format, gmatch, concat, match = string.format, string.gmatch, table.concat, string.match local ceil, floor, max, min, round = math.ceil, math.floor, math.max, math.min, math.round local texsprint, texlists, texdimen, texbox, texht, texdp = tex.sprint, tex.lists, tex.dimen, tex.box, tex.ht, tex.dp +local lpegmatch = lpeg.match local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables @@ -96,7 +97,7 @@ local colonsplitter = lpeg.splitat(":") function interfaces.listtohash(str) local t = { } for s in gmatch(str,"[^, ]+") do - local key, fraction = colonsplitter:match(s) + local key, fraction = lpegmatch(colonsplitter,s) local v = variables[key] if v then t[v] = true @@ -295,7 +296,7 @@ do -- todo: interface.variables local function analyse(str,oldcategory,texsprint) -- we could use shorter names for s in gmatch(str,"([^ ,]+)") do - local amount, keyword, detail = splitter:match(s) + local amount, keyword, detail = lpegmatch(splitter,s) if not keyword then logs.report("vspacing","unknown directive: %s",s) else diff --git a/tex/context/base/strc-blk.lua b/tex/context/base/strc-blk.lua index 825e32c67..301c76a0e 100644 --- a/tex/context/base/strc-blk.lua +++ b/tex/context/base/strc-blk.lua @@ -8,7 +8,8 @@ if not modules then modules = { } end modules ['strc--blk'] = { -- this one runs on top of buffers and structure -local texprint, format, gmatch = tex.print, string.format, string.gmatch +local texprint, format, gmatch, find = tex.print, string.format, string.gmatch, string.find +local lpegmatch = lpeg.match local ctxcatcodes = tex.ctxcatcodes @@ -42,7 +43,7 @@ function blocks.print(name,data,hide) texprint(data[i]) end else - printer:match(data) + lpegmatch(printer,data) end if hide then texprint(ctxcatcodes,"\\dostophiddenblock") @@ -76,7 +77,7 @@ end function blocks.select(state,name,tag,criterium) criterium = criterium or "text" - if tag:find("=") then tag = "" end + if find(tag,"=") then tag = "" end local names = aux.settings_to_set(name) local all = tag == "" local tags = not all and aux.settings_to_set(tag) diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index 02306f912..74a5cc21a 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -7,7 +7,7 @@ if not modules then modules = { } end modules ['strc-doc'] = { } local next, type = next, type -local format, gsub, find, concat = string.format, string.gsub, string.find, table.concat +local format, gsub, find, concat, gmatch, match = string.format, string.gsub, string.find, table.concat, string.gmatch, string.match local texsprint, texwrite = tex.sprint, tex.write local ctxcatcodes = tex.ctxcatcodes @@ -314,7 +314,7 @@ end function sections.setnumber(depth,n) local forced, depth, new = data.forced, depth or data.depth, tonumber(n) if type(n) == "string" then - if n:find("^[%+%-]") then + if find(n,"^[%+%-]") then forced[depth] = { "add", new } else forced[depth] = { "set", new } @@ -362,7 +362,7 @@ function sections.structuredata(depth,key,default,honorcatcodetable) -- todo: sp if not depth or depth == 0 then depth = data.depth end local data = data.status[depth] local d = data - for k in key:gmatch("([^.]+)") do + for k in gmatch(key,"([^.]+)") do if type(d) == "table" then d = d[k] if not d then @@ -489,7 +489,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref -- local firstprefix, lastprefix = 0, 16 if segments then - local f, l = (tostring(segments)):match("^(.-):(.+)$") + local f, l = match(tostring(segments),"^(.-):(.+)$") if f and l then -- 0:100, chapter:subsubsection firstprefix = tonumber(f) or sections.getlevel(f) or 0 diff --git a/tex/context/base/strc-ini.lua b/tex/context/base/strc-ini.lua index 2d81cb9ab..61c26a20e 100644 --- a/tex/context/base/strc-ini.lua +++ b/tex/context/base/strc-ini.lua @@ -23,6 +23,7 @@ but it does not make sense to store all processdata. local format, concat, match = string.format, table.concat, string.match local count, texwrite, texprint, texsprint = tex.count, tex.write, tex.print, tex.sprint local type, next, tonumber, tostring = type, next, tonumber, tostring +local lpegmatch = lpeg.match local ctxcatcodes, xmlcatcodes, notcatcodes = tex.ctxcatcodes, tex.xmlcatcodes, tex.notcatcodes -- tricky as we're in notcatcodes @@ -198,7 +199,7 @@ end local splitter = lpeg.splitat("->",true) function processors.split(str) - local p, s = splitter:match(str) + local p, s = lpegmatch(splitter,str) if registered[p] then return p, s else @@ -207,7 +208,7 @@ function processors.split(str) end function processors.sprint(catcodes,str,fnc,...) - local p, s = splitter:match(str) + local p, s = lpegmatch(splitter,str) local code if registered[p] then code = format("\\applyprocessor{%s}{%s}",p,(fnc and fnc(s,...)) or s) @@ -221,7 +222,7 @@ function processors.sprint(catcodes,str,fnc,...) end function processors.apply(str) - local p, s = splitter:match(str) + local p, s = lpegmatch(splitter,str) if registered[p] then return format("\\applyprocessor{%s}{%s}",p,s) else diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua index 12c0b8c45..73b20f9d2 100644 --- a/tex/context/base/strc-lst.lua +++ b/tex/context/base/strc-lst.lua @@ -11,7 +11,8 @@ if not modules then modules = { } end modules ['strc-lst'] = { -- section, metadata cache (internal then has to move up one level) or a -- shared cache [we can use a fast and stupid serializer] -local format, tonumber = string.format, tonumber +local format, gmatch = string.format, string.gmatch +local tonumber = tonumber local texsprint, texprint, texwrite, texcount = tex.sprint, tex.print, tex.write, tex.count local concat, insert, remove = table.concat, table.insert, table.remove @@ -139,7 +140,7 @@ local function filter_collected(names, criterium, number, collected, nested) local numbers, depth = documents.data.numbers, documents.data.depth local hash, result, all, detail = { }, { }, not names or names == "" or names == variables.all, nil if not all then - for s in names:gmatch("[^, ]+") do + for s in gmatch(names,"[^, ]+") do if trace_lists then logs.report("lists","filtering: %s",s) end diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 4c94fbbe7..001a52a75 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['strc-ref'] = { } local format, find, gmatch, match, concat = string.format, string.find, string.gmatch, string.match, table.concat +local lpegmatch = lpeg.match local texsprint, texwrite, texcount = tex.sprint, tex.write, tex.count local trace_referencing = false trackers.register("structure.referencing", function(v) trace_referencing = v end) @@ -133,11 +134,11 @@ local special_reference = special * lparent * (operation * optional_arguments + local scanner = (reset * outer_reference * (special_reference + inner_reference)^-1 * -1) / function() return result end --~ function jobreferences.analyse(str) -- overloaded ---~ return scanner:match(str) +--~ return lpegmatch(scanner,str) --~ end function jobreferences.split(str) - return scanner:match(str or "") + return lpegmatch(scanner,str or "") end --~ print(table.serialize(jobreferences.analyse(""))) @@ -502,7 +503,7 @@ local function resolve(prefix,reference,args,set) -- we start with prefix,refere if d then resolve(prefix,d[2],nil,set) else - local var = scanner:match(ri) + local var = lpegmatch(scanner,ri) if var then var.reference = ri if not var.outer and var.inner then diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua index ba9c239c0..bce3b17ba 100644 --- a/tex/context/base/strc-reg.lua +++ b/tex/context/base/strc-reg.lua @@ -10,6 +10,7 @@ local next, type = next, type local texwrite, texsprint, texcount = tex.write, tex.sprint, tex.count local format, gmatch, concat = string.format, string.gmatch, table.concat local utfchar = utf.char +local lpegmatch = lpeg.match local trace_registers = false trackers.register("structure.registers", function(v) trace_registers = v end) @@ -215,8 +216,8 @@ local function preprocessentries(rawdata) local entries = rawdata.entries if entries then local e, k = entries[1] or "", entries[2] or "" - local et = (type(e) == "table" and e) or entrysplitter:match(e) - local kt = (type(k) == "table" and k) or entrysplitter:match(k) + local et = (type(e) == "table" and e) or lpegmatch(entrysplitter,e) + local kt = (type(k) == "table" and k) or lpegmatch(entrysplitter,k) entries = { } for k=1,#et do entries[k] = { et[k] or "", kt[k] or "" } diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua index 228765eea..23c5b05ef 100644 --- a/tex/context/base/syst-lua.lua +++ b/tex/context/base/syst-lua.lua @@ -7,7 +7,8 @@ if not modules then modules = { } end modules ['syst-lua'] = { } local texsprint, texprint, texwrite, texiowrite_nl = tex.sprint, tex.print, tex.write, texio.write_nl -local format = string.format +local format, find = string.format, string.find +local lpegmatch = lpeg.match local ctxcatcodes = tex.ctxcatcodes @@ -57,7 +58,7 @@ function commands.boolcase(b) end function commands.doifelsespaces(str) - return commands.doifelse(str:find("^ +$")) + return commands.doifelse(find(str,"^ +$")) end local s = lpeg.Ct(lpeg.splitat(",")) @@ -66,8 +67,8 @@ local h = { } function commands.doifcommonelse(a,b) local ha = h[a] local hb = h[b] - if not ha then ha = s:match(a) h[a] = ha end - if not hb then hb = s:match(b) h[b] = hb end + if not ha then ha = lpegmatch(s,a) h[a] = ha end + if not hb then hb = lpegmatch(s,b) h[b] = hb end for i=1,#ha do for j=1,#hb do if ha[i] == hb[j] then @@ -80,7 +81,7 @@ end function commands.doifinsetelse(a,b) local hb = h[b] - if not hb then hb = s:match(b) h[b] = hb end + if not hb then hb = lpegmatch(s,b) h[b] = hb end for i=1,#hb do if a == hb[i] then return commands.testcase(true) diff --git a/tex/context/base/trac-deb.lua b/tex/context/base/trac-deb.lua index 08252c6c9..1a7c55594 100644 --- a/tex/context/base/trac-deb.lua +++ b/tex/context/base/trac-deb.lua @@ -18,8 +18,11 @@ if not tracers.strings then tracers.strings = { } end tracers.strings.undefined = "undefined" +local splitter = lpeg.splitat(":") +local lpegmatch = lpeg.match + function tracers.split(csname) - return csname:match("^(.+):(.+)$") + return lpegmatch(splitter,csname) end function tracers.type(csname) diff --git a/tex/context/base/trac-log.lua b/tex/context/base/trac-log.lua index 00af9895b..73ec0adb4 100644 --- a/tex/context/base/trac-log.lua +++ b/tex/context/base/trac-log.lua @@ -11,7 +11,8 @@ if not modules then modules = { } end modules ['trac-log'] = { --~ io.stdout:setvbuf("no") --~ io.stderr:setvbuf("no") -local write_nl, write, format = texio.write_nl or print, texio.write or io.write, string.format +local write_nl, write = texio.write_nl or print, texio.write or io.write +local format, gmatch = string.format, string.gmatch local texcount = tex and tex.count if texlua then @@ -265,7 +266,7 @@ logs.report = logs.tex.report logs.simple = logs.tex.report function logs.reportlines(str) -- todo: <lines></lines> - for line in str:gmatch("(.-)[\n\r]") do + for line in gmatch(str,"(.-)[\n\r]") do logs.report(line) end end diff --git a/tex/context/base/trac-tim.lua b/tex/context/base/trac-tim.lua index a896d767f..674abdf60 100644 --- a/tex/context/base/trac-tim.lua +++ b/tex/context/base/trac-tim.lua @@ -6,6 +6,10 @@ if not modules then modules = { } end modules ['trac-tim'] = { license = "see context related readme files" } +local format, gsub = string.format, string.gsub +local concat, sort = table.concat, table.sort +local next, pairs, ipairs = next, pairs, ipairs + goodies = goodies or { } goodies.progress = goodies.progress or { } @@ -98,8 +102,8 @@ local function convert(name) end end local tagname = subtag or tag - top[tagname] = (string.format("%.3f",t)):gsub("%.000$","") - bot[tagname] = (string.format("%.3f",b)):gsub("%.000$","") + top[tagname] = gsub(format("%.3f",t),"%.000$","") + bot[tagname] = gsub(format("%.3f",b),"%.000$","") local delta = t-b if delta == 0 then delta = 1 @@ -109,7 +113,7 @@ local function convert(name) for k, v in ipairs(s) do s[k] = "(" .. k .. "," .. (v-b)*delta .. ")" end - paths[tagname] = table.concat(s,"--") + paths[tagname] = concat(s,"--") end for _, tag in pairs(params) do path(tag) @@ -121,7 +125,7 @@ local function convert(name) pages = pages - 1 end end - table.sort(names) + sort(names) processed[name] = { names = names, top = top, diff --git a/tex/context/base/trac-tra.lua b/tex/context/base/trac-tra.lua index 128cd63dc..63ce4233f 100644 --- a/tex/context/base/trac-tra.lua +++ b/tex/context/base/trac-tra.lua @@ -60,7 +60,7 @@ function debugger.showstats(printer,threshold) for func, count in pairs(counters) do if count > threshold then local name = getname(func) - if not name:find("for generator") then + if not find(name,"for generator") then printer(format("%8i %s", count, name)) total = total + count end diff --git a/tex/context/base/typo-mir.lua b/tex/context/base/typo-mir.lua index 6e5d8663c..d60af700e 100644 --- a/tex/context/base/typo-mir.lua +++ b/tex/context/base/typo-mir.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['typo-mir'] = { local utf = unicode.utf8 local next, type = next, type -local format, insert = string.format, table.insert +local format, insert, sub, find, match = string.format, table.insert, string.sub, string.find, string.match local utfchar = utf.char -- vertical space handler @@ -323,8 +323,8 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster local subtype = current.subtype if subtype == 6 then local dir = current.dir - local d = dir:sub(2,2) -- -- -- -- -- why is this not used - if dir:find(".R.") then -- -- d == "R" or just dir == "TRT" + local d = sub(dir,2,2) + if d == 'R' then -- find(dir,".R.") / dir == "TRT" autodir = -1 else autodir = 1 @@ -335,8 +335,9 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster end elseif subtype == 7 then local dir = current.dir - local sign = dir:sub(1,1) - local dire = dir:sub(3,3) + -- local sign = sub(dir,1,1) + -- local dire = sub(dir,3,3) + local sign, dire = match(dir,"^(.).(.)") if dire == "R" then if sign == "+" then finish, autodir = "TRT", -1 diff --git a/tex/context/base/x-asciimath.lua b/tex/context/base/x-asciimath.lua index 55fe6c991..84a89ad44 100644 --- a/tex/context/base/x-asciimath.lua +++ b/tex/context/base/x-asciimath.lua @@ -14,6 +14,7 @@ local trace_mapping = false if trackers then trackers.register("asciimath.mappi local format = string.format local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes +local lpegmatch = lpeg.match local S, P, R, C, V, Cc, Ct, Cs = lpeg.S, lpeg.P, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Ct, lpeg.Cs @@ -165,17 +166,17 @@ local function converted(original,totex) if trace_mapping then logs.report("asciimath","original : %s",original) end - local premapped = premapper:match(original) + local premapped = lpegmatch(premapper,original) if premapped then if trace_mapping then logs.report("asciimath","prepared : %s",premapped) end - local parsed = parser:match(premapped) + local parsed = lpegmatch(parser,premapped) if parsed then if trace_mapping then logs.report("asciimath","parsed : %s",parsed) end - local postmapped = postmapper:match(parsed) + local postmapped = lpegmatch(postmapper,parsed) if postmapped then if trace_mapping then logs.report("asciimath","finalized : %s",postmapped) @@ -202,7 +203,7 @@ local function converted(original,totex) end local function onlyconverted(str) - local parsed = parser:match(str) + local parsed = lpegmatch(parser,str) return parsed or str end diff --git a/tex/context/base/x-calcmath.lua b/tex/context/base/x-calcmath.lua index 0939411be..e4d5da139 100644 --- a/tex/context/base/x-calcmath.lua +++ b/tex/context/base/x-calcmath.lua @@ -6,7 +6,8 @@ if not modules then modules = { } end modules ['x-calcmath'] = { license = "see context related readme files" } -local format, lower, upper, gsub = string.format, string.lower, string.upper, string.gsub +local format, lower, upper, gsub, sub = string.format, string.lower, string.upper, string.gsub, string.sub +local lpegmatch = lpeg.match tex = tex or { } @@ -71,8 +72,8 @@ local symbols = { } local function nsub(str,tag,pre,post) - return (str:gsub(tag .. "(%b())", function(body) - return pre .. nsub(body:sub(2,-2),tag,pre,post) .. post + return (gsub(str,tag .. "(%b())", function(body) + return pre .. nsub(sub(body,2,-2),tag,pre,post) .. post end)) end @@ -80,87 +81,87 @@ function calcmath.totex(str,mode) if not frozen then freeze() end local n = 0 -- crap - str = str:gsub("%s+" , ' ') + str = gsub(str,"%s+",' ') -- xml - str = str:gsub("&(.-);", entities) + str = gsub(str,"&(.-);",entities) -- ...E... - str = str:gsub("([%-%+]?[%d%.%+%-]+)E([%-%+]?[%d%.]+)", "{\\SCINOT{%1}{%2}}") + str = gsub(str,"([%-%+]?[%d%.%+%-]+)E([%-%+]?[%d%.]+)", "{\\SCINOT{%1}{%2}}") -- ^-.. - str = str:gsub( "%^([%-%+]*%d+)", "^{%1}") + str = gsub(str,"%^([%-%+]*%d+)", "^{%1}") -- ^(...) - str = nsub(str, "%^", "^{", "}") + str = nsub(str,"%^", "^{", "}") -- 1/x^2 repeat - str, n = str:gsub("([%d%w%.]+)/([%d%w%.]+%^{[%d%w%.]+})", "\\frac{%1}{%2}") + str, n = gsub(str,"([%d%w%.]+)/([%d%w%.]+%^{[%d%w%.]+})", "\\frac{%1}{%2}") until n == 0 -- todo: autoparenthesis -- int(a,b,c) for k, v in next, list_2_1 do - repeat str, n = str:gsub(k,v) until n == 0 + repeat str, n = gsub(str,k,v) until n == 0 end -- int(a,b) for k, v in next, list_2_2 do - repeat str, n = str:gsub(k, v) until n == 0 + repeat str, n = gsub(str,k,v) until n == 0 end -- int(a) for k, v in next, list_2_3 do - repeat str, n = str:gsub(k, v) until n == 0 + repeat str, n = gsub(str,k,v) until n == 0 end -- sin(x) => {\\sin(x)} for k, v in next, list_1_1 do - repeat str, n = str:gsub(k, v) until n == 0 + repeat str, n = gsub(str,k,v) until n == 0 end -- mean str = nsub(str, "mean", "\\OVERLINE{", "}") -- (1+x)/(1+x) => \\FRAC{1+x}{1+x} repeat - str, n = str:gsub("(%b())/(%b())", function(a,b) - return "\\FRAC{" .. a:sub(2,-2) .. "}{" .. b:sub(2,-2) .. "}" + str, n = gsub(str,"(%b())/(%b())", function(a,b) + return "\\FRAC{" .. sub(a,2,-2) .. "}{" .. sub(b,2,-2) .. "}" end ) until n == 0 -- (1+x)/x => \\FRAC{1+x}{x} repeat - str, n = str:gsub("(%b())/([%+%-]?[%.%d%w]+)", function(a,b) - return "\\FRAC{" .. a:sub(2,-2) .. "}{" .. b .. "}" + str, n = gsub(str,"(%b())/([%+%-]?[%.%d%w]+)", function(a,b) + return "\\FRAC{" .. sub(a,2,-2) .. "}{" .. b .. "}" end ) until n == 0 -- 1/(1+x) => \\FRAC{1}{1+x} repeat - str, n = str:gsub("([%.%d%w]+)/(%b())", function(a,b) - return "\\FRAC{" .. a .. "}{" .. b:sub(2,-2) .. "}" + str, n = gsub(str,"([%.%d%w]+)/(%b())", function(a,b) + return "\\FRAC{" .. a .. "}{" .. sub(b,2,-2) .. "}" end ) until n == 0 -- 1/x => \\FRAC{1}{x} repeat - str, n = str:gsub("([%.%d%w]+)/([%+%-]?[%.%d%w]+)", "\\FRAC{%1}{%2}") + str, n = gsub(str,"([%.%d%w]+)/([%+%-]?[%.%d%w]+)", "\\FRAC{%1}{%2}") until n == 0 -- times - str = str:gsub("%*", " ") + str = gsub(str,"%*", " ") -- symbols -- we can use a table substitution here - str = str:gsub("([<>=][<>=]*)", symbols) + str = gsub(str,"([<>=][<>=]*)", symbols) -- functions - str = nsub(str, "sqrt", "\\SQRT{", "}") - str = nsub(str, "exp", "e^{", "}") - str = nsub(str, "abs", "\\left|", "\\right|") + str = nsub(str,"sqrt", "\\SQRT{", "}") + str = nsub(str,"exp", "e^{", "}") + str = nsub(str,"abs", "\\left|", "\\right|") -- d/D - str = nsub(str, "D", "{\\FRAC{\\MBOX{d}}{\\MBOX{d}x}{(", ")}}") - str = str:gsub("D([xy])", "\\FRAC{{\\RM d}%1}{{\\RM d}x}") + str = nsub(str,"D", "{\\FRAC{\\MBOX{d}}{\\MBOX{d}x}{(", ")}}") + str = gsub(str,"D([xy])", "\\FRAC{{\\RM d}%1}{{\\RM d}x}") -- f/g for k,v in next, list_3 do -- todo : prepare k,v - str = nsub(str, "D"..v,"{\\RM "..v.."}^{\\PRIME}(",")") - str = nsub(str, v,"{\\RM "..v.."}(",")") + str = nsub(str,"D"..v,"{\\RM "..v.."}^{\\PRIME}(",")") + str = nsub(str,v,"{\\RM "..v.."}(",")") end -- more symbols for k,v in next, list_4_1 do - str = str:gsub(k, v) + str = gsub(str,k,v) end -- parenthesis (optional) if mode == 2 then - str = str:gsub("%(", "\\left\(") - str = str:gsub("%)", "\\right\)") + str = gsub(str,"%(", "\\left\(") + str = gsub(str,"%)", "\\right\)") end -- csnames - str = str:gsub("(\\[A-Z]+)", lower) + str = gsub(str,"(\\[A-Z]+)", lower) -- trace --~ print(str) -- report @@ -351,11 +352,11 @@ if false then calcmath = { } function calcmath.parse(str) - return parser:match(str) + return lpegmatch(parser,str) end function calcmath.tex(str) - str = totex(parser:match(str)) + str = totex(lpegmatch(parser,str)) return (str == "" and "[error]") or str end diff --git a/tex/context/base/x-ct.lua b/tex/context/base/x-ct.lua index 7fe1795a8..222a127ce 100644 --- a/tex/context/base/x-ct.lua +++ b/tex/context/base/x-ct.lua @@ -8,7 +8,7 @@ if not modules then modules = { } end modules ['x-ct'] = { local xmlsprint, xmlfilter, xmlcollected = xml.sprint, xml.filter, xml.collected local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes -local format, concat, rep = string.format, table.concat, string.rep +local format, concat, rep, find = string.format, table.concat, string.rep, string.find lxml.context = { } @@ -26,11 +26,11 @@ local halignments = { local function roottemplate(root) local rt = root.at.template if rt then - if not rt:find("|") then - rt = rt:gsub(",","|") + if not find(rt,"|") then + rt = gsub(rt,",","|") end - if not rt:find("^|") then rt = "|" .. rt end - if not rt:find("|$") then rt = rt .. "|" end + if not find(rt,"^|") then rt = "|" .. rt end + if not find(rt,"|$") then rt = rt .. "|" end end return rt end diff --git a/tex/context/base/x-ldx.tex b/tex/context/base/x-ldx.tex index eb242245c..398ca2345 100644 --- a/tex/context/base/x-ldx.tex +++ b/tex/context/base/x-ldx.tex @@ -2,7 +2,7 @@ \setupxml[method=mkiv,default=hidden] -\usemodule[mathml] +\usemodule[x][mathml] \xmlregisterdocumentsetup{ldx}{xml:mml:define} \xmlregisterdocumentsetup{ldx}{xml:ldx:define} @@ -10,7 +10,8 @@ \xmlregisterns{ldx}{ldx} \startxmlsetups xml:ldx:define - \xmlgrab {\xmldocument} {ldx:*} {*} +% \xmlgrab {\xmldocument} {ldx:*} {*} + \xmlsetsetup {#1} {ldx:*} {ldx:*} \stopxmlsetups % % % @@ -95,7 +96,7 @@ \dontleavehmode \hbox to \hsize \bgroup \strut \hskip.25\dimexpr\xmlattdef{#1}{n}{0}em\relax\relax % extra relax needed ! - \xmldoif {\xmlatt{#1}{comment}} {yes} {\tt} + \doif {\xmlatt{#1}{comment}} {yes} {\tt} \xmlflush{#1} \hss \egroup @@ -185,4 +186,6 @@ backspace=2cm, topspace=2cm] +% \usemodule[inf-02] + \endinput diff --git a/tex/context/base/x-mathml.lua b/tex/context/base/x-mathml.lua index 166db30b6..fd73de6a0 100644 --- a/tex/context/base/x-mathml.lua +++ b/tex/context/base/x-mathml.lua @@ -9,11 +9,12 @@ if not modules then modules = { } end modules ['x-mathml'] = { local type, pairs = type, pairs local utf = unicode.utf8 local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes -local format, lower = string.format, string.lower -local utfchar, utffind, utfgmatch = utf.char, utf.find, utf.gmatch -local xmlsprint, xmlcprint, xmltext = xml.sprint, xml.cprint, xml.text +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 utfcharacters, utfvalues = string.utfcharacters, string.utfvalues +local lpegmatch = lpeg.match lxml.mml = lxml.mml or { } @@ -442,53 +443,53 @@ function xml.functions.remapopenmath(e) end function lxml.mml.checked_operator(str) - texsprint(ctxcatcodes,(utf.gsub(str,".",o_replacements))) + texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements))) end function lxml.mml.stripped(str) tex.sprint(ctxcatcodes,str:strip()) 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 = xmltext(get_id(id),pattern) or "" - str = str:gsub("(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen) - texsprint(ctxcatcodes,(str:gsub(".",n_replacements))) +function table.keys_as_string(t) + local k = { } + for k,_ in pairs(t) do + k[#k+1] = k + end + return concat(k,"") end +--~ local leftdelimiters = "[" .. table.keys_as_string(l_replacements) .. "]" +--~ local rightdelimiters = "[" .. table.keys_as_string(r_replacements) .. "]" + function characters.remapentity(chr,slot) texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr)) end -function lxml.mml.mo(id,pattern) - local str = xmltext(get_id(id),pattern) or "" - texsprint(ctxcatcodes,(utf.gsub(str,".",o_replacements))) +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 "" + 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 "" + texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements))) end -function lxml.mml.mi(id,pattern) - local str = xmltext(get_id(id),pattern) or "" - -- str = str:gsub("^%s*(.-)%s*$","%1") +function lxml.mml.mi(id) + local str = xmlcontent(get_id(id)) or "" + -- str = gsub(str,"^%s*(.-)%s*$","%1") local rep = i_replacements[str] if rep then texsprint(ctxcatcodes,rep) else - texsprint(ctxcatcodes,(str:gsub(".",i_replacements))) - end -end - -function table.keys_as_string(t) - local k = { } - for k,_ in pairs(t) do - k[#k+1] = k + texsprint(ctxcatcodes,(gsub(str,".",i_replacements))) end - return concat(k,"") end ---~ local leftdelimiters = "[" .. table.keys_as_string(l_replacements) .. "]" ---~ local rightdelimiters = "[" .. table.keys_as_string(r_replacements) .. "]" - -function lxml.mml.mfenced(id,pattern) -- multiple separators +function lxml.mml.mfenced(id) -- multiple separators id = get_id(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] @@ -500,13 +501,14 @@ function lxml.mml.mfenced(id,pattern) -- multiple separators texsprint(ctxcatcodes,left) end texsprint(ctxcatcodes,"\\disabledelimiter") - local collected = lxml.filter(id,pattern) + local collected = lxml.filter(id,"/*") -- check the * if collected then local n = #collected if n == 0 then -- skip elseif n == 1 then - lxml.all(id,pattern) + xmlsprint(collected[1]) -- to be checked +--~ lxml.all(id,"/*") else local t = { } for s in utfgmatch(separators,"[^%s]") do @@ -669,9 +671,9 @@ function lxml.mml.mcolumn(root) --~ if type(mc) ~= "string" then --~ n, p = false, false --~ break ---~ elseif mc:find("^[%d ]$") then -- rangecheck is faster +--~ elseif find(mc,"^[%d ]$") then -- rangecheck is faster --~ -- digit ---~ elseif not mc:find("^[%.%,]$") then -- rangecheck is faster +--~ elseif not find(mc,"^[%.%,]$") then -- rangecheck is faster --~ -- punctuation --~ else --~ n = false @@ -710,9 +712,9 @@ function lxml.mml.mtable(root) local rowalign = at.rowalign local columnalign = at.columnalign local frame = at.frame - local rowaligns = rowalign and spacesplitter:match(rowalign) - local columnaligns = columnalign and spacesplitter:match(columnalign) - local frames = frame and spacesplitter:match(frame) + local rowaligns = rowalign and lpegmatch(spacesplitter,rowalign) + local columnaligns = columnalign and lpegmatch(spacesplitter,columnalign) + local frames = frame and lpegmatch(spacesplitter,frame) local framespacing = at.framespacing or "0pt" local framespacing = at.framespacing or "-\\ruledlinewidth" -- make this an option @@ -777,6 +779,6 @@ function lxml.mml.menclosepattern(root) root = get_id(root) local a = root.at.notation if a and a ~= "" then - texsprint("mml:enclose:",a:gsub(" +",",mml:enclose:")) + texsprint("mml:enclose:",gsub(a," +",",mml:enclose:")) end end diff --git a/tex/context/base/x-mathml.mkiv b/tex/context/base/x-mathml.mkiv index 6ddf00cac..a32009f06 100644 --- a/tex/context/base/x-mathml.mkiv +++ b/tex/context/base/x-mathml.mkiv @@ -1661,16 +1661,13 @@ %usemodule[x][asciimath] \startxmlsetups mml:annotation - \xmldoifelse {#1} {[oneof(@encoding,'TeX','tex','TEX','ConTeXt','context','CONTEXT','ctx')]} { - \begingroup - \setcatcodetable\ctxcatcodes - \xmlflush{#1} - \endgroup + \xmldoifelse {#1} {.[oneof(@encoding,'TeX','tex','TEX','ConTeXt','context','CONTEXT','ctx')]} { + \xmlflushcontext{#1} } { - \xmldoifelse {#1} {[oneof(@encoding,'calcmath','cm')]} { + \xmldoifelse {#1} {.[oneof(@encoding,'calcmath','cm')]} { \expanded{\calcmath{\xmlflush{#1}}} } { - \xmldoifelse {#1} {[oneof(@encoding,'asciimath','am')]} { + \xmldoifelse {#1} {.[oneof(@encoding,'asciimath','am')]} { \ifdefined\asciimath \expanded{\asciimath{\xmlflush{#1}}} \else @@ -1855,12 +1852,12 @@ % setups \startxmlsetups mml:mi % todo: mathvariant mathsize mathcolor mathbackground - \ctxlua{lxml.mml.mi("#1","/*")} + \ctxlua{lxml.mml.mi("#1")} \stopxmlsetups \startxmlsetups mml:mn % todo: mathvariant mathsize mathcolor mathbackground \begingroup - \mr \ctxlua{lxml.mml.mn("#1","/*")}% no \hbox, would be ok for . , but spoils rest + \mr \ctxlua{lxml.mml.mn("#1")}% no \hbox, would be ok for . , but spoils rest \endgroup \stopxmlsetups @@ -1871,7 +1868,7 @@ \startxmlsetups mml:mo \doif {\xmlatt{#1}{maxsize}} {1} {\settrue\mmlignoredelimiter} \doif {\xmlatt{#1}{stretchy}} {false} {\settrue\mmlignoredelimiter} - \ctxlua{lxml.mml.mo("#1","/*")} + \ctxlua{lxml.mml.mo("#1")} \setfalse\mmlignoredelimiter \stopxmlsetups @@ -1879,7 +1876,7 @@ \def\MMLleft {\left }% weird \def\MMLright {\right} \def\MMLmiddle{\middle} - \ctxlua{lxml.mml.mfenced("#1","/*")} + \ctxlua{lxml.mml.mfenced("#1")} \stopxmlsetups \defineoverlay [mml:enclose:box] [\useMPgraphic{mml:enclose:box}] diff --git a/tex/context/test/x-cals-test.cdx b/tex/context/test/x-cals-test.cdx deleted file mode 100644 index ce90883fa..000000000 --- a/tex/context/test/x-cals-test.cdx +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" standalone="yes"?> - -<directives> - - <!-- - <directive attribute='id' value="100" setup="cdx:100"/> - <directive attribute='id' value="101" setup="cdx:101"/> - --> - - <!-- - <directive element="cals:table" attribute='cdx' value="colors" setup="cdx:cals:table:colors"/> - <directive element="cals:table" attribute='cdx' value="vertical" setup="cdx:cals:table:vertical"/> - <directive element="cals:table" attribute='cdx' value="noframe" setup="cdx:cals:table:noframe"/> - --> - - <!-- - <directive element="cals:table" attribute='cdx' value="*" setup="cdx:cals:table:*"/> - <directive element="cals:table" attribute='cdx' value="*" before="cdx:cals:table:before:*"/> - <directive element="cals:table" attribute='cdx' value="*" after="cdx:cals:table:after:*"/> - --> - - <directive - element="cals:table" - attribute='cdx' - value="*" - setup="cdx:cals:table:*" - before="cdx:cals:table:before:*" - after="cdx:cals:table:after:*" - /> - -</directives> diff --git a/tex/context/test/x-cals-test.tex b/tex/context/test/x-cals-test.tex deleted file mode 100644 index 30645c2bd..000000000 --- a/tex/context/test/x-cals-test.tex +++ /dev/null @@ -1,48 +0,0 @@ -% engine=luatex - -\usemodule[x][cals] - -\setupcolors[state=start] - -\startsetups cdx:cals:table:noframe - \setupTABLE[frame=off] -\stopsetups - -\startsetups cdx:cals:table:colors - \setupTABLE[row] [odd] [frame=off,background=color,backgroundcolor=red] - \setupTABLE[row] [even][frame=off,background=color,backgroundcolor=green] - \setupTABLE[column][2] [frame=off,background=color,backgroundcolor=blue] -\stopsetups - -\startsetups cdx:cals:table:vertical - \setupTABLE[row] [odd] [frame=off,background=color,backgroundcolor=lightblue] -\stopsetups - -\startsetups cdx:cals:table:horizontal - \setupTABLE[column] [odd] [frame=off,background=color,backgroundcolor=lightblue] -\stopsetups - -\startsetups cdx:cals:table:before:frame - \framed [offset=overlay,frame=off,topframe=on,bottomframe=on,rulethickness=2pt,framecolor=red,align=normal] \bgroup - \vskip2pt - \framed [offset=overlay,frame=off,leftframe=on,rightframe=on,rulethickness=1pt,framecolor=red,align=normal] \bgroup -\stopsetups - -\startsetups cdx:cals:table:after:frame - \egroup - \vskip2pt - \egroup -\stopsetups - -% \startxmlsetups xml:cals:process -% \xmlsetsetup {\xmldocument} {cals:table} {*} -% \stopxmlsetups -% \startxmlsetups cals:table -% \ctxlua{lxml.cals.table("#1")} -% \stopxmlsetups -% \xmlregistersetup{xml:cals:process} - -\starttext - \xmlloaddirectives{x-cals-test.cdx} - \xmlprocess{main}{x-cals-test.xml}{} -\stoptext diff --git a/tex/context/test/x-cals-test.xml b/tex/context/test/x-cals-test.xml deleted file mode 100644 index dc03668e3..000000000 --- a/tex/context/test/x-cals-test.xml +++ /dev/null @@ -1,522 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!-- this is a test file --> -<!-- this is a test file --> -<!-- this is a test file --> - -<root xmlns:cals="http://www.someplace.org/cals" - xmlns:c="http://www.someplace.org/cals"> - - <c:table cdx="vertical"> - <c:tgroup cols="3"> - <c:thead> - <c:row> - <c:entry>alpha</c:entry> - <c:entry>beta</c:entry> - <c:entry>gamma</c:entry> - </c:row> - </c:thead> - <c:tbody> - <c:row> - <c:entry>one</c:entry> - <c:entry>two</c:entry> - <c:entry>three</c:entry> - </c:row> - <c:row> - <c:entry>four</c:entry> - <c:entry>five</c:entry> - <c:entry>six</c:entry> - </c:row> - </c:tbody> - </c:tgroup> - </c:table> - - <c:table cdx="horizontal"> - <c:tgroup cols="3"> - <c:thead> - <c:row> - <c:entry>alpha</c:entry> - <c:entry>beta</c:entry> - <c:entry>gamma</c:entry> - </c:row> - </c:thead> - <c:tbody> - <c:row> - <c:entry>one</c:entry> - <c:entry>two</c:entry> - <c:entry>three</c:entry> - </c:row> - <c:row> - <c:entry>four</c:entry> - <c:entry>five</c:entry> - <c:entry>six</c:entry> - </c:row> - </c:tbody> - </c:tgroup> - </c:table> - - <c:table cdx="frame"> - <c:tgroup cols="3"> - <c:thead> - <c:row> - <c:entry>alpha</c:entry> - <c:entry>beta</c:entry> - <c:entry>gamma</c:entry> - </c:row> - </c:thead> - <c:tbody> - <c:row> - <c:entry>one</c:entry> - <c:entry>two</c:entry> - <c:entry>three</c:entry> - </c:row> - <c:row> - <c:entry>four</c:entry> - <c:entry>five</c:entry> - <c:entry>six</c:entry> - </c:row> - </c:tbody> - </c:tgroup> - </c:table> - - <c:table cdx="colors"> - <c:tgroup cols="3"> - <c:colspec colnum="1" colwidth="4cm" colname="first"/> - <c:colspec colnum="2" colname="second"/> - <c:thead> - <c:row> - <c:entry>alpha</c:entry> - <c:entry>beta</c:entry> - <c:entry>gamma</c:entry> - </c:row> - </c:thead> - <c:tbody> - <c:row> - <c:entry>one</c:entry> - <c:entry>two</c:entry> - <c:entry>three</c:entry> - </c:row> - <c:row> - <c:entry namest="first" nameend="second">four</c:entry> - <c:entry>five</c:entry> - </c:row> - </c:tbody> - </c:tgroup> - </c:table> - - <cals:table cdx="noframe"> - <cals:tgroup cols="2"> - <cals:colspec colnum="1" colwidth="4cm" colname="first"/> - <cals:colspec colnum="2" colname="second"/> - <cals:thead> - <cals:colspec colnum="1" colwidth="2cm"/> - <cals:row> - <cals:entry>alpha</cals:entry> - <cals:entry>beta</cals:entry> - <cals:entry>gamma</cals:entry> - </cals:row> - </cals:thead> - <cals:tbody> - <cals:colspec colnum="1" colwidth="2cm"/> - <cals:row> - <cals:entry>one</cals:entry> - <cals:entry>two</cals:entry> - <cals:entry>three</cals:entry> - </cals:row> - <cals:row> - <cals:entry namest="first" nameend="second">four</cals:entry> - <cals:entry>five</cals:entry> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - <cls:table xmlns:cls="http://www.hereorthere.com/cals" id="200"> - <cls:tgroup cols="2"> - <cls:colspec colnum="1" colwidth="4cm" colname="first"/> - <cls:colspec colnum="2" colname="second"/> - <cls:spanspec colname="myspan" namest="first" nameend="second"/> - <cls:thead> - <cls:row> - <cls:entry>alpha</cls:entry> - <cls:entry>beta</cls:entry> - <cls:entry>gamma</cls:entry> - </cls:row> - </cls:thead> - <cls:tbody> - <cls:row> - <cls:entry>one</cls:entry> - <cls:entry morerows='1'>two</cls:entry> - <cls:entry>three</cls:entry> - </cls:row> - <cls:row> - <cls:entry>one</cls:entry> - <cls:entry>three</cls:entry> - </cls:row> - <cls:row align="center"> - <cls:entry>4m</cls:entry> - <cls:entry>5m</cls:entry> - </cls:row> - </cls:tbody> - </cls:tgroup> - </cls:table> - - <table xmlns="http://www.nowhere.org/cals" id="300"> - <tgroup cols="2"> - <tbody> - <row> - <entry>alpha</entry> - <entrytbl id="400"> - <tgroup cols="2"> - <tbody> - <row> - <entry align='middle'>one</entry> - <entry>three</entry> - </row> - <row> - <entry align='left'>4</entry> - <entry align='right'>5</entry> - </row> - </tbody> - </tgroup> - </entrytbl> - </row> - <row> - <entry>one</entry> - <entry>two</entry> - </row> - </tbody> - </tgroup> - </table> - - <cals:table id="ex.calstable" frame='all'> - <cals:title>Cals tabel 3 met kolommen: header + footer + 3 rijen </cals:title> - <cals:tgroup cols='3' align='left' colsep='1' rowsep='1'> - <cals:colspec colname='c1'/> - <cals:colspec colname='c2'/> - <cals:colspec colname='c3'/> - <cals:thead> - <cals:row> - <cals:entry>h1</cals:entry> - <cals:entry>h2</cals:entry> - <cals:entry>h3</cals:entry> - </cals:row> - </cals:thead> - <cals:tfoot> - <cals:row> - <cals:entry>f1</cals:entry> - <cals:entry>f2</cals:entry> - <cals:entry>f3</cals:entry> - </cals:row> - </cals:tfoot> - <cals:tbody> - <cals:row> - <cals:entry>a1</cals:entry> - <cals:entry>a2</cals:entry> - <cals:entry>a3</cals:entry> - </cals:row> - <cals:row> - <cals:entry>b1</cals:entry> - <cals:entry>b2</cals:entry> - <cals:entry>b3</cals:entry> - </cals:row> - <cals:row> - <cals:entry>c1</cals:entry> - <cals:entry>c2</cals:entry> - <cals:entry>c3</cals:entry> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - <cals:table id="ex.calstable" frame='all'> - <cals:title>Cals tabel 4 met kolommen: header + footer + 3 rijen </cals:title> - <cals:tgroup cols='4' align='left' colsep='1' rowsep='1'> - <cals:colspec colnum='1' colname='c1'/> - <cals:colspec colnum='2' colname='c2'/> - <cals:colspec colnum='3' colname='c3'/> - <cals:colspec colnum='4' colname='c4'/> - <cals:thead> - <cals:row> - <cals:entry>h1</cals:entry> - <cals:entry>h2</cals:entry> - <cals:entry>h3</cals:entry> - <cals:entry>h4</cals:entry> - </cals:row> - </cals:thead> - <cals:tfoot> - <cals:row> - <cals:entry>f1</cals:entry> - <cals:entry>f2</cals:entry> - <cals:entry>f3</cals:entry> - <cals:entry>f4</cals:entry> - </cals:row> - </cals:tfoot> - <cals:tbody> - <cals:row> - <cals:entry>a1</cals:entry> - <cals:entry>a2</cals:entry> - <cals:entry>a3</cals:entry> - <cals:entry>a4</cals:entry> - </cals:row> - <cals:row> - <cals:entry>b1</cals:entry> - <cals:entry>b2</cals:entry> - <cals:entry>b3</cals:entry> - <cals:entry>b4</cals:entry> - </cals:row> - <cals:row> - <cals:entry>c1</cals:entry> - <cals:entry>c2</cals:entry> - <cals:entry>c3</cals:entry> - <cals:entry>c4</cals:entry> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - <cals:table id="ex.calstable" frame='all'> - <cals:title>Cals tabel 3 met kolommen: horizontal span</cals:title> - <cals:tgroup cols='3' align='left' colsep='1' rowsep='1'> - <cals:colspec colnum='1' colname='c1'/> - <cals:colspec colnum='2' colname='c2'/> - <cals:colspec colnum='3' colname='c3'/> - <cals:thead> - <cals:row> - <cals:entry>h1</cals:entry> - <cals:entry>h2</cals:entry> - <cals:entry>h3</cals:entry> - </cals:row> - </cals:thead> - <cals:tfoot> - <cals:row> - <cals:entry>f1</cals:entry> - <cals:entry>f2</cals:entry> - <cals:entry>f3</cals:entry> - </cals:row> - </cals:tfoot> - <cals:tbody> - <cals:row> - <cals:entry>a1</cals:entry> - <cals:entry>a2</cals:entry> - <cals:entry>a3</cals:entry> - </cals:row> - <cals:row> - <cals:entry namest="c1" nameend="c2" align="center">hs</cals:entry> - <!-- cals:entry>b2: weg in verband met horizontale span</cals:entry --> - <cals:entry>b3</cals:entry> - </cals:row> - <cals:row> - <cals:entry>c1</cals:entry> - <cals:entry>c2</cals:entry> - <cals:entry>c3</cals:entry> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - <cals:table id="ex.calstable" frame='all'> - <cals:title>Cals tabel 3 met kolommen: verticale span</cals:title> - <cals:tgroup cols='3' align='left' colsep='1' rowsep='1'> - <cals:colspec colnum='1' colname='c1'/> - <cals:colspec colnum='2' colname='c2'/> - <cals:colspec colnum='3' colname='c3'/> - <cals:thead> - <cals:row> - <cals:entry>h1</cals:entry> - <cals:entry>h2</cals:entry> - <cals:entry>h3</cals:entry> - </cals:row> - </cals:thead> - <cals:tfoot> - <cals:row> - <cals:entry>f1</cals:entry> - <cals:entry>f2</cals:entry> - <cals:entry>f3</cals:entry> - </cals:row> - </cals:tfoot> - <cals:tbody> - <cals:row> - <cals:entry>a1</cals:entry> - <cals:entry>a2</cals:entry> - <cals:entry>a3</cals:entry> - </cals:row> - <cals:row> - <cals:entry>b1</cals:entry> - <cals:entry>b2</cals:entry> - <cals:entry morerows='1' valign='middle'><p>vs</p></cals:entry> - </cals:row> - <cals:row> - <cals:entry>c1</cals:entry> - <cals:entry>c2</cals:entry> - <!-- cals:entry>c3: weg in verband met verticale span</cals:entry--> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - <cals:table id="ex.calstable" frame='all'> - <cals:title>Cals tabel 3 met kolommen: verticale en horizontale span</cals:title> - <cals:tgroup cols='3' align='left' colsep='1' rowsep='1'> - <cals:colspec colnum='1' colname='c1'/> - <cals:colspec colnum='2' colname='c2'/> - <cals:colspec colnum='3' colname='c3'/> - <cals:thead> - <cals:row> - <cals:entry>h1</cals:entry> - <cals:entry>h2</cals:entry> - <cals:entry>h3</cals:entry> - </cals:row> - </cals:thead> - <cals:tfoot> - <cals:row> - <cals:entry>f1</cals:entry> - <cals:entry>f2</cals:entry> - <cals:entry>f3</cals:entry> - </cals:row> - </cals:tfoot> - <cals:tbody> - <cals:row> - <cals:entry>a1</cals:entry> - <cals:entry>a2</cals:entry> - <cals:entry>a3</cals:entry> - </cals:row> - <cals:row> - <cals:entry>b1</cals:entry> - <cals:entry namest="c1" nameend="c2" align="center" morerows='1' valign='bottom'>vh</cals:entry> - <!-- cals:entry>b3: weg in verband met verticale en horizontale span</cals:entry--> - </cals:row> - <cals:row> - <cals:entry>c1</cals:entry> - <!-- cals:entry>c2: weg in verband met verticale en horizontale span</cals:entry--> - <!-- cals:entry>c3: weg in verband met verticale en horizontale span</cals:entry--> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - <cals:table frame="all"> - <cals:tgroup cols="8"> - <cals:colspec colnum="1" colname="col1" colwidth="115.3pt"/> - <cals:colspec colnum="2" colname="col2" colwidth="62.1pt"/> - <cals:colspec colnum="3" colname="col3" colwidth="63.3pt"/> - <cals:colspec colnum="4" colname="col4" colwidth="41.4pt"/> - <cals:colspec colnum="5" colname="col5" colwidth="41.4pt"/> - <cals:colspec colnum="6" colname="col6" colwidth="41.4pt"/> - <cals:colspec colnum="7" colname="col7" colwidth="41.4pt"/> - <cals:colspec colnum="8" colname="col8" colwidth="41.3pt"/> - <cals:tbody> - <cals:row> - <cals:entry colname="col1" colsep="yes" rowsep="yes" - valign="top"> - <p>Grootheid</p> - </cals:entry> - <cals:entry colname="col2" colsep="yes" rowsep="yes" - valign="top"> - <p>Eenheid</p> - </cals:entry> - <cals:entry colname="col3" colsep="yes" rowsep="yes" - valign="top"> - <p>Symbool</p> - </cals:entry> - <cals:entry colname="col4" namest="col4" nameend="col8" - colsep="yes" rowsep="yes" valign="top"> - <p>Meetwaarden</p> - </cals:entry> - </cals:row> - <cals:row> - <cals:entry colname="col1" colsep="yes" rowsep="yes" - valign="top"> - <p>massa</p> - </cals:entry> - <cals:entry colname="col2" colsep="yes" rowsep="yes" - valign="top"/> - <cals:entry colname="col3" colsep="yes" rowsep="yes" - valign="top"/> - <cals:entry colname="col4" colsep="yes" rowsep="yes" - valign="top"> - <p>125</p> - </cals:entry> - <cals:entry colname="col5" colsep="yes" rowsep="yes" - valign="top"> - <p>195</p> - </cals:entry> - <cals:entry colname="col6" colsep="yes" rowsep="yes" - valign="top"> - <p>280</p> - </cals:entry> - <cals:entry colname="col7" colsep="yes" rowsep="yes" - valign="top"> - <p>380</p> - </cals:entry> - <cals:entry colname="col8" colsep="yes" rowsep="yes" - valign="top"> - <p>500</p> - </cals:entry> - </cals:row> - <cals:row> - <cals:entry colname="col1" colsep="yes" rowsep="yes" - valign="top"> - <p>volume</p> - </cals:entry> - <cals:entry colname="col2" colsep="yes" rowsep="yes" - valign="top"/> - <cals:entry colname="col3" colsep="yes" rowsep="yes" - valign="top"/> - <cals:entry colname="col4" colsep="yes" rowsep="yes" - valign="top"> - <p>16</p> - </cals:entry> - <cals:entry colname="col5" colsep="yes" rowsep="yes" - valign="top"> - <p>25</p> - </cals:entry> - <cals:entry colname="col6" colsep="yes" rowsep="yes" - valign="top"> - <p>36</p> - </cals:entry> - <cals:entry colname="col7" colsep="yes" rowsep="yes" - valign="top"> - <p>49</p> - </cals:entry> - <cals:entry colname="col8" colsep="yes" rowsep="yes" - valign="top"> - <p>64</p> - </cals:entry> - </cals:row> - <cals:row> - <cals:entry colname="col1" colsep="yes" rowsep="yes" - valign="top"> - <p>dichtheid</p> - </cals:entry> - <cals:entry colname="col2" colsep="yes" rowsep="yes" - valign="top"/> - <cals:entry colname="col3" colsep="yes" rowsep="yes" - valign="top"/> - <cals:entry colname="col4" colsep="yes" rowsep="yes" - valign="top"> - <p>7,8 </p> - </cals:entry> - <cals:entry colname="col5" colsep="yes" rowsep="yes" - valign="top"> - <p>7,8 </p> - </cals:entry> - <cals:entry colname="col6" colsep="yes" rowsep="yes" - valign="top"> - <p>7,8 </p> - </cals:entry> - <cals:entry colname="col7" colsep="yes" rowsep="yes" - valign="top"> - <p>7,8</p> - </cals:entry> - <cals:entry colname="col8" colsep="yes" rowsep="yes" - valign="top"> - <p>7,8 </p> - </cals:entry> - </cals:row> - </cals:tbody> - </cals:tgroup> - </cals:table> - - -</root> diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index f35c65e9f..e6cc18125 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua --- merge date : 12/26/09 22:27:58 +-- merge date : 12/29/09 22:36:24 do -- begin closure to overcome local limits and interference @@ -13,6 +13,7 @@ if not modules then modules = { } end modules ['l-string'] = { } local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower +local lpegmatch = lpeg.match -- some functions may disappear as they are not used anywhere @@ -83,9 +84,19 @@ function string:limit(n,sentinel) end end -function string:strip() -- the .- is quite efficient --- return match(self,"^%s*(.-)%s*$") or "" - return match(self,'^%s*(.*%S)') or '' -- posted on lua list +--~ function string:strip() -- the .- is quite efficient +--~ -- return match(self,"^%s*(.-)%s*$") or "" +--~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list +--~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)') +--~ end + +do -- roberto's variant: + local space = lpeg.S(" \t\v\n") + local nospace = 1 - space + local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0) + function string.strip(str) + return lpegmatch(stripper,str) or "" + end end function string:is_empty() @@ -222,7 +233,7 @@ end local pattern = lpeg.Ct(lpeg.C(1)^0) function string:totable() - return pattern:match(self) + return lpegmatch(pattern,self) end --~ for _, str in ipairs { @@ -294,6 +305,7 @@ if not modules then modules = { } end modules ['l-lpeg'] = { lpeg = require("lpeg") local P, R, S, Ct, C, Cs, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc +local match = lpeg.match --~ l-lpeg.lua : @@ -346,15 +358,15 @@ local content = (empty + nonempty)^1 local capture = Ct(content^0) function string:splitlines() - return capture:match(self) + return match(capture,self) end lpeg.linebyline = content -- better make a sublibrary ---~ local p = lpeg.splitat("->",false) print(p:match("oeps->what->more")) -- oeps what more ---~ local p = lpeg.splitat("->",true) print(p:match("oeps->what->more")) -- oeps what->more ---~ local p = lpeg.splitat("->",false) print(p:match("oeps")) -- oeps ---~ local p = lpeg.splitat("->",true) print(p:match("oeps")) -- oeps +--~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more +--~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more +--~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps +--~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps local splitters_s, splitters_m = { }, { } @@ -385,7 +397,7 @@ function string:split(separator) c = Ct(splitat(separator)) cache[separator] = c end - return c:match(self) + return match(c,self) end local cache = { } @@ -398,7 +410,7 @@ function string:checkedsplit(separator) c = Ct(separator^0 * other * (separator^1 * other)^0) cache[separator] = c end - return c:match(self) + return match(c,self) end --~ function lpeg.L(list,pp) @@ -1434,7 +1446,8 @@ if not modules then modules = { } end modules ['l-file'] = { file = file or { } local concat = table.concat -local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub +local find, gmatch, match, gsub, sub = string.find, string.gmatch, string.match, string.gsub, string.sub +local lpegmatch = lpeg.match function file.removesuffix(filename) return (gsub(filename,"%.[%a%d]+$","")) @@ -1492,12 +1505,12 @@ end function file.iswritable(name) local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,".")) - return a and a.permissions:sub(2,2) == "w" + return a and sub(a.permissions,2,2) == "w" end function file.isreadable(name) local a = lfs.attributes(name) - return a and a.permissions:sub(1,1) == "r" + return a and sub(a.permissions,1,1) == "r" end file.is_readable = file.isreadable @@ -1572,27 +1585,27 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1 --~ function file.extname(name) ---~ return pattern:match(name) or "" +--~ return lpegmatch(pattern,name) or "" --~ end --~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1) --~ function file.removesuffix(name) ---~ return pattern:match(name) +--~ return lpegmatch(pattern,name) --~ end --~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1 --~ function file.basename(name) ---~ return pattern:match(name) or name +--~ return lpegmatch(pattern,name) or name --~ end --~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1 --~ function file.dirname(name) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then ---~ return name:sub(1,p-2) +--~ return sub(name,1,p-2) --~ else --~ return "" --~ end @@ -1601,7 +1614,7 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1 --~ function file.addsuffix(name, suffix) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then --~ return name --~ else @@ -1612,9 +1625,9 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1 --~ function file.replacesuffix(name,suffix) ---~ local p = pattern:match(name) +--~ local p = lpegmatch(pattern,name) --~ if p then ---~ return name:sub(1,p-2) .. "." .. suffix +--~ return sub(name,1,p-2) .. "." .. suffix --~ else --~ return name .. "." .. suffix --~ end @@ -1623,11 +1636,11 @@ end --~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1 --~ function file.nameonly(name) ---~ local a, b = pattern:match(name) +--~ local a, b = lpegmatch(pattern,name) --~ if b then ---~ return name:sub(a,b-2) +--~ return sub(name,a,b-2) --~ elseif a then ---~ return name:sub(a) +--~ return sub(name,a) --~ else --~ return name --~ end @@ -1661,11 +1674,11 @@ local rootbased = lpeg.P("/") + letter*lpeg.P(":") -- ./name ../name /name c: :// name/name function file.is_qualified_path(filename) - return qualified:match(filename) ~= nil + return lpegmatch(qualified,filename) ~= nil end function file.is_rootbased_path(filename) - return rootbased:match(filename) ~= nil + return lpegmatch(rootbased,filename) ~= nil end local slash = lpeg.S("\\/") @@ -1678,7 +1691,7 @@ local base = lpeg.C((1-suffix)^0) local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc("")) function file.splitname(str) -- returns drive, path, base, suffix - return pattern:match(str) + return lpegmatch(pattern,str) end -- function test(t) for k, v in pairs(t) do print(v, "=>", file.splitname(v)) end end @@ -1700,7 +1713,7 @@ if not modules then modules = { } end modules ['l-io'] = { license = "see context related readme files" } -local byte = string.byte +local byte, find, gsub = string.byte, string.find, string.gsub if string.find(os.getenv("PATH"),";") then io.fileseparator, io.pathseparator = "\\", ";" @@ -1858,7 +1871,7 @@ function io.ask(question,default,options) end io.write(string.format(" ")) local answer = io.read() - answer = answer:gsub("^%s*(.*)%s*$","%1") + answer = gsub(answer,"^%s*(.*)%s*$","%1") if answer == "" and default then return default elseif not options then @@ -1871,7 +1884,7 @@ function io.ask(question,default,options) end local pattern = "^" .. answer for _,v in pairs(options) do - if v:find(pattern) then + if find(v,pattern) then return v end end @@ -4182,6 +4195,7 @@ if not modules then modules = { } end modules ['font-cid'] = { local format, match, lower = string.format, string.match, string.lower local tonumber = tonumber +local lpegmatch = lpeg.match local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) @@ -4235,7 +4249,7 @@ function fonts.cid.load(filename) local data = io.loaddata(filename) if data then unicodes, names = { }, { } - grammar:match(data) + lpegmatch(grammar,data) local supplement, registry, ordering = match(filename,"^(.-)%-(.-)%-()%.(.-)$") return { supplement = supplement, @@ -5287,6 +5301,7 @@ local utf = unicode.utf8 local concat, getn, utfbyte = table.concat, table.getn, utf.byte local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip local type, next, tonumber, tostring = type, next, tonumber, tostring +local lpegmatch = lpeg.match local trace_private = false trackers.register("otf.private", function(v) trace_private = v end) local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) @@ -5359,7 +5374,7 @@ otf.features.default = otf.features.default or { } otf.enhancers = otf.enhancers or { } otf.glists = { "gsub", "gpos" } -otf.version = 2.641 -- beware: also sync font-mis.lua +otf.version = 2.642 -- beware: also sync font-mis.lua otf.pack = true -- beware: also sync font-mis.lua otf.syncspace = true otf.notdef = false @@ -5483,6 +5498,7 @@ local enhancers = { "reorganize mark classes", "reorganize kerns", -- moved here "flatten glyph lookups", "flatten anchor tables", "flatten feature tables", + "simplify glyph lookups", -- some saving "prepare luatex tables", "analyse features", "rehash features", "analyse anchors", "analyse marks", "analyse unicodes", "analyse subtables", @@ -5779,11 +5795,11 @@ local separator = lpeg.S("_.") local other = lpeg.C((1 - separator)^1) local ligsplitter = lpeg.Ct(other * (separator * other)^0) ---~ print(table.serialize(ligsplitter:match("this"))) ---~ print(table.serialize(ligsplitter:match("this.that"))) ---~ print(table.serialize(ligsplitter:match("japan1.123"))) ---~ print(table.serialize(ligsplitter:match("such_so_more"))) ---~ print(table.serialize(ligsplitter:match("such_so_more.that"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"this"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"this.that"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that"))) otf.enhancers["analyse unicodes"] = function(data,filename) local tounicode16, tounicode16sequence = fonts.map.tounicode16, fonts.map.tounicode16sequence @@ -5821,13 +5837,13 @@ otf.enhancers["analyse unicodes"] = function(data,filename) -- cidmap heuristics, beware, there is no guarantee for a match unless -- the chain resolves if (not unicode) and usedmap then - local foundindex = oparser:match(name) + local foundindex = lpegmatch(oparser,name) if foundindex then unicode = cidcodes[foundindex] -- name to number if not unicode then local reference = cidnames[foundindex] -- number to name if reference then - local foundindex = oparser:match(reference) + local foundindex = lpegmatch(oparser,reference) if foundindex then unicode = cidcodes[foundindex] if unicode then @@ -5835,7 +5851,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end end if not unicode then - local foundcodes, multiple = uparser:match(reference) + local foundcodes, multiple = lpegmatch(uparser,reference) if foundcodes then if multiple then originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true @@ -5850,7 +5866,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end -- a.whatever or a_b_c.whatever or a_b_c (no numbers) if not unicode then - local split = ligsplitter:match(name) + local split = lpegmatch(ligsplitter,name) local nplit = (split and #split) or 0 if nplit == 0 then -- skip @@ -5883,7 +5899,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) end -- last resort if not unicode then - local foundcodes, multiple = uparser:match(name) + local foundcodes, multiple = lpegmatch(uparser,name) if foundcodes then if multiple then originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true @@ -6469,8 +6485,9 @@ end otf.enhancers["flatten glyph lookups"] = function(data,filename) for k, v in next, data.glyphs do - if v.lookups then - for kk, vv in next, v.lookups do + local lookups = v.lookups + if lookups then + for kk, vv in next, lookups do for kkk=1,#vv do local vvv = vv[kkk] local s = vvv.specification @@ -6520,6 +6537,31 @@ otf.enhancers["flatten glyph lookups"] = function(data,filename) end end +otf.enhancers["simplify glyph lookups"] = function(data,filename) + for k, v in next, data.glyphs do + local lookups = v.lookups + if lookups then + local slookups, mlookups + for kk, vv in next, lookups do + if #vv == 1 then + if not slookups then + slookups = { } + v.slookups = slookups + end + slookups[kk] = vv[1] + else + if not mlookups then + mlookups = { } + v.mlookups = mlookups + end + mlookups[kk] = vv + end + end + v.lookups = nil + end + end +end + otf.enhancers["flatten anchor tables"] = function(data,filename) for k, v in next, data.glyphs do if v.anchors then @@ -6760,7 +6802,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th local variants = m.horiz_variants if variants then local c = char - for n in variants:gmatch("[^ ]+") do + for n in gmatch(variants,"[^ ]+") do local un = unicodes[n] if un and u ~= un then c.next = un @@ -6772,7 +6814,7 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th local variants = m.vert_variants if variants then local c = char - for n in variants:gmatch("[^ ]+") do + for n in gmatch(variants,"[^ ]+") do local un = unicodes[n] if un and u ~= un then c.next = un @@ -7101,6 +7143,7 @@ if not modules then modules = { } end modules ['font-otb'] = { local concat = table.concat local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip local type, next, tonumber, tostring = type, next, tonumber, tostring +local lpegmatch = lpeg.match local otf = fonts.otf local tfm = fonts.tfm @@ -7161,7 +7204,7 @@ local function resolve_ligatures(tfmdata,ligatures,kind) for k,v in next, ligatures do local lig = v[1] if not done[lig] then - local ligs = split_at_space:match(lig) + local ligs = lpegmatch(split_at_space,lig) if #ligs == 2 then local uc = v[2] local c, f, s = characters[uc], ligs[1], ligs[2] @@ -7269,9 +7312,84 @@ function prepare_base_substitutions(tfmdata,kind,value) -- we can share some cod local characters = tfmdata.characters local descriptions = tfmdata.descriptions local changed = tfmdata.changed + -- + local actions = { + substitution = function(p,lookup,k,glyph,unicode) + local pv = p[2] -- p.variant + if pv then + local upv = unicodes[pv] + if upv then + if type(upv) == "table" then + upv = upv[1] + end + if characters[upv] then + if trace_baseinit and trace_singles then + logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv)) + end + changed[k] = upv + end + end + end + end, + alternate = function(p,lookup,k,glyph,unicode) + local pc = p[2] -- p.components + if pc then + -- a bit optimized ugliness + if value == 1 then + pc = lpegmatch(splitter,pc) + elseif value == 2 then + local a, b = lpegmatch(splitter,pc) + pc = b or a + else + pc = { lpegmatch(splitter,pc) } + pc = pc[value] or pc[#pc] + end + if pc then + local upc = unicodes[pc] + if upc then + if type(upc) == "table" then + upc = upc[1] + end + if characters[upc] then + if trace_baseinit and trace_alternatives then + logs.report("define otf","%s: base alternate %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upc)) + end + changed[k] = upc + end + end + end + end + end, + ligature = function(p,lookup,k,glyph,unicode) + local pc = p[2] + if pc then + if trace_baseinit and trace_ligatures then + local upc = { lpegmatch(splitter,pc) } + for i=1,#upc do upc[i] = unicodes[upc[i]] end + -- we assume that it's no table + logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k)) + end + ligatures[#ligatures+1] = { pc, k } + end + end, + } + -- for k,c in next, characters do local glyph = descriptions[k] - local lookups = glyph.lookups + local lookups = glyph.slookups + if lookups then + for l=1,#lookuplist do + local lookup = lookuplist[l] + local p = lookups[lookup] + if p then + local a = actions[p[1]] + if a then + a(p,lookup,k,glyph,unicode) + end + end + end + end + local lookups = glyph.mlookups if lookups then for l=1,#lookuplist do local lookup = lookuplist[l] @@ -7279,62 +7397,9 @@ function prepare_base_substitutions(tfmdata,kind,value) -- we can share some cod if ps then for i=1,#ps do local p = ps[i] - local t = p[1] - if t == 'substitution' then - local pv = p[2] -- p.variant - if pv then - local upv = unicodes[pv] - if upv then - if type(upv) == "table" then - upv = upv[1] - end - if characters[upv] then - if trace_baseinit and trace_singles then - logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv)) - end - changed[k] = upv - end - end - end - elseif t == 'alternate' then - local pc = p[2] -- p.components - if pc then - -- a bit optimized ugliness - if value == 1 then - pc = splitter:match(pc) - elseif value == 2 then - local a, b = splitter:match(pc) - pc = b or a - else - pc = { splitter:match(pc) } - pc = pc[value] or pc[#pc] - end - if pc then - local upc = unicodes[pc] - if upc then - if type(upc) == "table" then - upc = upc[1] - end - if characters[upc] then - if trace_baseinit and trace_alternatives then - logs.report("define otf","%s: base alternate %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upc)) - end - changed[k] = upc - end - end - end - end - elseif t == 'ligature' and not changed[k] then - local pc = p[2] - if pc then - if trace_baseinit and trace_ligatures then - local upc = { splitter:match(pc) } - for i=1,#upc do upc[i] = unicodes[upc[i]] end - -- we assume that it's no table - logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k)) - end - ligatures[#ligatures+1] = { pc, k } - end + local a = actions[p[1]] + if a then + a(p,lookup,k,glyph,unicode) end end end @@ -9743,142 +9808,153 @@ local function prepare_lookups(tfmdata) -- we can change the otf table after loading but then we need to adapt base mode -- as well (no big deal) -- - for unicode, glyph in next, descriptions do - local lookups = glyph.lookups - if lookups then - for lookup, whatever in next, lookups do - for i=1,#whatever do -- normaly one - local p = whatever[i] - local what = p[1] - if what == 'substitution' then - local old, new = unicode, unicodes[p[2]] - if type(new) == "table" then - new = new[1] - end - local s = single[lookup] - if not s then s = { } single[lookup] = s end - s[old] = new ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new) ---~ end - break - elseif what == 'multiple' then - local old, new = unicode, { } - local m = multiple[lookup] - if not m then m = { } multiple[lookup] = m end - m[old] = new - for pc in gmatch(p[2],"[^ ]+") do - local upc = unicodes[pc] - if type(upc) == "number" then - new[#new+1] = upc - else - new[#new+1] = upc[1] - end - end ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," ")) ---~ end + local action = { + substitution = function(p,lookup,k,glyph,unicode) + local old, new = unicode, unicodes[p[2]] + if type(new) == "table" then + new = new[1] + end + local s = single[lookup] + if not s then s = { } single[lookup] = s end + s[old] = new + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new) + --~ end + end, + multiple = function (p,lookup,k,glyph,unicode) + local old, new = unicode, { } + local m = multiple[lookup] + if not m then m = { } multiple[lookup] = m end + m[old] = new + for pc in gmatch(p[2],"[^ ]+") do + local upc = unicodes[pc] + if type(upc) == "number" then + new[#new+1] = upc + else + new[#new+1] = upc[1] + end + end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," ")) + --~ end + end, + alternate = function(p,lookup,k,glyph,unicode) + local old, new = unicode, { } + local a = alternate[lookup] + if not a then a = { } alternate[lookup] = a end + a[old] = new + for pc in gmatch(p[2],"[^ ]+") do + local upc = unicodes[pc] + if type(upc) == "number" then + new[#new+1] = upc + else + new[#new+1] = upc[1] + end + end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|")) + --~ end + end, + ligature = function (p,lookup,k,glyph,unicode) + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name) + --~ end + local first = true + local t = ligature[lookup] + if not t then t = { } ligature[lookup] = t end + for s in gmatch(p[2],"[^ ]+") do + if first then + local u = unicodes[s] + if not u then + logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name) break - elseif what == 'alternate' then - local old, new = unicode, { } - local a = alternate[lookup] - if not a then a = { } alternate[lookup] = a end - a[old] = new - for pc in gmatch(p[2],"[^ ]+") do - local upc = unicodes[pc] - if type(upc) == "number" then - new[#new+1] = upc - else - new[#new+1] = upc[1] - end + elseif type(u) == "number" then + if not t[u] then + t[u] = { { } } end ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|")) ---~ end - break - elseif what == "ligature" then ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name) ---~ end - local first = true - local t = ligature[lookup] - if not t then t = { } ligature[lookup] = t end - for s in gmatch(p[2],"[^ ]+") do - if first then - local u = unicodes[s] - if not u then - logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name) - break - elseif type(u) == "number" then - if not t[u] then - t[u] = { { } } - end - t = t[u] - else - local tt = t - local tu - for i=1,#u do - local u = u[i] - if i==1 then - if not t[u] then - t[u] = { { } } - end - tu = t[u] - t = tu - else - if not t[u] then - tt[u] = tu - end - end - end + t = t[u] + else + local tt = t + local tu + for i=1,#u do + local u = u[i] + if i==1 then + if not t[u] then + t[u] = { { } } end - first = false + tu = t[u] + t = tu else - s = unicodes[s] - local t1 = t[1] - if not t1[s] then - t1[s] = { { } } + if not t[u] then + tt[u] = tu end - t = t1[s] end end - t[2] = unicode - elseif what == 'position' then - -- not used - local s = position[lookup] - if not s then s = { } position[lookup] = s end - s[unicode] = p[2] -- direct pointer to kern spec - elseif what == 'pair' then - local s = pair[lookup] - if not s then s = { } pair[lookup] = s end - local others = s[unicode] - if not others then others = { } s[unicode] = others end - -- todo: fast check for space - local two = p[2] - local upc = unicodes[two] - if not upc then - for pc in gmatch(two,"[^ ]+") do - local upc = unicodes[pc] - if type(upc) == "number" then - others[upc] = p -- direct pointer to main table - else - for i=1,#upc do - others[upc[i]] = p -- direct pointer to main table - end - end - end - elseif type(upc) == "number" then - others[upc] = p -- direct pointer to main table - else - for i=1,#upc do - others[upc[i]] = p -- direct pointer to main table - end + end + first = false + else + s = unicodes[s] + local t1 = t[1] + if not t1[s] then + t1[s] = { { } } + end + t = t1[s] + end + end + t[2] = unicode + end, + position = function(p,lookup,k,glyph,unicode) + -- not used + local s = position[lookup] + if not s then s = { } position[lookup] = s end + s[unicode] = p[2] -- direct pointer to kern spec + end, + pair = function(p,lookup,k,glyph,unicode) + local s = pair[lookup] + if not s then s = { } pair[lookup] = s end + local others = s[unicode] + if not others then others = { } s[unicode] = others end + -- todo: fast check for space + local two = p[2] + local upc = unicodes[two] + if not upc then + for pc in gmatch(two,"[^ ]+") do + local upc = unicodes[pc] + if type(upc) == "number" then + others[upc] = p -- direct pointer to main table + else + for i=1,#upc do + others[upc[i]] = p -- direct pointer to main table end ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode) ---~ end end end + elseif type(upc) == "number" then + others[upc] = p -- direct pointer to main table + else + for i=1,#upc do + others[upc[i]] = p -- direct pointer to main table + end + end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode) + --~ end + end, + } + -- + for unicode, glyph in next, descriptions do + local lookups = glyph.slookups + if lookups then + for lookup, p in next, lookups do + action[p[1]](p,lookup,k,glyph,unicode) + end + end + local lookups = glyph.mlookups + if lookups then + for lookup, whatever in next, lookups do + for i=1,#whatever do -- normaly one + local p = whatever[i] + action[p[1]](p,lookup,k,glyph,unicode) + end end end local list = glyph.mykerns @@ -9887,9 +9963,9 @@ local function prepare_lookups(tfmdata) local k = kerns[lookup] if not k then k = { } kerns[lookup] = k end k[unicode] = krn -- ref to glyph, saves lookup ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode) ---~ end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode) + --~ end end end local oanchor = glyph.anchors @@ -9903,9 +9979,9 @@ local function prepare_lookups(tfmdata) local f = mark[lookup] if not f then f = { } mark[lookup] = f end f[unicode] = anchors -- ref to glyph, saves lookup ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode) ---~ end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode) + --~ end end end end @@ -9917,9 +9993,9 @@ local function prepare_lookups(tfmdata) local f = cursive[lookup] if not f then f = { } cursive[lookup] = f end f[unicode] = anchors -- ref to glyph, saves lookup ---~ if trace_lookups then ---~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode) ---~ end + --~ if trace_lookups then + --~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode) + --~ end end end end @@ -10657,6 +10733,7 @@ if not modules then modules = { } end modules ['font-def'] = { local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower local tostring, next = tostring, next +local lpegmatch = lpeg.match local trace_defining = false trackers .register("fonts.defining", function(v) trace_defining = v end) local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end) @@ -10757,7 +10834,7 @@ define.add_lookup("name") define.add_lookup("spec") function define.get_specification(str) - return splitter:match(str) + return lpegmatch(splitter,str) end function define.register_split(symbol,action) @@ -11310,6 +11387,7 @@ if not modules then modules = { } end modules ['font-xtx'] = { local texsprint, count = tex.sprint, tex.count local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower local tostring, next = tostring, next +local lpegmatch = lpeg.match local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end) @@ -11389,7 +11467,7 @@ local pattern = (filename + fontname) * subvalue^0 * crapspec^0 * options^0 function fonts.define.specify.colonized(specification) -- xetex mode list = { } - pattern:match(specification.specification) + lpegmatch(pattern,specification.specification) for k, v in next, list do list[k] = v:is_boolean() if type(list[a]) == "nil" then @@ -11427,7 +11505,8 @@ if not modules then modules = { } end modules ['font-map'] = { license = "see context related readme files" } -local match, format, find, concat = string.match, string.format, string.find, table.concat +local match, format, find, concat, gsub = string.match, string.format, string.find, table.concat, string.gsub +local lpegmatch = lpeg.match local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) @@ -11509,7 +11588,7 @@ function fonts.map.load_file(filename, entries, encodings) -- print(line) else local extend, slant, name, fullname, fontfile, encoding - line = line:gsub('"(.+)"', function(s) + line = gsub(line,'"(.+)"', function(s) extend = find(s,'"([^"]+) ExtendFont"') slant = find(s,'"([^"]+) SlantFont"') return "" @@ -11590,7 +11669,7 @@ end --~ local parser = fonts.map.make_name_parser("Japan1") --~ local parser = fonts.map.make_name_parser() --~ local function test(str) ---~ local b, a = parser:match(str) +--~ local b, a = lpegmatch(parser,str) --~ print((a and table.serialize(b)) or b) --~ end --~ test("a.sc") diff --git a/tex/generic/context/luatex-mplib.lua b/tex/generic/context/luatex-mplib.lua index 09919af67..259a5e646 100644 --- a/tex/generic/context/luatex-mplib.lua +++ b/tex/generic/context/luatex-mplib.lua @@ -22,7 +22,7 @@ if metapost and metapost.version then else - local format, concat, abs = string.format, table.concat, math.abs + local format, concat, abs, match = string.format, table.concat, math.abs, string.match local mplib = require ('mplib') local kpse = require ('kpse') @@ -320,7 +320,7 @@ else metapost.report("flushing figure %s",f) local figure = figures[f] local objects = getobjects(result,figure,f) - local fignum = tonumber((figure:filename()):match("([%d]+)$") or figure:charcode() or 0) + local fignum = match(tonumber((figure:filename())),"([%d]+)$") or figure:charcode() or 0) local miterlimit, linecap, linejoin, dashed = -1, -1, -1, false local bbox = figure:boundingbox() local llx, lly, urx, ury = bbox[1], bbox[2], bbox[3], bbox[4] -- faster than unpack |