1if not modules then modules = { } end modules [ ' font-imp-ligatures ' ] = {
2 version = 1 . 001 ,
3 comment = " companion to font-ini.mkiv " ,
4 author = " Hans Hagen, PRAGMA-ADE, Hasselt NL " ,
5 copyright = " PRAGMA ADE / ConTeXt Development Team " ,
6 license = " see context related readme files "
7}
8
9local lpegmatch = lpeg . match
10local utfsplit = utf . split
11local settings_to_array = utilities . parsers . settings_to_array
12
13local fonts = fonts
14local otf = fonts . handlers . otf
15local registerotffeature = otf . features . register
16local addotffeature = otf . addfeature
17
18
19
20local lookups = { }
21local protect = { }
22local revert = { }
23local zwjchar = 0x200C
24local zwj = { zwjchar }
25
26addotffeature {
27 name = " blockligatures " ,
28 type = " chainsubstitution " ,
29 nocheck = true ,
30 prepend = true ,
31 future = true ,
32 lookups = {
33 {
34 type = " multiple " ,
35 data = lookups ,
36 } ,
37 } ,
38 data = {
39 rules = protect ,
40 }
41}
42
43addotffeature {
44 name = " blockligatures " ,
45 type = " chainsubstitution " ,
46 nocheck = true ,
47 append = true ,
48 overload = false ,
49 lookups = {
50 {
51 type = " ligature " ,
52 data = lookups ,
53 } ,
54 } ,
55 data = {
56 rules = revert ,
57 }
58}
59
60registerotffeature {
61 name = ' blockligatures ' ,
62 description = ' block certain ligatures ' ,
63}
64
65local splitter = lpeg . splitat ( " : " )
66
67local function blockligatures ( str )
68
69 local t = settings_to_array ( str )
70
71 for i = 1 , # t do
72 local ti = t [ i ]
73 local before , current , after = lpegmatch ( splitter , ti )
74 if current and after then
75
76 if before then
77 before = utfsplit ( before )
78 for i = 1 , # before do
79 before [ i ] = { before [ i ] }
80 end
81 end
82 if current then
83 current = utfsplit ( current )
84 end
85 if after then
86 after = utfsplit ( after )
87 for i = 1 , # after do
88 after [ i ] = { after [ i ] }
89 end
90 end
91 else
92 before = nil
93 current = utfsplit ( ti )
94 after = nil
95 end
96 if # current > 1 then
97 local one = current [ 1 ]
98 local two = current [ 2 ]
99 lookups [ one ] = { one , zwjchar }
100 local one = { one }
101 local two = { two }
102 local new = # protect + 1
103 protect [ new ] = {
104 before = before ,
105 current = { one , two } ,
106 after = after ,
107 lookups = { 1 } ,
108 }
109 revert [ new ] = {
110
111 current = { one , zwj } ,
112
113 after = { two } ,
114 lookups = { 1 } ,
115 }
116 end
117 end
118end
119
120
121
122otf . helpers . blockligatures = blockligatures
123
124
125
126
127
128if context then
129
130 interfaces . implement {
131 name = " blockligatures " ,
132 arguments = " string " ,
133 actions = blockligatures ,
134 }
135
136end
137 |