summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-05-03 03:02:51 +0000
committerNorbert Preining <norbert@preining.info>2020-05-03 03:02:51 +0000
commitd78de17ddf0443233483fd98f40802cae5aa87c5 (patch)
tree1b7128cc505808a09c18e158288d6c3cdcf5c2fb /macros/luatex/generic/luaotfload/luaotfload-suppress.lua
parent8626a9c3cb5dc8d02d779d5b5b1e3933d5626f43 (diff)
CTAN sync 202005030302
Diffstat (limited to 'macros/luatex/generic/luaotfload/luaotfload-suppress.lua')
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-suppress.lua89
1 files changed, 89 insertions, 0 deletions
diff --git a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
new file mode 100644
index 0000000000..eba776fe85
--- /dev/null
+++ b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
@@ -0,0 +1,89 @@
+-----------------------------------------------------------------------
+-- FILE: luaotfload-suppress.lua
+-- DESCRIPTION: part of luaotfload / suppress
+-----------------------------------------------------------------------
+
+local ProvidesLuaModule = {
+ name = "luaotfload-suppress",
+ version = "3.13", --TAGVERSION
+ date = "2020-05-01", --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