summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/context/documents/general/qrcs/setup-cs.pdfbin858729 -> 858390 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-de.pdfbin859279 -> 858974 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-en.pdfbin865375 -> 865151 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-fr.pdfbin857329 -> 857046 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-it.pdfbin862625 -> 862653 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-cs.pdfbin348708 -> 348660 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-de.pdfbin433252 -> 432927 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-en.pdfbin346115 -> 345819 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-fr.pdfbin349141 -> 348878 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-it.pdfbin347834 -> 347523 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-nl.pdfbin346944 -> 346492 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-mapping-ro.pdfbin510347 -> 510258 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-nl.pdfbin851848 -> 852048 bytes
-rw-r--r--doc/context/documents/general/qrcs/setup-ro.pdfbin856436 -> 856114 bytes
-rw-r--r--doc/context/sources/general/manuals/luatex/luatex-nodes.tex4
-rw-r--r--doc/context/sources/general/manuals/luatex/luatex-style.tex1
-rw-r--r--metapost/context/base/mpiv/mp-mlib.mpiv2
-rw-r--r--scripts/context/lua/mtx-bibtex.lua2
-rw-r--r--scripts/context/lua/mtx-context.lua14
-rw-r--r--scripts/context/lua/mtx-dvi.lua4
-rw-r--r--scripts/context/lua/mtx-fcd.lua2
-rw-r--r--scripts/context/lua/mtx-fonts.lua2
-rw-r--r--scripts/context/lua/mtx-grep.lua2
-rw-r--r--scripts/context/lua/mtx-install.lua204
-rw-r--r--scripts/context/lua/mtx-tools.lua5
-rw-r--r--scripts/context/lua/mtxrun.lua821
-rw-r--r--scripts/context/stubs/mswin/mtxrun.lua821
-rw-r--r--scripts/context/stubs/unix/mtxrun821
-rw-r--r--scripts/context/stubs/win64/mtxrun.lua821
-rw-r--r--tex/context/base/mkii/cont-new.mkii2
-rw-r--r--tex/context/base/mkii/context.mkii2
-rw-r--r--tex/context/base/mkiv/char-ini.mkiv32
-rw-r--r--tex/context/base/mkiv/cldf-ini.lua4
-rw-r--r--tex/context/base/mkiv/cont-new.mkiv2
-rw-r--r--tex/context/base/mkiv/context.mkiv2
-rw-r--r--tex/context/base/mkiv/data-exp.lua6
-rw-r--r--tex/context/base/mkiv/data-tmp.lua6
-rw-r--r--tex/context/base/mkiv/data-zip.lua99
-rw-r--r--tex/context/base/mkiv/font-lib.mkvi1
-rw-r--r--tex/context/base/mkiv/font-one.lua2
-rw-r--r--tex/context/base/mkiv/font-osd.lua6
-rw-r--r--tex/context/base/mkiv/font-syn.lua21
-rw-r--r--tex/context/base/mkiv/grph-inc.lua14
-rw-r--r--tex/context/base/mkiv/l-dir.lua31
-rw-r--r--tex/context/base/mkiv/l-file.lua77
-rw-r--r--tex/context/base/mkiv/l-lua.lua3
-rw-r--r--tex/context/base/mkiv/l-os.lua16
-rw-r--r--tex/context/base/mkiv/lang-dis.lua1
-rw-r--r--tex/context/base/mkiv/lpdf-col.lua3
-rw-r--r--tex/context/base/mkiv/lpdf-pde.lua14
-rw-r--r--tex/context/base/mkiv/luat-fmt.lua7
-rw-r--r--tex/context/base/mkiv/luat-lib.mkiv4
-rw-r--r--tex/context/base/mkiv/luat-run.lua5
-rw-r--r--tex/context/base/mkiv/mlib-run.lua7
-rw-r--r--tex/context/base/mkiv/mtx-context-listing.tex8
-rw-r--r--tex/context/base/mkiv/node-met.lua163
-rw-r--r--tex/context/base/mkiv/node-pro.lua23
-rw-r--r--tex/context/base/mkiv/node-tsk.lua7
-rw-r--r--tex/context/base/mkiv/publ-imp-apa.mkvi24
-rw-r--r--tex/context/base/mkiv/publ-imp-aps.mkvi14
-rw-r--r--tex/context/base/mkiv/publ-imp-commands.mkvi2
-rw-r--r--tex/context/base/mkiv/publ-imp-default.mkvi22
-rw-r--r--tex/context/base/mkiv/spac-hor.mkiv2
-rw-r--r--tex/context/base/mkiv/status-files.pdfbin26602 -> 26606 bytes
-rw-r--r--tex/context/base/mkiv/status-lua.pdfbin268486 -> 265935 bytes
-rw-r--r--tex/context/base/mkiv/symb-ini.mkiv14
-rw-r--r--tex/context/base/mkiv/trac-log.lua2
-rw-r--r--tex/context/base/mkiv/typo-mar.lua2
-rw-r--r--tex/context/base/mkiv/util-fil.lua157
-rw-r--r--tex/context/base/mkiv/util-sac.lua16
-rw-r--r--tex/context/base/mkiv/util-soc-imp-mime.lua4
-rw-r--r--tex/context/base/mkiv/util-soc-imp-socket.lua2
-rw-r--r--tex/context/base/mkiv/util-str.lua1
-rw-r--r--tex/context/base/mkiv/util-tab.lua3
-rw-r--r--tex/context/interface/mkiv/i-context.pdfbin865375 -> 865151 bytes
-rw-r--r--tex/context/interface/mkiv/i-readme.pdfbin61161 -> 61161 bytes
-rw-r--r--tex/context/modules/mkiv/m-chart.lua4
-rw-r--r--tex/context/sample/third/aristotle-grc.tex13
-rw-r--r--tex/context/sample/third/capek-cz.tex13
-rw-r--r--tex/context/sample/third/capek-vlnka-cz.tex13
-rw-r--r--tex/context/sample/third/dequincey.tex5
-rw-r--r--tex/context/sample/third/dyrynk-cz.tex22
-rw-r--r--tex/context/sample/third/dyrynk-vlnka-cz.tex23
-rw-r--r--tex/context/sample/third/kollar-cz.tex31
-rw-r--r--tex/context/sample/third/kollar-vlnka-cz.tex30
-rw-r--r--tex/context/sample/third/komensky-cz.tex33
-rw-r--r--tex/context/sample/third/komensky-vlnka-cz.tex33
-rw-r--r--tex/context/sample/third/krdel-sk.tex7
-rw-r--r--tex/context/sample/third/kun-cz.tex7
-rw-r--r--tex/generic/context/luatex/luatex-basics-nod.lua140
-rw-r--r--tex/generic/context/luatex/luatex-fonts-merged.lua224
91 files changed, 4013 insertions, 944 deletions
diff --git a/doc/context/documents/general/qrcs/setup-cs.pdf b/doc/context/documents/general/qrcs/setup-cs.pdf
index 0a02331c2..3d1e4f5de 100644
--- a/doc/context/documents/general/qrcs/setup-cs.pdf
+++ b/doc/context/documents/general/qrcs/setup-cs.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-de.pdf b/doc/context/documents/general/qrcs/setup-de.pdf
index fdc000a1f..df9f4f122 100644
--- a/doc/context/documents/general/qrcs/setup-de.pdf
+++ b/doc/context/documents/general/qrcs/setup-de.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-en.pdf b/doc/context/documents/general/qrcs/setup-en.pdf
index 147d7755b..c4450ad71 100644
--- a/doc/context/documents/general/qrcs/setup-en.pdf
+++ b/doc/context/documents/general/qrcs/setup-en.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-fr.pdf b/doc/context/documents/general/qrcs/setup-fr.pdf
index f835d6ade..6b5603f4f 100644
--- a/doc/context/documents/general/qrcs/setup-fr.pdf
+++ b/doc/context/documents/general/qrcs/setup-fr.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-it.pdf b/doc/context/documents/general/qrcs/setup-it.pdf
index 88576c838..86359572b 100644
--- a/doc/context/documents/general/qrcs/setup-it.pdf
+++ b/doc/context/documents/general/qrcs/setup-it.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf
index 535c6d157..3883ae49e 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-cs.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-cs.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-de.pdf b/doc/context/documents/general/qrcs/setup-mapping-de.pdf
index ad1893c29..58e98cfe2 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-de.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-de.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-en.pdf b/doc/context/documents/general/qrcs/setup-mapping-en.pdf
index 30f757833..5fee547d2 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-en.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-en.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf
index 39a3f6cb8..1b8d7be73 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-fr.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-fr.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-it.pdf b/doc/context/documents/general/qrcs/setup-mapping-it.pdf
index 7b0254841..5714fef31 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-it.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-it.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf
index 2290d98cf..4d776ed86 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-nl.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-nl.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf
index d10ea0b9a..f387f4c06 100644
--- a/doc/context/documents/general/qrcs/setup-mapping-ro.pdf
+++ b/doc/context/documents/general/qrcs/setup-mapping-ro.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-nl.pdf b/doc/context/documents/general/qrcs/setup-nl.pdf
index d482570f1..d25676688 100644
--- a/doc/context/documents/general/qrcs/setup-nl.pdf
+++ b/doc/context/documents/general/qrcs/setup-nl.pdf
Binary files differ
diff --git a/doc/context/documents/general/qrcs/setup-ro.pdf b/doc/context/documents/general/qrcs/setup-ro.pdf
index b30441453..5d0e026e6 100644
--- a/doc/context/documents/general/qrcs/setup-ro.pdf
+++ b/doc/context/documents/general/qrcs/setup-ro.pdf
Binary files differ
diff --git a/doc/context/sources/general/manuals/luatex/luatex-nodes.tex b/doc/context/sources/general/manuals/luatex/luatex-nodes.tex
index 34a2aebe8..21e8a2808 100644
--- a/doc/context/sources/general/manuals/luatex/luatex-nodes.tex
+++ b/doc/context/sources/general/manuals/luatex/luatex-nodes.tex
@@ -2305,8 +2305,8 @@ consistency. You can of course always define additional accessors using \type
\def\supported#1#2#3%
{\NC \type{#1}
- \NC \ifx#2\yes\libidx{node} {#1}\fi #2
- \NC \ifx#3\yes\libidx{node.direct}{#1}\fi #3 \NC
+ \NC \ifx#2\yes\lix{node} {#1}\fi #2
+ \NC \ifx#3\yes\lix{node.direct}{#1}\fi #3 \NC
\NR}
\starttabulate[|l|c|c|]
diff --git a/doc/context/sources/general/manuals/luatex/luatex-style.tex b/doc/context/sources/general/manuals/luatex/luatex-style.tex
index 708f83ed6..aa0a7edc3 100644
--- a/doc/context/sources/general/manuals/luatex/luatex-style.tex
+++ b/doc/context/sources/general/manuals/luatex/luatex-style.tex
@@ -436,6 +436,7 @@
\unexpanded\def\lib #1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}\type{\currentlibraryindex.#1}}}
\unexpanded\def\libindex#1{\doifmode{*bodypart}{\expanded{\libraryindex{\currentlibraryindex+#1}}}}
\unexpanded\def\libidx#1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}\type{#1.#2}}}
+\unexpanded\def\lix #1#2{\doifmode{*bodypart}{\expanded{\libraryindex{#1+#2}}}}
% \setstructurepageregister[][keys:1=,entries:1=]
diff --git a/metapost/context/base/mpiv/mp-mlib.mpiv b/metapost/context/base/mpiv/mp-mlib.mpiv
index 131796757..f39010e00 100644
--- a/metapost/context/base/mpiv/mp-mlib.mpiv
+++ b/metapost/context/base/mpiv/mp-mlib.mpiv
@@ -16,7 +16,7 @@ if known context_mlib : endinput ; fi ;
boolean context_mlib ; context_mlib := true ;
-numeric LUATEXFUNCTIONALITY ; LUATEXFUNCTIONALITY := runscript("mp.print(LUATEXFUNCTIONALITY)") ;
+% numeric LUATEXFUNCTIONALITY ; LUATEXFUNCTIONALITY := runscript("mp.print(LUATEXFUNCTIONALITY or (status and status.development_id) or 6346)") ;
%D Objects:
diff --git a/scripts/context/lua/mtx-bibtex.lua b/scripts/context/lua/mtx-bibtex.lua
index 92036e3a5..d30cc2f6a 100644
--- a/scripts/context/lua/mtx-bibtex.lua
+++ b/scripts/context/lua/mtx-bibtex.lua
@@ -127,7 +127,7 @@ function scripts.bibtex.search(files,pattern,list)
utilities.formatters.formatcolumns(result)
logs.newline()
for i=1,#result do
- texio.write_nl(result[i])
+ logs.writer(result[i])
end
logs.newline()
else
diff --git a/scripts/context/lua/mtx-context.lua b/scripts/context/lua/mtx-context.lua
index 0288d686c..49d40dda8 100644
--- a/scripts/context/lua/mtx-context.lua
+++ b/scripts/context/lua/mtx-context.lua
@@ -159,7 +159,7 @@ local formatofinterface = {
local defaultformats = {
"cont-en",
- "cont-nl",
+ -- "cont-nl",
}
-- purging files (we should have an mkii and mkiv variants)
@@ -537,7 +537,7 @@ end
local function luatex_command(l_flags,c_flags,filename,engine)
return format('%s %s %s "%s"',
- engine or "luatex",
+ engine or (status and status.luatex_engine) or "luatex",
flags_to_string(l_flags),
flags_to_string(c_flags,true),
filename
@@ -872,10 +872,12 @@ function scripts.context.run(ctxdata,filename)
--
report("run %s: %s",currentrun,command)
print("") -- cleaner, else continuation on same line
- local returncode, errorstring = os.spawn(command)
+-- local returncode, errorstring = os.spawn(command)
+ local returncode = os.execute(command)
-- todo: remake format when no proper format is found
if not returncode then
- report("fatal error: no return code, message: %s",errorstring or "?")
+-- report("fatal error: no return code, message: %s",errorstring or "?")
+ report("fatal error: no return code")
if resultname then
result_save_error(oldbase,newbase)
end
@@ -1192,7 +1194,7 @@ function scripts.context.make(name)
scripts.context.generate()
end
local list = (name and { name }) or (environment.filenames[1] and environment.filenames) or defaultformats
- local engine = getargument("engine") or "luatex"
+ local engine = getargument("engine") or (status and status.luatex_engine) or "luatex"
if getargument("jit") then
engine = "luajittex"
end
@@ -1201,7 +1203,7 @@ function scripts.context.make(name)
name = formatofinterface[name] or name or ""
if name == "" then
-- nothing
- elseif engine == "luatex" or engine == "luajittex" then
+ elseif engine == "luametatex" or engine == "luatex" or engine == "luajittex" then
make_mkiv_format(name,engine)
elseif engine == "pdftex" or engine == "xetex" then
make_mkii_format(name,engine)
diff --git a/scripts/context/lua/mtx-dvi.lua b/scripts/context/lua/mtx-dvi.lua
index 57f146ee6..901b9561f 100644
--- a/scripts/context/lua/mtx-dvi.lua
+++ b/scripts/context/lua/mtx-dvi.lua
@@ -83,7 +83,7 @@ local f_postamble_end = formatters["postamble end offset=%s version=%s"]
local f_define_font = formatters["define font k=%i checksum=%i scale=%p designsize=%p area=%s name=%s"]
local currentdepth = 0
-local usedprinter = texio and texio.write_ln or print
+local usedprinter = (logs and logs.writer) or (texio and texio.write_nl) or print
local handler = { } for i=0,255 do handler[i] = false end
@@ -379,7 +379,7 @@ function scripts.dvi.list(filename,printer)
local position = 0
f:seek("set",position)
local format = formatters["%0" .. #tostring(filesize) .. "i : %s"]
- local flush = printer or (texio and texio.write_ln) or print
+ local flush = printer or usedprinter
usedprinter = function(str)
flush(format(position,str))
position = f:seek()
diff --git a/scripts/context/lua/mtx-fcd.lua b/scripts/context/lua/mtx-fcd.lua
index 76087cc37..87b06dff0 100644
--- a/scripts/context/lua/mtx-fcd.lua
+++ b/scripts/context/lua/mtx-fcd.lua
@@ -66,7 +66,7 @@ local application = logs.application {
}
local report = application.report
-local writeln = print -- texio.write_nl
+local writeln = (logs and logs.writer) or (texio and texio.write_nl) or print
local find, char, byte, lower, gsub, format = string.find, string.char, string.byte, string.lower, string.gsub, string.format
diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua
index 5fab67082..2e50543c3 100644
--- a/scripts/context/lua/mtx-fonts.lua
+++ b/scripts/context/lua/mtx-fonts.lua
@@ -14,7 +14,7 @@ local suffix, addsuffix, removesuffix, replacesuffix = file.suffix, file.addsuff
local nameonly, basename, joinpath, collapsepath = file.nameonly, file.basename, file.join, file.collapsepath
local lower = string.lower
local concat = table.concat
-local write_nl = texio.write_nl
+local write_nl = (logs and logs.writer) or (texio and texio.write_nl) or print
local otlversion = 3.106
diff --git a/scripts/context/lua/mtx-grep.lua b/scripts/context/lua/mtx-grep.lua
index 0c4364630..9a4237737 100644
--- a/scripts/context/lua/mtx-grep.lua
+++ b/scripts/context/lua/mtx-grep.lua
@@ -69,7 +69,7 @@ local crlf = cr * lf
local newline = crlf + cr + lf
local content = lpeg.C((1-newline)^0) * newline + lpeg.C(lpeg.P(1)^1)
-local write_nl = texio.write_nl
+local write_nl = (logs and logs.writer) or (texio and texio.write_nl) or print
-- local pattern = "LIJST[@TYPE='BULLET']/LIJSTITEM[contains(text(),'Kern')]"
diff --git a/scripts/context/lua/mtx-install.lua b/scripts/context/lua/mtx-install.lua
index 46580bb20..275102e37 100644
--- a/scripts/context/lua/mtx-install.lua
+++ b/scripts/context/lua/mtx-install.lua
@@ -36,8 +36,8 @@ local helpinfo = [[
local gsub, find, escapedpattern = string.gsub, string.find, string.escapedpattern
local round = math.round
local savetable, loadtable, sortedhash = table.save, table.load, table.sortedhash
-local joinfile, filesize, dirname, addsuffix = file.join, file.size, file.dirname, file.addsuffix
-local isdir, isfile, walkdir = lfs.isdir, lfs.isfile, lfs.dir
+local copyfile, joinfile, filesize, dirname, addsuffix, basename = file.copy, file.join, file.size, file.dirname, file.addsuffix, file.basename
+local isdir, isfile, walkdir, pushdir, popdir, currentdir = lfs.isdir, lfs.isfile, lfs.dir, lfs.chdir, dir.push, dir.pop, currentdir
local mkdirs, globdir = dir.mkdirs, dir.glob
local osremove, osexecute, ostype = os.remove, os.execute, os.type
local savedata = io.savedata
@@ -223,9 +223,9 @@ function install.update()
mkdirs(tree)
end
- local function update(url,tree)
+ local function update(url,what,zipfile,skiplist)
- tree = joinfile("tex",tree)
+ local tree = joinfile("tex",what)
local ok = validdir(tree)
if not validdir(tree) then
@@ -252,24 +252,69 @@ function install.update()
local total = 0
local done = 0
+ local count = 0
if not old then
- report("installing %s, %i files",tree,#new)
+ if zipfile then
+ zipfile = addsuffix(what,"zip")
+ end
+ if zipfile then
+ local zipurl = url .. "/" .. zipfile
+ report("fetching %a",zipurl)
+ local zipdata = fetch(zipurl)
+ if zipdata then
+ io.savedata(zipfile,zipdata)
+ else
+ zipfile = false
+ end
+ end
+
+ if type(zipfile) == "string" and isfile(zipfile) then
+
+ -- todo: pcall
- for i=1,#new do
+ report("unzipping %a",zipfile)
+
+ local specification = {
+ zipname = zipfile,
+ path = ".",
+ -- verbose = true,
+ verbose = "steps",
+ }
+
+ if utilities.zipfiles.unzipdir(specification) then
+ osremove(zipfile)
+ goto done
+ else
+ osremove(zipfile)
+ end
+
+ end
+
+ count = #new
+
+ report("installing %s, %i files",tree,count)
+
+ for i=1,count do
total = total + new[i][2]
end
- for i=1,#new do
+ for i=1,count do
local entry = new[i]
local name = entry[1]
local size = entry[2]
local target = joinfile(tree,name)
done = done + size
- download("new",url,target,total,done)
+ if not skiplist or not skiplist[basename(name)] then
+ download("new",url,target,total,done)
+ else
+ report("skipping %s",target)
+ end
end
+ ::done::
+
else
report("updating %s, %i files",tree,#new)
@@ -279,24 +324,30 @@ function install.update()
local todo = { }
for newname, newhash in sortedhash(hnew) do
- local target = joinfile(tree,newname)
- local oldhash = hold[newname]
- local action = nil
- if not oldhash then
- action = "added"
- elseif oldhash[3] ~= newhash[3] then
- action = "changed"
- elseif not ispresent(joinfile(tree,newname)) then
- action = "missing"
- end
- if action then
- local size = newhash[2]
- total = total + size
- todo[#todo+1] = { action, target, size }
+ local target = joinfile(tree,newname)
+ if not skiplist or not skiplist[basename(newname)] then
+ local oldhash = hold[newname]
+ local action = nil
+ if not oldhash then
+ action = "added"
+ elseif oldhash[3] ~= newhash[3] then
+ action = "changed"
+ elseif not ispresent(joinfile(tree,newname)) then
+ action = "missing"
+ end
+ if action then
+ local size = newhash[2]
+ total = total + size
+ todo[#todo+1] = { action, target, size }
+ end
+ else
+ report("skipping %s",target)
end
end
- for i=1,#todo do
+ count = #todo
+
+ for i=1,count do
local entry = todo[i]
download(entry[1],url,entry[2],total,done)
done = done + entry[3]
@@ -314,6 +365,8 @@ function install.update()
savetable(lua,new)
+ return { tree, count, done }
+
end
local targetroot = dir.current()
@@ -355,9 +408,17 @@ function install.update()
report("platform : %s",osplatform)
report("system : %s",ostype)
- update(url,"texmf")
- update(url,"texmf-context")
- update(url,texmfplatform)
+ local status = { }
+ local skiplist = {
+ ["mtxrun"] = true,
+ ["context"] = true,
+ ["mtxrun.exe"] = true,
+ ["context.exe"] = true,
+ }
+
+ status[#status+1] = update(url,"texmf",true)
+ status[#status+1] = update(url,"texmf-context",true)
+ status[#status+1] = update(url,texmfplatform,false,skiplist)
prepare("texmf-cache")
prepare("texmf-project")
@@ -367,36 +428,83 @@ function install.update()
local binpath = joinfile(targetroot,"tex",texmfplatform,"bin")
- if ostype == "unix" then
- osexecute(formatters["chmod +x %s/*"](binpath))
+ local luametatex = "luametatex"
+ local mtxrun = "mtxrun"
+ local context = "context"
+
+ if ostype == "windows" then
+ luametatex = addsuffix(luametatex,"exe")
+ mtxrun = addsuffix(mtxrun,"exe")
+ context = addsuffix(context,"exe")
end
- local mtxrun = joinfile(binpath,"mtxrun")
- local context = joinfile(binpath,"context")
+ local luametatexbin = joinfile(binpath,luametatex)
+ local mtxrunbin = joinfile(binpath,mtxrun)
+ local contextbin = joinfile(binpath,context)
- if ostype == "windows" then
- addsuffix(mtxrun,"exe")
- addsuffix(context,"exe")
+ local cdir = currentdir()
+ local pdir = pushdir(binpath)
+
+ report("current : %S",cdir)
+ report("target : %S",pdir)
+
+ if pdir ~= cdir then
+
+ report("removing : %s",mtxrun)
+ report("removing : %s",context)
+
+ osremove(mtxrun)
+ osremove(context)
+
+ if isfile(luametatex) then
+ lfs.symlink(luametatex,mtxrun)
+ lfs.symlink(luametatex,context)
+ end
+
+ if isfile(mtxrun) then
+ report("linked : %s",mtxrun)
+ else
+ copyfile(luametatex,mtxrun)
+ report("copied : %s",mtxrun)
+ end
+ if isfile(context) then
+ report("linked : %s",context)
+ else
+ copyfile(luametatex,context)
+ report("copied : %s",context)
+ end
+
+ end
+
+ popdir()
+
+ if lfs.setexecutable(luametatexbin) then
+ report("xbit set : %s",luametatexbin)
+ else
+ -- report("xbit bad : %s",luametatexbin)
+ end
+ if lfs.setexecutable(mtxrunbin) then
+ report("xbit set : %s",mtxrunbin)
+ else
+ -- report("xbit bad : %s",mtxrunbin)
+ end
+ if lfs.setexecutable(contextbin) then
+ report("xbit set : %s",contextbin)
+ else
+ -- report("xbit bad : %s",contextbin)
end
- run("%s --generate",mtxrun)
- run("%s --make en", context)
- run("%s --make nl", context)
-
- -- local mtxrun = joinfile(binpath,"mtxrunjit")
- -- local context = joinfile(binpath,"contextjit")
- --
- -- if ostype == "windows" then
- -- addsuffix(mtxrun,"exe")
- -- addsuffix(context,"exe")
- -- end
- --
- -- run("%s --generate",mtxrun)
- -- run("%s --make en", context)
- -- run("%s --make nl", context)
+ run("%s --generate",mtxrunbin)
+ run("%s --make en", contextbin)
-- in calling script: update mtxrun.exe and mtxrun.lua
+ report("")
+ for i=1,#status do
+ report("%-20s : %4i files with %9i bytes installed",unpack(status[i]))
+ end
+ report("")
+
report("update, done")
end
diff --git a/scripts/context/lua/mtx-tools.lua b/scripts/context/lua/mtx-tools.lua
index 146c46f36..be2177111 100644
--- a/scripts/context/lua/mtx-tools.lua
+++ b/scripts/context/lua/mtx-tools.lua
@@ -53,7 +53,8 @@ local application = logs.application {
helpinfo = helpinfo,
}
-local report = application.report
+local report = application.report
+local writeln = (logs and logs.writer) or (texio and texio.write_nl) or print
scripts = scripts or { }
scripts.tools = scripts.tools or { }
@@ -189,7 +190,7 @@ function scripts.tools.dirtoxml()
result = table.concat(result,"\n")
if not outputfile or outputfile == "" then
- texio.write_nl(result)
+ writeln(result)
else
io.savedata(outputfile,result)
end
diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua
index 15606e1e1..98fe7f752 100644
--- a/scripts/context/lua/mtxrun.lua
+++ b/scripts/context/lua/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6281, stripped down to: 2863
+-- original size: 6330, stripped down to: 2831
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -312,7 +312,6 @@ elseif not ffi.number then
ffi.number=tonumber
end
if LUAVERSION>5.3 then
- collectgarbage("generational")
end
@@ -3766,7 +3765,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 19347, stripped down to: 10258
+-- original size: 18916, stripped down to: 10126
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3933,16 +3932,6 @@ local launchers={
function os.launch(str)
execute(format(launchers[os.name] or launchers.unix,str))
end
-if not os.times then
- function os.times()
- return {
- utime=os.gettimeofday(),
- stime=0,
- cutime=0,
- cstime=0,
- }
- end
-end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
local startuptime=gettimeofday()
@@ -4218,7 +4207,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21804, stripped down to: 9980
+-- original size: 21984, stripped down to: 10148
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4398,40 +4387,45 @@ local reslasher=lpeg.replacer(P("\\"),"/")
function file.reslash(str)
return str and lpegmatch(reslasher,str)
end
-function file.is_writable(name)
- if not name then
- elseif lfs.isdir(name) then
- name=name.."/m_t_x_t_e_s_t.tmp"
- local f=io.open(name,"wb")
- if f then
- f:close()
- os.remove(name)
- return true
- end
- elseif lfs.isfile(name) then
- local f=io.open(name,"ab")
- if f then
- f:close()
- return true
- end
- else
- local f=io.open(name,"ab")
- if f then
- f:close()
- os.remove(name)
- return true
+if lfs.isreadablefile and lfs.iswritablefile then
+ file.is_readable=lfs.isreadablefile
+ file.is_writable=lfs.iswritablefile
+else
+ function file.is_writable(name)
+ if not name then
+ elseif lfs.isdir(name) then
+ name=name.."/m_t_x_t_e_s_t.tmp"
+ local f=io.open(name,"wb")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
+ elseif lfs.isfile(name) then
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ return true
+ end
+ else
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
end
- end
- return false
-end
-local readable=P("r")*Cc(true)
-function file.is_readable(name)
- if name then
- local a=attributes(name)
- return a and lpegmatch(readable,a.permissions) or false
- else
return false
end
+ local readable=P("r")*Cc(true)
+ function file.is_readable(name)
+ if name then
+ local a=attributes(name)
+ return a and lpegmatch(readable,a.permissions) or false
+ else
+ return false
+ end
+ end
end
file.isreadable=file.is_readable
file.iswritable=file.is_writable
@@ -5062,7 +5056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 18002, stripped down to: 10681
+-- original size: 18253, stripped down to: 10816
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -5127,13 +5121,15 @@ local function glob_pattern_function(path,patt,recurse,action)
end
local dirs
local nofdirs=0
- for name in walkdir(usedpath) do
+ for name,mode,size,time in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
- action(full)
+ action(full,size,time)
end
elseif recurse and mode=="directory" then
if dirs then
@@ -5169,10 +5165,12 @@ local function glob_pattern_table(path,patt,recurse,result)
local dirs
local nofdirs=0
local noffiles=#result
- for name,a in walkdir(usedpath) do
+ for name,mode in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
noffiles=noffiles+1
@@ -5223,7 +5221,7 @@ local function collectpattern(path,patt,recurse,result)
if not find(path,"/$") then
path=path..'/'
end
- for name in scanner,first do
+ for name in scanner,first do
if name=="." then
elseif name==".." then
else
@@ -5314,10 +5312,12 @@ local function globfiles(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if recurse then
globfiles(path.."/"..name,recurse,func,files)
@@ -5340,10 +5340,12 @@ local function globdirs(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if not func or func(name) then
noffiles=noffiles+1
@@ -5524,8 +5526,7 @@ local stack={}
function dir.push(newdir)
local curdir=currentdir()
insert(stack,curdir)
- if newdir and newdir~="" then
- chdir(newdir)
+ if newdir and newdir~="" and chdir(newdir) then
return newdir
else
return curdir
@@ -6466,7 +6467,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43538, stripped down to: 21641
+-- original size: 43488, stripped down to: 21595
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6482,7 +6483,6 @@ local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,s
local load,dump=load,string.dump
local tonumber,type,tostring,next,setmetatable=tonumber,type,tostring,next,setmetatable
local unpack,concat=table.unpack,table.concat
-local unpack,concat=table.unpack,table.concat
local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc
local patterns,lpegmatch=lpeg.patterns,lpeg.match
local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len
@@ -7307,7 +7307,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28810, stripped down to: 16134
+-- original size: 28866, stripped down to: 16134
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7971,7 +7971,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-fil"] = package.loaded["util-fil"] or true
--- original size: 8607, stripped down to: 6727
+-- original size: 11530, stripped down to: 9007
if not modules then modules={} end modules ['util-fil']={
version=1.001,
@@ -8180,6 +8180,32 @@ if bit32 then
local b=char(n%256)
f:write(b,a)
end
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
else
local floor=math.floor
function files.writecardinal2(f,n)
@@ -8188,16 +8214,32 @@ else
local b=char(n%256)
f:write(b,a)
end
-end
-function files.writecardinal4(f,n)
- local a=char(n%256)
- n=rshift(n,8)
- local b=char(n%256)
- n=rshift(n,8)
- local c=char(n%256)
- n=rshift(n,8)
- local d=char(n%256)
- f:write(d,c,b,a)
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
end
function files.writestring(f,s)
f:write(char(byte(s,1,#s)))
@@ -8210,10 +8252,18 @@ if fio and fio.readcardinal1 then
files.readcardinal2=fio.readcardinal2
files.readcardinal3=fio.readcardinal3
files.readcardinal4=fio.readcardinal4
+ files.readcardinal1le=fio.readcardinal1le or files.readcardinal1le
+ files.readcardinal2le=fio.readcardinal2le or files.readcardinal2le
+ files.readcardinal3le=fio.readcardinal3le or files.readcardinal3le
+ files.readcardinal4le=fio.readcardinal4le or files.readcardinal4le
files.readinteger1=fio.readinteger1
files.readinteger2=fio.readinteger2
files.readinteger3=fio.readinteger3
files.readinteger4=fio.readinteger4
+ files.readinteger1le=fio.readinteger1le or files.readinteger1le
+ files.readinteger2le=fio.readinteger2le or files.readinteger2le
+ files.readinteger3le=fio.readinteger3le or files.readinteger3le
+ files.readinteger4le=fio.readinteger4le or files.readinteger4le
files.readfixed2=fio.readfixed2
files.readfixed4=fio.readfixed4
files.read2dot14=fio.read2dot14
@@ -8234,6 +8284,24 @@ if fio and fio.readcardinal1 then
skipposition(f,4*(n or 1))
end
end
+if fio and fio.writecardinal1 then
+ files.writecardinal1=fio.writecardinal1
+ files.writecardinal2=fio.writecardinal2
+ files.writecardinal3=fio.writecardinal3
+ files.writecardinal4=fio.writecardinal4
+ files.writecardinal1le=fio.writecardinal1le
+ files.writecardinal2le=fio.writecardinal2le
+ files.writecardinal3le=fio.writecardinal3le
+ files.writecardinal4le=fio.writecardinal4le
+ files.writeinteger1=fio.writeinteger1 or fio.writecardinal1
+ files.writeinteger2=fio.writeinteger2 or fio.writecardinal2
+ files.writeinteger3=fio.writeinteger3 or fio.writecardinal3
+ files.writeinteger4=fio.writeinteger4 or fio.writecardinal4
+ files.writeinteger1le=files.writeinteger1le or fio.writecardinal1le
+ files.writeinteger2le=files.writeinteger2le or fio.writecardinal2le
+ files.writeinteger3le=files.writeinteger3le or fio.writecardinal3le
+ files.writeinteger4le=files.writeinteger4le or fio.writecardinal4le
+end
if fio and fio.readcardinaltable then
files.readcardinaltable=fio.readcardinaltable
files.readintegertable=fio.readintegertable
@@ -8271,7 +8339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11065, stripped down to: 8209
+-- original size: 11332, stripped down to: 8420
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8296,6 +8364,11 @@ function streams.openstring(f,zerobased)
return { f,1,#f,zerobased or false }
end
end
+function streams.getstring(f)
+ if f then
+ return f[1]
+ end
+end
function streams.close()
end
function streams.size(f)
@@ -8386,7 +8459,7 @@ function streams.readcardinal2(f)
local a,b=byte(f[1],i,j)
return 0x100*a+b
end
-function streams.readcardinal2LE(f)
+function streams.readcardinal2le(f)
local i=f[2]
local j=i+1
f[2]=j+1
@@ -8458,6 +8531,13 @@ function streams.readcardinal4(f)
local a,b,c,d=byte(f[1],i,j)
return 0x1000000*a+0x10000*b+0x100*c+d
end
+function streams.readcardinal4le(f)
+ local i=f[2]
+ local j=i+3
+ f[2]=j+1
+ local d,c,b,a=byte(f[1],i,j)
+ return 0x1000000*a+0x10000*b+0x100*c+d
+end
function streams.readinteger4(f)
local i=f[2]
local j=i+3
@@ -9545,13 +9625,13 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-socket"] = package.loaded["util-soc-imp-socket"] or true
--- original size: 4870, stripped down to: 3527
+-- original size: 4905, stripped down to: 3562
local type,tostring,setmetatable=type,tostring,setmetatable
local min=math.min
local format=string.format
-local socket=require("socket.core")
+local socket=socket or package.loaded.socket or require("socket.core")
local connect=socket.connect
local tcp4=socket.tcp4
local tcp6=socket.tcp6
@@ -10734,12 +10814,12 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-mime"] = package.loaded["util-soc-imp-mime"] or true
--- original size: 2328, stripped down to: 1874
+-- original size: 2373, stripped down to: 1931
local type,tostring=type,tostring
-local mime=require("mime.core")
-local ltn12=ltn12 or require("ltn12")
+local mime=mime or package.loaded.mime or require("mime.core")
+local ltn12=ltn12 or package.loaded.ltn12 or require("ltn12")
local filtercycle=ltn12.filter.cycle
local function report(fmt,first,...)
if logs then
@@ -12691,7 +12771,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32608, stripped down to: 20925
+-- original size: 32618, stripped down to: 20935
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12736,7 +12816,7 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
-if runningtex then
+if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
@@ -15613,6 +15693,468 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+package.loaded["util-zip"] = package.loaded["util-zip"] or true
+
+-- original size: 18645, stripped down to: 11291
+
+if not modules then modules={} end modules ['util-zip']={
+ version=1.001,
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local type,tostring,tonumber=type,tostring,tonumber
+local sort=table.sort
+local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
+local osdate,ostime=os.date,os.time
+local ioopen=io.open
+local loaddata,savedata=io.loaddata,io.savedata
+local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
+local files=utilities.files
+local openfile=files.open
+local closefile=files.close
+local readstring=files.readstring
+local readcardinal2=files.readcardinal2le
+local readcardinal4=files.readcardinal4le
+local setposition=files.setposition
+local getposition=files.getposition
+local band=bit32.band
+local rshift=bit32.rshift
+local lshift=bit32.lshift
+local decompress,calculatecrc
+if flate then
+ decompress=flate.flate_decompress
+ calculatecrc=flate.update_crc32
+else
+ local zlibdecompress=zlib.decompress
+ local zlibchecksum=zlib.crc32
+ decompress=function(source,targetsize)
+ local target=zlibdecompress(source,-15)
+ if target then
+ return target
+ else
+ return false,1
+ end
+ end
+ calculatecrc=function(buffer,initial)
+ return zlibchecksum(initial or 0,buffer)
+ end
+end
+local zipfiles={}
+utilities.zipfiles=zipfiles
+local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
+ function openzipfile(name)
+ return {
+ name=name,
+ handle=openfile(name,0),
+ }
+ end
+ local function collect(z)
+ if not z.list then
+ local list={}
+ local hash={}
+ local position=0
+ local index=0
+ local handle=z.handle
+ while true do
+ setposition(handle,position)
+ local signature=readstring(handle,4)
+ if signature=="PK\3\4" then
+ local version=readcardinal2(handle)
+ local flag=readcardinal2(handle)
+ local method=readcardinal2(handle)
+ local filetime=readcardinal2(handle)
+ local filedate=readcardinal2(handle)
+ local crc32=readcardinal4(handle)
+ local compressed=readcardinal4(handle)
+ local uncompressed=readcardinal4(handle)
+ local namelength=readcardinal2(handle)
+ local extralength=readcardinal2(handle)
+ local filename=readstring(handle,namelength)
+ local descriptor=band(flag,8)~=0
+ local encrypted=band(flag,1)~=0
+ local acceptable=method==0 or method==8
+ local skipped=0
+ local size=0
+ if encrypted then
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ skipbytes(8)
+ skipped=skipped+8
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ size=readcardinal4(handle)
+ skipbytes(size)
+ skipped=skipped+size+4
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ end
+ position=position+30+namelength+extralength+skipped
+ if descriptor then
+ setposition(handle,position+compressed)
+ crc32=readcardinal4(handle)
+ compressed=readcardinal4(handle)
+ uncompressed=readcardinal4(handle)
+ end
+ if acceptable then
+ index=index+1
+ local data={
+ filename=filename,
+ index=index,
+ position=position,
+ method=method,
+ compressed=compressed,
+ uncompressed=uncompressed,
+ crc32=crc32,
+ encrypted=encrypted,
+ }
+ hash[filename]=data
+ list[index]=data
+ else
+ end
+ position=position+compressed
+ else
+ break
+ end
+ z.list=list
+ z.hash=hash
+ end
+ end
+ end
+ function getziplist(z)
+ local list=z.list
+ if not list then
+ collect(z)
+ end
+ return z.list
+ end
+ function getziphash(z)
+ local hash=z.hash
+ if not hash then
+ collect(z)
+ end
+ return z.hash
+ end
+ function foundzipfile(z,name)
+ return getziphash(z)[name]
+ end
+ function closezipfile(z)
+ local f=z.handle
+ if f then
+ closefile(f)
+ z.handle=nil
+ end
+ end
+ function unzipfile(z,filename,check)
+ local hash=z.hash
+ if not hash then
+ hash=zipfiles.hash(z)
+ end
+ local data=hash[filename]
+ if not data then
+ end
+ if data then
+ local handle=z.handle
+ local position=data.position
+ local compressed=data.compressed
+ if compressed>0 then
+ setposition(handle,position)
+ local result=readstring(handle,compressed)
+ if data.method==8 then
+ result=decompress(result,data.uncompressed)
+ end
+ if check and data.crc32~=calculatecrc(result) then
+ print("checksum mismatch")
+ return ""
+ end
+ return result
+ else
+ return ""
+ end
+ end
+ end
+ zipfiles.open=openzipfile
+ zipfiles.close=closezipfile
+ zipfiles.unzip=unzipfile
+ zipfiles.hash=getziphash
+ zipfiles.list=getziplist
+ zipfiles.found=foundzipfile
+end
+if flate then do
+ local writecardinal1=files.writebyte
+ local writecardinal2=files.writecardinal2le
+ local writecardinal4=files.writecardinal4le
+ local logwriter=logs.writer
+ local globpattern=dir.globpattern
+ local compress=flate.flate_compress
+ local checksum=flate.update_crc32
+ local function fromdostime(dostime,dosdate)
+ return ostime {
+ year=rshift(dosdate,9)+1980,
+ month=band(rshift(dosdate,5),0x0F),
+ day=band((dosdate ),0x1F),
+ hour=band(rshift(dostime,11) ),
+ min=band(rshift(dostime,5),0x3F),
+ sec=band((dostime ),0x1F),
+ }
+ end
+ local function todostime(time)
+ local t=osdate("*t",time)
+ return
+ lshift(t.year-1980,9)+lshift(t.month,5)+t.day,
+ lshift(t.hour,11)+lshift(t.min,5)+rshift(t.sec,1)
+ end
+ local function openzip(filename,level,comment,verbose)
+ local f=ioopen(filename,"wb")
+ if f then
+ return {
+ filename=filename,
+ handle=f,
+ list={},
+ level=tonumber(level) or 3,
+ comment=tostring(comment),
+ verbose=verbose,
+ uncompressed=0,
+ compressed=0,
+ }
+ end
+ end
+ local function writezip(z,name,data,level,time)
+ local f=z.handle
+ local list=z.list
+ local level=tonumber(level) or z.level or 3
+ local method=8
+ local zipped=compress(data,level)
+ local checksum=checksum(data)
+ local verbose=z.verbose
+ if not zipped then
+ method=0
+ zipped=data
+ end
+ local start=f:seek()
+ local compressed=#zipped
+ local uncompressed=#data
+ z.compressed=z.compressed+compressed
+ z.uncompressed=z.uncompressed+uncompressed
+ if verbose then
+ local pct=100*compressed/uncompressed
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,name))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,name))
+ end
+ end
+ f:write("\x50\x4b\x03\x04")
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,method)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ f:write(name)
+ f:write(zipped)
+ list[#list+1]={ #zipped,#data,name,checksum,start,time or 0 }
+ end
+ local function closezip(z)
+ local f=z.handle
+ local list=z.list
+ local comment=z.comment
+ local verbose=z.verbose
+ local count=#list
+ local start=f:seek()
+ for i=1,count do
+ local l=list[i]
+ local compressed=l[1]
+ local uncompressed=l[2]
+ local name=l[3]
+ local checksum=l[4]
+ local start=l[5]
+ local time=l[6]
+ local date,time=todostime(time)
+ f:write('\x50\x4b\x01\x02')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,8)
+ writecardinal2(f,time)
+ writecardinal2(f,date)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,0)
+ writecardinal4(f,start)
+ f:write(name)
+ end
+ local stop=f:seek()
+ local size=stop-start
+ f:write('\x50\x4b\x05\x06')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,count)
+ writecardinal2(f,count)
+ writecardinal4(f,size)
+ writecardinal4(f,start)
+ if type(comment)=="string" and comment~="" then
+ writecardinal2(f,#comment)
+ f:write(comment)
+ else
+ writecardinal2(f,0)
+ end
+ if verbose then
+ local compressed=z.compressed
+ local uncompressed=z.uncompressed
+ local filename=z.filename
+ local pct=100*compressed/uncompressed
+ logwriter("")
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,filename))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,filename))
+ end
+ end
+ f:close()
+ end
+ local function zipdir(zipname,path,level,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ level=zipname.level
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ if not isdir(path) then
+ return
+ end
+ path=gsub(path,"\\+","/")
+ path=gsub(path,"/+","/")
+ local list={}
+ local count=0
+ globpattern(path,"",true,function(name,size,time)
+ count=count+1
+ list[count]={ name,time }
+ end)
+ sort(list,function(a,b)
+ return a[1]<b[1]
+ end)
+ local zipf=openzip(zipname,level,comment,verbose)
+ if zipf then
+ local p=#path+2
+ for i=1,count do
+ local li=list[i]
+ local name=li[1]
+ local time=li[2]
+ local data=loaddata(name)
+ local name=sub(name,p,#name)
+ writezip(zipf,name,data,level,time,verbose)
+ end
+ closezip(zipf)
+ end
+ end
+ local function unzipdir(zipname,path,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ local z=openzipfile(zipname)
+ if z then
+ local list=getziplist(z)
+ if list then
+ local total=0
+ local count=#list
+ local step=number.idiv(count,10)
+ local done=0
+ for i=1,count do
+ local l=list[i]
+ local n=l.filename
+ local d=unzipfile(z,n)
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if verbose=="steps" then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ end
+ elseif verbose then
+ logwriter(n)
+ end
+ savedata(p,d)
+ end
+ end
+ if verbose=="steps" then
+ logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ end
+ closezipfile(z)
+ return true
+ else
+ closezipfile(z)
+ end
+ end
+ end
+ zipfiles.zipdir=zipdir
+ zipfiles.unzipdir=unzipdir
+end end
+if flate then
+ local streams=utilities.streams
+ local openfile=streams.open
+ local closestream=streams.close
+ local setposition=streams.setposition
+ local getsize=streams.size
+ local readcardinal4=streams.readcardinal4le
+ local getstring=streams.getstring
+ local decompress=flate.gz_decompress
+ function zipfiles.gunzipfile(filename)
+ local strm=openfile(filename)
+ if strm then
+ setposition(strm,getsize(strm)-4+1)
+ local size=readcardinal4(strm)
+ local data=decompress(getstring(strm),size)
+ closestream(strm)
+ return data
+ end
+ end
+elseif gzip then
+ local openfile=gzip.open
+ function zipfiles.gunzipfile(filename)
+ local g=openfile(filename,"rb")
+ if g then
+ local d=g:read("*a")
+ d:close()
+ return d
+ end
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
-- original size: 60383, stripped down to: 35698
@@ -20103,7 +20645,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18105, stripped down to: 10389
+-- original size: 18154, stripped down to: 10416
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20310,9 +20852,11 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
local pattern=tolerant and lessweird or weird
local filelist={}
local noffiles=0
- for name in directory(full) do
+ for name,mode in directory(full) do
if not lpegmatch(pattern,name) then
- local mode=attributes(full..name,"mode")
+ if not mode then
+ mode=attributes(full..name,"mode")
+ end
if mode=="file" then
n=n+1
noffiles=noffiles+1
@@ -20793,7 +21337,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16116, stripped down to: 10782
+-- original size: 16284, stripped down to: 10938
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -20833,6 +21377,7 @@ caches.force=true
caches.ask=false
caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
+directives.register("system.caches.fast",function(v) caches.fast=true end)
local writable,readables,usedreadables=nil,{},{}
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
@@ -21066,7 +21611,9 @@ local saveoptions={ compact=true }
function caches.savedata(filepath,filename,data,raw)
local tmaname,tmcname=caches.setluanames(filepath,filename)
data.cache_uuid=os.uuid()
- if caches.direct then
+ if caches.fast then
+ file.savedata(tmaname,table.fastserialize(data,true))
+ elseif caches.direct then
file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
table.tofile(tmaname,data,true,saveoptions)
@@ -23400,7 +23947,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8700, stripped down to: 6313
+-- original size: 10263, stripped down to: 7556
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23419,6 +23966,65 @@ local archives=zip.archives or {}
zip.archives=archives
local registeredfiles=zip.registeredfiles or {}
zip.registeredfiles=registeredfiles
+local zipfiles=utilities.zipfiles
+local openzip,closezip,validfile,wholefile,filehandle,traversezip
+if zipfiles then
+ local ipairs=ipairs
+ openzip=zipfiles.open
+ closezip=zipfiles.close
+ validfile=zipfiles.found
+ wholefile=zipfiles.unzip
+ traversezip=function(zfile)
+ return ipairs(zipfiles.list(zfile))
+ end
+ local streams=utilities.streams
+ local openstream=streams.open
+ local readstring=streams.readstring
+ local streamsize=streams.size
+ local metatable={
+ close=streams.close,
+ read=function(stream,n)
+ readstring(stream,n=="*a" and streamsize(stream) or n)
+ end
+ }
+ filehandle=function(zfile,queryname)
+ local data=wholefile(zfile,queryname)
+ if data then
+ local stream=openstream(data)
+ if stream then
+ return setmetatableindex(stream,metatable)
+ end
+ end
+ end
+else
+ openzip=zip.open
+ closezip=zip.close
+ validfile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ dfile:close()
+ return true
+ end
+ return false
+ end
+ traversezip=function(zfile)
+ return z:files()
+ end
+ wholefile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ local s=dfile:read("*all")
+ dfile:close()
+ return s
+ end
+ end
+ filehandle=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ return dfile
+ end
+ end
+end
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -23433,7 +24039,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=full~="" and zip.open(full) or false
+ arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
@@ -23441,7 +24047,7 @@ function zip.openarchive(name)
end
function zip.closearchive(name)
if not name or (name=="" and archives[name]) then
- zip.close(archives[name])
+ closezip(archives[name])
archives[name]=nil
end
end
@@ -23482,9 +24088,7 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: archive %a found",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
- dfile:close()
+ if validfile(zfile,queryname) then
if trace_locating then
report_zip("finder: file %a found",queryname)
end
@@ -23514,12 +24118,12 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener; archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local handle=filehandle(zfile,queryname)
+ if handle then
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,dfile)
+ return resolvers.openers.helpers.textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -23545,15 +24149,13 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local data=wholefile(zfile,queryname)
+ if data then
logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
- local s=dfile:read("*all")
- dfile:close()
- return true,s,#s
+ return true,data,#data
elseif trace_locating then
report_zip("loader: file %a not found",queryname)
end
@@ -23600,7 +24202,7 @@ function resolvers.registerzipfile(z,tree)
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- for i in z:files() do
+ for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
@@ -24734,7 +25336,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9418, stripped down to: 7087
+-- original size: 9637, stripped down to: 7253
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -24804,6 +25406,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="make luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="make luajittex format",
program="luajittex",
@@ -24971,10 +25580,10 @@ end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 995501
--- stripped bytes : 395318
+-- original bytes : 1019480
+-- stripped bytes : 403728
-- end library merge
@@ -25055,6 +25664,8 @@ local ownlibs = { -- order can be made better
'util-env.lua',
'luat-env.lua', -- can come before inf (as in mkiv)
+ 'util-zip.lua',
+
'lxml-tab.lua',
'lxml-lpt.lua',
-- 'lxml-ent.lua',
diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua
index 15606e1e1..98fe7f752 100644
--- a/scripts/context/stubs/mswin/mtxrun.lua
+++ b/scripts/context/stubs/mswin/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6281, stripped down to: 2863
+-- original size: 6330, stripped down to: 2831
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -312,7 +312,6 @@ elseif not ffi.number then
ffi.number=tonumber
end
if LUAVERSION>5.3 then
- collectgarbage("generational")
end
@@ -3766,7 +3765,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 19347, stripped down to: 10258
+-- original size: 18916, stripped down to: 10126
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3933,16 +3932,6 @@ local launchers={
function os.launch(str)
execute(format(launchers[os.name] or launchers.unix,str))
end
-if not os.times then
- function os.times()
- return {
- utime=os.gettimeofday(),
- stime=0,
- cutime=0,
- cstime=0,
- }
- end
-end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
local startuptime=gettimeofday()
@@ -4218,7 +4207,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21804, stripped down to: 9980
+-- original size: 21984, stripped down to: 10148
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4398,40 +4387,45 @@ local reslasher=lpeg.replacer(P("\\"),"/")
function file.reslash(str)
return str and lpegmatch(reslasher,str)
end
-function file.is_writable(name)
- if not name then
- elseif lfs.isdir(name) then
- name=name.."/m_t_x_t_e_s_t.tmp"
- local f=io.open(name,"wb")
- if f then
- f:close()
- os.remove(name)
- return true
- end
- elseif lfs.isfile(name) then
- local f=io.open(name,"ab")
- if f then
- f:close()
- return true
- end
- else
- local f=io.open(name,"ab")
- if f then
- f:close()
- os.remove(name)
- return true
+if lfs.isreadablefile and lfs.iswritablefile then
+ file.is_readable=lfs.isreadablefile
+ file.is_writable=lfs.iswritablefile
+else
+ function file.is_writable(name)
+ if not name then
+ elseif lfs.isdir(name) then
+ name=name.."/m_t_x_t_e_s_t.tmp"
+ local f=io.open(name,"wb")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
+ elseif lfs.isfile(name) then
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ return true
+ end
+ else
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
end
- end
- return false
-end
-local readable=P("r")*Cc(true)
-function file.is_readable(name)
- if name then
- local a=attributes(name)
- return a and lpegmatch(readable,a.permissions) or false
- else
return false
end
+ local readable=P("r")*Cc(true)
+ function file.is_readable(name)
+ if name then
+ local a=attributes(name)
+ return a and lpegmatch(readable,a.permissions) or false
+ else
+ return false
+ end
+ end
end
file.isreadable=file.is_readable
file.iswritable=file.is_writable
@@ -5062,7 +5056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 18002, stripped down to: 10681
+-- original size: 18253, stripped down to: 10816
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -5127,13 +5121,15 @@ local function glob_pattern_function(path,patt,recurse,action)
end
local dirs
local nofdirs=0
- for name in walkdir(usedpath) do
+ for name,mode,size,time in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
- action(full)
+ action(full,size,time)
end
elseif recurse and mode=="directory" then
if dirs then
@@ -5169,10 +5165,12 @@ local function glob_pattern_table(path,patt,recurse,result)
local dirs
local nofdirs=0
local noffiles=#result
- for name,a in walkdir(usedpath) do
+ for name,mode in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
noffiles=noffiles+1
@@ -5223,7 +5221,7 @@ local function collectpattern(path,patt,recurse,result)
if not find(path,"/$") then
path=path..'/'
end
- for name in scanner,first do
+ for name in scanner,first do
if name=="." then
elseif name==".." then
else
@@ -5314,10 +5312,12 @@ local function globfiles(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if recurse then
globfiles(path.."/"..name,recurse,func,files)
@@ -5340,10 +5340,12 @@ local function globdirs(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if not func or func(name) then
noffiles=noffiles+1
@@ -5524,8 +5526,7 @@ local stack={}
function dir.push(newdir)
local curdir=currentdir()
insert(stack,curdir)
- if newdir and newdir~="" then
- chdir(newdir)
+ if newdir and newdir~="" and chdir(newdir) then
return newdir
else
return curdir
@@ -6466,7 +6467,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43538, stripped down to: 21641
+-- original size: 43488, stripped down to: 21595
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6482,7 +6483,6 @@ local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,s
local load,dump=load,string.dump
local tonumber,type,tostring,next,setmetatable=tonumber,type,tostring,next,setmetatable
local unpack,concat=table.unpack,table.concat
-local unpack,concat=table.unpack,table.concat
local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc
local patterns,lpegmatch=lpeg.patterns,lpeg.match
local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len
@@ -7307,7 +7307,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28810, stripped down to: 16134
+-- original size: 28866, stripped down to: 16134
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7971,7 +7971,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-fil"] = package.loaded["util-fil"] or true
--- original size: 8607, stripped down to: 6727
+-- original size: 11530, stripped down to: 9007
if not modules then modules={} end modules ['util-fil']={
version=1.001,
@@ -8180,6 +8180,32 @@ if bit32 then
local b=char(n%256)
f:write(b,a)
end
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
else
local floor=math.floor
function files.writecardinal2(f,n)
@@ -8188,16 +8214,32 @@ else
local b=char(n%256)
f:write(b,a)
end
-end
-function files.writecardinal4(f,n)
- local a=char(n%256)
- n=rshift(n,8)
- local b=char(n%256)
- n=rshift(n,8)
- local c=char(n%256)
- n=rshift(n,8)
- local d=char(n%256)
- f:write(d,c,b,a)
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
end
function files.writestring(f,s)
f:write(char(byte(s,1,#s)))
@@ -8210,10 +8252,18 @@ if fio and fio.readcardinal1 then
files.readcardinal2=fio.readcardinal2
files.readcardinal3=fio.readcardinal3
files.readcardinal4=fio.readcardinal4
+ files.readcardinal1le=fio.readcardinal1le or files.readcardinal1le
+ files.readcardinal2le=fio.readcardinal2le or files.readcardinal2le
+ files.readcardinal3le=fio.readcardinal3le or files.readcardinal3le
+ files.readcardinal4le=fio.readcardinal4le or files.readcardinal4le
files.readinteger1=fio.readinteger1
files.readinteger2=fio.readinteger2
files.readinteger3=fio.readinteger3
files.readinteger4=fio.readinteger4
+ files.readinteger1le=fio.readinteger1le or files.readinteger1le
+ files.readinteger2le=fio.readinteger2le or files.readinteger2le
+ files.readinteger3le=fio.readinteger3le or files.readinteger3le
+ files.readinteger4le=fio.readinteger4le or files.readinteger4le
files.readfixed2=fio.readfixed2
files.readfixed4=fio.readfixed4
files.read2dot14=fio.read2dot14
@@ -8234,6 +8284,24 @@ if fio and fio.readcardinal1 then
skipposition(f,4*(n or 1))
end
end
+if fio and fio.writecardinal1 then
+ files.writecardinal1=fio.writecardinal1
+ files.writecardinal2=fio.writecardinal2
+ files.writecardinal3=fio.writecardinal3
+ files.writecardinal4=fio.writecardinal4
+ files.writecardinal1le=fio.writecardinal1le
+ files.writecardinal2le=fio.writecardinal2le
+ files.writecardinal3le=fio.writecardinal3le
+ files.writecardinal4le=fio.writecardinal4le
+ files.writeinteger1=fio.writeinteger1 or fio.writecardinal1
+ files.writeinteger2=fio.writeinteger2 or fio.writecardinal2
+ files.writeinteger3=fio.writeinteger3 or fio.writecardinal3
+ files.writeinteger4=fio.writeinteger4 or fio.writecardinal4
+ files.writeinteger1le=files.writeinteger1le or fio.writecardinal1le
+ files.writeinteger2le=files.writeinteger2le or fio.writecardinal2le
+ files.writeinteger3le=files.writeinteger3le or fio.writecardinal3le
+ files.writeinteger4le=files.writeinteger4le or fio.writecardinal4le
+end
if fio and fio.readcardinaltable then
files.readcardinaltable=fio.readcardinaltable
files.readintegertable=fio.readintegertable
@@ -8271,7 +8339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11065, stripped down to: 8209
+-- original size: 11332, stripped down to: 8420
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8296,6 +8364,11 @@ function streams.openstring(f,zerobased)
return { f,1,#f,zerobased or false }
end
end
+function streams.getstring(f)
+ if f then
+ return f[1]
+ end
+end
function streams.close()
end
function streams.size(f)
@@ -8386,7 +8459,7 @@ function streams.readcardinal2(f)
local a,b=byte(f[1],i,j)
return 0x100*a+b
end
-function streams.readcardinal2LE(f)
+function streams.readcardinal2le(f)
local i=f[2]
local j=i+1
f[2]=j+1
@@ -8458,6 +8531,13 @@ function streams.readcardinal4(f)
local a,b,c,d=byte(f[1],i,j)
return 0x1000000*a+0x10000*b+0x100*c+d
end
+function streams.readcardinal4le(f)
+ local i=f[2]
+ local j=i+3
+ f[2]=j+1
+ local d,c,b,a=byte(f[1],i,j)
+ return 0x1000000*a+0x10000*b+0x100*c+d
+end
function streams.readinteger4(f)
local i=f[2]
local j=i+3
@@ -9545,13 +9625,13 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-socket"] = package.loaded["util-soc-imp-socket"] or true
--- original size: 4870, stripped down to: 3527
+-- original size: 4905, stripped down to: 3562
local type,tostring,setmetatable=type,tostring,setmetatable
local min=math.min
local format=string.format
-local socket=require("socket.core")
+local socket=socket or package.loaded.socket or require("socket.core")
local connect=socket.connect
local tcp4=socket.tcp4
local tcp6=socket.tcp6
@@ -10734,12 +10814,12 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-mime"] = package.loaded["util-soc-imp-mime"] or true
--- original size: 2328, stripped down to: 1874
+-- original size: 2373, stripped down to: 1931
local type,tostring=type,tostring
-local mime=require("mime.core")
-local ltn12=ltn12 or require("ltn12")
+local mime=mime or package.loaded.mime or require("mime.core")
+local ltn12=ltn12 or package.loaded.ltn12 or require("ltn12")
local filtercycle=ltn12.filter.cycle
local function report(fmt,first,...)
if logs then
@@ -12691,7 +12771,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32608, stripped down to: 20925
+-- original size: 32618, stripped down to: 20935
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12736,7 +12816,7 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
-if runningtex then
+if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
@@ -15613,6 +15693,468 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+package.loaded["util-zip"] = package.loaded["util-zip"] or true
+
+-- original size: 18645, stripped down to: 11291
+
+if not modules then modules={} end modules ['util-zip']={
+ version=1.001,
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local type,tostring,tonumber=type,tostring,tonumber
+local sort=table.sort
+local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
+local osdate,ostime=os.date,os.time
+local ioopen=io.open
+local loaddata,savedata=io.loaddata,io.savedata
+local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
+local files=utilities.files
+local openfile=files.open
+local closefile=files.close
+local readstring=files.readstring
+local readcardinal2=files.readcardinal2le
+local readcardinal4=files.readcardinal4le
+local setposition=files.setposition
+local getposition=files.getposition
+local band=bit32.band
+local rshift=bit32.rshift
+local lshift=bit32.lshift
+local decompress,calculatecrc
+if flate then
+ decompress=flate.flate_decompress
+ calculatecrc=flate.update_crc32
+else
+ local zlibdecompress=zlib.decompress
+ local zlibchecksum=zlib.crc32
+ decompress=function(source,targetsize)
+ local target=zlibdecompress(source,-15)
+ if target then
+ return target
+ else
+ return false,1
+ end
+ end
+ calculatecrc=function(buffer,initial)
+ return zlibchecksum(initial or 0,buffer)
+ end
+end
+local zipfiles={}
+utilities.zipfiles=zipfiles
+local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
+ function openzipfile(name)
+ return {
+ name=name,
+ handle=openfile(name,0),
+ }
+ end
+ local function collect(z)
+ if not z.list then
+ local list={}
+ local hash={}
+ local position=0
+ local index=0
+ local handle=z.handle
+ while true do
+ setposition(handle,position)
+ local signature=readstring(handle,4)
+ if signature=="PK\3\4" then
+ local version=readcardinal2(handle)
+ local flag=readcardinal2(handle)
+ local method=readcardinal2(handle)
+ local filetime=readcardinal2(handle)
+ local filedate=readcardinal2(handle)
+ local crc32=readcardinal4(handle)
+ local compressed=readcardinal4(handle)
+ local uncompressed=readcardinal4(handle)
+ local namelength=readcardinal2(handle)
+ local extralength=readcardinal2(handle)
+ local filename=readstring(handle,namelength)
+ local descriptor=band(flag,8)~=0
+ local encrypted=band(flag,1)~=0
+ local acceptable=method==0 or method==8
+ local skipped=0
+ local size=0
+ if encrypted then
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ skipbytes(8)
+ skipped=skipped+8
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ size=readcardinal4(handle)
+ skipbytes(size)
+ skipped=skipped+size+4
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ end
+ position=position+30+namelength+extralength+skipped
+ if descriptor then
+ setposition(handle,position+compressed)
+ crc32=readcardinal4(handle)
+ compressed=readcardinal4(handle)
+ uncompressed=readcardinal4(handle)
+ end
+ if acceptable then
+ index=index+1
+ local data={
+ filename=filename,
+ index=index,
+ position=position,
+ method=method,
+ compressed=compressed,
+ uncompressed=uncompressed,
+ crc32=crc32,
+ encrypted=encrypted,
+ }
+ hash[filename]=data
+ list[index]=data
+ else
+ end
+ position=position+compressed
+ else
+ break
+ end
+ z.list=list
+ z.hash=hash
+ end
+ end
+ end
+ function getziplist(z)
+ local list=z.list
+ if not list then
+ collect(z)
+ end
+ return z.list
+ end
+ function getziphash(z)
+ local hash=z.hash
+ if not hash then
+ collect(z)
+ end
+ return z.hash
+ end
+ function foundzipfile(z,name)
+ return getziphash(z)[name]
+ end
+ function closezipfile(z)
+ local f=z.handle
+ if f then
+ closefile(f)
+ z.handle=nil
+ end
+ end
+ function unzipfile(z,filename,check)
+ local hash=z.hash
+ if not hash then
+ hash=zipfiles.hash(z)
+ end
+ local data=hash[filename]
+ if not data then
+ end
+ if data then
+ local handle=z.handle
+ local position=data.position
+ local compressed=data.compressed
+ if compressed>0 then
+ setposition(handle,position)
+ local result=readstring(handle,compressed)
+ if data.method==8 then
+ result=decompress(result,data.uncompressed)
+ end
+ if check and data.crc32~=calculatecrc(result) then
+ print("checksum mismatch")
+ return ""
+ end
+ return result
+ else
+ return ""
+ end
+ end
+ end
+ zipfiles.open=openzipfile
+ zipfiles.close=closezipfile
+ zipfiles.unzip=unzipfile
+ zipfiles.hash=getziphash
+ zipfiles.list=getziplist
+ zipfiles.found=foundzipfile
+end
+if flate then do
+ local writecardinal1=files.writebyte
+ local writecardinal2=files.writecardinal2le
+ local writecardinal4=files.writecardinal4le
+ local logwriter=logs.writer
+ local globpattern=dir.globpattern
+ local compress=flate.flate_compress
+ local checksum=flate.update_crc32
+ local function fromdostime(dostime,dosdate)
+ return ostime {
+ year=rshift(dosdate,9)+1980,
+ month=band(rshift(dosdate,5),0x0F),
+ day=band((dosdate ),0x1F),
+ hour=band(rshift(dostime,11) ),
+ min=band(rshift(dostime,5),0x3F),
+ sec=band((dostime ),0x1F),
+ }
+ end
+ local function todostime(time)
+ local t=osdate("*t",time)
+ return
+ lshift(t.year-1980,9)+lshift(t.month,5)+t.day,
+ lshift(t.hour,11)+lshift(t.min,5)+rshift(t.sec,1)
+ end
+ local function openzip(filename,level,comment,verbose)
+ local f=ioopen(filename,"wb")
+ if f then
+ return {
+ filename=filename,
+ handle=f,
+ list={},
+ level=tonumber(level) or 3,
+ comment=tostring(comment),
+ verbose=verbose,
+ uncompressed=0,
+ compressed=0,
+ }
+ end
+ end
+ local function writezip(z,name,data,level,time)
+ local f=z.handle
+ local list=z.list
+ local level=tonumber(level) or z.level or 3
+ local method=8
+ local zipped=compress(data,level)
+ local checksum=checksum(data)
+ local verbose=z.verbose
+ if not zipped then
+ method=0
+ zipped=data
+ end
+ local start=f:seek()
+ local compressed=#zipped
+ local uncompressed=#data
+ z.compressed=z.compressed+compressed
+ z.uncompressed=z.uncompressed+uncompressed
+ if verbose then
+ local pct=100*compressed/uncompressed
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,name))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,name))
+ end
+ end
+ f:write("\x50\x4b\x03\x04")
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,method)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ f:write(name)
+ f:write(zipped)
+ list[#list+1]={ #zipped,#data,name,checksum,start,time or 0 }
+ end
+ local function closezip(z)
+ local f=z.handle
+ local list=z.list
+ local comment=z.comment
+ local verbose=z.verbose
+ local count=#list
+ local start=f:seek()
+ for i=1,count do
+ local l=list[i]
+ local compressed=l[1]
+ local uncompressed=l[2]
+ local name=l[3]
+ local checksum=l[4]
+ local start=l[5]
+ local time=l[6]
+ local date,time=todostime(time)
+ f:write('\x50\x4b\x01\x02')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,8)
+ writecardinal2(f,time)
+ writecardinal2(f,date)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,0)
+ writecardinal4(f,start)
+ f:write(name)
+ end
+ local stop=f:seek()
+ local size=stop-start
+ f:write('\x50\x4b\x05\x06')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,count)
+ writecardinal2(f,count)
+ writecardinal4(f,size)
+ writecardinal4(f,start)
+ if type(comment)=="string" and comment~="" then
+ writecardinal2(f,#comment)
+ f:write(comment)
+ else
+ writecardinal2(f,0)
+ end
+ if verbose then
+ local compressed=z.compressed
+ local uncompressed=z.uncompressed
+ local filename=z.filename
+ local pct=100*compressed/uncompressed
+ logwriter("")
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,filename))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,filename))
+ end
+ end
+ f:close()
+ end
+ local function zipdir(zipname,path,level,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ level=zipname.level
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ if not isdir(path) then
+ return
+ end
+ path=gsub(path,"\\+","/")
+ path=gsub(path,"/+","/")
+ local list={}
+ local count=0
+ globpattern(path,"",true,function(name,size,time)
+ count=count+1
+ list[count]={ name,time }
+ end)
+ sort(list,function(a,b)
+ return a[1]<b[1]
+ end)
+ local zipf=openzip(zipname,level,comment,verbose)
+ if zipf then
+ local p=#path+2
+ for i=1,count do
+ local li=list[i]
+ local name=li[1]
+ local time=li[2]
+ local data=loaddata(name)
+ local name=sub(name,p,#name)
+ writezip(zipf,name,data,level,time,verbose)
+ end
+ closezip(zipf)
+ end
+ end
+ local function unzipdir(zipname,path,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ local z=openzipfile(zipname)
+ if z then
+ local list=getziplist(z)
+ if list then
+ local total=0
+ local count=#list
+ local step=number.idiv(count,10)
+ local done=0
+ for i=1,count do
+ local l=list[i]
+ local n=l.filename
+ local d=unzipfile(z,n)
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if verbose=="steps" then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ end
+ elseif verbose then
+ logwriter(n)
+ end
+ savedata(p,d)
+ end
+ end
+ if verbose=="steps" then
+ logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ end
+ closezipfile(z)
+ return true
+ else
+ closezipfile(z)
+ end
+ end
+ end
+ zipfiles.zipdir=zipdir
+ zipfiles.unzipdir=unzipdir
+end end
+if flate then
+ local streams=utilities.streams
+ local openfile=streams.open
+ local closestream=streams.close
+ local setposition=streams.setposition
+ local getsize=streams.size
+ local readcardinal4=streams.readcardinal4le
+ local getstring=streams.getstring
+ local decompress=flate.gz_decompress
+ function zipfiles.gunzipfile(filename)
+ local strm=openfile(filename)
+ if strm then
+ setposition(strm,getsize(strm)-4+1)
+ local size=readcardinal4(strm)
+ local data=decompress(getstring(strm),size)
+ closestream(strm)
+ return data
+ end
+ end
+elseif gzip then
+ local openfile=gzip.open
+ function zipfiles.gunzipfile(filename)
+ local g=openfile(filename,"rb")
+ if g then
+ local d=g:read("*a")
+ d:close()
+ return d
+ end
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
-- original size: 60383, stripped down to: 35698
@@ -20103,7 +20645,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18105, stripped down to: 10389
+-- original size: 18154, stripped down to: 10416
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20310,9 +20852,11 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
local pattern=tolerant and lessweird or weird
local filelist={}
local noffiles=0
- for name in directory(full) do
+ for name,mode in directory(full) do
if not lpegmatch(pattern,name) then
- local mode=attributes(full..name,"mode")
+ if not mode then
+ mode=attributes(full..name,"mode")
+ end
if mode=="file" then
n=n+1
noffiles=noffiles+1
@@ -20793,7 +21337,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16116, stripped down to: 10782
+-- original size: 16284, stripped down to: 10938
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -20833,6 +21377,7 @@ caches.force=true
caches.ask=false
caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
+directives.register("system.caches.fast",function(v) caches.fast=true end)
local writable,readables,usedreadables=nil,{},{}
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
@@ -21066,7 +21611,9 @@ local saveoptions={ compact=true }
function caches.savedata(filepath,filename,data,raw)
local tmaname,tmcname=caches.setluanames(filepath,filename)
data.cache_uuid=os.uuid()
- if caches.direct then
+ if caches.fast then
+ file.savedata(tmaname,table.fastserialize(data,true))
+ elseif caches.direct then
file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
table.tofile(tmaname,data,true,saveoptions)
@@ -23400,7 +23947,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8700, stripped down to: 6313
+-- original size: 10263, stripped down to: 7556
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23419,6 +23966,65 @@ local archives=zip.archives or {}
zip.archives=archives
local registeredfiles=zip.registeredfiles or {}
zip.registeredfiles=registeredfiles
+local zipfiles=utilities.zipfiles
+local openzip,closezip,validfile,wholefile,filehandle,traversezip
+if zipfiles then
+ local ipairs=ipairs
+ openzip=zipfiles.open
+ closezip=zipfiles.close
+ validfile=zipfiles.found
+ wholefile=zipfiles.unzip
+ traversezip=function(zfile)
+ return ipairs(zipfiles.list(zfile))
+ end
+ local streams=utilities.streams
+ local openstream=streams.open
+ local readstring=streams.readstring
+ local streamsize=streams.size
+ local metatable={
+ close=streams.close,
+ read=function(stream,n)
+ readstring(stream,n=="*a" and streamsize(stream) or n)
+ end
+ }
+ filehandle=function(zfile,queryname)
+ local data=wholefile(zfile,queryname)
+ if data then
+ local stream=openstream(data)
+ if stream then
+ return setmetatableindex(stream,metatable)
+ end
+ end
+ end
+else
+ openzip=zip.open
+ closezip=zip.close
+ validfile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ dfile:close()
+ return true
+ end
+ return false
+ end
+ traversezip=function(zfile)
+ return z:files()
+ end
+ wholefile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ local s=dfile:read("*all")
+ dfile:close()
+ return s
+ end
+ end
+ filehandle=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ return dfile
+ end
+ end
+end
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -23433,7 +24039,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=full~="" and zip.open(full) or false
+ arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
@@ -23441,7 +24047,7 @@ function zip.openarchive(name)
end
function zip.closearchive(name)
if not name or (name=="" and archives[name]) then
- zip.close(archives[name])
+ closezip(archives[name])
archives[name]=nil
end
end
@@ -23482,9 +24088,7 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: archive %a found",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
- dfile:close()
+ if validfile(zfile,queryname) then
if trace_locating then
report_zip("finder: file %a found",queryname)
end
@@ -23514,12 +24118,12 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener; archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local handle=filehandle(zfile,queryname)
+ if handle then
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,dfile)
+ return resolvers.openers.helpers.textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -23545,15 +24149,13 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local data=wholefile(zfile,queryname)
+ if data then
logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
- local s=dfile:read("*all")
- dfile:close()
- return true,s,#s
+ return true,data,#data
elseif trace_locating then
report_zip("loader: file %a not found",queryname)
end
@@ -23600,7 +24202,7 @@ function resolvers.registerzipfile(z,tree)
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- for i in z:files() do
+ for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
@@ -24734,7 +25336,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9418, stripped down to: 7087
+-- original size: 9637, stripped down to: 7253
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -24804,6 +25406,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="make luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="make luajittex format",
program="luajittex",
@@ -24971,10 +25580,10 @@ end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 995501
--- stripped bytes : 395318
+-- original bytes : 1019480
+-- stripped bytes : 403728
-- end library merge
@@ -25055,6 +25664,8 @@ local ownlibs = { -- order can be made better
'util-env.lua',
'luat-env.lua', -- can come before inf (as in mkiv)
+ 'util-zip.lua',
+
'lxml-tab.lua',
'lxml-lpt.lua',
-- 'lxml-ent.lua',
diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun
index 15606e1e1..98fe7f752 100644
--- a/scripts/context/stubs/unix/mtxrun
+++ b/scripts/context/stubs/unix/mtxrun
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6281, stripped down to: 2863
+-- original size: 6330, stripped down to: 2831
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -312,7 +312,6 @@ elseif not ffi.number then
ffi.number=tonumber
end
if LUAVERSION>5.3 then
- collectgarbage("generational")
end
@@ -3766,7 +3765,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 19347, stripped down to: 10258
+-- original size: 18916, stripped down to: 10126
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3933,16 +3932,6 @@ local launchers={
function os.launch(str)
execute(format(launchers[os.name] or launchers.unix,str))
end
-if not os.times then
- function os.times()
- return {
- utime=os.gettimeofday(),
- stime=0,
- cutime=0,
- cstime=0,
- }
- end
-end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
local startuptime=gettimeofday()
@@ -4218,7 +4207,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21804, stripped down to: 9980
+-- original size: 21984, stripped down to: 10148
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4398,40 +4387,45 @@ local reslasher=lpeg.replacer(P("\\"),"/")
function file.reslash(str)
return str and lpegmatch(reslasher,str)
end
-function file.is_writable(name)
- if not name then
- elseif lfs.isdir(name) then
- name=name.."/m_t_x_t_e_s_t.tmp"
- local f=io.open(name,"wb")
- if f then
- f:close()
- os.remove(name)
- return true
- end
- elseif lfs.isfile(name) then
- local f=io.open(name,"ab")
- if f then
- f:close()
- return true
- end
- else
- local f=io.open(name,"ab")
- if f then
- f:close()
- os.remove(name)
- return true
+if lfs.isreadablefile and lfs.iswritablefile then
+ file.is_readable=lfs.isreadablefile
+ file.is_writable=lfs.iswritablefile
+else
+ function file.is_writable(name)
+ if not name then
+ elseif lfs.isdir(name) then
+ name=name.."/m_t_x_t_e_s_t.tmp"
+ local f=io.open(name,"wb")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
+ elseif lfs.isfile(name) then
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ return true
+ end
+ else
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
end
- end
- return false
-end
-local readable=P("r")*Cc(true)
-function file.is_readable(name)
- if name then
- local a=attributes(name)
- return a and lpegmatch(readable,a.permissions) or false
- else
return false
end
+ local readable=P("r")*Cc(true)
+ function file.is_readable(name)
+ if name then
+ local a=attributes(name)
+ return a and lpegmatch(readable,a.permissions) or false
+ else
+ return false
+ end
+ end
end
file.isreadable=file.is_readable
file.iswritable=file.is_writable
@@ -5062,7 +5056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 18002, stripped down to: 10681
+-- original size: 18253, stripped down to: 10816
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -5127,13 +5121,15 @@ local function glob_pattern_function(path,patt,recurse,action)
end
local dirs
local nofdirs=0
- for name in walkdir(usedpath) do
+ for name,mode,size,time in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
- action(full)
+ action(full,size,time)
end
elseif recurse and mode=="directory" then
if dirs then
@@ -5169,10 +5165,12 @@ local function glob_pattern_table(path,patt,recurse,result)
local dirs
local nofdirs=0
local noffiles=#result
- for name,a in walkdir(usedpath) do
+ for name,mode in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
noffiles=noffiles+1
@@ -5223,7 +5221,7 @@ local function collectpattern(path,patt,recurse,result)
if not find(path,"/$") then
path=path..'/'
end
- for name in scanner,first do
+ for name in scanner,first do
if name=="." then
elseif name==".." then
else
@@ -5314,10 +5312,12 @@ local function globfiles(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if recurse then
globfiles(path.."/"..name,recurse,func,files)
@@ -5340,10 +5340,12 @@ local function globdirs(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if not func or func(name) then
noffiles=noffiles+1
@@ -5524,8 +5526,7 @@ local stack={}
function dir.push(newdir)
local curdir=currentdir()
insert(stack,curdir)
- if newdir and newdir~="" then
- chdir(newdir)
+ if newdir and newdir~="" and chdir(newdir) then
return newdir
else
return curdir
@@ -6466,7 +6467,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43538, stripped down to: 21641
+-- original size: 43488, stripped down to: 21595
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6482,7 +6483,6 @@ local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,s
local load,dump=load,string.dump
local tonumber,type,tostring,next,setmetatable=tonumber,type,tostring,next,setmetatable
local unpack,concat=table.unpack,table.concat
-local unpack,concat=table.unpack,table.concat
local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc
local patterns,lpegmatch=lpeg.patterns,lpeg.match
local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len
@@ -7307,7 +7307,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28810, stripped down to: 16134
+-- original size: 28866, stripped down to: 16134
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7971,7 +7971,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-fil"] = package.loaded["util-fil"] or true
--- original size: 8607, stripped down to: 6727
+-- original size: 11530, stripped down to: 9007
if not modules then modules={} end modules ['util-fil']={
version=1.001,
@@ -8180,6 +8180,32 @@ if bit32 then
local b=char(n%256)
f:write(b,a)
end
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
else
local floor=math.floor
function files.writecardinal2(f,n)
@@ -8188,16 +8214,32 @@ else
local b=char(n%256)
f:write(b,a)
end
-end
-function files.writecardinal4(f,n)
- local a=char(n%256)
- n=rshift(n,8)
- local b=char(n%256)
- n=rshift(n,8)
- local c=char(n%256)
- n=rshift(n,8)
- local d=char(n%256)
- f:write(d,c,b,a)
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
end
function files.writestring(f,s)
f:write(char(byte(s,1,#s)))
@@ -8210,10 +8252,18 @@ if fio and fio.readcardinal1 then
files.readcardinal2=fio.readcardinal2
files.readcardinal3=fio.readcardinal3
files.readcardinal4=fio.readcardinal4
+ files.readcardinal1le=fio.readcardinal1le or files.readcardinal1le
+ files.readcardinal2le=fio.readcardinal2le or files.readcardinal2le
+ files.readcardinal3le=fio.readcardinal3le or files.readcardinal3le
+ files.readcardinal4le=fio.readcardinal4le or files.readcardinal4le
files.readinteger1=fio.readinteger1
files.readinteger2=fio.readinteger2
files.readinteger3=fio.readinteger3
files.readinteger4=fio.readinteger4
+ files.readinteger1le=fio.readinteger1le or files.readinteger1le
+ files.readinteger2le=fio.readinteger2le or files.readinteger2le
+ files.readinteger3le=fio.readinteger3le or files.readinteger3le
+ files.readinteger4le=fio.readinteger4le or files.readinteger4le
files.readfixed2=fio.readfixed2
files.readfixed4=fio.readfixed4
files.read2dot14=fio.read2dot14
@@ -8234,6 +8284,24 @@ if fio and fio.readcardinal1 then
skipposition(f,4*(n or 1))
end
end
+if fio and fio.writecardinal1 then
+ files.writecardinal1=fio.writecardinal1
+ files.writecardinal2=fio.writecardinal2
+ files.writecardinal3=fio.writecardinal3
+ files.writecardinal4=fio.writecardinal4
+ files.writecardinal1le=fio.writecardinal1le
+ files.writecardinal2le=fio.writecardinal2le
+ files.writecardinal3le=fio.writecardinal3le
+ files.writecardinal4le=fio.writecardinal4le
+ files.writeinteger1=fio.writeinteger1 or fio.writecardinal1
+ files.writeinteger2=fio.writeinteger2 or fio.writecardinal2
+ files.writeinteger3=fio.writeinteger3 or fio.writecardinal3
+ files.writeinteger4=fio.writeinteger4 or fio.writecardinal4
+ files.writeinteger1le=files.writeinteger1le or fio.writecardinal1le
+ files.writeinteger2le=files.writeinteger2le or fio.writecardinal2le
+ files.writeinteger3le=files.writeinteger3le or fio.writecardinal3le
+ files.writeinteger4le=files.writeinteger4le or fio.writecardinal4le
+end
if fio and fio.readcardinaltable then
files.readcardinaltable=fio.readcardinaltable
files.readintegertable=fio.readintegertable
@@ -8271,7 +8339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11065, stripped down to: 8209
+-- original size: 11332, stripped down to: 8420
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8296,6 +8364,11 @@ function streams.openstring(f,zerobased)
return { f,1,#f,zerobased or false }
end
end
+function streams.getstring(f)
+ if f then
+ return f[1]
+ end
+end
function streams.close()
end
function streams.size(f)
@@ -8386,7 +8459,7 @@ function streams.readcardinal2(f)
local a,b=byte(f[1],i,j)
return 0x100*a+b
end
-function streams.readcardinal2LE(f)
+function streams.readcardinal2le(f)
local i=f[2]
local j=i+1
f[2]=j+1
@@ -8458,6 +8531,13 @@ function streams.readcardinal4(f)
local a,b,c,d=byte(f[1],i,j)
return 0x1000000*a+0x10000*b+0x100*c+d
end
+function streams.readcardinal4le(f)
+ local i=f[2]
+ local j=i+3
+ f[2]=j+1
+ local d,c,b,a=byte(f[1],i,j)
+ return 0x1000000*a+0x10000*b+0x100*c+d
+end
function streams.readinteger4(f)
local i=f[2]
local j=i+3
@@ -9545,13 +9625,13 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-socket"] = package.loaded["util-soc-imp-socket"] or true
--- original size: 4870, stripped down to: 3527
+-- original size: 4905, stripped down to: 3562
local type,tostring,setmetatable=type,tostring,setmetatable
local min=math.min
local format=string.format
-local socket=require("socket.core")
+local socket=socket or package.loaded.socket or require("socket.core")
local connect=socket.connect
local tcp4=socket.tcp4
local tcp6=socket.tcp6
@@ -10734,12 +10814,12 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-mime"] = package.loaded["util-soc-imp-mime"] or true
--- original size: 2328, stripped down to: 1874
+-- original size: 2373, stripped down to: 1931
local type,tostring=type,tostring
-local mime=require("mime.core")
-local ltn12=ltn12 or require("ltn12")
+local mime=mime or package.loaded.mime or require("mime.core")
+local ltn12=ltn12 or package.loaded.ltn12 or require("ltn12")
local filtercycle=ltn12.filter.cycle
local function report(fmt,first,...)
if logs then
@@ -12691,7 +12771,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32608, stripped down to: 20925
+-- original size: 32618, stripped down to: 20935
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12736,7 +12816,7 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
-if runningtex then
+if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
@@ -15613,6 +15693,468 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+package.loaded["util-zip"] = package.loaded["util-zip"] or true
+
+-- original size: 18645, stripped down to: 11291
+
+if not modules then modules={} end modules ['util-zip']={
+ version=1.001,
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local type,tostring,tonumber=type,tostring,tonumber
+local sort=table.sort
+local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
+local osdate,ostime=os.date,os.time
+local ioopen=io.open
+local loaddata,savedata=io.loaddata,io.savedata
+local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
+local files=utilities.files
+local openfile=files.open
+local closefile=files.close
+local readstring=files.readstring
+local readcardinal2=files.readcardinal2le
+local readcardinal4=files.readcardinal4le
+local setposition=files.setposition
+local getposition=files.getposition
+local band=bit32.band
+local rshift=bit32.rshift
+local lshift=bit32.lshift
+local decompress,calculatecrc
+if flate then
+ decompress=flate.flate_decompress
+ calculatecrc=flate.update_crc32
+else
+ local zlibdecompress=zlib.decompress
+ local zlibchecksum=zlib.crc32
+ decompress=function(source,targetsize)
+ local target=zlibdecompress(source,-15)
+ if target then
+ return target
+ else
+ return false,1
+ end
+ end
+ calculatecrc=function(buffer,initial)
+ return zlibchecksum(initial or 0,buffer)
+ end
+end
+local zipfiles={}
+utilities.zipfiles=zipfiles
+local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
+ function openzipfile(name)
+ return {
+ name=name,
+ handle=openfile(name,0),
+ }
+ end
+ local function collect(z)
+ if not z.list then
+ local list={}
+ local hash={}
+ local position=0
+ local index=0
+ local handle=z.handle
+ while true do
+ setposition(handle,position)
+ local signature=readstring(handle,4)
+ if signature=="PK\3\4" then
+ local version=readcardinal2(handle)
+ local flag=readcardinal2(handle)
+ local method=readcardinal2(handle)
+ local filetime=readcardinal2(handle)
+ local filedate=readcardinal2(handle)
+ local crc32=readcardinal4(handle)
+ local compressed=readcardinal4(handle)
+ local uncompressed=readcardinal4(handle)
+ local namelength=readcardinal2(handle)
+ local extralength=readcardinal2(handle)
+ local filename=readstring(handle,namelength)
+ local descriptor=band(flag,8)~=0
+ local encrypted=band(flag,1)~=0
+ local acceptable=method==0 or method==8
+ local skipped=0
+ local size=0
+ if encrypted then
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ skipbytes(8)
+ skipped=skipped+8
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ size=readcardinal4(handle)
+ skipbytes(size)
+ skipped=skipped+size+4
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ end
+ position=position+30+namelength+extralength+skipped
+ if descriptor then
+ setposition(handle,position+compressed)
+ crc32=readcardinal4(handle)
+ compressed=readcardinal4(handle)
+ uncompressed=readcardinal4(handle)
+ end
+ if acceptable then
+ index=index+1
+ local data={
+ filename=filename,
+ index=index,
+ position=position,
+ method=method,
+ compressed=compressed,
+ uncompressed=uncompressed,
+ crc32=crc32,
+ encrypted=encrypted,
+ }
+ hash[filename]=data
+ list[index]=data
+ else
+ end
+ position=position+compressed
+ else
+ break
+ end
+ z.list=list
+ z.hash=hash
+ end
+ end
+ end
+ function getziplist(z)
+ local list=z.list
+ if not list then
+ collect(z)
+ end
+ return z.list
+ end
+ function getziphash(z)
+ local hash=z.hash
+ if not hash then
+ collect(z)
+ end
+ return z.hash
+ end
+ function foundzipfile(z,name)
+ return getziphash(z)[name]
+ end
+ function closezipfile(z)
+ local f=z.handle
+ if f then
+ closefile(f)
+ z.handle=nil
+ end
+ end
+ function unzipfile(z,filename,check)
+ local hash=z.hash
+ if not hash then
+ hash=zipfiles.hash(z)
+ end
+ local data=hash[filename]
+ if not data then
+ end
+ if data then
+ local handle=z.handle
+ local position=data.position
+ local compressed=data.compressed
+ if compressed>0 then
+ setposition(handle,position)
+ local result=readstring(handle,compressed)
+ if data.method==8 then
+ result=decompress(result,data.uncompressed)
+ end
+ if check and data.crc32~=calculatecrc(result) then
+ print("checksum mismatch")
+ return ""
+ end
+ return result
+ else
+ return ""
+ end
+ end
+ end
+ zipfiles.open=openzipfile
+ zipfiles.close=closezipfile
+ zipfiles.unzip=unzipfile
+ zipfiles.hash=getziphash
+ zipfiles.list=getziplist
+ zipfiles.found=foundzipfile
+end
+if flate then do
+ local writecardinal1=files.writebyte
+ local writecardinal2=files.writecardinal2le
+ local writecardinal4=files.writecardinal4le
+ local logwriter=logs.writer
+ local globpattern=dir.globpattern
+ local compress=flate.flate_compress
+ local checksum=flate.update_crc32
+ local function fromdostime(dostime,dosdate)
+ return ostime {
+ year=rshift(dosdate,9)+1980,
+ month=band(rshift(dosdate,5),0x0F),
+ day=band((dosdate ),0x1F),
+ hour=band(rshift(dostime,11) ),
+ min=band(rshift(dostime,5),0x3F),
+ sec=band((dostime ),0x1F),
+ }
+ end
+ local function todostime(time)
+ local t=osdate("*t",time)
+ return
+ lshift(t.year-1980,9)+lshift(t.month,5)+t.day,
+ lshift(t.hour,11)+lshift(t.min,5)+rshift(t.sec,1)
+ end
+ local function openzip(filename,level,comment,verbose)
+ local f=ioopen(filename,"wb")
+ if f then
+ return {
+ filename=filename,
+ handle=f,
+ list={},
+ level=tonumber(level) or 3,
+ comment=tostring(comment),
+ verbose=verbose,
+ uncompressed=0,
+ compressed=0,
+ }
+ end
+ end
+ local function writezip(z,name,data,level,time)
+ local f=z.handle
+ local list=z.list
+ local level=tonumber(level) or z.level or 3
+ local method=8
+ local zipped=compress(data,level)
+ local checksum=checksum(data)
+ local verbose=z.verbose
+ if not zipped then
+ method=0
+ zipped=data
+ end
+ local start=f:seek()
+ local compressed=#zipped
+ local uncompressed=#data
+ z.compressed=z.compressed+compressed
+ z.uncompressed=z.uncompressed+uncompressed
+ if verbose then
+ local pct=100*compressed/uncompressed
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,name))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,name))
+ end
+ end
+ f:write("\x50\x4b\x03\x04")
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,method)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ f:write(name)
+ f:write(zipped)
+ list[#list+1]={ #zipped,#data,name,checksum,start,time or 0 }
+ end
+ local function closezip(z)
+ local f=z.handle
+ local list=z.list
+ local comment=z.comment
+ local verbose=z.verbose
+ local count=#list
+ local start=f:seek()
+ for i=1,count do
+ local l=list[i]
+ local compressed=l[1]
+ local uncompressed=l[2]
+ local name=l[3]
+ local checksum=l[4]
+ local start=l[5]
+ local time=l[6]
+ local date,time=todostime(time)
+ f:write('\x50\x4b\x01\x02')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,8)
+ writecardinal2(f,time)
+ writecardinal2(f,date)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,0)
+ writecardinal4(f,start)
+ f:write(name)
+ end
+ local stop=f:seek()
+ local size=stop-start
+ f:write('\x50\x4b\x05\x06')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,count)
+ writecardinal2(f,count)
+ writecardinal4(f,size)
+ writecardinal4(f,start)
+ if type(comment)=="string" and comment~="" then
+ writecardinal2(f,#comment)
+ f:write(comment)
+ else
+ writecardinal2(f,0)
+ end
+ if verbose then
+ local compressed=z.compressed
+ local uncompressed=z.uncompressed
+ local filename=z.filename
+ local pct=100*compressed/uncompressed
+ logwriter("")
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,filename))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,filename))
+ end
+ end
+ f:close()
+ end
+ local function zipdir(zipname,path,level,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ level=zipname.level
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ if not isdir(path) then
+ return
+ end
+ path=gsub(path,"\\+","/")
+ path=gsub(path,"/+","/")
+ local list={}
+ local count=0
+ globpattern(path,"",true,function(name,size,time)
+ count=count+1
+ list[count]={ name,time }
+ end)
+ sort(list,function(a,b)
+ return a[1]<b[1]
+ end)
+ local zipf=openzip(zipname,level,comment,verbose)
+ if zipf then
+ local p=#path+2
+ for i=1,count do
+ local li=list[i]
+ local name=li[1]
+ local time=li[2]
+ local data=loaddata(name)
+ local name=sub(name,p,#name)
+ writezip(zipf,name,data,level,time,verbose)
+ end
+ closezip(zipf)
+ end
+ end
+ local function unzipdir(zipname,path,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ local z=openzipfile(zipname)
+ if z then
+ local list=getziplist(z)
+ if list then
+ local total=0
+ local count=#list
+ local step=number.idiv(count,10)
+ local done=0
+ for i=1,count do
+ local l=list[i]
+ local n=l.filename
+ local d=unzipfile(z,n)
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if verbose=="steps" then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ end
+ elseif verbose then
+ logwriter(n)
+ end
+ savedata(p,d)
+ end
+ end
+ if verbose=="steps" then
+ logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ end
+ closezipfile(z)
+ return true
+ else
+ closezipfile(z)
+ end
+ end
+ end
+ zipfiles.zipdir=zipdir
+ zipfiles.unzipdir=unzipdir
+end end
+if flate then
+ local streams=utilities.streams
+ local openfile=streams.open
+ local closestream=streams.close
+ local setposition=streams.setposition
+ local getsize=streams.size
+ local readcardinal4=streams.readcardinal4le
+ local getstring=streams.getstring
+ local decompress=flate.gz_decompress
+ function zipfiles.gunzipfile(filename)
+ local strm=openfile(filename)
+ if strm then
+ setposition(strm,getsize(strm)-4+1)
+ local size=readcardinal4(strm)
+ local data=decompress(getstring(strm),size)
+ closestream(strm)
+ return data
+ end
+ end
+elseif gzip then
+ local openfile=gzip.open
+ function zipfiles.gunzipfile(filename)
+ local g=openfile(filename,"rb")
+ if g then
+ local d=g:read("*a")
+ d:close()
+ return d
+ end
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
-- original size: 60383, stripped down to: 35698
@@ -20103,7 +20645,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18105, stripped down to: 10389
+-- original size: 18154, stripped down to: 10416
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20310,9 +20852,11 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
local pattern=tolerant and lessweird or weird
local filelist={}
local noffiles=0
- for name in directory(full) do
+ for name,mode in directory(full) do
if not lpegmatch(pattern,name) then
- local mode=attributes(full..name,"mode")
+ if not mode then
+ mode=attributes(full..name,"mode")
+ end
if mode=="file" then
n=n+1
noffiles=noffiles+1
@@ -20793,7 +21337,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16116, stripped down to: 10782
+-- original size: 16284, stripped down to: 10938
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -20833,6 +21377,7 @@ caches.force=true
caches.ask=false
caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
+directives.register("system.caches.fast",function(v) caches.fast=true end)
local writable,readables,usedreadables=nil,{},{}
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
@@ -21066,7 +21611,9 @@ local saveoptions={ compact=true }
function caches.savedata(filepath,filename,data,raw)
local tmaname,tmcname=caches.setluanames(filepath,filename)
data.cache_uuid=os.uuid()
- if caches.direct then
+ if caches.fast then
+ file.savedata(tmaname,table.fastserialize(data,true))
+ elseif caches.direct then
file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
table.tofile(tmaname,data,true,saveoptions)
@@ -23400,7 +23947,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8700, stripped down to: 6313
+-- original size: 10263, stripped down to: 7556
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23419,6 +23966,65 @@ local archives=zip.archives or {}
zip.archives=archives
local registeredfiles=zip.registeredfiles or {}
zip.registeredfiles=registeredfiles
+local zipfiles=utilities.zipfiles
+local openzip,closezip,validfile,wholefile,filehandle,traversezip
+if zipfiles then
+ local ipairs=ipairs
+ openzip=zipfiles.open
+ closezip=zipfiles.close
+ validfile=zipfiles.found
+ wholefile=zipfiles.unzip
+ traversezip=function(zfile)
+ return ipairs(zipfiles.list(zfile))
+ end
+ local streams=utilities.streams
+ local openstream=streams.open
+ local readstring=streams.readstring
+ local streamsize=streams.size
+ local metatable={
+ close=streams.close,
+ read=function(stream,n)
+ readstring(stream,n=="*a" and streamsize(stream) or n)
+ end
+ }
+ filehandle=function(zfile,queryname)
+ local data=wholefile(zfile,queryname)
+ if data then
+ local stream=openstream(data)
+ if stream then
+ return setmetatableindex(stream,metatable)
+ end
+ end
+ end
+else
+ openzip=zip.open
+ closezip=zip.close
+ validfile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ dfile:close()
+ return true
+ end
+ return false
+ end
+ traversezip=function(zfile)
+ return z:files()
+ end
+ wholefile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ local s=dfile:read("*all")
+ dfile:close()
+ return s
+ end
+ end
+ filehandle=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ return dfile
+ end
+ end
+end
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -23433,7 +24039,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=full~="" and zip.open(full) or false
+ arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
@@ -23441,7 +24047,7 @@ function zip.openarchive(name)
end
function zip.closearchive(name)
if not name or (name=="" and archives[name]) then
- zip.close(archives[name])
+ closezip(archives[name])
archives[name]=nil
end
end
@@ -23482,9 +24088,7 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: archive %a found",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
- dfile:close()
+ if validfile(zfile,queryname) then
if trace_locating then
report_zip("finder: file %a found",queryname)
end
@@ -23514,12 +24118,12 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener; archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local handle=filehandle(zfile,queryname)
+ if handle then
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,dfile)
+ return resolvers.openers.helpers.textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -23545,15 +24149,13 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local data=wholefile(zfile,queryname)
+ if data then
logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
- local s=dfile:read("*all")
- dfile:close()
- return true,s,#s
+ return true,data,#data
elseif trace_locating then
report_zip("loader: file %a not found",queryname)
end
@@ -23600,7 +24202,7 @@ function resolvers.registerzipfile(z,tree)
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- for i in z:files() do
+ for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
@@ -24734,7 +25336,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9418, stripped down to: 7087
+-- original size: 9637, stripped down to: 7253
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -24804,6 +25406,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="make luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="make luajittex format",
program="luajittex",
@@ -24971,10 +25580,10 @@ end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 995501
--- stripped bytes : 395318
+-- original bytes : 1019480
+-- stripped bytes : 403728
-- end library merge
@@ -25055,6 +25664,8 @@ local ownlibs = { -- order can be made better
'util-env.lua',
'luat-env.lua', -- can come before inf (as in mkiv)
+ 'util-zip.lua',
+
'lxml-tab.lua',
'lxml-lpt.lua',
-- 'lxml-ent.lua',
diff --git a/scripts/context/stubs/win64/mtxrun.lua b/scripts/context/stubs/win64/mtxrun.lua
index 15606e1e1..98fe7f752 100644
--- a/scripts/context/stubs/win64/mtxrun.lua
+++ b/scripts/context/stubs/win64/mtxrun.lua
@@ -194,7 +194,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-lua"] = package.loaded["l-lua"] or true
--- original size: 6281, stripped down to: 2863
+-- original size: 6330, stripped down to: 2831
if not modules then modules={} end modules ['l-lua']={
version=1.001,
@@ -312,7 +312,6 @@ elseif not ffi.number then
ffi.number=tonumber
end
if LUAVERSION>5.3 then
- collectgarbage("generational")
end
@@ -3766,7 +3765,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-os"] = package.loaded["l-os"] or true
--- original size: 19347, stripped down to: 10258
+-- original size: 18916, stripped down to: 10126
if not modules then modules={} end modules ['l-os']={
version=1.001,
@@ -3933,16 +3932,6 @@ local launchers={
function os.launch(str)
execute(format(launchers[os.name] or launchers.unix,str))
end
-if not os.times then
- function os.times()
- return {
- utime=os.gettimeofday(),
- stime=0,
- cutime=0,
- cstime=0,
- }
- end
-end
local gettimeofday=os.gettimeofday or os.clock
os.gettimeofday=gettimeofday
local startuptime=gettimeofday()
@@ -4218,7 +4207,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-file"] = package.loaded["l-file"] or true
--- original size: 21804, stripped down to: 9980
+-- original size: 21984, stripped down to: 10148
if not modules then modules={} end modules ['l-file']={
version=1.001,
@@ -4398,40 +4387,45 @@ local reslasher=lpeg.replacer(P("\\"),"/")
function file.reslash(str)
return str and lpegmatch(reslasher,str)
end
-function file.is_writable(name)
- if not name then
- elseif lfs.isdir(name) then
- name=name.."/m_t_x_t_e_s_t.tmp"
- local f=io.open(name,"wb")
- if f then
- f:close()
- os.remove(name)
- return true
- end
- elseif lfs.isfile(name) then
- local f=io.open(name,"ab")
- if f then
- f:close()
- return true
- end
- else
- local f=io.open(name,"ab")
- if f then
- f:close()
- os.remove(name)
- return true
+if lfs.isreadablefile and lfs.iswritablefile then
+ file.is_readable=lfs.isreadablefile
+ file.is_writable=lfs.iswritablefile
+else
+ function file.is_writable(name)
+ if not name then
+ elseif lfs.isdir(name) then
+ name=name.."/m_t_x_t_e_s_t.tmp"
+ local f=io.open(name,"wb")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
+ elseif lfs.isfile(name) then
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ return true
+ end
+ else
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
end
- end
- return false
-end
-local readable=P("r")*Cc(true)
-function file.is_readable(name)
- if name then
- local a=attributes(name)
- return a and lpegmatch(readable,a.permissions) or false
- else
return false
end
+ local readable=P("r")*Cc(true)
+ function file.is_readable(name)
+ if name then
+ local a=attributes(name)
+ return a and lpegmatch(readable,a.permissions) or false
+ else
+ return false
+ end
+ end
end
file.isreadable=file.is_readable
file.iswritable=file.is_writable
@@ -5062,7 +5056,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["l-dir"] = package.loaded["l-dir"] or true
--- original size: 18002, stripped down to: 10681
+-- original size: 18253, stripped down to: 10816
if not modules then modules={} end modules ['l-dir']={
version=1.001,
@@ -5127,13 +5121,15 @@ local function glob_pattern_function(path,patt,recurse,action)
end
local dirs
local nofdirs=0
- for name in walkdir(usedpath) do
+ for name,mode,size,time in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
- action(full)
+ action(full,size,time)
end
elseif recurse and mode=="directory" then
if dirs then
@@ -5169,10 +5165,12 @@ local function glob_pattern_table(path,patt,recurse,result)
local dirs
local nofdirs=0
local noffiles=#result
- for name,a in walkdir(usedpath) do
+ for name,mode in walkdir(usedpath) do
if name~="." and name~=".." then
local full=path..name
- local mode=attributes(full,'mode')
+ if mode==nil then
+ mode=attributes(full,'mode')
+ end
if mode=='file' then
if not patt or find(full,patt) then
noffiles=noffiles+1
@@ -5223,7 +5221,7 @@ local function collectpattern(path,patt,recurse,result)
if not find(path,"/$") then
path=path..'/'
end
- for name in scanner,first do
+ for name in scanner,first do
if name=="." then
elseif name==".." then
else
@@ -5314,10 +5312,12 @@ local function globfiles(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if recurse then
globfiles(path.."/"..name,recurse,func,files)
@@ -5340,10 +5340,12 @@ local function globdirs(path,recurse,func,files)
end
files=files or {}
local noffiles=#files
- for name in walkdir(path) do
+ for name,mode in walkdir(path) do
if find(name,"^%.") then
else
- local mode=attributes(name,'mode')
+ if mode==nil then
+ mode=attributes(name,'mode')
+ end
if mode=="directory" then
if not func or func(name) then
noffiles=noffiles+1
@@ -5524,8 +5526,7 @@ local stack={}
function dir.push(newdir)
local curdir=currentdir()
insert(stack,curdir)
- if newdir and newdir~="" then
- chdir(newdir)
+ if newdir and newdir~="" and chdir(newdir) then
return newdir
else
return curdir
@@ -6466,7 +6467,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-str"] = package.loaded["util-str"] or true
--- original size: 43538, stripped down to: 21641
+-- original size: 43488, stripped down to: 21595
if not modules then modules={} end modules ['util-str']={
version=1.001,
@@ -6482,7 +6483,6 @@ local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,s
local load,dump=load,string.dump
local tonumber,type,tostring,next,setmetatable=tonumber,type,tostring,next,setmetatable
local unpack,concat=table.unpack,table.concat
-local unpack,concat=table.unpack,table.concat
local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc
local patterns,lpegmatch=lpeg.patterns,lpeg.match
local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len
@@ -7307,7 +7307,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-tab"] = package.loaded["util-tab"] or true
--- original size: 28810, stripped down to: 16134
+-- original size: 28866, stripped down to: 16134
if not modules then modules={} end modules ['util-tab']={
version=1.001,
@@ -7971,7 +7971,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-fil"] = package.loaded["util-fil"] or true
--- original size: 8607, stripped down to: 6727
+-- original size: 11530, stripped down to: 9007
if not modules then modules={} end modules ['util-fil']={
version=1.001,
@@ -8180,6 +8180,32 @@ if bit32 then
local b=char(n%256)
f:write(b,a)
end
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
else
local floor=math.floor
function files.writecardinal2(f,n)
@@ -8188,16 +8214,32 @@ else
local b=char(n%256)
f:write(b,a)
end
-end
-function files.writecardinal4(f,n)
- local a=char(n%256)
- n=rshift(n,8)
- local b=char(n%256)
- n=rshift(n,8)
- local c=char(n%256)
- n=rshift(n,8)
- local d=char(n%256)
- f:write(d,c,b,a)
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
end
function files.writestring(f,s)
f:write(char(byte(s,1,#s)))
@@ -8210,10 +8252,18 @@ if fio and fio.readcardinal1 then
files.readcardinal2=fio.readcardinal2
files.readcardinal3=fio.readcardinal3
files.readcardinal4=fio.readcardinal4
+ files.readcardinal1le=fio.readcardinal1le or files.readcardinal1le
+ files.readcardinal2le=fio.readcardinal2le or files.readcardinal2le
+ files.readcardinal3le=fio.readcardinal3le or files.readcardinal3le
+ files.readcardinal4le=fio.readcardinal4le or files.readcardinal4le
files.readinteger1=fio.readinteger1
files.readinteger2=fio.readinteger2
files.readinteger3=fio.readinteger3
files.readinteger4=fio.readinteger4
+ files.readinteger1le=fio.readinteger1le or files.readinteger1le
+ files.readinteger2le=fio.readinteger2le or files.readinteger2le
+ files.readinteger3le=fio.readinteger3le or files.readinteger3le
+ files.readinteger4le=fio.readinteger4le or files.readinteger4le
files.readfixed2=fio.readfixed2
files.readfixed4=fio.readfixed4
files.read2dot14=fio.read2dot14
@@ -8234,6 +8284,24 @@ if fio and fio.readcardinal1 then
skipposition(f,4*(n or 1))
end
end
+if fio and fio.writecardinal1 then
+ files.writecardinal1=fio.writecardinal1
+ files.writecardinal2=fio.writecardinal2
+ files.writecardinal3=fio.writecardinal3
+ files.writecardinal4=fio.writecardinal4
+ files.writecardinal1le=fio.writecardinal1le
+ files.writecardinal2le=fio.writecardinal2le
+ files.writecardinal3le=fio.writecardinal3le
+ files.writecardinal4le=fio.writecardinal4le
+ files.writeinteger1=fio.writeinteger1 or fio.writecardinal1
+ files.writeinteger2=fio.writeinteger2 or fio.writecardinal2
+ files.writeinteger3=fio.writeinteger3 or fio.writecardinal3
+ files.writeinteger4=fio.writeinteger4 or fio.writecardinal4
+ files.writeinteger1le=files.writeinteger1le or fio.writecardinal1le
+ files.writeinteger2le=files.writeinteger2le or fio.writecardinal2le
+ files.writeinteger3le=files.writeinteger3le or fio.writecardinal3le
+ files.writeinteger4le=files.writeinteger4le or fio.writecardinal4le
+end
if fio and fio.readcardinaltable then
files.readcardinaltable=fio.readcardinaltable
files.readintegertable=fio.readintegertable
@@ -8271,7 +8339,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-sac"] = package.loaded["util-sac"] or true
--- original size: 11065, stripped down to: 8209
+-- original size: 11332, stripped down to: 8420
if not modules then modules={} end modules ['util-sac']={
version=1.001,
@@ -8296,6 +8364,11 @@ function streams.openstring(f,zerobased)
return { f,1,#f,zerobased or false }
end
end
+function streams.getstring(f)
+ if f then
+ return f[1]
+ end
+end
function streams.close()
end
function streams.size(f)
@@ -8386,7 +8459,7 @@ function streams.readcardinal2(f)
local a,b=byte(f[1],i,j)
return 0x100*a+b
end
-function streams.readcardinal2LE(f)
+function streams.readcardinal2le(f)
local i=f[2]
local j=i+1
f[2]=j+1
@@ -8458,6 +8531,13 @@ function streams.readcardinal4(f)
local a,b,c,d=byte(f[1],i,j)
return 0x1000000*a+0x10000*b+0x100*c+d
end
+function streams.readcardinal4le(f)
+ local i=f[2]
+ local j=i+3
+ f[2]=j+1
+ local d,c,b,a=byte(f[1],i,j)
+ return 0x1000000*a+0x10000*b+0x100*c+d
+end
function streams.readinteger4(f)
local i=f[2]
local j=i+3
@@ -9545,13 +9625,13 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-socket"] = package.loaded["util-soc-imp-socket"] or true
--- original size: 4870, stripped down to: 3527
+-- original size: 4905, stripped down to: 3562
local type,tostring,setmetatable=type,tostring,setmetatable
local min=math.min
local format=string.format
-local socket=require("socket.core")
+local socket=socket or package.loaded.socket or require("socket.core")
local connect=socket.connect
local tcp4=socket.tcp4
local tcp6=socket.tcp6
@@ -10734,12 +10814,12 @@ do -- create closure to overcome 200 locals limit
package.loaded["util-soc-imp-mime"] = package.loaded["util-soc-imp-mime"] or true
--- original size: 2328, stripped down to: 1874
+-- original size: 2373, stripped down to: 1931
local type,tostring=type,tostring
-local mime=require("mime.core")
-local ltn12=ltn12 or require("ltn12")
+local mime=mime or package.loaded.mime or require("mime.core")
+local ltn12=ltn12 or package.loaded.ltn12 or require("ltn12")
local filtercycle=ltn12.filter.cycle
local function report(fmt,first,...)
if logs then
@@ -12691,7 +12771,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["trac-log"] = package.loaded["trac-log"] or true
--- original size: 32608, stripped down to: 20925
+-- original size: 32618, stripped down to: 20935
if not modules then modules={} end modules ['trac-log']={
version=1.001,
@@ -12736,7 +12816,7 @@ local function ignore() end
setmetatableindex(logs,function(t,k) t[k]=ignore;return ignore end)
local report,subreport,status,settarget,setformats,settranslations
local direct,subdirect,writer,pushtarget,poptarget,setlogfile,settimedlog,setprocessor,setformatters,newline
-if runningtex then
+if runningtex and texio then
if texio.setescape then
texio.setescape(0)
end
@@ -15613,6 +15693,468 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+package.loaded["util-zip"] = package.loaded["util-zip"] or true
+
+-- original size: 18645, stripped down to: 11291
+
+if not modules then modules={} end modules ['util-zip']={
+ version=1.001,
+ author="Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright="PRAGMA ADE / ConTeXt Development Team",
+ license="see context related readme files"
+}
+local type,tostring,tonumber=type,tostring,tonumber
+local sort=table.sort
+local find,format,sub,gsub=string.find,string.format,string.sub,string.gsub
+local osdate,ostime=os.date,os.time
+local ioopen=io.open
+local loaddata,savedata=io.loaddata,io.savedata
+local filejoin,isdir,dirname,mkdirs=file.join,lfs.isdir,file.dirname,dir.mkdirs
+local files=utilities.files
+local openfile=files.open
+local closefile=files.close
+local readstring=files.readstring
+local readcardinal2=files.readcardinal2le
+local readcardinal4=files.readcardinal4le
+local setposition=files.setposition
+local getposition=files.getposition
+local band=bit32.band
+local rshift=bit32.rshift
+local lshift=bit32.lshift
+local decompress,calculatecrc
+if flate then
+ decompress=flate.flate_decompress
+ calculatecrc=flate.update_crc32
+else
+ local zlibdecompress=zlib.decompress
+ local zlibchecksum=zlib.crc32
+ decompress=function(source,targetsize)
+ local target=zlibdecompress(source,-15)
+ if target then
+ return target
+ else
+ return false,1
+ end
+ end
+ calculatecrc=function(buffer,initial)
+ return zlibchecksum(initial or 0,buffer)
+ end
+end
+local zipfiles={}
+utilities.zipfiles=zipfiles
+local openzipfile,closezipfile,unzipfile,foundzipfile,getziphash,getziplist do
+ function openzipfile(name)
+ return {
+ name=name,
+ handle=openfile(name,0),
+ }
+ end
+ local function collect(z)
+ if not z.list then
+ local list={}
+ local hash={}
+ local position=0
+ local index=0
+ local handle=z.handle
+ while true do
+ setposition(handle,position)
+ local signature=readstring(handle,4)
+ if signature=="PK\3\4" then
+ local version=readcardinal2(handle)
+ local flag=readcardinal2(handle)
+ local method=readcardinal2(handle)
+ local filetime=readcardinal2(handle)
+ local filedate=readcardinal2(handle)
+ local crc32=readcardinal4(handle)
+ local compressed=readcardinal4(handle)
+ local uncompressed=readcardinal4(handle)
+ local namelength=readcardinal2(handle)
+ local extralength=readcardinal2(handle)
+ local filename=readstring(handle,namelength)
+ local descriptor=band(flag,8)~=0
+ local encrypted=band(flag,1)~=0
+ local acceptable=method==0 or method==8
+ local skipped=0
+ local size=0
+ if encrypted then
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ skipbytes(8)
+ skipped=skipped+8
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ size=readcardinal4(handle)
+ skipbytes(size)
+ skipped=skipped+size+4
+ size=readcardinal2(handle)
+ skipbytes(size)
+ skipped=skipped+size+2
+ end
+ position=position+30+namelength+extralength+skipped
+ if descriptor then
+ setposition(handle,position+compressed)
+ crc32=readcardinal4(handle)
+ compressed=readcardinal4(handle)
+ uncompressed=readcardinal4(handle)
+ end
+ if acceptable then
+ index=index+1
+ local data={
+ filename=filename,
+ index=index,
+ position=position,
+ method=method,
+ compressed=compressed,
+ uncompressed=uncompressed,
+ crc32=crc32,
+ encrypted=encrypted,
+ }
+ hash[filename]=data
+ list[index]=data
+ else
+ end
+ position=position+compressed
+ else
+ break
+ end
+ z.list=list
+ z.hash=hash
+ end
+ end
+ end
+ function getziplist(z)
+ local list=z.list
+ if not list then
+ collect(z)
+ end
+ return z.list
+ end
+ function getziphash(z)
+ local hash=z.hash
+ if not hash then
+ collect(z)
+ end
+ return z.hash
+ end
+ function foundzipfile(z,name)
+ return getziphash(z)[name]
+ end
+ function closezipfile(z)
+ local f=z.handle
+ if f then
+ closefile(f)
+ z.handle=nil
+ end
+ end
+ function unzipfile(z,filename,check)
+ local hash=z.hash
+ if not hash then
+ hash=zipfiles.hash(z)
+ end
+ local data=hash[filename]
+ if not data then
+ end
+ if data then
+ local handle=z.handle
+ local position=data.position
+ local compressed=data.compressed
+ if compressed>0 then
+ setposition(handle,position)
+ local result=readstring(handle,compressed)
+ if data.method==8 then
+ result=decompress(result,data.uncompressed)
+ end
+ if check and data.crc32~=calculatecrc(result) then
+ print("checksum mismatch")
+ return ""
+ end
+ return result
+ else
+ return ""
+ end
+ end
+ end
+ zipfiles.open=openzipfile
+ zipfiles.close=closezipfile
+ zipfiles.unzip=unzipfile
+ zipfiles.hash=getziphash
+ zipfiles.list=getziplist
+ zipfiles.found=foundzipfile
+end
+if flate then do
+ local writecardinal1=files.writebyte
+ local writecardinal2=files.writecardinal2le
+ local writecardinal4=files.writecardinal4le
+ local logwriter=logs.writer
+ local globpattern=dir.globpattern
+ local compress=flate.flate_compress
+ local checksum=flate.update_crc32
+ local function fromdostime(dostime,dosdate)
+ return ostime {
+ year=rshift(dosdate,9)+1980,
+ month=band(rshift(dosdate,5),0x0F),
+ day=band((dosdate ),0x1F),
+ hour=band(rshift(dostime,11) ),
+ min=band(rshift(dostime,5),0x3F),
+ sec=band((dostime ),0x1F),
+ }
+ end
+ local function todostime(time)
+ local t=osdate("*t",time)
+ return
+ lshift(t.year-1980,9)+lshift(t.month,5)+t.day,
+ lshift(t.hour,11)+lshift(t.min,5)+rshift(t.sec,1)
+ end
+ local function openzip(filename,level,comment,verbose)
+ local f=ioopen(filename,"wb")
+ if f then
+ return {
+ filename=filename,
+ handle=f,
+ list={},
+ level=tonumber(level) or 3,
+ comment=tostring(comment),
+ verbose=verbose,
+ uncompressed=0,
+ compressed=0,
+ }
+ end
+ end
+ local function writezip(z,name,data,level,time)
+ local f=z.handle
+ local list=z.list
+ local level=tonumber(level) or z.level or 3
+ local method=8
+ local zipped=compress(data,level)
+ local checksum=checksum(data)
+ local verbose=z.verbose
+ if not zipped then
+ method=0
+ zipped=data
+ end
+ local start=f:seek()
+ local compressed=#zipped
+ local uncompressed=#data
+ z.compressed=z.compressed+compressed
+ z.uncompressed=z.uncompressed+uncompressed
+ if verbose then
+ local pct=100*compressed/uncompressed
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,name))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,name))
+ end
+ end
+ f:write("\x50\x4b\x03\x04")
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,method)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ f:write(name)
+ f:write(zipped)
+ list[#list+1]={ #zipped,#data,name,checksum,start,time or 0 }
+ end
+ local function closezip(z)
+ local f=z.handle
+ local list=z.list
+ local comment=z.comment
+ local verbose=z.verbose
+ local count=#list
+ local start=f:seek()
+ for i=1,count do
+ local l=list[i]
+ local compressed=l[1]
+ local uncompressed=l[2]
+ local name=l[3]
+ local checksum=l[4]
+ local start=l[5]
+ local time=l[6]
+ local date,time=todostime(time)
+ f:write('\x50\x4b\x01\x02')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,8)
+ writecardinal2(f,time)
+ writecardinal2(f,date)
+ writecardinal4(f,checksum)
+ writecardinal4(f,compressed)
+ writecardinal4(f,uncompressed)
+ writecardinal2(f,#name)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal4(f,0)
+ writecardinal4(f,start)
+ f:write(name)
+ end
+ local stop=f:seek()
+ local size=stop-start
+ f:write('\x50\x4b\x05\x06')
+ writecardinal2(f,0)
+ writecardinal2(f,0)
+ writecardinal2(f,count)
+ writecardinal2(f,count)
+ writecardinal4(f,size)
+ writecardinal4(f,start)
+ if type(comment)=="string" and comment~="" then
+ writecardinal2(f,#comment)
+ f:write(comment)
+ else
+ writecardinal2(f,0)
+ end
+ if verbose then
+ local compressed=z.compressed
+ local uncompressed=z.uncompressed
+ local filename=z.filename
+ local pct=100*compressed/uncompressed
+ logwriter("")
+ if pct>=100 then
+ logwriter(format("%10i %s",uncompressed,filename))
+ else
+ logwriter(format("%10i %02.1f %s",uncompressed,pct,filename))
+ end
+ end
+ f:close()
+ end
+ local function zipdir(zipname,path,level,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ level=zipname.level
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ if not isdir(path) then
+ return
+ end
+ path=gsub(path,"\\+","/")
+ path=gsub(path,"/+","/")
+ local list={}
+ local count=0
+ globpattern(path,"",true,function(name,size,time)
+ count=count+1
+ list[count]={ name,time }
+ end)
+ sort(list,function(a,b)
+ return a[1]<b[1]
+ end)
+ local zipf=openzip(zipname,level,comment,verbose)
+ if zipf then
+ local p=#path+2
+ for i=1,count do
+ local li=list[i]
+ local name=li[1]
+ local time=li[2]
+ local data=loaddata(name)
+ local name=sub(name,p,#name)
+ writezip(zipf,name,data,level,time,verbose)
+ end
+ closezip(zipf)
+ end
+ end
+ local function unzipdir(zipname,path,verbose)
+ if type(zipname)=="table" then
+ verbose=zipname.verbose
+ path=zipname.path
+ zipname=zipname.zipname
+ end
+ if not zipname or zipname=="" then
+ return
+ end
+ if not path or path=="" then
+ path="."
+ end
+ local z=openzipfile(zipname)
+ if z then
+ local list=getziplist(z)
+ if list then
+ local total=0
+ local count=#list
+ local step=number.idiv(count,10)
+ local done=0
+ for i=1,count do
+ local l=list[i]
+ local n=l.filename
+ local d=unzipfile(z,n)
+ local p=filejoin(path,n)
+ if mkdirs(dirname(p)) then
+ if verbose=="steps" then
+ total=total+#d
+ done=done+1
+ if done>=step then
+ done=0
+ logwriter(format("%4i files of %4i done, %10i bytes",i,count,total))
+ end
+ elseif verbose then
+ logwriter(n)
+ end
+ savedata(p,d)
+ end
+ end
+ if verbose=="steps" then
+ logwriter(format("%4i files of %4i done, %10i bytes",count,count,total))
+ end
+ closezipfile(z)
+ return true
+ else
+ closezipfile(z)
+ end
+ end
+ end
+ zipfiles.zipdir=zipdir
+ zipfiles.unzipdir=unzipdir
+end end
+if flate then
+ local streams=utilities.streams
+ local openfile=streams.open
+ local closestream=streams.close
+ local setposition=streams.setposition
+ local getsize=streams.size
+ local readcardinal4=streams.readcardinal4le
+ local getstring=streams.getstring
+ local decompress=flate.gz_decompress
+ function zipfiles.gunzipfile(filename)
+ local strm=openfile(filename)
+ if strm then
+ setposition(strm,getsize(strm)-4+1)
+ local size=readcardinal4(strm)
+ local data=decompress(getstring(strm),size)
+ closestream(strm)
+ return data
+ end
+ end
+elseif gzip then
+ local openfile=gzip.open
+ function zipfiles.gunzipfile(filename)
+ local g=openfile(filename,"rb")
+ if g then
+ local d=g:read("*a")
+ d:close()
+ return d
+ end
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
package.loaded["lxml-tab"] = package.loaded["lxml-tab"] or true
-- original size: 60383, stripped down to: 35698
@@ -20103,7 +20645,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-exp"] = package.loaded["data-exp"] or true
--- original size: 18105, stripped down to: 10389
+-- original size: 18154, stripped down to: 10416
if not modules then modules={} end modules ['data-exp']={
version=1.001,
@@ -20310,9 +20852,11 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
local pattern=tolerant and lessweird or weird
local filelist={}
local noffiles=0
- for name in directory(full) do
+ for name,mode in directory(full) do
if not lpegmatch(pattern,name) then
- local mode=attributes(full..name,"mode")
+ if not mode then
+ mode=attributes(full..name,"mode")
+ end
if mode=="file" then
n=n+1
noffiles=noffiles+1
@@ -20793,7 +21337,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-tmp"] = package.loaded["data-tmp"] or true
--- original size: 16116, stripped down to: 10782
+-- original size: 16284, stripped down to: 10938
if not modules then modules={} end modules ['data-tmp']={
version=1.100,
@@ -20833,6 +21377,7 @@ caches.force=true
caches.ask=false
caches.relocate=false
caches.defaults={ "TMPDIR","TEMPDIR","TMP","TEMP","HOME","HOMEPATH" }
+directives.register("system.caches.fast",function(v) caches.fast=true end)
local writable,readables,usedreadables=nil,{},{}
local function identify()
local texmfcaches=resolvers.cleanpathlist("TEXMFCACHE")
@@ -21066,7 +21611,9 @@ local saveoptions={ compact=true }
function caches.savedata(filepath,filename,data,raw)
local tmaname,tmcname=caches.setluanames(filepath,filename)
data.cache_uuid=os.uuid()
- if caches.direct then
+ if caches.fast then
+ file.savedata(tmaname,table.fastserialize(data,true))
+ elseif caches.direct then
file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
table.tofile(tmaname,data,true,saveoptions)
@@ -23400,7 +23947,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["data-zip"] = package.loaded["data-zip"] or true
--- original size: 8700, stripped down to: 6313
+-- original size: 10263, stripped down to: 7556
if not modules then modules={} end modules ['data-zip']={
version=1.001,
@@ -23419,6 +23966,65 @@ local archives=zip.archives or {}
zip.archives=archives
local registeredfiles=zip.registeredfiles or {}
zip.registeredfiles=registeredfiles
+local zipfiles=utilities.zipfiles
+local openzip,closezip,validfile,wholefile,filehandle,traversezip
+if zipfiles then
+ local ipairs=ipairs
+ openzip=zipfiles.open
+ closezip=zipfiles.close
+ validfile=zipfiles.found
+ wholefile=zipfiles.unzip
+ traversezip=function(zfile)
+ return ipairs(zipfiles.list(zfile))
+ end
+ local streams=utilities.streams
+ local openstream=streams.open
+ local readstring=streams.readstring
+ local streamsize=streams.size
+ local metatable={
+ close=streams.close,
+ read=function(stream,n)
+ readstring(stream,n=="*a" and streamsize(stream) or n)
+ end
+ }
+ filehandle=function(zfile,queryname)
+ local data=wholefile(zfile,queryname)
+ if data then
+ local stream=openstream(data)
+ if stream then
+ return setmetatableindex(stream,metatable)
+ end
+ end
+ end
+else
+ openzip=zip.open
+ closezip=zip.close
+ validfile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ dfile:close()
+ return true
+ end
+ return false
+ end
+ traversezip=function(zfile)
+ return z:files()
+ end
+ wholefile=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ local s=dfile:read("*all")
+ dfile:close()
+ return s
+ end
+ end
+ filehandle=function(zfile,queryname)
+ local dfile=zfile:open(queryname)
+ if dfile then
+ return dfile
+ end
+ end
+end
local function validzip(str)
if not find(str,"^zip://") then
return "zip:///"..str
@@ -23433,7 +24039,7 @@ function zip.openarchive(name)
local arch=archives[name]
if not arch then
local full=resolvers.findfile(name) or ""
- arch=full~="" and zip.open(full) or false
+ arch=full~="" and openzip(full) or false
archives[name]=arch
end
return arch
@@ -23441,7 +24047,7 @@ function zip.openarchive(name)
end
function zip.closearchive(name)
if not name or (name=="" and archives[name]) then
- zip.close(archives[name])
+ closezip(archives[name])
archives[name]=nil
end
end
@@ -23482,9 +24088,7 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: archive %a found",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
- dfile:close()
+ if validfile(zfile,queryname) then
if trace_locating then
report_zip("finder: file %a found",queryname)
end
@@ -23514,12 +24118,12 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener; archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local handle=filehandle(zfile,queryname)
+ if handle then
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,dfile)
+ return resolvers.openers.helpers.textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -23545,15 +24149,13 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
- local dfile=zfile:open(queryname)
- if dfile then
+ local data=wholefile(zfile,queryname)
+ if data then
logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
- local s=dfile:read("*all")
- dfile:close()
- return true,s,#s
+ return true,data,#data
elseif trace_locating then
report_zip("loader: file %a not found",queryname)
end
@@ -23600,7 +24202,7 @@ function resolvers.registerzipfile(z,tree)
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- for i in z:files() do
+ for i in traversezip(z) do
local filename=i.filename
local path,name=match(filename,filter)
if not path then
@@ -24734,7 +25336,7 @@ do -- create closure to overcome 200 locals limit
package.loaded["luat-fmt"] = package.loaded["luat-fmt"] or true
--- original size: 9418, stripped down to: 7087
+-- original size: 9637, stripped down to: 7253
if not modules then modules={} end modules ['luat-fmt']={
version=1.001,
@@ -24804,6 +25406,13 @@ local runners={
checkers=checkers,
reporter=report_format,
},
+ luametatex=sandbox.registerrunner {
+ name="make luametatex format",
+ program="luametatex",
+ template=template,
+ checkers=checkers,
+ reporter=report_format,
+ },
luajittex=sandbox.registerrunner {
name="make luajittex format",
program="luajittex",
@@ -24971,10 +25580,10 @@ end
end -- of closure
--- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
+-- used libraries : l-bit32.lua l-lua.lua l-macro.lua l-sandbox.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-sha.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-fil.lua util-sac.lua util-sto.lua util-prs.lua util-fmt.lua util-soc-imp-reset.lua util-soc-imp-socket.lua util-soc-imp-copas.lua util-soc-imp-ltn12.lua util-soc-imp-mime.lua util-soc-imp-url.lua util-soc-imp-headers.lua util-soc-imp-tp.lua util-soc-imp-http.lua util-soc-imp-ftp.lua util-soc-imp-smtp.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-tpl.lua util-sbx.lua util-mrg.lua util-env.lua luat-env.lua util-zip.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua
-- skipped libraries : -
--- original bytes : 995501
--- stripped bytes : 395318
+-- original bytes : 1019480
+-- stripped bytes : 403728
-- end library merge
@@ -25055,6 +25664,8 @@ local ownlibs = { -- order can be made better
'util-env.lua',
'luat-env.lua', -- can come before inf (as in mkiv)
+ 'util-zip.lua',
+
'lxml-tab.lua',
'lxml-lpt.lua',
-- 'lxml-ent.lua',
diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii
index faa50ce78..a1981921b 100644
--- a/tex/context/base/mkii/cont-new.mkii
+++ b/tex/context/base/mkii/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2019.03.05 15:40}
+\newcontextversion{2019.03.21 21:39}
%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/mkii/context.mkii b/tex/context/base/mkii/context.mkii
index c0e856845..a6f8647ee 100644
--- a/tex/context/base/mkii/context.mkii
+++ b/tex/context/base/mkii/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.03.05 15:40}
+\edef\contextversion{2019.03.21 21:39}
%D For those who want to use this:
diff --git a/tex/context/base/mkiv/char-ini.mkiv b/tex/context/base/mkiv/char-ini.mkiv
index 0519aaf91..5979b8685 100644
--- a/tex/context/base/mkiv/char-ini.mkiv
+++ b/tex/context/base/mkiv/char-ini.mkiv
@@ -57,14 +57,34 @@
\unexpanded\def\checkedtextchar#1% #2%
{\clf_doifelsecharinfont\numexpr#1\relax{\char#1}} % {#2}
+% \unexpanded\def\textormathchar#1%
+% {\relax\ifmmode
+% \char#1\relax
+% \else\iffontchar\font#1\relax
+% \char#1\relax
+% \else
+% \normalstartimath\char#1\normalstopimath
+% \fi\fi}
+
+\newconditional\prefermathovertextchar
+
\unexpanded\def\textormathchar#1%
- {\relax\ifmmode
- \char#1\relax
- \else\iffontchar\font#1\relax
- \char#1\relax
+ {\begingroup
+ \scratchcounter#1\relax
+ \ifmmode
+ \char\scratchcounter
\else
- \normalstartimath\char#1\normalstopimath
- \fi\fi}
+ \ifconditional\prefermathovertextchar
+ % dirty trick .. maybe let this adapt to bf too ?
+ \setfontid\fontid\textfont\c_font_fam_mr
+ \fi
+ \iffontchar\font\scratchcounter
+ \char\scratchcounter
+ \else
+ \normalstartimath\char\scratchcounter\normalstopimath
+ \fi
+ \fi
+ \endgroup}
\unexpanded\def\textormathchars#1%
{{\font_text_or_mathchars#1\relax}}
diff --git a/tex/context/base/mkiv/cldf-ini.lua b/tex/context/base/mkiv/cldf-ini.lua
index ccbbb2454..15ebc9d95 100644
--- a/tex/context/base/mkiv/cldf-ini.lua
+++ b/tex/context/base/mkiv/cldf-ini.lua
@@ -793,7 +793,7 @@ local function writer(parent,command,...) -- already optimized before call
tj = storefunction(tj)
if tokenflushmode then
if newtoken then
- flush(currentcatcodes,"[",newtoken(tj,lua_expandable_call_code),"]")
+ flush(currentcatcodes,"[",newtoken(tj,lua_expandable_call_token_code),"]")
else
flush(currentcatcodes,"[",t_cldl_luafunction,tj,"]")
end
@@ -811,7 +811,7 @@ local function writer(parent,command,...) -- already optimized before call
tj = storefunction(tj)
if tokenflushmode then
if newtoken then
- flush(currentcatcodes,"[",newtoken(tj,lua_expandable_call_code),j == tn and "]" or ",")
+ flush(currentcatcodes,"[",newtoken(tj,lua_expandable_call_token_code),j == tn and "]" or ",")
else
flush(currentcatcodes,"[",t_cldl_luafunction,tj,j == tn and "]" or ",")
end
diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv
index 913fa747f..f75814652 100644
--- a/tex/context/base/mkiv/cont-new.mkiv
+++ b/tex/context/base/mkiv/cont-new.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2019.03.05 15:40}
+\newcontextversion{2019.03.21 21:39}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv
index 81558c98a..4059a2975 100644
--- a/tex/context/base/mkiv/context.mkiv
+++ b/tex/context/base/mkiv/context.mkiv
@@ -42,7 +42,7 @@
%D has to match \type {YYYY.MM.DD HH:MM} format.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.03.05 15:40}
+\edef\contextversion{2019.03.21 21:39}
\edef\contextkind {beta}
%D Kind of special:
diff --git a/tex/context/base/mkiv/data-exp.lua b/tex/context/base/mkiv/data-exp.lua
index 76fd3c7b0..ce7f95222 100644
--- a/tex/context/base/mkiv/data-exp.lua
+++ b/tex/context/base/mkiv/data-exp.lua
@@ -344,9 +344,11 @@ local function scan(files,remap,spec,path,n,m,r,onlyone,tolerant)
local pattern = tolerant and lessweird or weird
local filelist = { }
local noffiles = 0
- for name in directory(full) do
+ for name, mode in directory(full) do
if not lpegmatch(pattern,name) then
- local mode = attributes(full..name,"mode")
+ if not mode then
+ mode = attributes(full..name,"mode")
+ end
if mode == "file" then
n = n + 1
noffiles = noffiles + 1
diff --git a/tex/context/base/mkiv/data-tmp.lua b/tex/context/base/mkiv/data-tmp.lua
index 948827161..d25a6b2f9 100644
--- a/tex/context/base/mkiv/data-tmp.lua
+++ b/tex/context/base/mkiv/data-tmp.lua
@@ -68,6 +68,8 @@ caches.ask = false
caches.relocate = false
caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+directives.register("system.caches.fast",function(v) caches.fast = true end)
+
local writable, readables, usedreadables = nil, { }, { }
-- we could use a metatable for writable and readable but not yet
@@ -364,7 +366,9 @@ local saveoptions = { compact = true }
function caches.savedata(filepath,filename,data,raw)
local tmaname, tmcname = caches.setluanames(filepath,filename)
data.cache_uuid = os.uuid()
- if caches.direct then
+ if caches.fast then
+ file.savedata(tmaname,table.fastserialize(data,true))
+ elseif caches.direct then
file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
table.tofile(tmaname,data,true,saveoptions)
diff --git a/tex/context/base/mkiv/data-zip.lua b/tex/context/base/mkiv/data-zip.lua
index 6f20b4a9d..388ae0c10 100644
--- a/tex/context/base/mkiv/data-zip.lua
+++ b/tex/context/base/mkiv/data-zip.lua
@@ -37,6 +37,81 @@ zip.archives = archives
local registeredfiles = zip.registeredfiles or { }
zip.registeredfiles = registeredfiles
+local zipfiles = utilities.zipfiles
+
+local openzip, closezip, validfile, wholefile, filehandle, traversezip
+
+if zipfiles then
+
+ local ipairs = ipairs
+
+ openzip = zipfiles.open
+ closezip = zipfiles.close
+ validfile = zipfiles.found
+ wholefile = zipfiles.unzip
+
+ traversezip = function(zfile)
+ return ipairs(zipfiles.list(zfile))
+ end
+
+ local streams = utilities.streams
+ local openstream = streams.open
+ local readstring = streams.readstring
+ local streamsize = streams.size
+
+ local metatable = {
+ close = streams.close,
+ read = function(stream,n)
+ readstring(stream,n == "*a" and streamsize(stream) or n)
+ end
+ }
+
+ filehandle = function(zfile,queryname)
+ local data = wholefile(zfile,queryname)
+ if data then
+ local stream = openstream(data)
+ if stream then
+ return setmetatableindex(stream,metatable)
+ end
+ end
+ end
+
+else
+
+ openzip = zip.open
+ closezip = zip.close
+
+ validfile = function(zfile,queryname)
+ local dfile = zfile:open(queryname)
+ if dfile then
+ dfile:close()
+ return true
+ end
+ return false
+ end
+
+ traversezip = function(zfile)
+ return z:files()
+ end
+
+ wholefile = function(zfile,queryname)
+ local dfile = zfile:open(queryname)
+ if dfile then
+ local s = dfile:read("*all")
+ dfile:close()
+ return s
+ end
+ end
+
+ filehandle = function(zfile,queryname)
+ local dfile = zfile:open(queryname)
+ if dfile then
+ return dfile
+ end
+ end
+
+end
+
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
return "zip:///" .. str
@@ -52,7 +127,7 @@ function zip.openarchive(name)
local arch = archives[name]
if not arch then
local full = resolvers.findfile(name) or ""
- arch = full ~= "" and zip.open(full) or false
+ arch = full ~= "" and openzip(full) or false
archives[name] = arch
end
return arch
@@ -61,7 +136,7 @@ end
function zip.closearchive(name)
if not name or (name == "" and archives[name]) then
- zip.close(archives[name])
+ closezip(archives[name])
archives[name] = nil
end
end
@@ -106,9 +181,7 @@ function resolvers.finders.zip(specification)
if trace_locating then
report_zip("finder: archive %a found",archive)
end
- local dfile = zfile:open(queryname)
- if dfile then
- dfile:close()
+ if validfile(zfile,queryname) then
if trace_locating then
report_zip("finder: file %a found",queryname)
end
@@ -139,12 +212,12 @@ function resolvers.openers.zip(specification)
if trace_locating then
report_zip("opener; archive %a opened",archive)
end
- local dfile = zfile:open(queryname)
- if dfile then
+ local handle = filehandle(zfile,queryname)
+ if handle then
if trace_locating then
report_zip("opener: file %a found",queryname)
end
- return resolvers.openers.helpers.textopener('zip',original,dfile)
+ return resolvers.openers.helpers.textopener('zip',original,handle)
elseif trace_locating then
report_zip("opener: file %a not found",queryname)
end
@@ -171,15 +244,13 @@ function resolvers.loaders.zip(specification)
if trace_locating then
report_zip("loader: archive %a opened",archive)
end
- local dfile = zfile:open(queryname)
- if dfile then
+ local data = wholefile(zfile,queryname)
+ if data then
logs.show_load(original)
if trace_locating then
report_zip("loader; file %a loaded",original)
end
- local s = dfile:read("*all")
- dfile:close()
- return true, s, #s
+ return true, data, #data
elseif trace_locating then
report_zip("loader: file %a not found",queryname)
end
@@ -231,7 +302,7 @@ function resolvers.registerzipfile(z,tree)
if trace_locating then
report_zip("registering: using filter %a",filter)
end
- for i in z:files() do
+ for i in traversezip(z) do
local filename = i.filename
local path, name = match(filename,filter)
if not path then
diff --git a/tex/context/base/mkiv/font-lib.mkvi b/tex/context/base/mkiv/font-lib.mkvi
index 3cff81751..081ae0f38 100644
--- a/tex/context/base/mkiv/font-lib.mkvi
+++ b/tex/context/base/mkiv/font-lib.mkvi
@@ -50,6 +50,7 @@
\registerctxluafile{font-otc}{}
\registerctxluafile{font-oth}{}
\registerctxluafile{font-osd}{}
+% \doifelsefileexists{font-osm.lua}{\registerctxluafile{font-osm}{}}{}
\registerctxluafile{font-ocl}{}
% we use otf code for type one
diff --git a/tex/context/base/mkiv/font-one.lua b/tex/context/base/mkiv/font-one.lua
index 18ba51185..9b296cac5 100644
--- a/tex/context/base/mkiv/font-one.lua
+++ b/tex/context/base/mkiv/font-one.lua
@@ -761,7 +761,7 @@ local function check_afm(specification,fullname)
if foundname == "" then
foundname = fonts.names.getfilename(fullname,"afm") or ""
end
- if foundname == "" and afm.autoprefixed then
+ if fullname and foundname == "" and afm.autoprefixed then
local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.*
if encoding and shortname and fonts.encodings.known[encoding] then
shortname = findbinfile(shortname,'afm') or "" -- just to be sure
diff --git a/tex/context/base/mkiv/font-osd.lua b/tex/context/base/mkiv/font-osd.lua
index 32d791b48..f51ae7bf7 100644
--- a/tex/context/base/mkiv/font-osd.lua
+++ b/tex/context/base/mkiv/font-osd.lua
@@ -615,6 +615,8 @@ local function initializedevanagi(tfmdata)
end
end
--
+ -- needs checking: this might be needed per instance ?
+ --
if script == "deva" then
sharedfeatures["dv04"] = true -- dv04_remove_joiners
elseif script == "dev2" then
@@ -689,7 +691,7 @@ local function initialize_one(font,attr) -- we need a proper hook into the datas
if not devanagaridata then
- devanagaridata = {
+ devanagaridata = {
reph = false,
vattu = false,
blwfcache = { },
@@ -1329,7 +1331,7 @@ end
function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement)
local stop = getnext(start)
- local font = getfont(start)
+ local font = getfont(start) -- hm
local last = start
while stop do
local char = ischar(stop,font)
diff --git a/tex/context/base/mkiv/font-syn.lua b/tex/context/base/mkiv/font-syn.lua
index dfe32b57b..18c25fbfd 100644
--- a/tex/context/base/mkiv/font-syn.lua
+++ b/tex/context/base/mkiv/font-syn.lua
@@ -515,15 +515,20 @@ local function cleanname(name)
end
local function cleanfilename(fullname,defaultsuffix)
- local path, name, suffix = splitname(fullname)
- name = gsub(lower(name),"[^%a%d]","")
- if suffix and suffix ~= "" then
- return name .. ".".. suffix
- elseif defaultsuffix and defaultsuffix ~= "" then
- return name .. ".".. defaultsuffix
- else
- return name
+ if fullname then
+ local path, name, suffix = splitname(fullname)
+ if name then
+ name = gsub(lower(name),"[^%a%d]","")
+ if suffix and suffix ~= "" then
+ return name .. ".".. suffix
+ elseif defaultsuffix and defaultsuffix ~= "" then
+ return name .. ".".. defaultsuffix
+ else
+ return name
+ end
+ end
end
+ return "badfontname"
end
local sorter = function(a,b)
diff --git a/tex/context/base/mkiv/grph-inc.lua b/tex/context/base/mkiv/grph-inc.lua
index f66f8249a..0856e0de9 100644
--- a/tex/context/base/mkiv/grph-inc.lua
+++ b/tex/context/base/mkiv/grph-inc.lua
@@ -1611,15 +1611,15 @@ function includers.generic(data)
ds.pageindex = nofimages
local image = wrapimage(figure)
local pager = new_latelua { action = updatepage, n = nofimages }
- image.next = pager
- pager.prev = image
- local box = hpack(image)
- -- indexed[figure.index] = figure
- box.width = figure.width
- box.height = figure.height
- box.depth = 0
+ image.next = pager
+ pager.prev = image
+ local box = hpack(image)
+ box.width = figure.width
+ box.height = figure.height
+ box.depth = 0
texsetbox(nr,box)
ds.objectnumber = figure.objnum
+ -- indexed[figure.index] = figure
ctx_relocateexternalfigure()
end
return data
diff --git a/tex/context/base/mkiv/l-dir.lua b/tex/context/base/mkiv/l-dir.lua
index b0b2c5283..325039cb1 100644
--- a/tex/context/base/mkiv/l-dir.lua
+++ b/tex/context/base/mkiv/l-dir.lua
@@ -91,13 +91,15 @@ local function glob_pattern_function(path,patt,recurse,action)
end
local dirs
local nofdirs = 0
- for name in walkdir(usedpath) do
+ for name, mode, size, time in walkdir(usedpath) do
if name ~= "." and name ~= ".." then
local full = path .. name
- local mode = attributes(full,'mode')
+ if mode == nil then
+ mode = attributes(full,'mode')
+ end
if mode == 'file' then
if not patt or find(full,patt) then
- action(full)
+ action(full,size,time)
end
elseif recurse and mode == "directory" then
if dirs then
@@ -134,10 +136,12 @@ local function glob_pattern_table(path,patt,recurse,result)
local dirs
local nofdirs = 0
local noffiles = #result
- for name, a in walkdir(usedpath) do
+ for name, mode in walkdir(usedpath) do
if name ~= "." and name ~= ".." then
local full = path .. name
- local mode = attributes(full,'mode')
+ if mode == nil then
+ mode = attributes(full,'mode')
+ end
if mode == 'file' then
if not patt or find(full,patt) then
noffiles = noffiles + 1
@@ -193,7 +197,7 @@ local function collectpattern(path,patt,recurse,result)
if not find(path,"/$") then
path = path .. '/'
end
- for name in scanner, first do
+ for name in scanner, first do -- cna be optimized
if name == "." then
-- skip
elseif name == ".." then
@@ -321,11 +325,13 @@ local function globfiles(path,recurse,func,files) -- func == pattern or function
end
files = files or { }
local noffiles = #files
- for name in walkdir(path) do
+ for name, mode in walkdir(path) do
if find(name,"^%.") then
--- skip
else
- local mode = attributes(name,'mode')
+ if mode == nil then
+ mode = attributes(name,'mode')
+ end
if mode == "directory" then
if recurse then
globfiles(path .. "/" .. name,recurse,func,files)
@@ -350,11 +356,13 @@ local function globdirs(path,recurse,func,files) -- func == pattern or function
end
files = files or { }
local noffiles = #files
- for name in walkdir(path) do
+ for name, mode in walkdir(path) do
if find(name,"^%.") then
--- skip
else
- local mode = attributes(name,'mode')
+ if mode == nil then
+ mode = attributes(name,'mode')
+ end
if mode == "directory" then
if not func or func(name) then
noffiles = noffiles + 1
@@ -597,8 +605,7 @@ local stack = { }
function dir.push(newdir)
local curdir = currentdir()
insert(stack,curdir)
- if newdir and newdir ~= "" then
- chdir(newdir)
+ if newdir and newdir ~= "" and chdir(newdir) then
return newdir
else
return curdir
diff --git a/tex/context/base/mkiv/l-file.lua b/tex/context/base/mkiv/l-file.lua
index 46b6847d3..1b039a438 100644
--- a/tex/context/base/mkiv/l-file.lua
+++ b/tex/context/base/mkiv/l-file.lua
@@ -73,13 +73,9 @@ local P, R, S, C, Cs, Cp, Cc, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg
-- better this way:
------ tricky = S("/\\") * P(-1)
local attributes = lfs.attributes
function lfs.isdir(name)
- -- if not lpegmatch(tricky,name) then
- -- name = name .. "/."
- -- end
return attributes(name,"mode") == "directory"
end
@@ -336,43 +332,52 @@ end
-- But after some testing Taco and I came up with the more robust
-- variant:
-function file.is_writable(name)
- if not name then
- -- error
- elseif lfs.isdir(name) then
- name = name .. "/m_t_x_t_e_s_t.tmp"
- local f = io.open(name,"wb")
- if f then
- f:close()
- os.remove(name)
- return true
- end
- elseif lfs.isfile(name) then
- local f = io.open(name,"ab")
- if f then
- f:close()
- return true
- end
- else
- local f = io.open(name,"ab")
- if f then
- f:close()
- os.remove(name)
- return true
+if lfs.isreadablefile and lfs.iswritablefile then
+
+ file.is_readable = lfs.isreadablefile
+ file.is_writable = lfs.iswritablefile
+
+else
+
+ function file.is_writable(name)
+ if not name then
+ -- error
+ elseif lfs.isdir(name) then
+ name = name .. "/m_t_x_t_e_s_t.tmp"
+ local f = io.open(name,"wb")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
+ elseif lfs.isfile(name) then
+ local f = io.open(name,"ab")
+ if f then
+ f:close()
+ return true
+ end
+ else
+ local f = io.open(name,"ab")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
end
+ return false
end
- return false
-end
-local readable = P("r") * Cc(true)
+ local readable = P("r") * Cc(true)
-function file.is_readable(name)
- if name then
- local a = attributes(name)
- return a and lpegmatch(readable,a.permissions) or false
- else
- return false
+ function file.is_readable(name)
+ if name then
+ local a = attributes(name)
+ return a and lpegmatch(readable,a.permissions) or false
+ else
+ return false
+ end
end
+
end
file.isreadable = file.is_readable -- depricated
diff --git a/tex/context/base/mkiv/l-lua.lua b/tex/context/base/mkiv/l-lua.lua
index d8989364e..5570e83dc 100644
--- a/tex/context/base/mkiv/l-lua.lua
+++ b/tex/context/base/mkiv/l-lua.lua
@@ -250,5 +250,6 @@ end
-- if not loaded["socket.url"] then loaded["socket.url"] = socket.url end
if LUAVERSION > 5.3 then
- collectgarbage("generational")
+ -- collectgarbage("collect")
+ -- collectgarbage("generational") -- crashes on unix
end
diff --git a/tex/context/base/mkiv/l-os.lua b/tex/context/base/mkiv/l-os.lua
index cf469f79d..15408565c 100644
--- a/tex/context/base/mkiv/l-os.lua
+++ b/tex/context/base/mkiv/l-os.lua
@@ -230,22 +230,6 @@ function os.launch(str)
execute(format(launchers[os.name] or launchers.unix,str))
end
-if not os.times then -- ?
- -- utime = user time
- -- stime = system time
- -- cutime = children user time
- -- cstime = children system time
- function os.times()
- return {
- utime = os.gettimeofday(), -- user
- stime = 0, -- system
- cutime = 0, -- children user
- cstime = 0, -- children system
- }
- end
-end
-
-
local gettimeofday = os.gettimeofday or os.clock
os.gettimeofday = gettimeofday
diff --git a/tex/context/base/mkiv/lang-dis.lua b/tex/context/base/mkiv/lang-dis.lua
index 5603d1193..90e84f65d 100644
--- a/tex/context/base/mkiv/lang-dis.lua
+++ b/tex/context/base/mkiv/lang-dis.lua
@@ -180,7 +180,6 @@ end
-- experiment: for now not in not in export mode!
local flatten = languages.flatten
-local getlist = nodes.getlist
nodes.handlers.flattenline = flatten
diff --git a/tex/context/base/mkiv/lpdf-col.lua b/tex/context/base/mkiv/lpdf-col.lua
index b697dc481..9ba64abba 100644
--- a/tex/context/base/mkiv/lpdf-col.lua
+++ b/tex/context/base/mkiv/lpdf-col.lua
@@ -429,7 +429,8 @@ function codeinjections.setfigurecolorspace(data,figure)
local ref = indexcolorref(color)
if ref then
figure.colorspace = ref
- data.used.color = color
+ data.used.color = color
+ data.used.colorref = ref
end
end
end
diff --git a/tex/context/base/mkiv/lpdf-pde.lua b/tex/context/base/mkiv/lpdf-pde.lua
index 9d14f8f5e..c1680137d 100644
--- a/tex/context/base/mkiv/lpdf-pde.lua
+++ b/tex/context/base/mkiv/lpdf-pde.lua
@@ -1003,7 +1003,15 @@ if img then do
return openpdf(str,userpassword,ownerpassword,true)
end
- local function querypdf(pdfdoc,pagenumber)
+ local sizes = {
+ crop = "CropBox",
+ media = "MediaBox",
+ bleed = "BleedBox",
+ art = "ArtBox",
+ trim = "TrimBox",
+ }
+
+ local function querypdf(pdfdoc,pagenumber,size)
if pdfdoc then
if not pagenumber then
pagenumber = 1
@@ -1011,9 +1019,9 @@ if img then do
local root = pdfdoc.Catalog
local page = pdfdoc.pages[pagenumber]
if page then
- -- todo
+ local sizetag = sizes[size or "crop"] or sizes.cro
local mediabox = page.MediaBox or { 0, 0, 0, 0 }
- local cropbox = page.CropBox or mediabox
+ local cropbox = page[sizetag] or mediabox
return {
filename = pdfdoc.filename,
pagenumber = pagenumber,
diff --git a/tex/context/base/mkiv/luat-fmt.lua b/tex/context/base/mkiv/luat-fmt.lua
index 1c9222d95..586c5948e 100644
--- a/tex/context/base/mkiv/luat-fmt.lua
+++ b/tex/context/base/mkiv/luat-fmt.lua
@@ -79,6 +79,13 @@ local runners = {
checkers = checkers,
reporter = report_format,
},
+ luametatex = sandbox.registerrunner {
+ name = "make luametatex format",
+ program = "luametatex",
+ template = template,
+ checkers = checkers,
+ reporter = report_format,
+ },
luajittex = sandbox.registerrunner {
name = "make luajittex format",
program = "luajittex",
diff --git a/tex/context/base/mkiv/luat-lib.mkiv b/tex/context/base/mkiv/luat-lib.mkiv
index d5f6099ca..666032369 100644
--- a/tex/context/base/mkiv/luat-lib.mkiv
+++ b/tex/context/base/mkiv/luat-lib.mkiv
@@ -54,6 +54,10 @@
%registerctxluafile{util-soc-imp-ftp} {}
%registerctxluafile{util-soc-imp-smtp} {}
+\ifcase\contextlmtxmode\else
+ \registerctxluafile{util-zip}{}
+\fi
+
\registerctxluafile{data-ini}{}
\registerctxluafile{data-exp}{}
\registerctxluafile{data-env}{}
diff --git a/tex/context/base/mkiv/luat-run.lua b/tex/context/base/mkiv/luat-run.lua
index 98f981777..00cc65075 100644
--- a/tex/context/base/mkiv/luat-run.lua
+++ b/tex/context/base/mkiv/luat-run.lua
@@ -64,8 +64,9 @@ local function stop_run()
end
end
if quit then
- if status.setexitcode then
- status.setexitcode(1)
+ local setexitcode = lua.setexitcode or status.setexitcode
+ if setexitcode then
+ setexitcode(1)
if type(quit) == "table" then
logs.newline()
report_tex("quitting due to: %, t",quit)
diff --git a/tex/context/base/mkiv/mlib-run.lua b/tex/context/base/mkiv/mlib-run.lua
index 670c0e16b..09872ef0f 100644
--- a/tex/context/base/mkiv/mlib-run.lua
+++ b/tex/context/base/mkiv/mlib-run.lua
@@ -348,6 +348,13 @@ function metapost.pushformat(specification,f,m) -- was: instance, name, method
return mpx
end
+
+-- luatex.wrapup(function()
+-- for k, mpx in next, mpxformats do
+-- mpx:finish()
+-- end
+-- end)
+
function metapost.popformat()
nofformats = nofformats - 1
end
diff --git a/tex/context/base/mkiv/mtx-context-listing.tex b/tex/context/base/mkiv/mtx-context-listing.tex
index 1053e80b9..285113850 100644
--- a/tex/context/base/mkiv/mtx-context-listing.tex
+++ b/tex/context/base/mkiv/mtx-context-listing.tex
@@ -116,10 +116,10 @@
-- forced
end
context.page()
- context.setupfootertexts( -- return true: we need to keep this entry
- { function() context.detokenize(pattern and filename or file.basename(filename)) return true end },
- { function() context.pagenumber() return true end }
- )
+-- context.setupfootertexts( -- return true: we need to keep this entry
+-- { function() context.detokenize(pattern and filename or file.basename(filename)) return true end },
+-- { function() context.pagenumber() return true end }
+-- )
if scite then
context.scitefile { filename } -- here { }
elseif pretty then
diff --git a/tex/context/base/mkiv/node-met.lua b/tex/context/base/mkiv/node-met.lua
index f5db4babd..574c71f60 100644
--- a/tex/context/base/mkiv/node-met.lua
+++ b/tex/context/base/mkiv/node-met.lua
@@ -136,103 +136,82 @@ nodes.is_zero_glue = node.is_zero_glue
nodes.tonode = function(n) return n end
nodes.tonut = function(n) return n end
-local n_getid = node.getid
-local n_getlist = node.getlist
-local n_getnext = node.getnext
-local n_getprev = node.getprev
-local n_getchar = node.getchar
-local n_getfont = node.getfont
-local n_getsubtype = node.getsubtype
-local n_getfield = node.getfield
-local n_getattr = node.get_attribute
-local n_getdisc = node.getdisc
-local n_getleader = node.getleader
-
-local n_setfield = node.setfield
-local n_setattr = n_setfield
-
-local n_setnext = node.setnext or -- always
- function(c,n)
- n_setfield(c,"next",n)
- end
-local n_setprev = node.setprev or -- always
- function(c,p)
- n_setfield(c,"prev",p)
- end
-local n_setlist = node.setlist or -- always
- function(c,l)
- n_setfield(c,"list",l)
- end
-local n_setlink = node.setlink or -- always
- function(...)
- -- not that fast but not used often anyway
- local h = nil
- for i=1,select("#",...) do
- local n = select(i,...)
- if not n then
- -- go on
- elseif h then
- n_setfield(h,"next",n)
- n_setfield(n,"prev",h)
- else
- h = n
- end
+-- These are never used in \CONTEXT, only as a gimmick in node operators
+-- so we keep them around.
+
+local n_getfield = node.getfield
+local n_getattr = node.get_attribute
+
+local n_setfield = node.setfield
+local n_setattr = n_setfield
+
+nodes.getfield = n_getfield
+nodes.setfield = n_setfield
+nodes.getattr = n_getattr
+nodes.setattr = n_setattr
+nodes.takeattr = nodes.unset_attribute
+
+local function n_getid (n) return n_getfield(n,"id") end
+local function n_getsubtype(n) return n_getfield(n,"subtype") end
+
+nodes.getid = n_getid
+nodes.getsubtype = n_getsubtype
+
+local function n_getchar(n) return n_getfield(n,"char") end
+local function n_setchar(n,c) return n_setfield(n,"char",c) end
+local function n_getfont(n) return n_getfield(n,"font") end
+local function n_setfont(n,f) return n_setfield(n,"font",f) end
+
+nodes.getchar = n_getchar
+nodes.setchar = n_setchar
+nodes.getfont = n_getfont
+nodes.setfont = n_setfont
+
+local function n_getlist (n) return n_getfield(n,"list") end
+local function n_setlist (n,l) return n_setfield(n,"list",l) end
+local function n_getleader(n) return n_getfield(n,"leader") end
+local function n_setleader(n,l) return n_setfield(n,"leader",l) end
+
+nodes.getlist = n_getlist
+nodes.setlist = n_setlist
+nodes.getleader = n_getleader
+nodes.setleader = n_setleader
+
+local function n_getnext(n) return n_getfield(n,"next") end
+local function n_setnext(n,nn) return n_setfield(n,"next",nn) end
+local function n_getprev(n) return n_getfield(n,"prev") end
+local function n_setprev(n,pp) return n_setfield(n,"prev",pp) end
+local function n_getboth(n) return n_getfield(n,"prev"), n_getfield(n,"next") end
+local function n_setboth(n,pp,nn) return n_setfield(n,"prev",pp), n_setfield(n,"next",nn) end
+
+nodes.getnext = n_getnext
+nodes.setnext = n_setnext
+nodes.getprev = n_getprev
+nodes.setprev = n_setprev
+nodes.getboth = n_getboth
+nodes.setboth = n_setboth
+
+local function n_setlink(...)
+ -- not that fast but not used often anyway
+ local h = nil
+ for i=1,select("#",...) do
+ local n = select(i,...)
+ if not n then
+ -- go on
+ elseif h then
+ n_setfield(h,"next",n)
+ n_setfield(n,"prev",h)
+ else
+ h = n
end
- return h
- end
-local n_setboth = node.setboth or -- always
- function(c,p,n)
- n_setfield(c,"prev",p)
- n_setfield(c,"next",n)
- end
-
-nodes.setnext = n_setnext
-nodes.setprev = n_setprev
-nodes.setlink = n_setlink
-nodes.setboth = n_setboth
-nodes.setlist = n_setlist
-
-nodes.getfield = n_getfield
-nodes.setfield = n_setfield
-nodes.getattr = n_getattr
-nodes.setattr = n_setattr
-nodes.takeattr = nodes.unset_attribute
-
-nodes.getnext = n_getnext
-nodes.getprev = n_getprev
-nodes.getid = n_getid
-nodes.getchar = n_getchar
-nodes.getfont = n_getfont
-nodes.getsubtype = n_getsubtype
-nodes.getlist = n_getlist
-nodes.getleader = n_getleader
-nodes.getdisc = n_getdisc
-
-if not node.getwhd then
- function node.getwhd(n)
- return n_getfield(n,"width"), n_getfield(n,"height"), n_getfield(n,"depth")
end
+ return h
end
-if not node.setwhd then
- function node.setwhd(n,w,h,d)
- n_setfield(n,"width",w or 0)
- n_setfield(n,"height",h or 0)
- n_setfield(n,"depth",d or 0)
- end
-end
-
-nodes.getwhd = node.getwhd
-nodes.setwhd = node.setwhd
-
-nodes.is_char = node.is_char
-nodes.ischar = node.is_char
-
-nodes.is_glyph = node.is_glyph
-nodes.isglyph = node.is_glyph
+nodes.setlink = n_setlink
-nodes.getbox = node.getbox or tex.getbox
-nodes.setbox = node.setbox or tex.setbox
+nodes.getbox = node.getbox or tex.getbox
+nodes.setbox = node.setbox or tex.setbox
local n_flush_node = nodes.flush
local n_copy_node = nodes.copy
diff --git a/tex/context/base/mkiv/node-pro.lua b/tex/context/base/mkiv/node-pro.lua
index b6b130588..606d5b8d7 100644
--- a/tex/context/base/mkiv/node-pro.lua
+++ b/tex/context/base/mkiv/node-pro.lua
@@ -14,6 +14,7 @@ local report_nodes = logs.reporter("nodes","processors")
local nodes = nodes
local tasks = nodes.tasks
local nuts = nodes.nuts
+local tonut = nodes.tonut
nodes.processors = nodes.processors or { }
local processors = nodes.processors
@@ -25,7 +26,6 @@ local actions = tasks.actions("processors")
do
- local tonut = nuts.tonut
local isglyph = nuts.isglyph
local getnext = nuts.getnext
@@ -178,9 +178,9 @@ do
local texnest = tex.nest
- local getlist = nodes.getlist
- local setlist = nodes.setlist
- local getsubtype = nodes.getsubtype
+ local getlist = nuts.getlist
+ local setlist = nuts.setlist
+ local getsubtype = nuts.getsubtype
local linelist_code = nodes.listcodes.line
@@ -191,12 +191,15 @@ do
local whatever = texnest[texnest.ptr]
if whatever then
local line = whatever.tail
- if line and getsubtype(line) == linelist_code then
- local head = getlist(line)
- if head then
- local result = actions(head,groupcode,line)
- if result and result ~= head then
- setlist(line,result)
+ if line then
+ line = tonut(line)
+ if getsubtype(line) == linelist_code then
+ local head = getlist(line)
+ if head then
+ local result = actions(head,groupcode,line)
+ if result and result ~= head then
+ setlist(line,result)
+ end
end
end
end
diff --git a/tex/context/base/mkiv/node-tsk.lua b/tex/context/base/mkiv/node-tsk.lua
index 0378c14c6..ca7c7fee4 100644
--- a/tex/context/base/mkiv/node-tsk.lua
+++ b/tex/context/base/mkiv/node-tsk.lua
@@ -627,12 +627,11 @@ local tonode = nodes.nuts.tonode
%localize%
-return function(head,groupcode,line)
- local nuthead = tonut(head)
- local nutline = tonut(line)
+-- we operate exclusively on nuts
+return function(nuthead,groupcode,nutline)
%actions%
- return tonode(nuthead)
+ return nuthead
end
]],
diff --git a/tex/context/base/mkiv/publ-imp-apa.mkvi b/tex/context/base/mkiv/publ-imp-apa.mkvi
index 160cc4522..36e4882d2 100644
--- a/tex/context/base/mkiv/publ-imp-apa.mkvi
+++ b/tex/context/base/mkiv/publ-imp-apa.mkvi
@@ -696,6 +696,30 @@
apa:Advanced={Publicación en línea avanzada},
apa:Retrieved={Obtenido de}] % {Disponible desde}]
+
+\setupbtxlabeltext
+ [sv]
+ [apa:number={nr.},
+ apa:edition={Utgåva},
+ apa:Editor=Redaktör,
+ apa:Editors=Redaktörer,
+ apa:Volume=Band,
+ apa:Volumes=Band,
+ apa:nd={u.å.}, % utan årtal
+ apa:supplement=Bilaga, % Supplement
+ apa:MotionPicture=Spelfilm, % ?
+ apa:Writer={Manusförfattare}, % Assuming for a movie
+ apa:Writers={Manusförfattare}, %
+ apa:Producer=Producent, % Assuming for a movie
+ apa:Producers=Producenter, %
+ apa:Director={Regissör}, % Assuming for a movie
+ apa:Directors={Regissörer}, %
+ apa:Recordedby={Inspelad av}, % Assuming for a movie
+ apa:Author={Författare},
+ apa:Translator={Översättare},
+ apa:Advanced={Avancerad onlinepublikation}, % ?
+ apa:Retrieved={Hämtad från}]
+
% cite setups
% The following differs from the default returning n.d. if year is empty
diff --git a/tex/context/base/mkiv/publ-imp-aps.mkvi b/tex/context/base/mkiv/publ-imp-aps.mkvi
index 4180b6491..4e12fbfc7 100644
--- a/tex/context/base/mkiv/publ-imp-aps.mkvi
+++ b/tex/context/base/mkiv/publ-imp-aps.mkvi
@@ -514,6 +514,20 @@
aps:tobe={que se publicará},
aps:unpublished={inédito}]
+\setupbtxlabeltext
+ [sv]
+ [aps:number={nr.},
+ aps:edition={Utgåva},
+ aps:Editor=Redaktör,
+ aps:Editors=Redaktörer,
+ aps:Volume=Band,
+ aps:Volumes=Band,
+ aps:supplement=Bilaga,
+ aps:inpress={under tryckning},
+ aps:tobe={att publiceras},
+ aps:unpublished={opublicerat}]
+
+
% cite setups
\startsetups btx:aps:nd
diff --git a/tex/context/base/mkiv/publ-imp-commands.mkvi b/tex/context/base/mkiv/publ-imp-commands.mkvi
index 14e2dbae1..281b8324a 100644
--- a/tex/context/base/mkiv/publ-imp-commands.mkvi
+++ b/tex/context/base/mkiv/publ-imp-commands.mkvi
@@ -10,6 +10,6 @@
\definebtxcommand\acro #1{\dontleavehmode{\smallcaps#1}}
\let\<<
-\let\<>
+\let\>>
\protect \endinput
diff --git a/tex/context/base/mkiv/publ-imp-default.mkvi b/tex/context/base/mkiv/publ-imp-default.mkvi
index 22638c900..fef993fe0 100644
--- a/tex/context/base/mkiv/publ-imp-default.mkvi
+++ b/tex/context/base/mkiv/publ-imp-default.mkvi
@@ -342,24 +342,36 @@
[it]
[\s!default:and=e,
\s!default:number={nº},
- \s!default:edition={ed.}, % edizione
+ \s!default:edition={ed.}, % edizione
\s!default:Editor={A cura di},
\s!default:Editors={A cura di},
- \s!default:Volume={Vol.}, % Volume
- \s!default:Volumes={Vol.}, % Volumi
+ \s!default:Volume={Vol.}, % Volume
+ \s!default:Volumes={Vol.}, % Volumi
\s!default:others={et al.}]
\setupbtxlabeltext
[es]
[\s!default:and=y,
\s!default:number={nº},
- \s!default:edition={ed.}, % edición
- \s!default:Editor=Editor, % Ed./Eds.
+ \s!default:edition={ed.}, % edición
+ \s!default:Editor=Editor, % Ed./Eds.
\s!default:Editors=Editores,
\s!default:Volume={Vol.}, % Volumen
\s!default:Volumes={Vols.}, % Volúmenes
\s!default:others={et al.}]
+\setupbtxlabeltext
+ [sv]
+ [\s!default:and=och,
+ \s!default:number={nr.},
+ \s!default:edition={Utgåva},
+ \s!default:Editor=Redaktör,
+ \s!default:Editors=Redaktörer,
+ \s!default:Volume=Band,
+ \s!default:Volumes=Band,
+ \s!default:others={et al.}]
+
+
% First some helpers:
\starttexdefinition btx:default:composed-title
diff --git a/tex/context/base/mkiv/spac-hor.mkiv b/tex/context/base/mkiv/spac-hor.mkiv
index 32b7f06fb..24c7c7893 100644
--- a/tex/context/base/mkiv/spac-hor.mkiv
+++ b/tex/context/base/mkiv/spac-hor.mkiv
@@ -717,7 +717,7 @@
\global\s_spac_narrower_left \zeropoint
\global\s_spac_narrower_right \zeropoint
\global\s_spac_narrower_middle\zeropoint
- \edef\askednarrower{#1}
+ \edef\askednarrower{#1}%
\ifx\askednarrower\v!reverse
\ifconditional\s_spac_narrower_last_swap
\leftskip \s_spac_narrower_right_last
diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf
index d0d2324d8..211e6773f 100644
--- a/tex/context/base/mkiv/status-files.pdf
+++ b/tex/context/base/mkiv/status-files.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf
index a0d9f04f4..a9c4cb673 100644
--- a/tex/context/base/mkiv/status-lua.pdf
+++ b/tex/context/base/mkiv/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/symb-ini.mkiv b/tex/context/base/mkiv/symb-ini.mkiv
index abf857675..428fcd381 100644
--- a/tex/context/base/mkiv/symb-ini.mkiv
+++ b/tex/context/base/mkiv/symb-ini.mkiv
@@ -44,9 +44,23 @@
%D \stoptyping
\installcorenamespace{symbol}
+\installcorenamespace{symbols}
\installcorenamespace{symbolset}
\installcorenamespace{symboldefault}
+%D For now we only have one option.
+
+\installparameterhandler\??symbols {symbols}
+\installsetuphandler \??symbols {symbols}
+
+\appendtoks
+ \doifelse{\symbolsparameter\c!stylealternative}\v!math
+ \settrue\setfalse\prefermathovertextchar
+\to \everysetupsymbols
+
+\setupsymbols
+ [\c!stylealternative=\v!text]
+
\let\currentsymbol \empty
\let\currentsymbolset\empty
diff --git a/tex/context/base/mkiv/trac-log.lua b/tex/context/base/mkiv/trac-log.lua
index 206af5668..e76c9f684 100644
--- a/tex/context/base/mkiv/trac-log.lua
+++ b/tex/context/base/mkiv/trac-log.lua
@@ -114,7 +114,7 @@ local direct, subdirect, writer, pushtarget, poptarget, setlogfile, settimedlog,
-- we don't want this overhead for single messages (not that there are that
-- many; we could have a special weak table)
-if runningtex then
+if runningtex and texio then
if texio.setescape then
texio.setescape(0) -- or (false)
diff --git a/tex/context/base/mkiv/typo-mar.lua b/tex/context/base/mkiv/typo-mar.lua
index f8665e0b0..ce8375eea 100644
--- a/tex/context/base/mkiv/typo-mar.lua
+++ b/tex/context/base/mkiv/typo-mar.lua
@@ -204,7 +204,6 @@ end
function margins.save(t)
setmetatable(t,defaults)
local content = takebox(t.number)
- setprop(content,"specialcontent","margindata")
local location = t.location
local category = t.category
local inline = t.inline
@@ -220,6 +219,7 @@ function margins.save(t)
report_margindata("ignoring empty margin data %a",location or "unknown")
return
end
+ setprop(content,"specialcontent","margindata")
local store
if inline then
store = inlinestore
diff --git a/tex/context/base/mkiv/util-fil.lua b/tex/context/base/mkiv/util-fil.lua
index 9f96a01b9..79af27743 100644
--- a/tex/context/base/mkiv/util-fil.lua
+++ b/tex/context/base/mkiv/util-fil.lua
@@ -14,10 +14,14 @@ local char = string.char
-- flac files). In Lua 5.3 we can probably do this better. Some code will move
-- here.
+-- We could comment those that are in fio and sio.
+
utilities = utilities or { }
local files = { }
utilities.files = files
+-- we could have a gc method that closes but files auto close anyway
+
local zerobased = { }
function files.open(filename,zb)
@@ -249,7 +253,7 @@ end
if bit32 then
- local rshift = bit32.rshift
+ local rshift = bit32.rshift
function files.writecardinal2(f,n)
local a = char(n % 256)
@@ -258,6 +262,35 @@ if bit32 then
f:write(b,a)
end
+ function files.writecardinal4(f,n)
+ local a = char(n % 256)
+ n = rshift(n,8)
+ local b = char(n % 256)
+ n = rshift(n,8)
+ local c = char(n % 256)
+ n = rshift(n,8)
+ local d = char(n % 256)
+ f:write(d,c,b,a)
+ end
+
+ function files.writecardinal2le(f,n)
+ local a = char(n % 256)
+ n = rshift(n,8)
+ local b = char(n % 256)
+ f:write(a,b)
+ end
+
+ function files.writecardinal4le(f,n)
+ local a = char(n % 256)
+ n = rshift(n,8)
+ local b = char(n % 256)
+ n = rshift(n,8)
+ local c = char(n % 256)
+ n = rshift(n,8)
+ local d = char(n % 256)
+ f:write(a,b,c,d)
+ end
+
else
local floor = math.floor
@@ -269,17 +302,35 @@ else
f:write(b,a)
end
-end
+ function files.writecardinal4(f,n)
+ local a = char(n % 256)
+ n = floor(n/256)
+ local b = char(n % 256)
+ n = floor(n/256)
+ local c = char(n % 256)
+ n = floor(n/256)
+ local d = char(n % 256)
+ f:write(d,c,b,a)
+ end
+
+ function files.writecardinal2le(f,n)
+ local a = char(n % 256)
+ n = floor(n/256)
+ local b = char(n % 256)
+ f:write(a,b)
+ end
+
+ function files.writecardinal4le(f,n)
+ local a = char(n % 256)
+ n = floor(n/256)
+ local b = char(n % 256)
+ n = floor(n/256)
+ local c = char(n % 256)
+ n = floor(n/256)
+ local d = char(n % 256)
+ f:write(a,b,c,d)
+ end
-function files.writecardinal4(f,n)
- local a = char(n % 256)
- n = rshift(n,8)
- local b = char(n % 256)
- n = rshift(n,8)
- local c = char(n % 256)
- n = rshift(n,8)
- local d = char(n % 256)
- f:write(d,c,b,a)
end
function files.writestring(f,s)
@@ -292,30 +343,42 @@ end
if fio and fio.readcardinal1 then
- files.readcardinal1 = fio.readcardinal1
- files.readcardinal2 = fio.readcardinal2
- files.readcardinal3 = fio.readcardinal3
- files.readcardinal4 = fio.readcardinal4
- files.readinteger1 = fio.readinteger1
- files.readinteger2 = fio.readinteger2
- files.readinteger3 = fio.readinteger3
- files.readinteger4 = fio.readinteger4
- files.readfixed2 = fio.readfixed2
- files.readfixed4 = fio.readfixed4
- files.read2dot14 = fio.read2dot14
- files.setposition = fio.setposition
- files.getposition = fio.getposition
-
- files.readbyte = files.readcardinal1
- files.readsignedbyte = files.readinteger1
- files.readcardinal = files.readcardinal1
- files.readinteger = files.readinteger1
-
- local skipposition = fio.skipposition
- files.skipposition = skipposition
-
- files.readbytes = fio.readbytes
- files.readbytetable = fio.readbytetable
+ files.readcardinal1 = fio.readcardinal1
+ files.readcardinal2 = fio.readcardinal2
+ files.readcardinal3 = fio.readcardinal3
+ files.readcardinal4 = fio.readcardinal4
+
+ files.readcardinal1le = fio.readcardinal1le or files.readcardinal1le
+ files.readcardinal2le = fio.readcardinal2le or files.readcardinal2le
+ files.readcardinal3le = fio.readcardinal3le or files.readcardinal3le
+ files.readcardinal4le = fio.readcardinal4le or files.readcardinal4le
+
+ files.readinteger1 = fio.readinteger1
+ files.readinteger2 = fio.readinteger2
+ files.readinteger3 = fio.readinteger3
+ files.readinteger4 = fio.readinteger4
+
+ files.readinteger1le = fio.readinteger1le or files.readinteger1le
+ files.readinteger2le = fio.readinteger2le or files.readinteger2le
+ files.readinteger3le = fio.readinteger3le or files.readinteger3le
+ files.readinteger4le = fio.readinteger4le or files.readinteger4le
+
+ files.readfixed2 = fio.readfixed2
+ files.readfixed4 = fio.readfixed4
+ files.read2dot14 = fio.read2dot14
+ files.setposition = fio.setposition
+ files.getposition = fio.getposition
+
+ files.readbyte = files.readcardinal1
+ files.readsignedbyte = files.readinteger1
+ files.readcardinal = files.readcardinal1
+ files.readinteger = files.readinteger1
+
+ local skipposition = fio.skipposition
+ files.skipposition = skipposition
+
+ files.readbytes = fio.readbytes
+ files.readbytetable = fio.readbytetable
function files.skipshort(f,n)
skipposition(f,2*(n or 1))
@@ -327,6 +390,30 @@ if fio and fio.readcardinal1 then
end
+if fio and fio.writecardinal1 then
+
+ files.writecardinal1 = fio.writecardinal1
+ files.writecardinal2 = fio.writecardinal2
+ files.writecardinal3 = fio.writecardinal3
+ files.writecardinal4 = fio.writecardinal4
+
+ files.writecardinal1le = fio.writecardinal1le
+ files.writecardinal2le = fio.writecardinal2le
+ files.writecardinal3le = fio.writecardinal3le
+ files.writecardinal4le = fio.writecardinal4le
+
+ files.writeinteger1 = fio.writeinteger1 or fio.writecardinal1
+ files.writeinteger2 = fio.writeinteger2 or fio.writecardinal2
+ files.writeinteger3 = fio.writeinteger3 or fio.writecardinal3
+ files.writeinteger4 = fio.writeinteger4 or fio.writecardinal4
+
+ files.writeinteger1le = files.writeinteger1le or fio.writecardinal1le
+ files.writeinteger2le = files.writeinteger2le or fio.writecardinal2le
+ files.writeinteger3le = files.writeinteger3le or fio.writecardinal3le
+ files.writeinteger4le = files.writeinteger4le or fio.writecardinal4le
+
+end
+
if fio and fio.readcardinaltable then
files.readcardinaltable = fio.readcardinaltable
diff --git a/tex/context/base/mkiv/util-sac.lua b/tex/context/base/mkiv/util-sac.lua
index dc8ba72f1..976989a77 100644
--- a/tex/context/base/mkiv/util-sac.lua
+++ b/tex/context/base/mkiv/util-sac.lua
@@ -29,6 +29,12 @@ function streams.openstring(f,zerobased)
end
end
+function streams.getstring(f)
+ if f then
+ return f[1]
+ end
+end
+
function streams.close()
-- dummy
end
@@ -137,7 +143,7 @@ function streams.readcardinal2(f)
return 0x100 * a + b
end
-function streams.readcardinal2LE(f)
+function streams.readcardinal2le(f)
local i = f[2]
local j = i + 1
f[2] = j + 1
@@ -217,6 +223,14 @@ function streams.readcardinal4(f)
return 0x1000000 * a + 0x10000 * b + 0x100 * c + d
end
+function streams.readcardinal4le(f)
+ local i = f[2]
+ local j = i + 3
+ f[2] = j + 1
+ local d, c, b, a = byte(f[1],i,j)
+ return 0x1000000 * a + 0x10000 * b + 0x100 * c + d
+end
+
function streams.readinteger4(f)
local i = f[2]
local j = i + 3
diff --git a/tex/context/base/mkiv/util-soc-imp-mime.lua b/tex/context/base/mkiv/util-soc-imp-mime.lua
index 4b5d2baff..7a5cef27b 100644
--- a/tex/context/base/mkiv/util-soc-imp-mime.lua
+++ b/tex/context/base/mkiv/util-soc-imp-mime.lua
@@ -3,8 +3,8 @@
local type, tostring = type, tostring
-local mime = require("mime.core")
-local ltn12 = ltn12 or require("ltn12")
+local mime = mime or package.loaded.mime or require("mime.core")
+local ltn12 = ltn12 or package.loaded.ltn12 or require("ltn12")
local filtercycle = ltn12.filter.cycle
diff --git a/tex/context/base/mkiv/util-soc-imp-socket.lua b/tex/context/base/mkiv/util-soc-imp-socket.lua
index 3da155749..d1486f8f8 100644
--- a/tex/context/base/mkiv/util-soc-imp-socket.lua
+++ b/tex/context/base/mkiv/util-soc-imp-socket.lua
@@ -5,7 +5,7 @@ local type, tostring, setmetatable = type, tostring, setmetatable
local min = math.min
local format = string.format
-local socket = require("socket.core")
+local socket = socket or package.loaded.socket or require("socket.core")
local connect = socket.connect
local tcp4 = socket.tcp4
diff --git a/tex/context/base/mkiv/util-str.lua b/tex/context/base/mkiv/util-str.lua
index 5f175e227..a04b20835 100644
--- a/tex/context/base/mkiv/util-str.lua
+++ b/tex/context/base/mkiv/util-str.lua
@@ -14,7 +14,6 @@ local format, gsub, rep, sub, find = string.format, string.gsub, string.rep, str
local load, dump = load, string.dump
local tonumber, type, tostring, next, setmetatable = tonumber, type, tostring, next, setmetatable
local unpack, concat = table.unpack, table.concat
-local unpack, concat = table.unpack, table.concat
local P, V, C, S, R, Ct, Cs, Cp, Carg, Cc = lpeg.P, lpeg.V, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cs, lpeg.Cp, lpeg.Carg, lpeg.Cc
local patterns, lpegmatch = lpeg.patterns, lpeg.match
local utfchar, utfbyte, utflen = utf.char, utf.byte, utf.len
diff --git a/tex/context/base/mkiv/util-tab.lua b/tex/context/base/mkiv/util-tab.lua
index be5f1318c..2f425cca3 100644
--- a/tex/context/base/mkiv/util-tab.lua
+++ b/tex/context/base/mkiv/util-tab.lua
@@ -311,7 +311,8 @@ function tables.encapsulate(core,capsule,protect)
end
end
--- best keep [%q] keys (as we have some in older applications i.e. saving user data
+-- best keep [%q] keys (as we have some in older applications i.e. saving user data (otherwise
+-- we also need to check for reserved words)
local f_hashed_string = formatters["[%q]=%q,"]
local f_hashed_number = formatters["[%q]=%s,"]
diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf
index 147d7755b..c4450ad71 100644
--- a/tex/context/interface/mkiv/i-context.pdf
+++ b/tex/context/interface/mkiv/i-context.pdf
Binary files differ
diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf
index b48a519ae..8bc3240c4 100644
--- a/tex/context/interface/mkiv/i-readme.pdf
+++ b/tex/context/interface/mkiv/i-readme.pdf
Binary files differ
diff --git a/tex/context/modules/mkiv/m-chart.lua b/tex/context/modules/mkiv/m-chart.lua
index cde563fb3..7973640a7 100644
--- a/tex/context/modules/mkiv/m-chart.lua
+++ b/tex/context/modules/mkiv/m-chart.lua
@@ -864,8 +864,8 @@ local function getchart(settings,forced_x,forced_y,forced_nx,forced_ny)
for i=1,#data do
local cell = data[i]
if not autofocus or autofocus[cell.name] then -- offsets probably interfere with autofocus
- local x = cell.x
- local y = cell.y
+ local x = cell.realx -- was bug: .x
+ local y = cell.realy -- was bug: .y
if minx == 0 or x < minx then minx = x end
if miny == 0 or y < miny then miny = y end
if minx == 0 or x > maxx then maxx = x end
diff --git a/tex/context/sample/third/aristotle-grc.tex b/tex/context/sample/third/aristotle-grc.tex
new file mode 100644
index 000000000..85d774f23
--- /dev/null
+++ b/tex/context/sample/third/aristotle-grc.tex
@@ -0,0 +1,13 @@
+\startlanguage[grc]
+Λόγος δέ ἐστι φωνὴ σημαντική, ἧς τῶν μερῶν τι σημαντικόν ἐστι
+κεχωρισμένον, ὡς φάσις ἀλλ᾽ οὐχ ὡς κατάφασις. λέγω δέ, οἷον ἄνθρωπος
+σημαίνει τι, ἀλλ᾽ οὐχ ὅτι ἔστιν ἢ οὐκ ἔστιν (ἀλλ᾽ ἔσται κατάφασις ἢ
+ἀπόφασις ἐάν τι προστεθῇ)· ἀλλ᾽ οὐχ ἡ τοῦ ἀνθρώπου συλλαβὴ μία· οὐδὲ
+γὰρ ἐν τῷ μῦς τὸ υς σημαντικόν, ἀλλὰ φωνή ἐστι νῦν μόνον. ἐν δὲ τοῖς
+διπλοῖς σημαίνει μέν, ἀλλ᾽ οὐ καθ᾽ αὑτό, ὥσπερ εἴρηται. ἔστι δὲ λόγος
+ἅπας μὲν σημαντικός, οὐχ ὡς ὄργανον δέ, ἀλλ᾽ ὥσπερ εἴρηται κατὰ
+συνθήκην· ἀποφαντικὸς δὲ οὐ πᾶς, ἀλλ᾽ ἐν ᾧ τὸ ἀληθεύειν ἢ ψεύδεσθαι
+ὑπάρχει· οὐκ ἐν ἅπασι δὲ ὑπάρχει, οἷον ἡ εὐχὴ λόγος μέν, ἀλλ᾽ οὔτ᾽
+ἀληθὴς οὔτε ψευδής. οἱ μὲν οὖν ἄλλοι ἀφείσθωσαν, —ῥητορικῆς γὰρ ἢ
+ποιητικῆς οἰκειοτέρα ἡ σκέψις,— ὁ δὲ ἀποφαντικὸς τῆς νῦν θεωρίας.
+\stoplanguage
diff --git a/tex/context/sample/third/capek-cz.tex b/tex/context/sample/third/capek-cz.tex
new file mode 100644
index 000000000..8083d7152
--- /dev/null
+++ b/tex/context/sample/third/capek-cz.tex
@@ -0,0 +1,13 @@
+Tak vám jednou byl jeden chudý pán neboli člověk, on se vlastně jmenoval
+František Král, ale tak mu říkali jenom tehdy, když ho sebral strážník a
+dovedl ho na komisařství pro potulku, kde ho zapsali do takové tlusté knihy
+a nechali ho přespat na pryčně a ráno ho zase poslali dál; na policii mu
+tedy říkali František Král, ale ostatní lidé ho jmenovali všelijak jinak:
+ten vandrák, ten šupák, ten tulák, ten pobuda, ten lajdák, ten otrapa, ten
+hadrník, ten trhan, ten obejda, ten lenoch, ten chudák, ten jindyvyjduum,
+ten člověk, ten kdovíkdo, ten poběhlík, ten krajánek, ten štvanec, ten
+vošlapa, ten revertent, ten vagabund, ten darmošlap, ten budižkničemu, ten
+hlad, ten hunt, ten holota a ještě mnoho jiných jmen mu dávali; kdyby každé
+to názvisko platilo aspoň korunu, mohl by si za ně koupit žluté boty a možná
+že i klobouk, ale takhle si za to nekoupil nic a měl jenom to, co mu lidé
+dali.
diff --git a/tex/context/sample/third/capek-vlnka-cz.tex b/tex/context/sample/third/capek-vlnka-cz.tex
new file mode 100644
index 000000000..9fede2334
--- /dev/null
+++ b/tex/context/sample/third/capek-vlnka-cz.tex
@@ -0,0 +1,13 @@
+Tak vám jednou byl jeden chudý pán neboli člověk, on se vlastně jmenoval
+František Král, ale tak mu říkali jenom tehdy, když ho sebral strážník
+a~dovedl ho na komisařství pro potulku, kde ho zapsali do takové tlusté knihy
+a~nechali ho přespat na pryčně a~ráno ho zase poslali dál; na policii mu
+tedy říkali František Král, ale ostatní lidé ho jmenovali všelijak jinak:
+ten vandrák, ten šupák, ten tulák, ten pobuda, ten lajdák, ten otrapa, ten
+hadrník, ten trhan, ten obejda, ten lenoch, ten chudák, ten jindyvyjduum,
+ten člověk, ten kdovíkdo, ten poběhlík, ten krajánek, ten štvanec, ten
+vošlapa, ten revertent, ten vagabund, ten darmošlap, ten budižkničemu, ten
+hlad, ten hunt, ten holota a~ještě mnoho jiných jmen mu dávali; kdyby každé
+to názvisko platilo aspoň korunu, mohl by si za ně koupit žluté boty a~možná
+že i~klobouk, ale takhle si za to nekoupil nic a~měl jenom to, co mu lidé
+dali.
diff --git a/tex/context/sample/third/dequincey.tex b/tex/context/sample/third/dequincey.tex
new file mode 100644
index 000000000..a1070b562
--- /dev/null
+++ b/tex/context/sample/third/dequincey.tex
@@ -0,0 +1,5 @@
+For if once a man indulges himself in murder, very soon he comes to
+think little of robbing; and from robbing he comes next to drinking and
+Sabbath--breaking, and from that to incivility and procrastination.
+Once begin upon this downward path, you never know where you are to
+stop.
diff --git a/tex/context/sample/third/dyrynk-cz.tex b/tex/context/sample/third/dyrynk-cz.tex
new file mode 100644
index 000000000..e12a228b9
--- /dev/null
+++ b/tex/context/sample/third/dyrynk-cz.tex
@@ -0,0 +1,22 @@
+Čeho jsem si zvlášť všímal při prohlížení knih, je typografické jejich
+zhotovení, technické provedení knihtiskařem, které po mém soudu je základem
+dobré knižní úpravy. A tu nelze upřít, že řemeslná stránka je dosud stránkou
+slabou většiny našich knih. Často až překvapí rozpor mezi péčí, kterou
+věnoval umělec výzdobě knihy, a ledabylostí, s jakou ji tiskárna zhotovila.
+Bývá to podivná harmonie: výzdoba umělecká a sazba i tisk jako denních
+novin. Nejsou to malé závody, jichž výrobkům lze vytknouti tuto řemeslnou
+chybu, i přední veliké tiskárny zhotovují takto >>krásné<< knihy. Stačí
+prohlédnouti si podrobněji reprodukce v tomto díle, abychom se přesvědčili,
+že to tvrzení není přehnané.
+
+Přece však lze pozorovati potěšitelný obrat k lepšímu: některé české
+knihtiskárny se chlubí už správně vysazenými a dobře vytištěnými knihami.
+Sice dosud jest málo impressí, které takto jeví úctu a vážnost k svému
+černému umění, obracejíce knihtisk k jeho staré lásce, knize, a věnujíce
+její vkusné úpravě čas, píči a píli; na prstech jedné ruky by je spočetl.
+Nepochybuji však, že jich přibude, vždyť ničím nemůže se knihtiskárna
+lépe doporučiti než svojí firmou na dokonale, krásně upravené knize, která
+je rozkoší oku a potěšením duši, a ještě po letech a desetiletích, kdy
+dávno upadnou v zapomnění drobné akcidence, zůstane v knihovnách jako svědek
+odborné vyspělosti knihtiskárny, schopnosti jejích pracovníků
+a prozíravosti i vkusu principála nebo řiditele závodu.
diff --git a/tex/context/sample/third/dyrynk-vlnka-cz.tex b/tex/context/sample/third/dyrynk-vlnka-cz.tex
new file mode 100644
index 000000000..1d4df1e49
--- /dev/null
+++ b/tex/context/sample/third/dyrynk-vlnka-cz.tex
@@ -0,0 +1,23 @@
+
+Čeho jsem si zvlášť všímal při prohlížení knih, je typografické jejich
+zhotovení, technické provedení knihtiskařem, které po mém soudu je základem
+dobré knižní úpravy. A~tu nelze upřít, že řemeslná stránka je dosud stránkou
+slabou většiny našich knih. Často až překvapí rozpor mezi péčí, kterou
+věnoval umělec výzdobě knihy, a~ledabylostí, s~jakou ji tiskárna zhotovila.
+Bývá to podivná harmonie: výzdoba umělecká a~sazba i~tisk jako denních
+novin. Nejsou to malé závody, jichž výrobkům lze vytknouti tuto řemeslnou
+chybu, i~přední veliké tiskárny zhotovují takto >>krásné<< knihy. Stačí
+prohlédnouti si podrobněji reprodukce v~tomto díle, abychom se přesvědčili,
+že to tvrzení není přehnané.
+
+Přece však lze pozorovati potěšitelný obrat k~lepšímu: některé české
+knihtiskárny se chlubí už správně vysazenými a~dobře vytištěnými knihami.
+Sice dosud jest málo impressí, které takto jeví úctu a~vážnost k~svému
+černému umění, obracejíce knihtisk k~jeho staré lásce, knize, a~věnujíce
+její vkusné úpravě čas, píči a~píli; na prstech jedné ruky by je spočetl.
+Nepochybuji však, že jich přibude, vždyť ničím nemůže se knihtiskárna
+lépe doporučiti než svojí firmou na dokonale, krásně upravené knize, která
+je rozkoší oku a~potěšením duši, a~ještě po letech a~desetiletích, kdy
+dávno upadnou v~zapomnění drobné akcidence, zůstane v~knihovnách jako svědek
+odborné vyspělosti knihtiskárny, schopnosti jejích pracovníků
+a~prozíravosti i~vkusu principála nebo řiditele závodu.
diff --git a/tex/context/sample/third/kollar-cz.tex b/tex/context/sample/third/kollar-cz.tex
new file mode 100644
index 000000000..5a4f63695
--- /dev/null
+++ b/tex/context/sample/third/kollar-cz.tex
@@ -0,0 +1,31 @@
+
+Aj zde leží zem ta před okem mým slzy ronícím,
+někdy kolébka, nyní národu mého rakev.
+Stoj noho! posvátná místa jsou, kamkoli kráčíš,
+k obloze, Tatry synu, vznes se vyvýše pohled,
+neb raději k velikému prichyl tomu tam se dubisku,
+jenž vzdoruje zhoubným až dosaváde časům.
+Však času ten horší je člověk, jenž berlu železnou
+v těchto krajích na tvou, Slavie, šíji chopil.
+Horší, nežli divé války, hromu, ohně divější,
+zaslepenec na své když zlobu plémě kydá.
+Ó věkové dávní, jako noc vůkol mne ležící,
+ó krajino, všeliké slávy i hanby obraz!
+Od Labe zrádného k rovinám až Visly nevěrné,
+od Dunaje k hltným Baltu celého pěnám:
+Krásnohlasy zmužilých Slavjanů kde se někdy ozýval,
+aj oněmělť už, byv k ourazu zášti, jazyk.
+A kdo se loupeže té, volající vzhůru, dopustil?
+Kdo zhanobil v jednom národu lidstvo celé?
+Zardi se závistná Teutonie, sousedo Slávy,
+tvé vin těchto počet spáchaly někdy ruky!
+Neb krve nikde tolik nevylil černidla že žádný
+nepřítel, co vylil k záhubě Slávy Němec.
+Sám svobody kdo hoden, svobodu zná vážiti každou,
+ten kdo do pout jímá otroky, sám je otrok.
+Nechť ruky, nechť by jazyk v okovy své vázal otrocké,
+jedno to, neb nezná šetřiti práva jiných.
+Ten, kdo trůny bořil, lidskou krev darmo vyléval,
+po světě nešťastnou války pochodni nosil:
+ten porobu slušnou, buď Goth, buď Skytha zasloužil,
+ne kdo divé chválil příkladem ordě pokoj.
diff --git a/tex/context/sample/third/kollar-vlnka-cz.tex b/tex/context/sample/third/kollar-vlnka-cz.tex
new file mode 100644
index 000000000..01e815e74
--- /dev/null
+++ b/tex/context/sample/third/kollar-vlnka-cz.tex
@@ -0,0 +1,30 @@
+Aj zde leží zem ta před okem mým slzy ronícím,
+někdy kolébka, nyní národu mého rakev.
+Stoj noho! posvátná místa jsou, kamkoli kráčíš,
+k~obloze, Tatry synu, vznes se vyvýše pohled,
+neb raději k~velikému prichyl tomu tam se dubisku,
+jenž vzdoruje zhoubným až dosaváde časům.
+Však času ten horší je člověk, jenž berlu železnou
+v~těchto krajích na tvou, Slavie, šíji chopil.
+Horší, nežli divé války, hromu, ohně divější,
+zaslepenec na své když zlobu plémě kydá.
+Ó věkové dávní, jako noc vůkol mne ležící,
+ó krajino, všeliké slávy i~hanby obraz!
+Od Labe zrádného k~rovinám až Visly nevěrné,
+od Dunaje k~hltným Baltu celého pěnám:
+Krásnohlasy zmužilých Slavjanů kde se někdy ozýval,
+aj oněmělť už, byv k~ourazu zášti, jazyk.
+A~kdo se loupeže té, volající vzhůru, dopustil?
+Kdo zhanobil v~jednom národu lidstvo celé?
+Zardi se závistná Teutonie, sousedo Slávy,
+tvé vin těchto počet spáchaly někdy ruky!
+Neb krve nikde tolik nevylil černidla že žádný
+nepřítel, co vylil k~záhubě Slávy Němec.
+Sám svobody kdo hoden, svobodu zná vážiti každou,
+ten kdo do pout jímá otroky, sám je otrok.
+Nechť ruky, nechť by jazyk v~okovy své vázal otrocké,
+jedno to, neb nezná šetřiti práva jiných.
+Ten, kdo trůny bořil, lidskou krev darmo vyléval,
+po světě nešťastnou války pochodni nosil:
+ten porobu slušnou, buď Goth, buď Skytha zasloužil,
+ne kdo divé chválil příkladem ordě pokoj.
diff --git a/tex/context/sample/third/komensky-cz.tex b/tex/context/sample/third/komensky-cz.tex
new file mode 100644
index 000000000..f25bb47d9
--- /dev/null
+++ b/tex/context/sample/third/komensky-cz.tex
@@ -0,0 +1,33 @@
+Nejkrásnějším dílem Božím je svět, všeliké neviditelné Božské věcí viditelné
+ukazující. Nejkrásnější je ale naše duše, jíž je dáno, myšlením zobrazovat
+ve svém nitru svět i věci veškery. Nejkrásnější je řeč, jejíž pomocí
+vmalováváme všeliké obrazy své duše v duši druhého. Nejkrásnější je písmo,
+jímž zachycujeme a natrvalo upevňujeme řeč, samu o sobě prchavou a
+pomíjející, a jímž jako bychom ji zadržovali, aby trvala. Nejkrásnější jsou
+knihy, písmem ladně sestavené, jimiž zpodobenou moudrost posíláme lidem,
+místně či časově vzdáleným, ba dokonce i pozdnímu potomstvu. Nejkrásnějším
+darem Božím je vynález tiskových liter, jimž se knihy nesmírně rychle
+rozmnožují.
+
+Sazeč, maje před sebou kasu, naplněnou kovovými literkami, uloženými v
+přihrádkách, dívá se do rukopisu, postaveného na vidlici tak, aby pohodlně
+viděl, v levé ruce sázítko, pravou rukou vybírá (z přihrádek) literky a
+skládá je do sázítka v slova: když naplní sloupec, přenáší je na desku.
+Jakmile pak je naplněn počet sloupců pro jednu stranu archu, rozdělí je
+příložkami, ováže je a stáhne železnými rámy, aby se nerozpadly; a tím se
+podle svého mínění sví povinnosti zhostil.
+
+A tak tito všichni pracujíce vzájemně vykonávající jakoby hračkou
+podivuhodné dílo, lidem kdysi nepochopitelné, jen když mají všichni to, čeho
+je přitom potření, jednak odborné znalosti zbystřené praxí, jednak vytrvalou
+pozornost a píli. Znalosti: poněvadž třebaže je tiskařství řemeslem, je
+nejsubtilnějším uměním, skládajícím se z přečetných maličkostí, na něž nutno
+dávat dobrý pozor. Pozornost a píli: poněvadž zde, kde se stýká tolik
+maličkostí, velmi snadno se něco přihodí, co by dílo rušilo, kdyby se
+nebdělo.
+
+Tolik ve všeobecnosti o tom, jak se tisknou knihy vůbec. Jestliže by se
+naskytla otázka, jak vznikají knihy dobré, bude třeba říci, že je žádoucí za
+prvé rozumně sepsaný rukopis, hodný světla a nikoli tmy; na druhém místě
+elegantní typy; na třetím čistý papír; na čtvrtém pak pozorná práce, aby vše
+až do poslední čárky bylo zřetelné, rozlišené a správné.
diff --git a/tex/context/sample/third/komensky-vlnka-cz.tex b/tex/context/sample/third/komensky-vlnka-cz.tex
new file mode 100644
index 000000000..17a2ab3f7
--- /dev/null
+++ b/tex/context/sample/third/komensky-vlnka-cz.tex
@@ -0,0 +1,33 @@
+Nejkrásnějším dílem Božím je svět, všeliké neviditelné Božské věcí viditelné
+ukazující. Nejkrásnější je ale naše duše, jíž je dáno, myšlením zobrazovat
+ve svém nitru svět i~věci veškery. Nejkrásnější je řeč, jejíž pomocí
+vmalováváme všeliké obrazy své duše v~duši druhého. Nejkrásnější je písmo,
+jímž zachycujeme a~natrvalo upevňujeme řeč, samu o~sobě prchavou
+a~pomíjející, a~jímž jako bychom ji zadržovali, aby trvala. Nejkrásnější jsou
+knihy, písmem ladně sestavené, jimiž zpodobenou moudrost posíláme lidem,
+místně či časově vzdáleným, ba dokonce i~pozdnímu potomstvu. Nejkrásnějším
+darem Božím je vynález tiskových liter, jimž se knihy nesmírně rychle
+rozmnožují.
+
+Sazeč, maje před sebou kasu, naplněnou kovovými literkami, uloženými
+v~přihrádkách, dívá se do rukopisu, postaveného na vidlici tak, aby pohodlně
+viděl, v~levé ruce sázítko, pravou rukou vybírá (z~přihrádek) literky
+a~skládá je do sázítka v~slova: když naplní sloupec, přenáší je na desku.
+Jakmile pak je naplněn počet sloupců pro jednu stranu archu, rozdělí je
+příložkami, ováže je a~stáhne železnými rámy, aby se nerozpadly; a~tím se
+podle svého mínění sví povinnosti zhostil.
+
+A~tak tito všichni pracujíce vzájemně vykonávající jakoby hračkou
+podivuhodné dílo, lidem kdysi nepochopitelné, jen když mají všichni to, čeho
+je přitom potřebí, jednak odborné znalosti zbystřené praxí, jednak vytrvalou
+pozornost a~píli. Znalosti: poněvadž třebaže je tiskařství řemeslem, je
+nejsubtilnějším uměním, skládajícím se z~přečetných maličkostí, na něž nutno
+dávat dobrý pozor. Pozornost a~píli: poněvadž zde, kde se stýká tolik
+maličkostí, velmi snadno se něco přihodí, co by dílo rušilo, kdyby se
+nebdělo.
+
+Tolik ve všeobecnosti o~tom, jak se tisknou knihy vůbec. Jestliže by se
+naskytla otázka, jak vznikají knihy dobré, bude třeba říci, že je žádoucí za
+prvé rozumně sepsaný rukopis, hodný světla a~nikoli tmy; na druhém místě
+elegantní typy; na třetím čistý papír; na čtvrtém pak pozorná práce, aby vše
+až do poslední čárky bylo zřetelné, rozlišené a~správné.
diff --git a/tex/context/sample/third/krdel-sk.tex b/tex/context/sample/third/krdel-sk.tex
new file mode 100644
index 000000000..2f2395427
--- /dev/null
+++ b/tex/context/sample/third/krdel-sk.tex
@@ -0,0 +1,7 @@
+
+KŔDEĽ ŠŤASTNÝCH ĎATĽOV UČÍ PRI ÚSTÍ VÁHU MĹKVÉHO KOŇA OBHRÝZAŤ KÔRU A ŽRAŤ ČERSTVÉ MÄSO.
+
+Kŕdeľ šťastných ďatľov učí pri ústí Váhu mĺkveho koňa obhrýzať kôru a žrať čerstvé mäso.
+
+0123456789 :;!?()[]\{\} -/--/--- ÖÜŮŘ öüůř
+
diff --git a/tex/context/sample/third/kun-cz.tex b/tex/context/sample/third/kun-cz.tex
new file mode 100644
index 000000000..ee1471c1b
--- /dev/null
+++ b/tex/context/sample/third/kun-cz.tex
@@ -0,0 +1,7 @@
+
+ŽLUŤOUČKÝ KŮŇ ÚPĚL ĎÁBELSKÉ ÓDY,
+
+žluťoučký kůň úpěl ďábelské ódy.
+
+0123456789 :;!?()[]\{\} -/--/--- ŕĺľäöü ŔĹĽÄÖÜ
+
diff --git a/tex/generic/context/luatex/luatex-basics-nod.lua b/tex/generic/context/luatex/luatex-basics-nod.lua
index e22f170ef..879da4bc7 100644
--- a/tex/generic/context/luatex/luatex-basics-nod.lua
+++ b/tex/generic/context/luatex/luatex-basics-nod.lua
@@ -70,81 +70,77 @@ nodes.nodecodes = nodecodes
nodes.glyphcodes = glyphcodes
nodes.disccodes = disccodes
-local flush_node = node.flush_node
-local remove_node = node.remove
-local traverse_id = node.traverse_id
-
nodes.handlers.protectglyphs = node.protect_glyphs -- beware: nodes!
nodes.handlers.unprotectglyphs = node.unprotect_glyphs -- beware: nodes!
-function nodes.remove(head, current, free_too)
- local t = current
- head, current = remove_node(head,current)
- if t then
- if free_too then
- flush_node(t)
- t = nil
- else
- t.next, t.prev = nil, nil
- end
- end
- return head, current, t
-end
-
-function nodes.delete(head,current)
- return nodes.remove(head,current,true)
-end
-
-local getfield = node.getfield
-local setfield = node.setfield
-
-nodes.getfield = getfield
-nodes.setfield = setfield
-
-nodes.getattr = getfield
-nodes.setattr = setfield
-
--- being lazy ... just copy a bunch ... not all needed in generic but we assume
--- nodes to be kind of private anyway
-
-nodes.tostring = node.tostring or tostring
-nodes.copy = node.copy
-nodes.copy_node = node.copy
-nodes.copy_list = node.copy_list
-nodes.delete = node.delete
-nodes.dimensions = node.dimensions
-nodes.end_of_math = node.end_of_math
-nodes.flush_list = node.flush_list
-nodes.flush_node = node.flush_node
-nodes.flush = node.flush_node
-nodes.free = node.free
-nodes.insert_after = node.insert_after
-nodes.insert_before = node.insert_before
-nodes.hpack = node.hpack
-nodes.new = node.new
-nodes.tail = node.tail
-nodes.traverse = node.traverse
-nodes.traverse_id = node.traverse_id
-nodes.slide = node.slide
-nodes.vpack = node.vpack
-
-nodes.first_glyph = node.first_glyph
-nodes.has_glyph = node.has_glyph or node.first_glyph
-
-nodes.current_attr = node.current_attr
-nodes.has_field = node.has_field
-nodes.last_node = node.last_node
-nodes.usedlist = node.usedlist
-nodes.protrusion_skippable = node.protrusion_skippable
-nodes.write = node.write
-
-nodes.has_attribute = node.has_attribute
-nodes.set_attribute = node.set_attribute
-nodes.unset_attribute = node.unset_attribute
-
-nodes.protect_glyphs = node.protect_glyphs
-nodes.unprotect_glyphs = node.unprotect_glyphs
-nodes.mlist_to_hlist = node.mlist_to_hlist
+-- These are now gone in generic as they are context specific.
+
+-- local flush_node = node.flush_node
+-- local remove_node = node.remove
+-- local traverse_id = node.traverse_id
+--
+-- function nodes.remove(head, current, free_too)
+-- local t = current
+-- head, current = remove_node(head,current)
+-- if t then
+-- if free_too then
+-- flush_node(t)
+-- t = nil
+-- else
+-- t.next, t.prev = nil, nil
+-- end
+-- end
+-- return head, current, t
+-- end
+--
+-- function nodes.delete(head,current)
+-- return nodes.remove(head,current,true)
+-- end
+
+----- getfield = node.getfield
+----- setfield = node.setfield
+
+-----.getfield = getfield
+-----.setfield = setfield
+-----.getattr = getfield
+-----.setattr = setfield
+
+-----.tostring = node.tostring or tostring
+-----.copy = node.copy
+-----.copy_node = node.copy
+-----.copy_list = node.copy_list
+-----.delete = node.delete
+-----.dimensions = node.dimensions
+-----.end_of_math = node.end_of_math
+-----.flush_list = node.flush_list
+-----.flush_node = node.flush_node
+-----.flush = node.flush_node
+-----.free = node.free
+-----.insert_after = node.insert_after
+-----.insert_before = node.insert_before
+-----.hpack = node.hpack
+-----.new = node.new
+-----.tail = node.tail
+-----.traverse = node.traverse
+-----.traverse_id = node.traverse_id
+-----.slide = node.slide
+-----.vpack = node.vpack
+
+-----.first_glyph = node.first_glyph
+-----.has_glyph = node.has_glyph or node.first_glyph
+-----.current_attr = node.current_attr
+-----.has_field = node.has_field
+-----.usedlist = node.usedlist
+-----.protrusion_skippable = node.protrusion_skippable
+-----.write = node.write
+
+-----.has_attribute = node.has_attribute
+-----.set_attribute = node.set_attribute
+-----.unset_attribute = node.unset_attribute
+
+-----.protect_glyphs = node.protect_glyphs
+-----.unprotect_glyphs = node.unprotect_glyphs
+-----.mlist_to_hlist = node.mlist_to_hlist
-- in generic code, at least for some time, we stay nodes, while in context
-- we can go nuts (e.g. experimental); this split permits us us keep code
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 6fab6ea69..766b869fe 100644
--- a/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date : 03/05/19 15:40:37
+-- merge date : 03/21/19 21:39:34
do -- begin closure to overcome local limits and interference
@@ -120,7 +120,6 @@ elseif not ffi.number then
ffi.number=tonumber
end
if LUAVERSION>5.3 then
- collectgarbage("generational")
end
end -- closure
@@ -2677,40 +2676,45 @@ local reslasher=lpeg.replacer(P("\\"),"/")
function file.reslash(str)
return str and lpegmatch(reslasher,str)
end
-function file.is_writable(name)
- if not name then
- elseif lfs.isdir(name) then
- name=name.."/m_t_x_t_e_s_t.tmp"
- local f=io.open(name,"wb")
- if f then
- f:close()
- os.remove(name)
- return true
- end
- elseif lfs.isfile(name) then
- local f=io.open(name,"ab")
- if f then
- f:close()
- return true
- end
- else
- local f=io.open(name,"ab")
- if f then
- f:close()
- os.remove(name)
- return true
+if lfs.isreadablefile and lfs.iswritablefile then
+ file.is_readable=lfs.isreadablefile
+ file.is_writable=lfs.iswritablefile
+else
+ function file.is_writable(name)
+ if not name then
+ elseif lfs.isdir(name) then
+ name=name.."/m_t_x_t_e_s_t.tmp"
+ local f=io.open(name,"wb")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
+ elseif lfs.isfile(name) then
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ return true
+ end
+ else
+ local f=io.open(name,"ab")
+ if f then
+ f:close()
+ os.remove(name)
+ return true
+ end
end
- end
- return false
-end
-local readable=P("r")*Cc(true)
-function file.is_readable(name)
- if name then
- local a=attributes(name)
- return a and lpegmatch(readable,a.permissions) or false
- else
return false
end
+ local readable=P("r")*Cc(true)
+ function file.is_readable(name)
+ if name then
+ local a=attributes(name)
+ return a and lpegmatch(readable,a.permissions) or false
+ else
+ return false
+ end
+ end
end
file.isreadable=file.is_readable
file.iswritable=file.is_writable
@@ -3070,7 +3074,6 @@ local format,gsub,rep,sub,find=string.format,string.gsub,string.rep,string.sub,s
local load,dump=load,string.dump
local tonumber,type,tostring,next,setmetatable=tonumber,type,tostring,next,setmetatable
local unpack,concat=table.unpack,table.concat
-local unpack,concat=table.unpack,table.concat
local P,V,C,S,R,Ct,Cs,Cp,Carg,Cc=lpeg.P,lpeg.V,lpeg.C,lpeg.S,lpeg.R,lpeg.Ct,lpeg.Cs,lpeg.Cp,lpeg.Carg,lpeg.Cc
local patterns,lpegmatch=lpeg.patterns,lpeg.match
local utfchar,utfbyte,utflen=utf.char,utf.byte,utf.len
@@ -4099,6 +4102,32 @@ if bit32 then
local b=char(n%256)
f:write(b,a)
end
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=rshift(n,8)
+ local b=char(n%256)
+ n=rshift(n,8)
+ local c=char(n%256)
+ n=rshift(n,8)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
else
local floor=math.floor
function files.writecardinal2(f,n)
@@ -4107,16 +4136,32 @@ else
local b=char(n%256)
f:write(b,a)
end
-end
-function files.writecardinal4(f,n)
- local a=char(n%256)
- n=rshift(n,8)
- local b=char(n%256)
- n=rshift(n,8)
- local c=char(n%256)
- n=rshift(n,8)
- local d=char(n%256)
- f:write(d,c,b,a)
+ function files.writecardinal4(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(d,c,b,a)
+ end
+ function files.writecardinal2le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ f:write(a,b)
+ end
+ function files.writecardinal4le(f,n)
+ local a=char(n%256)
+ n=floor(n/256)
+ local b=char(n%256)
+ n=floor(n/256)
+ local c=char(n%256)
+ n=floor(n/256)
+ local d=char(n%256)
+ f:write(a,b,c,d)
+ end
end
function files.writestring(f,s)
f:write(char(byte(s,1,#s)))
@@ -4129,10 +4174,18 @@ if fio and fio.readcardinal1 then
files.readcardinal2=fio.readcardinal2
files.readcardinal3=fio.readcardinal3
files.readcardinal4=fio.readcardinal4
+ files.readcardinal1le=fio.readcardinal1le or files.readcardinal1le
+ files.readcardinal2le=fio.readcardinal2le or files.readcardinal2le
+ files.readcardinal3le=fio.readcardinal3le or files.readcardinal3le
+ files.readcardinal4le=fio.readcardinal4le or files.readcardinal4le
files.readinteger1=fio.readinteger1
files.readinteger2=fio.readinteger2
files.readinteger3=fio.readinteger3
files.readinteger4=fio.readinteger4
+ files.readinteger1le=fio.readinteger1le or files.readinteger1le
+ files.readinteger2le=fio.readinteger2le or files.readinteger2le
+ files.readinteger3le=fio.readinteger3le or files.readinteger3le
+ files.readinteger4le=fio.readinteger4le or files.readinteger4le
files.readfixed2=fio.readfixed2
files.readfixed4=fio.readfixed4
files.read2dot14=fio.read2dot14
@@ -4153,6 +4206,24 @@ if fio and fio.readcardinal1 then
skipposition(f,4*(n or 1))
end
end
+if fio and fio.writecardinal1 then
+ files.writecardinal1=fio.writecardinal1
+ files.writecardinal2=fio.writecardinal2
+ files.writecardinal3=fio.writecardinal3
+ files.writecardinal4=fio.writecardinal4
+ files.writecardinal1le=fio.writecardinal1le
+ files.writecardinal2le=fio.writecardinal2le
+ files.writecardinal3le=fio.writecardinal3le
+ files.writecardinal4le=fio.writecardinal4le
+ files.writeinteger1=fio.writeinteger1 or fio.writecardinal1
+ files.writeinteger2=fio.writeinteger2 or fio.writecardinal2
+ files.writeinteger3=fio.writeinteger3 or fio.writecardinal3
+ files.writeinteger4=fio.writeinteger4 or fio.writecardinal4
+ files.writeinteger1le=files.writeinteger1le or fio.writecardinal1le
+ files.writeinteger2le=files.writeinteger2le or fio.writecardinal2le
+ files.writeinteger3le=files.writeinteger3le or fio.writecardinal3le
+ files.writeinteger4le=files.writeinteger4le or fio.writecardinal4le
+end
if fio and fio.readcardinaltable then
files.readcardinaltable=fio.readcardinaltable
files.readintegertable=fio.readintegertable
@@ -4737,67 +4808,8 @@ end
nodes.nodecodes=nodecodes
nodes.glyphcodes=glyphcodes
nodes.disccodes=disccodes
-local flush_node=node.flush_node
-local remove_node=node.remove
-local traverse_id=node.traverse_id
nodes.handlers.protectglyphs=node.protect_glyphs
-nodes.handlers.unprotectglyphs=node.unprotect_glyphs
-function nodes.remove(head,current,free_too)
- local t=current
- head,current=remove_node(head,current)
- if t then
- if free_too then
- flush_node(t)
- t=nil
- else
- t.next,t.prev=nil,nil
- end
- end
- return head,current,t
-end
-function nodes.delete(head,current)
- return nodes.remove(head,current,true)
-end
-local getfield=node.getfield
-local setfield=node.setfield
-nodes.getfield=getfield
-nodes.setfield=setfield
-nodes.getattr=getfield
-nodes.setattr=setfield
-nodes.tostring=node.tostring or tostring
-nodes.copy=node.copy
-nodes.copy_node=node.copy
-nodes.copy_list=node.copy_list
-nodes.delete=node.delete
-nodes.dimensions=node.dimensions
-nodes.end_of_math=node.end_of_math
-nodes.flush_list=node.flush_list
-nodes.flush_node=node.flush_node
-nodes.flush=node.flush_node
-nodes.free=node.free
-nodes.insert_after=node.insert_after
-nodes.insert_before=node.insert_before
-nodes.hpack=node.hpack
-nodes.new=node.new
-nodes.tail=node.tail
-nodes.traverse=node.traverse
-nodes.traverse_id=node.traverse_id
-nodes.slide=node.slide
-nodes.vpack=node.vpack
-nodes.first_glyph=node.first_glyph
-nodes.has_glyph=node.has_glyph or node.first_glyph
-nodes.current_attr=node.current_attr
-nodes.has_field=node.has_field
-nodes.last_node=node.last_node
-nodes.usedlist=node.usedlist
-nodes.protrusion_skippable=node.protrusion_skippable
-nodes.write=node.write
-nodes.has_attribute=node.has_attribute
-nodes.set_attribute=node.set_attribute
-nodes.unset_attribute=node.unset_attribute
-nodes.protect_glyphs=node.protect_glyphs
-nodes.unprotect_glyphs=node.unprotect_glyphs
-nodes.mlist_to_hlist=node.mlist_to_hlist
+nodes.handlers.unprotectglyphs=node.unprotect_glyphs
local direct=node.direct
local nuts={}
nodes.nuts=nuts
@@ -30089,7 +30101,7 @@ function handlers.devanagari_reorder_pre_base_reordering_consonants(head,start)
end
function handlers.devanagari_remove_joiners(head,start,kind,lookupname,replacement)
local stop=getnext(start)
- local font=getfont(start)
+ local font=getfont(start)
local last=start
while stop do
local char=ischar(stop,font)
@@ -33242,7 +33254,7 @@ local function check_afm(specification,fullname)
if foundname=="" then
foundname=fonts.names.getfilename(fullname,"afm") or ""
end
- if foundname=="" and afm.autoprefixed then
+ if fullname and foundname=="" and afm.autoprefixed then
local encoding,shortname=match(fullname,"^(.-)%-(.*)$")
if encoding and shortname and fonts.encodings.known[encoding] then
shortname=findbinfile(shortname,'afm') or ""