[latex3-commits] [git/LaTeX3-latex3-luaotfload] dev: [WIP] Add feature to suppress ligatures in harf (66e54bf)
Marcel Fabian Krüger
tex at 2krueger.de
Thu Feb 20 01:56:41 CET 2020
Repository : https://github.com/latex3/luaotfload
On branch : dev
Link : https://github.com/latex3/luaotfload/commit/66e54bfcd8b6bee219959412c013ca6126d44245
>---------------------------------------------------------------
commit 66e54bfcd8b6bee219959412c013ca6126d44245
Author: Marcel Fabian Krüger <tex at 2krueger.de>
Date: Thu Feb 20 01:56:41 2020 +0100
[WIP] Add feature to suppress ligatures in harf
>---------------------------------------------------------------
66e54bfcd8b6bee219959412c013ca6126d44245
src/luaotfload-main.lua | 1 +
src/luaotfload-suppress.lua | 89 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+)
diff --git a/src/luaotfload-main.lua b/src/luaotfload-main.lua
index 8866009..edd5d20 100644
--- a/src/luaotfload-main.lua
+++ b/src/luaotfload-main.lua
@@ -327,6 +327,7 @@ luaotfload.main = function ()
loadmodule "letterspace" --- extra character kerning
loadmodule "embolden" --- fake bold
loadmodule "notdef" --- missing glyph handling
+ loadmodule "suppress" --- suppress ligatures by adding ZWNJ
loadmodule "szss" --- missing glyph handling
if harfstatus then
loadmodule "harf-define"
diff --git a/src/luaotfload-suppress.lua b/src/luaotfload-suppress.lua
new file mode 100644
index 0000000..a528a60
--- /dev/null
+++ b/src/luaotfload-suppress.lua
@@ -0,0 +1,89 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-suppress.lua
+-- DESCRIPTION: part of luaotfload / suppress
+-----------------------------------------------------------------------
+
+local ProvidesLuaModule = {
+ name = "luaotfload-suppress",
+ version = "3.1301-dev", --TAGVERSION
+ date = "2020-02-02", --TAGDATE
+ description = "luaotfload submodule / suppress",
+ license = "GPL v2.0",
+ author = "Marcel Krüger"
+}
+
+if luatexbase and luatexbase.provides_module then
+ luatexbase.provides_module (ProvidesLuaModule)
+end
+
+local direct = node.direct
+local otfregister = fonts.constructors.features.otf.register
+
+local copy = direct.copy
+local getdisc = direct.getdisc
+local getnext = direct.getnext
+local insert_after = direct.insert_after
+local is_char = direct.is_char
+local setchar = direct.setchar
+local setdisc = direct.setdisc
+local getfont = font.getfont
+
+local disc_t = node.id'disc'
+
+local empty = {}
+
+local lpeg = lpeg or require'lpeg'
+local valueparser do
+ local digits = lpeg.R'09'^1/tonumber
+ local hexdigits = (lpeg.P'u+' + '"' + '0x') * (lpeg.R('09', 'AF', 'af')^1/function(s) return tonumber(s, 16) end)
+ local entry = lpeg.Cg((hexdigits + digits) * lpeg.Cc(true))
+ local sep = lpeg.P' '^0 * lpeg.S'/|,;' * lpeg.P' '^0
+ valueparser = lpeg.Cf(lpeg.Ct'' * entry * (sep * entry)^0, rawset) * -1
+end
+
+local function initializer(tfmdata, value, features)
+ local properties = tfmdata.properties
+ properties.suppress_liga = valueparser:match(value)
+ if not properties.suppress_liga then
+ error[[Invalid suppress value]]
+ end
+end
+
+local function processor(head,font) -- ,attr,direction)
+ local supp = getfont(font).properties.suppress_liga
+ if not supp then return head end
+ local n = head
+ while n do
+ local c, id = is_char(n, font)
+ if supp[c] then
+ local nn = copy(n)
+ setchar(nn, 0x200C)
+ head, n = insert_after(head, n, nn)
+ elseif id == disc_t then
+ local pre, post, replace = getdisc(n)
+ pre = processor(pre, font)
+ post = processor(post, font)
+ replace = processor(replace, font)
+ setdisc(n, pre, post, replace)
+ end
+ n = getnext(n)
+ end
+ return head
+end
+
+otfregister {
+ name = 'suppress',
+ description = 'Insert ZWNJ to suppress ligatures',
+ default = false,
+ initializers = {
+ -- node = initializer,
+ plug = initializer,
+ },
+ processors = {
+ position = 1,
+ -- node = processor,
+ plug = processor,
+ },
+}
+
+--- vim:sw=2:ts=2:expandtab:tw=71
More information about the latex3-commits
mailing list.