summaryrefslogtreecommitdiff
path: root/macros/luatex/generic
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-02-16 03:01:49 +0000
committerNorbert Preining <norbert@preining.info>2024-02-16 03:01:49 +0000
commita6e02d45ad0d10cfc3256fc91abe80d6228325a4 (patch)
tree6d63cc33763dc264246cd1f7bcd9b8482acf956d /macros/luatex/generic
parent5b6839a58ea5468b40ebd52b579e680b8e62ff13 (diff)
CTAN sync 202402160301
Diffstat (limited to 'macros/luatex/generic')
-rw-r--r--macros/luatex/generic/luaotfload/NEWS8
-rw-r--r--macros/luatex/generic/luaotfload/README.md4
-rw-r--r--macros/luatex/generic/luaotfload/filegraph.pdfbin40007 -> 40007 bytes
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-2023-12-28.lua (renamed from macros/luatex/generic/luaotfload/fontloader-2023-08-19.lua)360
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-con.lua14
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-dsp.lua15
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-map.lua4
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-osd.lua3
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-otl.lua2
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-oto.lua16
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-font-ots.lua190
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-l-table.lua6
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-reference.lua203
-rw-r--r--macros/luatex/generic/luaotfload/fontloader-util-str.lua20
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-arabic.lua143
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-colors.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-conf.pdfbin79551 -> 79376 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-configuration.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-database.lua127
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-dvi.lua6
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-embolden.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-fallback.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-features.lua5
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-filelist.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-define.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-init.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-latex.pdfbin506335 -> 506279 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-letterspace.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-loaders.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-log.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-main.tex12
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-multiscript.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-notdef.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-parsers.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-realpath.lua131
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-resolvers.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-scripts.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-status.lua84
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-suppress.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-szss.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.12
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.pdfbin76967 -> 76779 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.rst4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tounicode.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-unicode.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.conf.52
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.conf.rst4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.sty2
-rw-r--r--macros/luatex/generic/luaotfload/scripts-demo.pdfbin21682 -> 21682 bytes
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo-graphite.pdfbin8562 -> 8562 bytes
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo.pdfbin8478 -> 8478 bytes
60 files changed, 895 insertions, 584 deletions
diff --git a/macros/luatex/generic/luaotfload/NEWS b/macros/luatex/generic/luaotfload/NEWS
index d263b2e002..17ce0a00c4 100644
--- a/macros/luatex/generic/luaotfload/NEWS
+++ b/macros/luatex/generic/luaotfload/NEWS
@@ -1,5 +1,13 @@
Change History
--------------
+2024-02-14 luaotfload v3.27
+
+ * Improved support for arabic mark rendering in \texttt{node} mode.
+ * Better ordering of GSUB substitutions.
+ * Avoid dropping hyphens in DVI mode
+ * Compatibility with \identifier{luatex} 1.18
+ * Various bug fixes
+
2023-08-31 luaotfload v3.26
* Reimplement mathsize feature recently dropped from fontloader
diff --git a/macros/luatex/generic/luaotfload/README.md b/macros/luatex/generic/luaotfload/README.md
index e22815220c..ed2ece5f29 100644
--- a/macros/luatex/generic/luaotfload/README.md
+++ b/macros/luatex/generic/luaotfload/README.md
@@ -1,8 +1,8 @@
# The Luaotfload Package
-VERSION: 3.26
+VERSION: 3.27
-DATE: 2023-08-31
+DATE: 2024-02-14
## Description
diff --git a/macros/luatex/generic/luaotfload/filegraph.pdf b/macros/luatex/generic/luaotfload/filegraph.pdf
index f4d68bbf6f..d0640d1ad6 100644
--- a/macros/luatex/generic/luaotfload/filegraph.pdf
+++ b/macros/luatex/generic/luaotfload/filegraph.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/fontloader-2023-08-19.lua b/macros/luatex/generic/luaotfload/fontloader-2023-12-28.lua
index dd457f0221..562516746a 100644
--- a/macros/luatex/generic/luaotfload/fontloader-2023-08-19.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-2023-12-28.lua
@@ -1,6 +1,6 @@
--[[info-----------------------------------------------------------------------
Luaotfload fontloader package
- build 2023-08-19 22:30:03
+ build 2023-12-28 15:52:34
-------------------------------------------------------------------------------
© 2023 PRAGMA ADE / ConTeXt Development Team
@@ -63,7 +63,7 @@
--info]]-----------------------------------------------------------------------
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “data-con” b4ab51aaeab872d86d827f3e216bf05e] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “data-con” b4ab51aaeab872d86d827f3e216bf05e] ---
if not modules then modules={} end modules ['data-con']={
version=1.100,
@@ -186,10 +186,10 @@ function containers.cleanname(name)
return (gsub(lower(name),"[^%w\128-\255]+","-"))
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “data-con”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “data-con”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-nod” 1750af43148def9e7a75c6900a96f9dc] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-nod” 1750af43148def9e7a75c6900a96f9dc] ---
if not modules then modules={} end modules ['luatex-fonts-nod']={
version=1.001,
@@ -456,10 +456,10 @@ do
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-nod”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-nod”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-chr” ce4afac7ba19471f3c8f90800839f315] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-chr” ce4afac7ba19471f3c8f90800839f315] ---
characters=characters or {}
@@ -4293,10 +4293,10 @@ characters.indicgroups={
},
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “basics-chr”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “basics-chr”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ini” 16b855c98602e4a3e9df39512916a427] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ini” 16b855c98602e4a3e9df39512916a427] ---
if not modules then modules={} end modules ['font-ini']={
version=1.001,
@@ -4337,10 +4337,10 @@ if node and not tex.getfontoffamily then
tex.getfontoffamily=node.family_font
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ini”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ini”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-mis” 17e967c9ec4d001deefd43ddf25e98f7] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-mis” 17e967c9ec4d001deefd43ddf25e98f7] ---
if not modules then modules={} end modules ['luatex-font-mis']={
version=1.001,
@@ -4372,10 +4372,10 @@ function font.each()
return table.sortedhash(fonts.hashes.identifiers)
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-mis”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-mis”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-con” bdbaaa361308c9ccc0a7dac0bf6c17ec] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-con” ebdd0ca857deafdc0152c7a4f1ed2490] ---
if not modules then modules={} end modules ['font-con']={
version=1.001,
@@ -4858,6 +4858,13 @@ function constructors.scale(tfmdata,specification)
if changed then
local c=changed[unicode]
if c and c~=unicode then
+ local cc=changed[c]
+ if cc then
+ while cc do
+ c=cc
+ cc=changed[c]
+ end
+ end
if c then
description=descriptions[c] or descriptions[unicode] or character
character=characters[c] or character
@@ -5733,10 +5740,10 @@ function constructors.addcoreunicodes(unicodes)
return unicodes
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-con”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-con”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-enc” c24fd6b4f34f87b9c4ff5e6193ce2656] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-enc” c24fd6b4f34f87b9c4ff5e6193ce2656] ---
if not modules then modules={} end modules ['luatex-font-enc']={
version=1.001,
@@ -5811,10 +5818,10 @@ function encodings.load(filename)
return containers.write(encodings.cache,name,data)
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-enc”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-enc”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cid” 22b0367742fb253deef84ef7ccf5e8de] ---
if not modules then modules={} end modules ['font-cid']={
version=1.001,
@@ -5965,10 +5972,10 @@ function cid.getmap(specification)
return found
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cid”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cid”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-map” 27ee748150e56f5f0e5f0fefc864f35e] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-map” b1444428c238a17d2a998ff1a4769183] ---
if not modules then modules={} end modules ['font-map']={
version=1.001,
@@ -6030,7 +6037,7 @@ local function tounicode16(unicode)
return s_unknown
else
unicode=unicode-0x10000
- return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00)
+ return f_double(idiv(unicode,0x400)+0xD800,unicode%0x400+0xDC00)
end
end
local function tounicode16sequence(unicodes)
@@ -6049,7 +6056,7 @@ local function tounicode16sequence(unicodes)
t[l]=s_unknown
else
u=u-0x10000
- t[l]=f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00)
+ t[l]=f_double(idiv(u,0x400)+0xD800,u%0x400+0xDC00)
end
end
return concat(t)
@@ -6376,10 +6383,10 @@ function mappings.addtounicode(data,filename,checklookups,forceligatures)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-map”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-map”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-vfc” a81c29eda98cd62cbebdb6c93544b50d] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-vfc” a81c29eda98cd62cbebdb6c93544b50d] ---
if not modules then modules={} end modules ['font-vfc']={
version=1.001,
@@ -6476,10 +6483,10 @@ helpers.commands=utilities.storage.allocate {
dummy=dummy,
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-vfc”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-vfc”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otr” 2958a21bebcf0579f4e11f0646d1b402] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otr” 2958a21bebcf0579f4e11f0646d1b402] ---
if not modules then modules={} end modules ['font-otr']={
version=1.001,
@@ -8328,10 +8335,10 @@ function readers.extend(fontdata)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otr”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otr”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oti” 309a75f9c14b77d87e94eba827dc4e71] ---
if not modules then modules={} end modules ['font-oti']={
version=1.001,
@@ -8474,10 +8481,10 @@ function otffeatures.checkeddefaultlanguage(featuretype,autolanguage,languages)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oti”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oti”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ott” 427bdc77dd187158eafb79b7193400dc] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ott” 427bdc77dd187158eafb79b7193400dc] ---
if not modules then modules={} end modules ["font-ott"]={
version=1.001,
@@ -9636,10 +9643,10 @@ function otffeatures.normalize(features,wrap)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ott”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ott”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cff” 999da544079698ce70178fd84bcdd67a] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cff” 999da544079698ce70178fd84bcdd67a] ---
if not modules then modules={} end modules ['font-cff']={
version=1.001,
@@ -11913,10 +11920,10 @@ function readers.cff2(f,fontdata,specification)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-cff”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-cff”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ttf” ff94e130d7c71edd899c4bae7745b7db] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ttf” ff94e130d7c71edd899c4bae7745b7db] ---
if not modules then modules={} end modules ['font-ttf']={
version=1.001,
@@ -13172,10 +13179,10 @@ function readers.gvar(f,fontdata,specification,glyphdata,shapedata)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ttf”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ttf”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-dsp” 755beef1b31e9dfd050e9d221d4e9ae3] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-dsp” f2897da5fd67280b4700c32696d21fb1] ---
if not modules then modules={} end modules ['font-dsp']={
version=1.001,
@@ -14877,7 +14884,7 @@ do
end
return features
end
- local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses)
setposition(f,lookupoffset)
local noflookups=readushort(f)
local lookups=readcardinaltable(f,noflookups,ushort)
@@ -14894,12 +14901,12 @@ do
subtables[j]=offset+readushort(f)
end
local markclass=band(flagbits,0x0010)~=0
+ local markset=rshift(flagbits,8)
if markclass then
markclass=readushort(f)
end
- local markset=rshift(flagbits,8)
if markset>0 then
- markclass=markset
+ markclass=nofmarkclasses+markset
end
lookups[lookupid]={
type=lookuptype,
@@ -15243,7 +15250,8 @@ do
if not lookupstoo then
return
end
- local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ local nofmarkclasses=(fontdata.markclasses and #fontdata.markclasses or 0)-(fontdata.marksets and #fontdata.marksets or 0)
+ local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses)
if lookups then
resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
end
@@ -15412,6 +15420,7 @@ function readers.gdef(f,fontdata,specification)
end
end
if marksetsoffset~=0 then
+ local nofmarkclasses=fontdata.markclasses and #fontdata.markclasses or 0
marksetsoffset=tableoffset+marksetsoffset
setposition(f,marksetsoffset)
local format=readushort(f)
@@ -15421,7 +15430,8 @@ function readers.gdef(f,fontdata,specification)
for i=1,nofsets do
local offset=sets[i]
if offset~=0 then
- marksets[i]=readcoverage(f,marksetsoffset+offset)
+ markclasses[nofmarkclasses+i]=readcoverage(f,marksetsoffset+offset)
+ marksets[i]={}
end
end
end
@@ -16468,10 +16478,10 @@ function readers.mvar(f,fontdata,specification)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-dsp”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-dsp”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oup” aaff9c28233bbea56e6d27ae50e04ff0] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oup” aaff9c28233bbea56e6d27ae50e04ff0] ---
if not modules then modules={} end modules ['font-oup']={
version=1.001,
@@ -19327,10 +19337,10 @@ end
expandlookups(sublookups,sequences)
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oup”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oup”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otl” 21196d193ce16f3996c9aa75e81e440c] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otl” 84499d355f82829841b8e304952a9d5d] ---
if not modules then modules={} end modules ['font-otl']={
version=1.001,
@@ -19358,7 +19368,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.133
+otf.version=3.134
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
@@ -20040,10 +20050,10 @@ otf.coverup={
end
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otl”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otl”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oto” 1cc20f34606fb55d4646a0dd323499ef] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oto” b148d66f642aaa3d0ddc427f71d6e02d] ---
if not modules then modules={} end modules ['font-oto']={
version=1.001,
@@ -20244,7 +20254,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
for i=1,#steps do
for unicode,data in next,steps[i].coverage do
if unicode~=data then
- changed[unicode]=data
+ changed[unicode]=changed[unicode] or data
end
if trace_singles then
report_substitution(feature,sequence,descriptions,unicode,data)
@@ -20257,7 +20267,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local replacement=data[alternate]
if replacement then
if unicode~=replacement then
- changed[unicode]=replacement
+ changed[unicode]=changed[unicode] or replacement
end
if trace_alternatives then
report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal")
@@ -20265,7 +20275,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
elseif defaultalt=="first" then
replacement=data[1]
if unicode~=replacement then
- changed[unicode]=replacement
+ changed[unicode]=changed[unicode] or replacement
end
if trace_alternatives then
report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
@@ -20273,7 +20283,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
elseif defaultalt=="last" then
replacement=data[#data]
if unicode~=replacement then
- changed[unicode]=replacement
+ changed[unicode]=changed[unicode] or replacement
end
if trace_alternatives then
report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
@@ -20512,10 +20522,10 @@ registerotffeature {
}
otf.basemodeinitializer=featuresinitializer
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-oto”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-oto”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otj” b2c165bd6771a57633f992d07384b739] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otj” b2c165bd6771a57633f992d07384b739] ---
if not modules then modules={} end modules ['font-otj']={
version=1.001,
@@ -22008,10 +22018,10 @@ function injections.handler(head,where)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otj”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otj”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ota” 7407b709ae7b2cdf36f68d5c98d51d12] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ota” 7407b709ae7b2cdf36f68d5c98d51d12] ---
if not modules then modules={} end modules ['font-ota']={
version=1.001,
@@ -22505,10 +22515,10 @@ directives.register("otf.analyze.useunicodemarks",function(v)
analyzers.useunicodemarks=v
end)
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ota”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ota”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ots” c039b20490b526ec469e41a8584ebe6d] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ots” 2ba92e909a45b68592f7271d8190f390] ---
if not modules then modules={} end modules ['font-ots']={
version=1.001,
@@ -24561,17 +24571,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if last then
local char,id=ischar(last,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n<l then
+ last=getnext(last)
+ end
+ n=n+1
+ elseif skiphash and skiphash[char] then
skipped=true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
last=getnext(last)
- elseif seq[n][char] then
- if n<l then
- last=getnext(last)
- end
- n=n+1
elseif discfound then
notmatchreplace[discfound]=true
if notmatchpre[discfound] then
@@ -24662,17 +24672,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if prev then
local char,id=ischar(prev,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n>1 then
+ prev=getprev(prev)
+ end
+ n=n-1
+ elseif skiphash and skiphash[char] then
skipped=true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
prev=getprev(prev)
- elseif seq[n][char] then
- if n>1 then
- prev=getprev(prev)
- end
- n=n-1
elseif discfound then
notmatchreplace[discfound]=true
if notmatchpost[discfound] then
@@ -24778,17 +24788,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if current then
local char,id=ischar(current,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n<s then
+ current=getnext(current)
+ end
+ n=n+1
+ elseif skiphash and skiphash[char] then
skipped=true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
- current=getnext(current)
- elseif seq[n][char] then
- if n<s then
- current=getnext(current)
- end
- n=n+1
+ current=getnext(current)
elseif discfound then
notmatchreplace[discfound]=true
if notmatchpre[discfound] then
@@ -25733,32 +25743,28 @@ do
while start do
local char,id=ischar(start,font)
if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local a
- if attr then
- if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
- a=true
- end
- elseif not attribute or getstate(start,attribute) then
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local a
+ if attr then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
a=true
end
- if a then
- local ok,df
- head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- elseif start then
- start=getnext(start)
- end
- else
+ elseif not attribute or getstate(start,attribute) then
+ a=true
+ end
+ if a then
+ local ok,df
+ head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ elseif start then
start=getnext(start)
end
else
- start=getnext(start)
+ start=getnext(start)
end
+ else
+ start=getnext(start)
end
elseif char==false or id==glue_code then
start=getnext(start)
@@ -25788,46 +25794,42 @@ do
while start do
local char,id=ischar(start,font)
if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- local m=merged[char]
- if m then
- local a
- if attr then
- if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
- a=true
- end
- elseif not attribute or getstate(start,attribute) then
+ local m=merged[char]
+ if m then
+ local a
+ if attr then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
a=true
end
- if a then
- local ok,df
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- break
- elseif ok then
- break
- elseif not start then
- break
- end
+ elseif not attribute or getstate(start,attribute) then
+ a=true
+ end
+ if a then
+ local ok,df
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ break
+ elseif ok then
+ break
+ elseif not start then
+ break
end
end
- if df then
- elseif start then
- start=getnext(start)
- end
- else
+ end
+ if df then
+ elseif start then
start=getnext(start)
end
else
start=getnext(start)
end
+ else
+ start=getnext(start)
end
elseif char==false or id==glue_code then
start=getnext(start)
@@ -25895,26 +25897,22 @@ do
position=position+1
local m=merged[char]
if m then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local ok
- head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- break
- elseif not start then
- break
- end
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local ok
+ head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ break
+ elseif not start then
+ break
end
end
- if start then
- start=getnext(start)
- end
+ end
+ if start then
+ start=getnext(start)
end
else
start=getnext(start)
@@ -26210,10 +26208,10 @@ registerotffeature {
},
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ots”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ots”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-osd” c38c14c118680202c6f4b09734542c49] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-osd” 837039b0dca88edd3f4b54222f7cf54c] ---
if not modules then modules={} end modules ['font-osd']={
version=1.001,
@@ -28847,10 +28845,10 @@ for i=1,nofscripts do
methods[scripts_two[i]]=method_two
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-osd”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-osd”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ocl” 2a377351ae23c339764ec8ce2e8e9164] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ocl” 2a377351ae23c339764ec8ce2e8e9164] ---
if not modules then modules={} end modules ['font-ocl']={
version=1.001,
@@ -29398,10 +29396,10 @@ if context then
}
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-ocl”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-ocl”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otc” 0ad931eec679ebeceed5d4f02f4ba31b] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otc” 0ad931eec679ebeceed5d4f02f4ba31b] ---
if not modules then modules={} end modules ['font-otc']={
version=1.001,
@@ -30233,10 +30231,10 @@ end
otf.enhancers.enhance=enhance
otf.enhancers.register("check extra features",enhance)
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-otc”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-otc”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-onr” a3f85c886cf22fb27760d98603d51ffd] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-onr” a3f85c886cf22fb27760d98603d51ffd] ---
if not modules then modules={} end modules ['font-onr']={
version=1.001,
@@ -30609,10 +30607,10 @@ function readers.getinfo(filename)
end
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-onr”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-onr”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-one” b7fb0389462a49bc1f41bebd2da85401] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-one” b7fb0389462a49bc1f41bebd2da85401] ---
if not modules then modules={} end modules ['font-one']={
version=1.001,
@@ -31327,10 +31325,10 @@ registerafmenhancer("normalize features",enhance_normalize_features)
registerafmenhancer("check extra features",otfenhancers.enhance)
registerafmenhancer("fix names",enhance_fix_names)
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-one”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-one”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-afk” b7bef80aa4c18357cbfa0ae4df4d4046] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-afk” b7bef80aa4c18357cbfa0ae4df4d4046] ---
if not modules then modules={} end modules ['font-afk']={
version=1.001,
@@ -31497,10 +31495,10 @@ fonts.handlers.afm.helpdata={
}
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-afk”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-afk”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-tfm” f0eb5e2a8068b17ad401bb7efdba1630] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-tfm” f0eb5e2a8068b17ad401bb7efdba1630] ---
if not modules then modules={} end modules ['luatex-fonts-tfm']={
version=1.001,
@@ -32015,10 +32013,10 @@ registertfmfeature {
}
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-tfm”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-tfm”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-lua” 1fbfdf7b689b2bdfd0e3bb9bf74ce136] ---
if not modules then modules={} end modules ['font-lua']={
version=1.001,
@@ -32058,10 +32056,10 @@ function readers.lua(specification)
return check_lua(specification,fullname)
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-lua”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-lua”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-def” cec0e49aee881c4cbd36d541f0162c6f] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-def” cec0e49aee881c4cbd36d541f0162c6f] ---
if not modules then modules={} end modules ['font-def']={
version=1.001,
@@ -32461,10 +32459,10 @@ if not context then
callbacks.register('define_font',definers.read,"definition of fonts (tfmdata preparation)")
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-def”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-def”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-shp” a174ac26390bd0828805747500df0077] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-shp” a174ac26390bd0828805747500df0077] ---
if not modules then modules={} end modules ['font-shp']={
version=1.001,
@@ -32831,10 +32829,10 @@ callback.register("glyph_stream_provider",function(id,index,mode)
return ""
end)
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-shp”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-shp”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-def” f435e0875f203f343157baeff876ec9c] ---
if not modules then modules={} end modules ['luatex-fonts-def']={
version=1.001,
@@ -32915,10 +32913,10 @@ function fonts.definers.applypostprocessors(tfmdata)
return tfmdata
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-def”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-def”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-ext” 32013cbc5d5d336be8b1d1e5879d86c4] ---
if not modules then modules={} end modules ['luatex-fonts-ext']={
version=1.001,
@@ -33104,10 +33102,10 @@ registerotffeature {
}
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-ext”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-ext”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-tex” 9882d382700e714cace08b7f09820958] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-tex” 9882d382700e714cace08b7f09820958] ---
if not modules then modules={} end modules ['font-imp-tex']={
version=1.001,
@@ -33212,10 +33210,10 @@ registerotffeature {
description="arabic digits",
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-tex”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-tex”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-ligatures” 250f6f4488ee770c23177afb2ff75676] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-ligatures” 250f6f4488ee770c23177afb2ff75676] ---
if not modules then modules={} end modules ['font-imp-ligatures']={
version=1.001,
@@ -33329,10 +33327,10 @@ if context then
}
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-ligatures”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-ligatures”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-italics” 3cc555a1fe00dc45449f1e4a47a5c990] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-italics” 3cc555a1fe00dc45449f1e4a47a5c990] ---
if not modules then modules={} end modules ['font-imp-italics']={
version=1.001,
@@ -33417,10 +33415,10 @@ if context then
registerafmfeature(dimensions_specification)
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-italics”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-italics”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-effects” d05997c1826355548ec9aec1346f9f23] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-effects” d05997c1826355548ec9aec1346f9f23] ---
if not modules then modules={} end modules ['font-imp-effects']={
version=1.001,
@@ -33777,10 +33775,10 @@ local specification={
registerotffeature(specification)
registerafmfeature(specification)
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “font-imp-effects”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “font-imp-effects”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-lig” fbd251eea3810a43a8d5542319361d68] ---
fonts.handlers.otf.addfeature {
@@ -35849,10 +35847,10 @@ fonts.handlers.otf.addfeature {
["type"]="ligature",
}
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-lig”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-lig”] ---
-do --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-gbn” 34e4543a02f6fbc8c2ade896cb6dc7df] ---
+do --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-gbn” 34e4543a02f6fbc8c2ade896cb6dc7df] ---
if not modules then modules={} end modules ['luatex-fonts-gbn']={
version=1.001,
@@ -36117,7 +36115,7 @@ function nodes.simple_font_handler(head,groupcode,size,packtype,direction)
return head
end
-end --- [luaotfload, fontloader-2023-08-19.lua scope for “fonts-gbn”] ---
+end --- [luaotfload, fontloader-2023-12-28.lua scope for “fonts-gbn”] ---
--- vim:ft=lua:sw=2:ts=8:et:tw=79
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-con.lua b/macros/luatex/generic/luaotfload/fontloader-font-con.lua
index 10f98ca120..6005897796 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-con.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-con.lua
@@ -651,13 +651,13 @@ function constructors.scale(tfmdata,specification)
if changed then
local c = changed[unicode]
if c and c ~= unicode then
- -- local cc = changed[c]
- -- if cc then
- -- while cc do
- -- c = cc
- -- cc = changed[c]
- -- end
- -- end
+ local cc = changed[c]
+ if cc then
+ while cc do
+ c = cc
+ cc = changed[c]
+ end
+ end
-- check not needed:
if c then
description = descriptions[c] or descriptions[unicode] or character
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua b/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua
index 5f9cf1a62e..788c59322d 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-dsp.lua
@@ -2134,7 +2134,7 @@ do
return features
end
- local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses)
setposition(f,lookupoffset)
local noflookups = readushort(f)
local lookups = readcardinaltable(f,noflookups,ushort)
@@ -2152,12 +2152,12 @@ do
end
-- which one wins?
local markclass = band(flagbits,0x0010) ~= 0 -- usemarkfilteringset
+ local markset = rshift(flagbits,8)
if markclass then
markclass = readushort(f) -- + 1
end
- local markset = rshift(flagbits,8)
if markset > 0 then
- markclass = markset -- + 1
+ markclass = nofmarkclasses + markset
end
lookups[lookupid] = {
type = lookuptype,
@@ -2559,7 +2559,8 @@ do
return
end
--
- local lookups = readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ local nofmarkclasses = (fontdata.markclasses and #fontdata.markclasses or 0) - (fontdata.marksets and #fontdata.marksets or 0)
+ local lookups = readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses)
--
if lookups then
resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
@@ -2740,8 +2741,9 @@ function readers.gdef(f,fontdata,specification)
end
end
end
- -- mark sets : todo: just make the same as class sets above
+ -- mark sets
if marksetsoffset ~= 0 then
+ local nofmarkclasses = fontdata.markclasses and #fontdata.markclasses or 0
marksetsoffset = tableoffset + marksetsoffset
setposition(f,marksetsoffset)
local format = readushort(f)
@@ -2751,7 +2753,8 @@ function readers.gdef(f,fontdata,specification)
for i=1,nofsets do
local offset = sets[i]
if offset ~= 0 then
- marksets[i] = readcoverage(f,marksetsoffset+offset)
+ markclasses[nofmarkclasses + i] = readcoverage(f,marksetsoffset+offset)
+ marksets[i] = { }
end
end
end
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-map.lua b/macros/luatex/generic/luaotfload/fontloader-font-map.lua
index 4aa937ed16..3ead64d561 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-map.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-map.lua
@@ -72,7 +72,7 @@ local function tounicode16(unicode)
return s_unknown
else
unicode = unicode - 0x10000
- return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00)
+ return f_double(idiv(unicode,0x400)+0xD800,unicode%0x400+0xDC00)
end
end
@@ -93,7 +93,7 @@ local function tounicode16sequence(unicodes)
t[l] = s_unknown
else
u = u - 0x10000
- t[l] = f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00)
+ t[l] = f_double(idiv(u,0x400)+0xD800,u%0x400+0xDC00)
end
end
return concat(t)
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-osd.lua b/macros/luatex/generic/luaotfload/fontloader-font-osd.lua
index 4177e3035a..cff9272741 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-osd.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-osd.lua
@@ -220,6 +220,9 @@ end
-- we might need to have consonants etc per script and initialize a local table
-- pointing to the right one. But not now.
+-- We have additional data in char-def that provides information not present (at
+-- least when this was written) in Unicode.
+
local indicgroups = characters and characters.indicgroups
if not indicgroups and characters then
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-otl.lua b/macros/luatex/generic/luaotfload/fontloader-font-otl.lua
index 0825077b3f..57e219a4af 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-otl.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-otl.lua
@@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading")
local fonts = fonts
local otf = fonts.handlers.otf
-otf.version = 3.133 -- beware: also sync font-mis.lua and in mtx-fonts
+otf.version = 3.134 -- beware: also sync font-mis.lua and in mtx-fonts
otf.cache = containers.define("fonts", "otl", otf.version, true)
otf.svgcache = containers.define("fonts", "svg", otf.version, true)
otf.pngcache = containers.define("fonts", "png", otf.version, true)
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-oto.lua b/macros/luatex/generic/luaotfload/fontloader-font-oto.lua
index 0689f4dfb5..131cbbe3c5 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-oto.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-oto.lua
@@ -263,9 +263,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
for i=1,#steps do
for unicode, data in next, steps[i].coverage do
if unicode ~= data then
--- if not changed[unicode] then
- changed[unicode] = data
--- end
+ changed[unicode] = changed[unicode] or data
end
if trace_singles then
report_substitution(feature,sequence,descriptions,unicode,data)
@@ -278,9 +276,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
local replacement = data[alternate]
if replacement then
if unicode ~= replacement then
--- if not changed[unicode] then
- changed[unicode] = replacement
--- end
+ changed[unicode] = changed[unicode] or replacement
end
if trace_alternatives then
report_alternate(feature,sequence,descriptions,unicode,replacement,value,"normal")
@@ -288,9 +284,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
elseif defaultalt == "first" then
replacement = data[1]
if unicode ~= replacement then
--- if not changed[unicode] then
- changed[unicode] = replacement
--- end
+ changed[unicode] = changed[unicode] or replacement
end
if trace_alternatives then
report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
@@ -298,9 +292,7 @@ local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplis
elseif defaultalt == "last" then
replacement = data[#data]
if unicode ~= replacement then
--- if not changed[unicode] then
- changed[unicode] = replacement
--- end
+ changed[unicode] = changed[unicode] or replacement
end
if trace_alternatives then
report_alternate(feature,sequence,descriptions,unicode,replacement,value,defaultalt)
diff --git a/macros/luatex/generic/luaotfload/fontloader-font-ots.lua b/macros/luatex/generic/luaotfload/fontloader-font-ots.lua
index 48f85c3658..3b4f5b3cc7 100644
--- a/macros/luatex/generic/luaotfload/fontloader-font-ots.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-font-ots.lua
@@ -2552,17 +2552,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if last then
local char, id = ischar(last,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n < l then
+ last = getnext(last)
+ end
+ n = n + 1
+ elseif skiphash and skiphash[char] then
skipped = true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
last = getnext(last)
- elseif seq[n][char] then
- if n < l then
- last = getnext(last)
- end
- n = n + 1
elseif discfound then
notmatchreplace[discfound] = true
if notmatchpre[discfound] then
@@ -2661,17 +2661,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if prev then
local char, id = ischar(prev,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n > 1 then
+ prev = getprev(prev)
+ end
+ n = n - 1
+ elseif skiphash and skiphash[char] then
skipped = true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
prev = getprev(prev)
- elseif seq[n][char] then
- if n > 1 then
- prev = getprev(prev)
- end
- n = n - 1
elseif discfound then
notmatchreplace[discfound] = true
if notmatchpost[discfound] then
@@ -2792,17 +2792,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if current then
local char, id = ischar(current,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n < s then
+ current = getnext(current)
+ end
+ n = n + 1
+ elseif skiphash and skiphash[char] then
skipped = true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
- current = getnext(current) -- was absent
- elseif seq[n][char] then
- if n < s then -- new test
- current = getnext(current) -- was absent
- end
- n = n + 1
+ current = getnext(current)
elseif discfound then
notmatchreplace[discfound] = true
if notmatchpre[discfound] then
@@ -3978,36 +3978,32 @@ do
while start do
local char, id = ischar(start,font)
if char then
- if skiphash and skiphash[char] then -- we never needed it here but let's try
- start = getnext(start)
- else
- local lookupmatch = lookupcache[char]
- if lookupmatch then
- local a -- happens often so no assignment is faster
- if attr then
- if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then
- a = true
- end
- elseif not attribute or getstate(start,attribute) then
+ local lookupmatch = lookupcache[char]
+ if lookupmatch then
+ local a -- happens often so no assignment is faster
+ if attr then
+ if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then
a = true
end
- if a then
- local ok, df
- head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- -- if ok then
- -- done = true
- -- end
- if df then
+ elseif not attribute or getstate(start,attribute) then
+ a = true
+ end
+ if a then
+ local ok, df
+ head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ -- if ok then
+ -- done = true
+ -- end
+ if df then
-- print("restart 1",typ)
- elseif start then
- start = getnext(start)
- end
- else
+ elseif start then
start = getnext(start)
end
else
- start = getnext(start)
+ start = getnext(start)
end
+ else
+ start = getnext(start)
end
elseif char == false or id == glue_code then
-- a different font|state or glue (happens often)
@@ -4041,53 +4037,49 @@ do
while start do
local char, id = ischar(start,font)
if char then
- if skiphash and skiphash[char] then -- we never needed it here but let's try
- start = getnext(start)
- else
- local m = merged[char]
- if m then
- local a -- happens often so no assignment is faster
- if attr then
- if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then
- a = true
- end
- elseif not attribute or getstate(start,attribute) then
+ local m = merged[char]
+ if m then
+ local a -- happens often so no assignment is faster
+ if attr then
+ if getglyphdata(start) == attr and (not attribute or getstate(start,attribute)) then
a = true
end
- if a then
- local ok, df
- for i=m[1],m[2] do
- local step = steps[i]
- -- for i=1,#m do
- -- local step = m[i]
- local lookupcache = step.coverage
- local lookupmatch = lookupcache[char]
- if lookupmatch then
- -- we could move all code inline but that makes things even more unreadable
+ elseif not attribute or getstate(start,attribute) then
+ a = true
+ end
+ if a then
+ local ok, df
+ for i=m[1],m[2] do
+ local step = steps[i]
+ -- for i=1,#m do
+ -- local step = m[i]
+ local lookupcache = step.coverage
+ local lookupmatch = lookupcache[char]
+ if lookupmatch then
+ -- we could move all code inline but that makes things even more unreadable
-- local ok, df
- head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- break
- elseif ok then
- -- done = true
- break
- elseif not start then
- -- don't ask why ... shouldn't happen
- break
- end
+ head, start, ok, df = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ break
+ elseif ok then
+ -- done = true
+ break
+ elseif not start then
+ -- don't ask why ... shouldn't happen
+ break
end
end
- if df then
+ end
+ if df then
-- print("restart 2",typ)
- elseif start then
- start = getnext(start)
- end
- else
+ elseif start then
start = getnext(start)
end
else
start = getnext(start)
end
+ else
+ start = getnext(start)
end
elseif char == false or id == glue_code then
-- a different font|state or glue (happens often)
@@ -4183,31 +4175,27 @@ do
position = position + 1
local m = merged[char]
if m then
- if skiphash and skiphash[char] then -- we never needed it here but let's try
- start = getnext(start)
- else
- for i=m[1],m[2] do
- local step = steps[i]
- local lookupcache = step.coverage
- local lookupmatch = lookupcache[char]
- if lookupmatch then
- local ok
- head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- -- if matches then
- -- matches[position] = i
- -- else
- -- matches = { [position] = i }
- -- end
- break
- elseif not start then
- break
- end
+ for i=m[1],m[2] do
+ local step = steps[i]
+ local lookupcache = step.coverage
+ local lookupmatch = lookupcache[char]
+ if lookupmatch then
+ local ok
+ head, start, ok = handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ -- if matches then
+ -- matches[position] = i
+ -- else
+ -- matches = { [position] = i }
+ -- end
+ break
+ elseif not start then
+ break
end
end
- if start then
- start = getnext(start)
- end
+ end
+ if start then
+ start = getnext(start)
end
else
start = getnext(start)
diff --git a/macros/luatex/generic/luaotfload/fontloader-l-table.lua b/macros/luatex/generic/luaotfload/fontloader-l-table.lua
index b6c3744b8b..429466179e 100644
--- a/macros/luatex/generic/luaotfload/fontloader-l-table.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-l-table.lua
@@ -740,7 +740,8 @@ local function do_serialize(root,name,depth,level,indexed)
if accurate then
handle(format("%s %s=%q,",depth,k,v))
else
- handle(format("%s %s=%s,",depth,k,v))
+-- handle(format("%s %s=%s,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
end
elseif accurate then
handle(format("%s %s=%q,",depth,k,v))
@@ -752,7 +753,8 @@ local function do_serialize(root,name,depth,level,indexed)
if accurate then
handle(format("%s [%q]=%q,",depth,k,v))
else
- handle(format("%s [%q]=%s,",depth,k,v))
+-- handle(format("%s [%q]=%s,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
end
elseif accurate then
handle(format("%s [%q]=%q,",depth,k,v))
diff --git a/macros/luatex/generic/luaotfload/fontloader-reference.lua b/macros/luatex/generic/luaotfload/fontloader-reference.lua
index 6997a417a7..8cff7fb909 100644
--- a/macros/luatex/generic/luaotfload/fontloader-reference.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-reference.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 : 2023-08-16 19:31
+-- merge date : 2023-09-26 18:19
do -- begin closure to overcome local limits and interference
@@ -1578,7 +1578,7 @@ local function do_serialize(root,name,depth,level,indexed)
if accurate then
handle(format("%s %s=%q,",depth,k,v))
else
- handle(format("%s %s=%s,",depth,k,v))
+ handle(format("%s %s=0x%X,",depth,k,v))
end
elseif accurate then
handle(format("%s %s=%q,",depth,k,v))
@@ -1590,7 +1590,7 @@ local function do_serialize(root,name,depth,level,indexed)
if accurate then
handle(format("%s [%q]=%q,",depth,k,v))
else
- handle(format("%s [%q]=%s,",depth,k,v))
+ handle(format("%s [%q]=0x%X,",depth,k,v))
end
elseif accurate then
handle(format("%s [%q]=%q,",depth,k,v))
@@ -4103,6 +4103,20 @@ do
return cache[s]
end
end
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE>0 then
+ local t={
+ ["#"]="#H",
+ ["\n"]="#L",
+ ['"']="#Q",
+ ["\r"]="#R",
+ [" "]="#S",
+ ["\t"]="#T",
+ ["\\"]="#X",
+ }
+ function string.texhashed(s)
+ return (gsub(s,".",t))
+ end
+end
end -- closure
@@ -10814,7 +10828,7 @@ local function tounicode16(unicode)
return s_unknown
else
unicode=unicode-0x10000
- return f_double(idiv(k,0x400)+0xD800,unicode%0x400+0xDC00)
+ return f_double(idiv(unicode,0x400)+0xD800,unicode%0x400+0xDC00)
end
end
local function tounicode16sequence(unicodes)
@@ -10833,7 +10847,7 @@ local function tounicode16sequence(unicodes)
t[l]=s_unknown
else
u=u-0x10000
- t[l]=f_double(idiv(k,0x400)+0xD800,u%0x400+0xDC00)
+ t[l]=f_double(idiv(u,0x400)+0xD800,u%0x400+0xDC00)
end
end
return concat(t)
@@ -18425,7 +18439,7 @@ do
end
return features
end
- local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ local function readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses)
setposition(f,lookupoffset)
local noflookups=readushort(f)
local lookups=readcardinaltable(f,noflookups,ushort)
@@ -18442,12 +18456,12 @@ do
subtables[j]=offset+readushort(f)
end
local markclass=band(flagbits,0x0010)~=0
+ local markset=rshift(flagbits,8)
if markclass then
markclass=readushort(f)
end
- local markset=rshift(flagbits,8)
if markset>0 then
- markclass=markset
+ markclass=nofmarkclasses+markset
end
lookups[lookupid]={
type=lookuptype,
@@ -18791,7 +18805,8 @@ do
if not lookupstoo then
return
end
- local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder)
+ local nofmarkclasses=(fontdata.markclasses and #fontdata.markclasses or 0)-(fontdata.marksets and #fontdata.marksets or 0)
+ local lookups=readlookups(f,lookupoffset,lookuptypes,featurehash,featureorder,nofmarkclasses)
if lookups then
resolvelookups(f,lookupoffset,fontdata,lookups,lookuptypes,lookuphandlers,what,tableoffset)
end
@@ -18960,6 +18975,7 @@ function readers.gdef(f,fontdata,specification)
end
end
if marksetsoffset~=0 then
+ local nofmarkclasses=fontdata.markclasses and #fontdata.markclasses or 0
marksetsoffset=tableoffset+marksetsoffset
setposition(f,marksetsoffset)
local format=readushort(f)
@@ -18969,7 +18985,8 @@ function readers.gdef(f,fontdata,specification)
for i=1,nofsets do
local offset=sets[i]
if offset~=0 then
- marksets[i]=readcoverage(f,marksetsoffset+offset)
+ markclasses[nofmarkclasses+i]=readcoverage(f,marksetsoffset+offset)
+ marksets[i]={}
end
end
end
@@ -21352,7 +21369,7 @@ local trace_defining=false registertracker("fonts.defining",function(v) trace_d
local report_otf=logs.reporter("fonts","otf loading")
local fonts=fonts
local otf=fonts.handlers.otf
-otf.version=3.133
+otf.version=3.134
otf.cache=containers.define("fonts","otl",otf.version,true)
otf.svgcache=containers.define("fonts","svg",otf.version,true)
otf.pngcache=containers.define("fonts","png",otf.version,true)
@@ -29402,17 +29419,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if last then
local char,id=ischar(last,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n<l then
+ last=getnext(last)
+ end
+ n=n+1
+ elseif skiphash and skiphash[char] then
skipped=true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
last=getnext(last)
- elseif seq[n][char] then
- if n<l then
- last=getnext(last)
- end
- n=n+1
elseif discfound then
notmatchreplace[discfound]=true
if notmatchpre[discfound] then
@@ -29503,17 +29520,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if prev then
local char,id=ischar(prev,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n>1 then
+ prev=getprev(prev)
+ end
+ n=n-1
+ elseif skiphash and skiphash[char] then
skipped=true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
prev=getprev(prev)
- elseif seq[n][char] then
- if n>1 then
- prev=getprev(prev)
- end
- n=n-1
elseif discfound then
notmatchreplace[discfound]=true
if notmatchpost[discfound] then
@@ -29619,17 +29636,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s
if current then
local char,id=ischar(current,currentfont)
if char then
- if skiphash and skiphash[char] then
+ if seq[n][char] then
+ if n<s then
+ current=getnext(current)
+ end
+ n=n+1
+ elseif skiphash and skiphash[char] then
skipped=true
if trace_skips then
show_skip(dataset,sequence,char,ck,classes[char])
end
- current=getnext(current)
- elseif seq[n][char] then
- if n<s then
- current=getnext(current)
- end
- n=n+1
+ current=getnext(current)
elseif discfound then
notmatchreplace[discfound]=true
if notmatchpre[discfound] then
@@ -30574,32 +30591,28 @@ do
while start do
local char,id=ischar(start,font)
if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local a
- if attr then
- if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
- a=true
- end
- elseif not attribute or getstate(start,attribute) then
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local a
+ if attr then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
a=true
end
- if a then
- local ok,df
- head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- elseif start then
- start=getnext(start)
- end
- else
+ elseif not attribute or getstate(start,attribute) then
+ a=true
+ end
+ if a then
+ local ok,df
+ head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ elseif start then
start=getnext(start)
end
else
- start=getnext(start)
+ start=getnext(start)
end
+ else
+ start=getnext(start)
end
elseif char==false or id==glue_code then
start=getnext(start)
@@ -30629,46 +30642,42 @@ do
while start do
local char,id=ischar(start,font)
if char then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- local m=merged[char]
- if m then
- local a
- if attr then
- if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
- a=true
- end
- elseif not attribute or getstate(start,attribute) then
+ local m=merged[char]
+ if m then
+ local a
+ if attr then
+ if getglyphdata(start)==attr and (not attribute or getstate(start,attribute)) then
a=true
end
- if a then
- local ok,df
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if df then
- break
- elseif ok then
- break
- elseif not start then
- break
- end
+ elseif not attribute or getstate(start,attribute) then
+ a=true
+ end
+ if a then
+ local ok,df
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ head,start,ok,df=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if df then
+ break
+ elseif ok then
+ break
+ elseif not start then
+ break
end
end
- if df then
- elseif start then
- start=getnext(start)
- end
- else
+ end
+ if df then
+ elseif start then
start=getnext(start)
end
else
start=getnext(start)
end
+ else
+ start=getnext(start)
end
elseif char==false or id==glue_code then
start=getnext(start)
@@ -30736,26 +30745,22 @@ do
position=position+1
local m=merged[char]
if m then
- if skiphash and skiphash[char] then
- start=getnext(start)
- else
- for i=m[1],m[2] do
- local step=steps[i]
- local lookupcache=step.coverage
- local lookupmatch=lookupcache[char]
- if lookupmatch then
- local ok
- head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
- if ok then
- break
- elseif not start then
- break
- end
+ for i=m[1],m[2] do
+ local step=steps[i]
+ local lookupcache=step.coverage
+ local lookupmatch=lookupcache[char]
+ if lookupmatch then
+ local ok
+ head,start,ok=handler(head,start,dataset,sequence,lookupmatch,rlmode,skiphash,step)
+ if ok then
+ break
+ elseif not start then
+ break
end
end
- if start then
- start=getnext(start)
- end
+ end
+ if start then
+ start=getnext(start)
end
else
start=getnext(start)
diff --git a/macros/luatex/generic/luaotfload/fontloader-util-str.lua b/macros/luatex/generic/luaotfload/fontloader-util-str.lua
index a9150b886a..3663b38489 100644
--- a/macros/luatex/generic/luaotfload/fontloader-util-str.lua
+++ b/macros/luatex/generic/luaotfload/fontloader-util-str.lua
@@ -315,7 +315,8 @@ function strings.collapse(str) -- maybe also in strings
return str and lpegmatch(p_prune_intospace,str) or str
end
--- local s = "\naa\n\naa\na a\n\n"
+-- local s = " \naa\n\naa\na a\n\n "
+-- local s = [[ \naa\n\naa\na a\n\n]]
-- print("["..strings.striplines(s,"collapse all").."]")
-- also see: string.collapsespaces
@@ -1557,3 +1558,20 @@ do
end
+if CONTEXTLMTXMODE and CONTEXTLMTXMODE > 0 then
+
+ local t = {
+ ["#"] = "#H",
+ ["\n"] = "#L",
+ ['"'] = "#Q",
+ ["\r"] = "#R",
+ [" "] = "#S",
+ ["\t"] = "#T",
+ ["\\"] = "#X",
+ }
+
+ function string.texhashed(s)
+ return (gsub(s,".",t))
+ end
+
+end
diff --git a/macros/luatex/generic/luaotfload/luaotfload-arabic.lua b/macros/luatex/generic/luaotfload/luaotfload-arabic.lua
new file mode 100644
index 0000000000..ac599ebca7
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-arabic.lua
@@ -0,0 +1,143 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-arabic.lua
+-- DESCRIPTION: part of luaotfload / arabic specific support
+-----------------------------------------------------------------------
+
+assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
+ name = "luaotfload-arabic",
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
+ description = "luaotfload submodule / features",
+ license = "GPL v2.0",
+ author = "Marcel Krüger",
+ copyright = "The LaTeX Project",
+}
+
+local unicode = require'luaotfload-unicode'
+local ccc = unicode.ccc
+
+local node_new = node.direct.new
+local setlink = node.direct.setlink
+local is_char = node.direct.is_char
+local getnext = node.direct.getnext
+
+-- Mark combining marks
+local mcm = {
+ [0x0654] = true, -- ARABIC HAMZA ABOVE
+ [0x0655] = true, -- ARABIC HAMZA BELOW
+ [0x0658] = true, -- ARABIC MARK NOON GHUNNA
+ [0x06DC] = true, -- ARABIC SMALL HIGH SEEN
+ [0x06E3] = true, -- ARABIC SMALL LOW SEEN
+ [0x06E7] = true, -- ARABIC SMALL HIGH YEH
+ [0x06E8] = true, -- ARABIC SMALL HIGH NOON
+ [0x08CA] = true, -- ARABIC SMALL HIGH FARSI YEH
+ [0x08CB] = true, -- ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW
+ [0x08CD] = true, -- ARABIC SMALL HIGH ZAH
+ [0x08CE] = true, -- ARABIC LARGE ROUND DOT ABOVE
+ [0x08CF] = true, -- ARABIC LARGE ROUND DOT BELOW
+ [0x08D3] = true, -- ARABIC SMALL LOW WAW
+ [0x08F3] = true, -- ARABIC SMALL HIGH WAW
+}
+
+-- Implement AMTRA from UTR #53.
+-- This assumes that the text is already normalized according to NFD. For most
+-- fonts, normalizing to NFC should be good enough.
+local function reorder_amtra(head, f)
+ local n = head
+ while n do
+ local base, prev = n
+ prev, n = n, getnext(n)
+ while true do
+ local char = is_char(n, f) -- is_char(nil, f) == is_char(0, f) == nil
+ local this_ccc = ccc[char]
+ if not this_ccc then break end -- ! This `break` is the hot path
+ if this_ccc == 33 then
+ local after_33, tail_33 = n
+ repeat
+ tail_33 = after_33
+ after_33 = getnext(tail_33)
+ local char = is_char(after_33, f)
+ local after_ccc = ccc[char]
+ until after_ccc ~= 33
+ setlink(prev, after_33)
+ setlink(tail_33, getnext(base))
+ setlink(base, n)
+ if prev == base then
+ prev = tail_33
+ end
+ n = after_33
+ elseif this_ccc == 220 then
+ local after_220, tail_220, found = n
+ repeat
+ tail_220 = after_220
+ after_220 = getnext(tail_220)
+ local char = is_char(after_220, f)
+ if mcm[char] then found = true end
+ local after_ccc = ccc[char]
+ until after_ccc ~= 220
+ if found then
+ setlink(prev, after_220)
+ setlink(tail_220, getnext(base))
+ setlink(base, n)
+ if prev == base then
+ prev = tail_220
+ end
+ n = after_220
+ base = tail_220 -- Because ccc230 should get inserted after this
+ else
+ prev, n = tail_220, after_220
+ end
+ elseif this_ccc == 230 then
+ local after_230, tail_230, found = n
+ repeat
+ tail_230 = after_230
+ after_230 = getnext(tail_230)
+ local char = is_char(after_230, f)
+ if mcm[char] then found = true end
+ local after_ccc = ccc[char]
+ until after_ccc ~= 230
+ if found then
+ setlink(prev, after_230)
+ setlink(tail_230, getnext(base))
+ setlink(base, n)
+ if prev == base then
+ prev = tail_230
+ end
+ n = after_230
+ else
+ prev, n = tail_220, after_220
+ end
+ else
+ prev, n = n, getnext(n)
+ end
+ end
+ end
+ return n
+end
+
+-- We need to run after normalize and ideally directly afterwards. So try to insert after normalize
+-- or default to the start of the list such that normalize can insert itself before us later.
+local normalize_index = 0
+for i, manipulator in ipairs(fonts.constructors.features.otf.processors.node) do
+ if manipulator.name == 'normalize' then
+ normalize_index = i
+ end
+end
+fonts.constructors.features.otf.register {
+ name = 'amtra',
+ default = 'auto',
+ description = 'Apply Unicode Arabic Mark Rendering',
+ initializers = {
+ node = function(fonttable, value, features)
+ if values == 'auto' then
+ features.amtra = fonttable.properties.script == 'arab'
+ end
+ end,
+ },
+ processors = {
+ position = normalize_index + 1,
+ node = function(head, f)
+ return reorder_amtra(head, f)
+ end,
+ },
+}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
index 5e2022a18b..71abb0e1bd 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
@@ -6,8 +6,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-auxiliary",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / auxiliary functions",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-colors.lua b/macros/luatex/generic/luaotfload/luaotfload-colors.lua
index 2d8942a3d9..944d1745e4 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-colors.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-colors.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-colors",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
index 078ba7de52..001729a1e2 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
index b59897b217..d8590666af 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-configuration",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / config file reader",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-database.lua b/macros/luatex/generic/luaotfload/luaotfload-database.lua
index 9b81f6a3d0..f1b59fcc7b 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-database.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-database.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-database",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / database",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -150,7 +150,6 @@ local kpsefind_file = kpse.find_file
local kpselookup = kpse.lookup
local kpsereadable_file = kpse.readable_file
local lfsattributes = lfs.attributes
-local lfschdir = lfs.chdir
local lfscurrentdir = lfs.currentdir
local lfsdir = lfs.dir
local mathabs = math.abs
@@ -202,6 +201,7 @@ local resolversfindfile = context_environment.resolvers.findfile
--- some of our own
local unicode = require'luaotfload-unicode'
local casefold = require'lua-uni-case'.casefold
+local realpath = require'luaotfload-realpath'.realpath
local alphnum_only = unicode.alphnum_only
local name_index = nil --> upvalue for names.data
@@ -318,49 +318,53 @@ local function sanitize_fontnames (rawnames)
return result
end
-local function find_files_indeed (acc, dirs, filter)
- if not next (dirs) then --- done
- return acc
+local list_dir_or_empty do
+ local function inner_list_dir_or_empty (dir, success, ...)
+ if success then
+ return ...
+ else
+ -- Skipping unreadable directory.
+ -- TODO: Print warning
+ return next, {}
+ end
+ end
+ function list_dir_or_empty (dir)
+ return inner_list_dir_or_empty(dir, pcall(lfsdir, dir))
end
+end
- local pwd = lfscurrentdir ()
- local dir = dirs[#dirs]
- dirs[#dirs] = nil
+local function dummyfilter () return true end
+
+--- the optional filter function receives the full path of a file
+--- system entity. a filter applies if the first argument it returns is
+--- true.
+
+--- string -> function? -> string list
+local function find_files (root, filter)
+ if not lfsisdir (root) then return end
+
+ local files = {}
+ local dirs = { root }
+ filter = filter or dummyfilter
- if lfschdir (dir) then
- lfschdir (pwd)
+ while dirs[1] do
+ local dir = dirs[#dirs]
+ dirs[#dirs] = nil
- local newfiles = { }
- for ent in lfsdir (dir) do
+ for ent in list_dir_or_empty (dir) do
if ent ~= "." and ent ~= ".." then
local fullpath = dir .. "/" .. ent
if filter (fullpath) == true then
if lfsisdir (fullpath) then
dirs[#dirs+1] = fullpath
elseif lfsisfile (fullpath) then
- newfiles[#newfiles+1] = fullpath
+ files[#files+1] = fullpath
end
end
end
end
- return find_files_indeed (tableappend (acc, newfiles),
- dirs, filter)
- end
- --- could not cd into, so we skip it
- return find_files_indeed (acc, dirs, filter)
-end
-
-local function dummyfilter () return true end
-
---- the optional filter function receives the full path of a file
---- system entity. a filter applies if the first argument it returns is
---- true.
-
---- string -> function? -> string list
-local function find_files (root, filter)
- if lfsisdir (root) then
- return find_files_indeed ({}, { root }, filter or dummyfilter)
end
+ return files
end
@@ -2177,17 +2181,19 @@ local function process_dir_tree (acc, dirs, done)
return acc
end
- local pwd = lfscurrentdir ()
local dir = dirs[#dirs]
dirs[#dirs] = nil
- if not lfschdir (dir) then
- --- Cannot cd; skip.
+ local mode_or_err
+ dir, mode_or_err = realpath(dir)
+ if not dir then
+ logreport ("both", 1, "db", "Skipping font directory: %s", mode_or_err)
+ return process_dir_tree (acc, dirs, done)
+ elseif mode_or_err ~= 'directory' then
+ logreport ("both", 1, "db", "Skipping non-directory while searching fonts: %q (%s)", dir, mode_or_err)
return process_dir_tree (acc, dirs, done)
end
- dir = lfscurrentdir () --- resolve symlinks
- lfschdir (pwd)
if tablecontains (done, dir) then
--- Already traversed. Note that it’d be unsafe to rely on the
--- hash part above due to Lua only processing up to 32 bytes
@@ -2226,35 +2232,38 @@ local function process_dir_tree (acc, dirs, done)
end
local function process_dir (dir)
- local pwd = lfscurrentdir ()
- if lfschdir (dir) then
- dir = lfscurrentdir () --- resolve symlinks
- lfschdir (pwd)
-
- local files = { }
- local blacklist = names.blacklist
- for ent in lfsdir (dir) do
- if ent ~= "." and ent ~= ".." and not blacklist[ent] then
- local fullpath = dir .. "/" .. ent
- if lfsisfile (fullpath) then
- ent = stringlower (ent)
- if lpegmatch (p_font_filter, ent)
- then
- if filesuffix (ent) == "afm" then
- local pfbpath = locate_matching_pfb (ent, dir)
- if pfbpath then
- files[#files+1] = pfbpath
- end
- else
- files[#files+1] = fullpath
+ local mode_or_err
+ dir, mode_or_err = realpath(dir)
+ if not dir then
+ logreport ("both", 1, "db", "Skipping font directory: %s", mode_or_err)
+ return {}
+ elseif mode_or_err ~= 'directory' then
+ logreport ("both", 1, "db", "Skipping non-directory while searching fonts: %q (%s)", dir, mode_or_err)
+ return {}
+ end
+
+ local files = { }
+ local blacklist = names.blacklist
+ for ent in lfsdir (dir) do
+ if ent ~= "." and ent ~= ".." and not blacklist[ent] then
+ local fullpath = dir .. "/" .. ent
+ if lfsisfile (fullpath) then
+ ent = stringlower (ent)
+ if lpegmatch (p_font_filter, ent)
+ then
+ if filesuffix (ent) == "afm" then
+ local pfbpath = locate_matching_pfb (ent, dir)
+ if pfbpath then
+ files[#files+1] = pfbpath
end
+ else
+ files[#files+1] = fullpath
end
end
end
end
- return files
end
- return { }
+ return files
end
--- string -> bool -> string list
diff --git a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
index 1a48ec9a08..83780b9929 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-diagnostics",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload-tool submodule / diagnostics",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-dvi.lua b/macros/luatex/generic/luaotfload/luaotfload-dvi.lua
index c1b6d227c9..f8d4d268f7 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-dvi.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-dvi.lua
@@ -6,8 +6,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-dvi",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / DVI",
license = "GPL v2.0",
author = "Marcel Krüger",
@@ -85,7 +85,7 @@ function full_hprocess(head)
end
if last_mapping then
local mapped = last_mapping[c]
- if mapped then setfont(n, mapped_font, mapped) end
+ if mapped then setfont(n, last_mapped_font, mapped) end
end
end
elseif id == glyph_t then
diff --git a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
index fad5ce7b2c..caff50ed4d 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-embolden",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / embolden",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-fallback.lua b/macros/luatex/generic/luaotfload/luaotfload-fallback.lua
index ef0ce1fb63..a527095618 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-fallback.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-fallback.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-fallback",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / fallback",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-features.lua b/macros/luatex/generic/luaotfload/luaotfload-features.lua
index 862f50aad3..d4d96217aa 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-features.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-features.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-features",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / features",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -890,6 +890,7 @@ fonts.constructors.features.otf.register {
end,
},
}
+require'luaotfload-arabic'
-- mathsize feature for compatibility with older fontloader versions
-- Not all that useful in most cases since it leads to messy font sizes,
diff --git a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
index fea69928b5..9b5f618cc2 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
@@ -6,8 +6,8 @@
if luaotfload_module then luaotfload_module {
name = "luaotfload-filelist",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / filelist",
license = "GPL v2.0"
} end
diff --git a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
index 370cfbd611..f300d4955d 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
@@ -1,8 +1,8 @@
if luaotfload_module then
luaotfload_module {
name = "luaotfload-glyphlist",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / autogenerated glyphlist",
copyright = "derived from https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/master/glyphlist.txt",
original = "Adobe Glyph List, version 2.0, September 20, 2002",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
index 32cad5fc54..7eb795d176 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-define",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / HarfBuzz font loading",
license = "GPL v2.0",
author = "Khaled Hosny, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
index e9d4a15b9f..5c2d13df00 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
@@ -4,8 +4,8 @@
-----------------------------------------------------------------------
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-plug",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / HarfBuzz shaping",
license = "GPL v2.0",
author = "Khaled Hosny, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua
index 063b99c2be..ad8fbdcd26 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua
@@ -5,8 +5,8 @@
do
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-var-cff2",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / CFF2 table processing",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua
index 491c127f9c..1d40d09ad0 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua
@@ -5,8 +5,8 @@
do
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-var-t2-writer",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / Type 2 charstring writer",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua
index 0853a62fc4..a6d4d36aba 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua
@@ -5,8 +5,8 @@
do
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-var-ttf",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / gvar table processing",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-init.lua b/macros/luatex/generic/luaotfload/luaotfload-init.lua
index 78cb99ff7e..13b1099752 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-init.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-init.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-init",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / initialization",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
index 8368bd9db3..bc1e5abae6 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
index d641b028bf..b2b848bfc6 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-letterspace",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / letterspacing",
license = "GPL v2.0",
copyright = "PRAGMA ADE / ConTeXt Development Team",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
index eceaff8188..86f48ee69a 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
@@ -8,8 +8,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-loaders",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / callback handling",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-log.lua b/macros/luatex/generic/luaotfload/luaotfload-log.lua
index 95f02beed5..d22c48eda5 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-log.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-log.lua
@@ -6,8 +6,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-log",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / logging",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-main.tex b/macros/luatex/generic/luaotfload/luaotfload-main.tex
index 1df20a5cee..f631263dee 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-main.tex
+++ b/macros/luatex/generic/luaotfload/luaotfload-main.tex
@@ -32,7 +32,7 @@
\beginfrontmatter
\setdocumenttitle {The \identifier{luaotfload} package}
- \setdocumentdate {2023-08-31 v3.26}
+ \setdocumentdate {2024-02-14 v3.27}
\setdocumentauthor {LaTeX3 Project\\
Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer · Marcel Krüger\\
Home: \hyperlink {https://github.com/latex3/luaotfload}}
@@ -62,6 +62,16 @@ Supported is the \identifier{luatex} versions of a current TeXLive 2019 (and a c
\endsection
\beginsection{Changes}
+\beginsubsection{New in version 3.27}
+\begin{itemize}
+ \item Improved support for arabic mark rendering in \texttt{node} mode.
+ \item Better ordering of GSUB substitutions.
+ \item Avoid dropping hyphens in DVI mode
+ \item Compatibility with \identifier{luatex} 1.18
+ \item Various bug fixes
+\end{itemize}
+\endsubsection
+
\beginsubsection{New in version 3.24}
\begin{itemize}
\item Add experimental configuration option to change default font lookup location
diff --git a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
index 2b2136ff68..c3a611a1f8 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-multiscript",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / multiscript",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
index 311a377148..f738fbdae9 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-notdef",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / notdef",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
index 2650e21e61..27c8c449ca 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-parsers",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / parsers",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-realpath.lua b/macros/luatex/generic/luaotfload/luaotfload-realpath.lua
new file mode 100644
index 0000000000..2738da8a1b
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-realpath.lua
@@ -0,0 +1,131 @@
+-- Helper to resolve symlinks in paths
+
+local sub = string.sub
+local symlinkattributes = lfs.symlinkattributes
+local attributes = lfs.attributes
+local currentdir = lfs.currentdir
+local concat = table.concat
+local move = table.move
+local newtable = lua.newtable
+local setmetatable = setmetatable
+
+-- Marker key for elements of result_tree to indicate the path components entry and the file mode
+local path_components, file_mode = {}, {}
+local tree_root
+
+local split_path do
+ local l = lpeg
+ local separator = os.type == 'unix' and l.S'/' or l.S'/\\'
+ -- We do not allow empty segments here because they get ignored.
+ local segment = l.C((1 - separator)^1)
+ -- Duplicate and trailing separators are dropped.
+ local unc = os.type == 'unix' and l.P(false) or separator * separator * l.Cg(l.P(1)^0 * -1, 'unc')
+ local drive_letter = os.type == 'unix' and l.P(false) or l.Cg(l.R('az', 'AZ') * ':', 'drive')
+ local path_pat = l.Ct(unc + drive_letter^-1 * (l.Cc'' * separator^1)^-1 * (segment * separator^1)^0 * segment^-1 * -1)
+ function split_path(path)
+ local splitted = path_pat:match(path)
+ if not splitted then
+ error'Invalid path rejected'
+ elseif splitted.unc then
+ error'Unsupported UNC path encountered'
+ elseif splitted.drive and splitted[1] ~= '' then
+ error'Unsupported relative path with drive letter encountered'
+ end
+ return splitted
+ end
+end
+
+local function recombine_path(components)
+ local joined = concat(components, '/')
+ if components.drive then
+ joined = components.drive .. joined
+ end
+ return joined
+end
+
+local function lookup_split_path_in_tree(components, tree)
+ if components[1] == '' then
+ tree = tree_root
+ end
+ for i=1, #components do
+ local next_tree = tree[components[i]]
+ if not next_tree then
+ return nil, string.format("Unable to find %q in %q", components[i], recombine_path(tree[path_components]))
+ end
+ tree = next_tree
+ end
+ return tree
+end
+
+local tree_meta
+tree_meta = {
+ __index = function(parent, component)
+ local parent_components = parent[path_components]
+ local depth = #parent_components
+ local components = move(parent[path_components], 1, depth, 1, newtable(depth + 1, 0))
+ components[depth + 1] = component
+ local path = recombine_path(components)
+
+ local mode = symlinkattributes(path, 'mode')
+ if not mode then
+ parent[component] = false
+ return false
+ end
+ if mode == 'link' then
+ local target = symlinkattributes(path, 'target')
+ local splitted_target = split_path(target)
+ local target_tree = lookup_split_path_in_tree(splitted_target, parent) or false
+ parent[component] = target_tree
+ return target_tree
+ end
+
+ local child = {
+ [path_components] = components,
+ [file_mode] = mode,
+ }
+ if mode == 'directory' then
+ setmetatable(child, tree_meta)
+ child['.'] = child
+ child['..'] = parent
+ end
+ parent[component] = child
+ return child
+ end,
+}
+
+-- We assume that the directory structure does not change during our run.
+function build_root_dir(drive)
+ local root_dir = setmetatable({
+ [path_components] = {'', drive = drive},
+ [file_mode] = 'directory', -- "If [your root is not a directory] you are having a bad problem and you will not go to space today".
+ }, tree_meta)
+ root_dir['.'] = root_dir
+ root_dir['..'] = root_dir
+ return root_dir
+end
+tree_root = os.type == 'unix' and build_root_dir() or setmetatable({}, {__index = function(t, drive)
+ local root_dir = build_root_dir(drive)
+ t[drive] = root_dir
+ return root_dir
+end})
+
+local function resolve_path_to_tree(path)
+ local splitted = split_path(path)
+ if splitted[1] == '' then -- Optimization to avoid currentdir lookup.
+ return lookup_split_path_in_tree(splitted, tree_root)
+ else
+ local splitted_currentdir = split_path(currentdir())
+ local current_tree = assert(lookup_split_path_in_tree(splitted_currentdir, tree_root))
+ return lookup_split_path_in_tree(splitted, current_tree)
+ end
+end
+
+local function resolve_path(path)
+ local tree, err = resolve_path_to_tree(path)
+ if not tree then return tree, err end
+ return recombine_path(tree[path_components]), tree[file_mode]
+end
+
+return {
+ realpath = resolve_path,
+}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
index a719d8f91b..93e8f61c30 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
@@ -11,8 +11,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-resolvers",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / resolvers",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
index 5ee0b451a5..75f9e3b579 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-script",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / Script helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-status.lua b/macros/luatex/generic/luaotfload/luaotfload-status.lua
index 78d097c0f2..530fc06edd 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-status.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-status.lua
@@ -1,14 +1,14 @@
return {
["hashes"]={
- { "fontloader-2023-08-19.lua", "5e8a5e13801cd8eff23f5e8dc4cbbc10" },
+ { "fontloader-2023-12-28.lua", "f33a8946b4d6a005e76276706db83059" },
{ "fontloader-util-fil.lua", "d0accf4180201efd567816a25ad5e037" },
- { "fontloader-util-str.lua", "9a601a851ef3595cddc01b40dc79e1d6" },
+ { "fontloader-util-str.lua", "f9cf43057eb25bbf466821908686fc3d" },
{ "fontloader-l-unicode.lua", "f368874f11f3c525de5864fd413e4b24" },
{ "fontloader-l-math.lua", "e19c80b7e700a69df942d4df2e14aa28" },
{ "fontloader-l-boolean.lua", "abe28515dd33e8f6c416c09bca351cf8" },
{ "fontloader-l-file.lua", "525b1c6af6f94d93ae929bfbe980d656" },
{ "fontloader-l-io.lua", "3396a8644bae37e49b2cfc0c388c78f8" },
- { "fontloader-l-table.lua", "87aad875871bba16bbf7d4c3208b3637" },
+ { "fontloader-l-table.lua", "baa3aea43dbc57e6fb5ff7850129218c" },
{ "fontloader-l-string.lua", "3e97812b1d8eff26f19837ab00813e71" },
{ "fontloader-l-function.lua", "a7e68a9703c35238729da41a474e951b" },
{ "fontloader-l-lpeg.lua", "8315a56e6bc7b2ede3f70c49bf2b5af5" },
@@ -33,67 +33,67 @@ return {
{ "fontloader-font-one.lua", "b7fb0389462a49bc1f41bebd2da85401" },
{ "fontloader-font-onr.lua", "a3f85c886cf22fb27760d98603d51ffd" },
{ "fontloader-font-ocl.lua", "2a377351ae23c339764ec8ce2e8e9164" },
- { "fontloader-font-osd.lua", "c38c14c118680202c6f4b09734542c49" },
+ { "fontloader-font-osd.lua", "837039b0dca88edd3f4b54222f7cf54c" },
{ "fontloader-font-otc.lua", "0ad931eec679ebeceed5d4f02f4ba31b" },
- { "fontloader-font-ots.lua", "c039b20490b526ec469e41a8584ebe6d" },
+ { "fontloader-font-ots.lua", "2ba92e909a45b68592f7271d8190f390" },
{ "fontloader-font-ota.lua", "7407b709ae7b2cdf36f68d5c98d51d12" },
{ "fontloader-font-oup.lua", "aaff9c28233bbea56e6d27ae50e04ff0" },
{ "fontloader-font-otj.lua", "b2c165bd6771a57633f992d07384b739" },
- { "fontloader-font-oto.lua", "1cc20f34606fb55d4646a0dd323499ef" },
- { "fontloader-font-otl.lua", "21196d193ce16f3996c9aa75e81e440c" },
+ { "fontloader-font-oto.lua", "b148d66f642aaa3d0ddc427f71d6e02d" },
+ { "fontloader-font-otl.lua", "84499d355f82829841b8e304952a9d5d" },
{ "fontloader-font-ott.lua", "427bdc77dd187158eafb79b7193400dc" },
{ "fontloader-font-oti.lua", "309a75f9c14b77d87e94eba827dc4e71" },
- { "fontloader-font-dsp.lua", "755beef1b31e9dfd050e9d221d4e9ae3" },
+ { "fontloader-font-dsp.lua", "d07a0663bafeb7603c5456639afaf2e8" },
{ "fontloader-font-ttf.lua", "ff94e130d7c71edd899c4bae7745b7db" },
{ "fontloader-font-cff.lua", "999da544079698ce70178fd84bcdd67a" },
{ "fontloader-font-otr.lua", "2958a21bebcf0579f4e11f0646d1b402" },
{ "fontloader-font-vfc.lua", "a81c29eda98cd62cbebdb6c93544b50d" },
- { "fontloader-font-map.lua", "27ee748150e56f5f0e5f0fefc864f35e" },
+ { "fontloader-font-map.lua", "b1444428c238a17d2a998ff1a4769183" },
{ "fontloader-font-cid.lua", "22b0367742fb253deef84ef7ccf5e8de" },
- { "fontloader-font-con.lua", "bdbaaa361308c9ccc0a7dac0bf6c17ec" },
+ { "fontloader-font-con.lua", "ebdd0ca857deafdc0152c7a4f1ed2490" },
{ "fontloader-font-ini.lua", "16b855c98602e4a3e9df39512916a427" },
{ "fontloader-data-con.lua", "b4ab51aaeab872d86d827f3e216bf05e" },
- { "fontloader-reference.lua", "50f2268d2d34d5f2ad630151fc1e5b8e" },
+ { "fontloader-reference.lua", "23d03b682af6417aa08995f2ec10de22" },
{ "fontloader-basics-gen.lua", "4bc43036e9796fccb0b8869f4b05bf2e" },
{ "mktests", "918cb50be9ee8bd645ac1a27dc501e8c" },
- { "mkstatus", "590e9cffec69376c1888aa78c5b9275e" },
+ { "mkstatus", "201011fcb01d8d804cc27b69d184b1e5" },
{ "mkcharacters", "bfca0e96e1e351afe7077502f9595af9" },
{ "mkglyphlist", "7a8a8fdc0eac7fac2f13ec8f4e8e7aa9" },
{ "mkimport", "7d62f1042e548f8b9368f26b9ba4be5c" },
- { "luaotfload-glyphlist.lua", "fa2a4b91221ca59a6af8ebf8f6d36092" },
+ { "luaotfload-glyphlist.lua", "5b7427a864ba333f2f674b172bba2b63" },
{ "luaotfload-characters.lua", "76415ca3ede312cad6e09038323489ae" },
- { "luaotfload-dvi.lua", "2c42e84f6c9cfdbe19bcc544f74bc3c8" },
- { "luaotfload-tounicode.lua", "c5b104d6d5d1d86f13d45294df8ac77f" },
- { "luaotfload-unicode.lua", "2ac5fb697191fbe7f30f4ab4e5f7037b" },
- { "luaotfload-resolvers.lua", "70abe38786679abb1ca55cc5911bba83" },
- { "luaotfload-parsers.lua", "72ab0dbd52fba0249530872bfde6163b" },
- { "luaotfload-fallback.lua", "653007bbe201edfe3d3841af3ec39b70" },
- { "luaotfload-szss.lua", "df7e044b32e6fa3105ebd7f31e5b03cf" },
- { "luaotfload-scripts.lua", "0d7bf2d895f46c408c26f23f5035affb" },
- { "luaotfload-multiscript.lua", "47e8a08c7271b9d660321631f3140a4c" },
- { "luaotfload-loaders.lua", "3acb9dc1e0f02d2ecee1ef144597caf6" },
- { "luaotfload-harf-plug.lua", "5274ff4eec2421572adbf4bf293fcd8c" },
- { "luaotfload-harf-define.lua", "0074c52e9baf538bfec8d4636552e466" },
- { "luaotfload-notdef.lua", "d1797bb1db42c691a1196a713c2e1936" },
- { "luaotfload-embolden.lua", "9b611178cd9acaa482f8be85f384d201" },
- { "luaotfload-letterspace.lua", "66348b58834d4cc954acd02bab149085" },
- { "luaotfload-features.lua", "23685ea0c4f4ba1adc4f9bdc467cfe34" },
- { "luaotfload-database.lua", "2c2ae0362806ef21ef2862326bc09c60" },
- { "luaotfload-configuration.lua", "34e76cd86a01213964c0f4d8b32c8858" },
- { "luaotfload-colors.lua", "1dadb911d3763a9517bc499d2652f431" },
- { "luaotfload-auxiliary.lua", "77787effc3f19842cd3df8641c1b1db5" },
- { "luaotfload-filelist.lua", "7a7aef4439461fa4b00231ac898abe82" },
- { "luaotfload-tool.lua", "6d582c12a960d475eeedf4dcd1ac5669" },
- { "luaotfload-diagnostics.lua", "4791249fede247e2c4346ab7f20d0d35" },
- { "luaotfload-log.lua", "dcd5da60663d042e45c60852b7edd23b" },
- { "luaotfload-init.lua", "2dc0709188f1ce7741f103949ebc9e67" },
+ { "luaotfload-dvi.lua", "a88ce85492b935becf9de00d168b9fc6" },
+ { "luaotfload-tounicode.lua", "834c7cb80bd7793c516187aa67a5dab8" },
+ { "luaotfload-unicode.lua", "7559a279476f189206b248117d80f70d" },
+ { "luaotfload-resolvers.lua", "aa07ed5021ce7bfb381ddd584910af6b" },
+ { "luaotfload-parsers.lua", "eb862d8075e5e0b6130beed3f89f29be" },
+ { "luaotfload-fallback.lua", "49bc7a9f026fd23e13cd1b4be30be43c" },
+ { "luaotfload-szss.lua", "b174020a2eb6021e0b8838f0ad4f0fe4" },
+ { "luaotfload-scripts.lua", "cf7669cbc2e1585e5e9f63b2ebef5a0f" },
+ { "luaotfload-multiscript.lua", "478c8afcc416be47c861474a3b64096b" },
+ { "luaotfload-loaders.lua", "178c47e50037b1455c29b10a826b8ebc" },
+ { "luaotfload-harf-plug.lua", "eb202ef8123cf63e6d4820452391697f" },
+ { "luaotfload-harf-define.lua", "5723873002793c7ea723c8f1abfc412d" },
+ { "luaotfload-notdef.lua", "ffae44eac263adc9e7b6c5f6373637ed" },
+ { "luaotfload-embolden.lua", "85ef9409937b25da3f3f4bbb0d72cebc" },
+ { "luaotfload-letterspace.lua", "b608dac037f4b173833eac25d205ed91" },
+ { "luaotfload-features.lua", "b43dedff88145a0626bdfcb77f8791ee" },
+ { "luaotfload-database.lua", "d92cce26908694dbbb30232252e12f80" },
+ { "luaotfload-configuration.lua", "84379ea613f7e55c07f17b55b9dfb67b" },
+ { "luaotfload-colors.lua", "89386fcb44e2887b1be60b8acbe251b3" },
+ { "luaotfload-auxiliary.lua", "a43134987a5cf7fc22bfd240745440fe" },
+ { "luaotfload-filelist.lua", "e40105831b58e5f0fa4908a7a131da1f" },
+ { "luaotfload-tool.lua", "89fc6f4c6e2630305a91dd6a29c1449d" },
+ { "luaotfload-diagnostics.lua", "7e07c0b2d9470c016d72d36900904792" },
+ { "luaotfload-log.lua", "e008c6135446dff77813079ce11a10e8" },
+ { "luaotfload-init.lua", "9f354ea115993d9a9238d5f74c7d7e63" },
{ "luaotfload-main.lua", "b19c9cc34cf1d676c39f872cfb41aef6" },
},
["notes"]={
["committer"]="Marcel Fabian Krüger <tex@2krueger.de>",
- ["description"]="v3.26/2023-08-31",
- ["loader"]="fontloader-2023-08-19.lua",
- ["revision"]="dc84dc80eeefae198d20f414ce1a3547f721446e",
- ["timestamp"]="2023-08-31 20:10:15 +0200",
+ ["description"]="v3.27/2024-02-14",
+ ["loader"]="fontloader-2023-12-28.lua",
+ ["revision"]="17a160cd9eacf04cb179e7405f2d616824314868",
+ ["timestamp"]="2024-02-14 22:31:40 +0100",
},
} \ No newline at end of file
diff --git a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
index c9fcfc8c2e..1df46db80b 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-suppress",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / suppress",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-szss.lua b/macros/luatex/generic/luaotfload/luaotfload-szss.lua
index 95ac6b4d08..c01d271d59 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-szss.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-szss.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-szss",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / Special feature handling",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.1 b/macros/luatex/generic/luaotfload/luaotfload-tool.1
index cd100af1f0..1334d48da9 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.1
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.1
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD-TOOL 1 "2023-08-31" "3.26" "text processing"
+.TH LUAOTFLOAD-TOOL 1 "2024-02-14" "3.27" "text processing"
.SH NAME
luaotfload-tool \- generate and query the Luaotfload font names database
.
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.lua b/macros/luatex/generic/luaotfload/luaotfload-tool.lua
index 9eeed6dc2c..45517448e7 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.lua
@@ -9,8 +9,8 @@
local ProvidesLuaModule = {
name = "luaotfload-tool",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload-tool / database functionality",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
index e1a613e4b1..b87a1914e0 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.rst b/macros/luatex/generic/luaotfload/luaotfload-tool.rst
index 6ef9270430..778bbf5f1b 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.rst
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.rst
@@ -6,9 +6,9 @@
generate and query the Luaotfload font names database
-----------------------------------------------------------------------
-:Date: 2023-08-31
+:Date: 2024-02-14
:Copyright: GPL v2.0
-:Version: 3.26
+:Version: 3.27
:Manual section: 1
:Manual group: text processing
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
index 00496d9ea8..c0d7046689 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-tounicode",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / tounicode",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
index 975813d468..b83ac25461 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-unicode",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "luaotfload submodule / Unicode helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.5 b/macros/luatex/generic/luaotfload/luaotfload.conf.5
index 457025497e..3ebd68b72a 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.conf.5
+++ b/macros/luatex/generic/luaotfload/luaotfload.conf.5
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD.CONF 5 "2023-08-31" "3.26" "text processing"
+.TH LUAOTFLOAD.CONF 5 "2024-02-14" "3.27" "text processing"
.SH NAME
luaotfload.conf \- Luaotfload configuration file
.
diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.rst b/macros/luatex/generic/luaotfload/luaotfload.conf.rst
index 877699a404..f9e48cb7a2 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.conf.rst
+++ b/macros/luatex/generic/luaotfload/luaotfload.conf.rst
@@ -6,9 +6,9 @@
Luaotfload configuration file
-----------------------------------------------------------------------
-:Date: 2023-08-31
+:Date: 2024-02-14
:Copyright: GPL v2.0
-:Version: 3.26
+:Version: 3.27
:Manual section: 5
:Manual group: text processing
diff --git a/macros/luatex/generic/luaotfload/luaotfload.lua b/macros/luatex/generic/luaotfload/luaotfload.lua
index 798fa8d45f..893309f9db 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload.lua
@@ -20,8 +20,8 @@ local authors = "\z
-- version number is used below!
local ProvidesLuaModule = {
name = "luaotfload",
- version = "3.26", --TAGVERSION
- date = "2023-08-31", --TAGDATE
+ version = "3.27", --TAGVERSION
+ date = "2024-02-14", --TAGDATE
description = "Lua based OpenType font support",
author = authors,
copyright = authors,
diff --git a/macros/luatex/generic/luaotfload/luaotfload.sty b/macros/luatex/generic/luaotfload/luaotfload.sty
index c68e171cbc..262834e95c 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.sty
+++ b/macros/luatex/generic/luaotfload/luaotfload.sty
@@ -39,7 +39,7 @@
\fi
\ifdefined\ProvidesPackage
\ProvidesPackage{luaotfload}%
- [2023/08/31 v3.26 OpenType layout system]
+ [2024/02/14 v3.27 OpenType layout system]
\fi
\directlua{
if xpcall(function ()%
diff --git a/macros/luatex/generic/luaotfload/scripts-demo.pdf b/macros/luatex/generic/luaotfload/scripts-demo.pdf
index ab6d26d476..0049165b55 100644
--- a/macros/luatex/generic/luaotfload/scripts-demo.pdf
+++ b/macros/luatex/generic/luaotfload/scripts-demo.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
index 129ca94725..d46132c76e 100644
--- a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
+++ b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/shaper-demo.pdf b/macros/luatex/generic/luaotfload/shaper-demo.pdf
index 01f952dcca..3ad7f54fa1 100644
--- a/macros/luatex/generic/luaotfload/shaper-demo.pdf
+++ b/macros/luatex/generic/luaotfload/shaper-demo.pdf
Binary files differ