summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/font-imp-ligatures.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/font-imp-ligatures.lmt')
-rw-r--r--tex/context/base/mkxl/font-imp-ligatures.lmt158
1 files changed, 158 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/font-imp-ligatures.lmt b/tex/context/base/mkxl/font-imp-ligatures.lmt
new file mode 100644
index 000000000..da5282428
--- /dev/null
+++ b/tex/context/base/mkxl/font-imp-ligatures.lmt
@@ -0,0 +1,158 @@
+if not modules then modules = { } end modules ['font-imp-ligatures'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Not perfect (disc) but we have allternatives.
+
+local lpegmatch = lpeg.match
+local utfsplit = utf.split
+local settings_to_array = utilities.parsers.settings_to_array
+
+local fonts = fonts
+local otf = fonts.handlers.otf
+local registerotffeature = otf.features.register
+local addotffeature = otf.addfeature
+
+-- This is a quick and dirty hack.
+
+local lookups = { }
+local protect = { }
+local revert = { }
+local zwjchar = 0x200C
+local zwj = { zwjchar }
+
+addotffeature {
+ name = "blockligatures",
+ type = "chainsubstitution",
+ nocheck = true, -- because there is no 0x200C in the font
+ prepend = true, -- make sure we do it early
+ future = true, -- avoid nilling due to no steps yet
+ lookups = {
+ {
+ type = "multiple",
+ data = lookups,
+ },
+ },
+ data = {
+ rules = protect,
+ }
+}
+
+addotffeature {
+ name = "blockligatures",
+ type = "chainsubstitution",
+ nocheck = true, -- because there is no 0x200C in the font
+ append = true, -- this is done late
+ overload = false, -- we don't want to overload the previous definition
+ lookups = {
+ {
+ type = "ligature",
+ data = lookups,
+ },
+ },
+ data = {
+ rules = revert,
+ }
+}
+
+registerotffeature {
+ name = 'blockligatures',
+ description = 'block certain ligatures',
+}
+
+-- local splitter = lpeg.splitat(":")
+--
+-- local function blockligatures(str)
+-- local t = settings_to_array(str)
+-- for i=1,#t do
+-- local ti = t[i]
+-- local before, current, after = lpegmatch(splitter,ti)
+-- if current and after then -- before is returned when no match
+-- -- experimental joke
+-- if before then
+-- before = utfsplit(before)
+-- for i=1,#before do
+-- before[i] = { before[i] }
+-- end
+-- end
+-- if current then
+-- current = utfsplit(current)
+-- end
+-- if after then
+-- after = utfsplit(after)
+-- for i=1,#after do
+-- after[i] = { after[i] }
+-- end
+-- end
+-- else
+-- before = nil
+-- current = utfsplit(ti)
+-- after = nil
+-- end
+-- if #current > 1 then
+-- local one = current[1]
+-- local two = current[2]
+-- lookups[one] = { one, zwjchar }
+-- local one = { one }
+-- local two = { two }
+-- local new = #protect + 1
+-- protect[new] = {
+-- before = before,
+-- current = { one, two },
+-- after = after,
+-- lookups = { 1, false }, -- not shared !
+-- }
+-- revert[new] = {
+-- current = { one, zwj },
+-- after = { two },
+-- lookups = { 1, false }, -- not shared !
+-- }
+-- end
+-- end
+-- end
+
+local function blockligatures(str)
+ local t = settings_to_array(str)
+ for i=1,#t do
+ local ti = t[i]
+ local current = utfsplit(ti)
+ if #current > 1 then
+ local one = current[1]
+ local two = current[2]
+ lookups[one] = { one, zwjchar }
+ local one = { one }
+ local two = { two }
+ local new = #protect + 1
+ protect[new] = {
+ current = { one, two },
+ lookups = { 1, false }, -- not shared !
+ }
+ revert[new] = {
+ current = { one, zwj },
+ after = { two },
+ lookups = { 1, false }, -- not shared !
+ }
+ end
+ end
+end
+
+-- blockligatures("\0\0")
+
+otf.helpers.blockligatures = blockligatures
+
+-- blockligatures("fi,ff")
+-- blockligatures("fl")
+
+if context then
+
+ interfaces.implement {
+ name = "blockligatures",
+ arguments = "string",
+ actions = blockligatures,
+ }
+
+end