On 1/6/2016 5:28 PM, Paolo Brasolin wrote:
Hello.
I am trying to add some custom ligatures to a font using a feature file.
Everything works just fine, until I try what is called a chained
contextual substitution, i.e. a GSUB lookup of type 6.
I am studying the specs from
http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html#5.f
A simple example.fea that does not work for me is:
languagesystem dflt dflt;
lookup FOOBAR {
sub B by Q ;
} FOOBAR;
feature foba {
sub [A] B' lookup FOOBAR;
} foba ;
I'd expect it to replace B with Q only when preceeded by A.
The same rule expressed with a lookup of type 8 works just fine:
languagesystem dflt dflt;
feature foba {
sub [A] B' by Q;
} foba ;
Ultimately I would need to use multiple inline lookups, something like
sub [A]' B' lookup FOO C' lookup BAR;
Are inline lookups unsupported by the engine?
That would seem strange to me.
I'm probably missing some point, but I'm unable to find more
documentation.
Am I using the wrong syntax?
As we have a way to define additional features in context i played a bit
with contextual lookups. As a result we now have an additional type
chainsubstitution. In due time I will document this better (once it's
settled). I still need to think of a way to kick this into place at a
specific location in the sequence.
Btw, contrary to fea extensions (not supported in the new font loader
anyway) these are runtime extensions i.e. not cached.
I'll upload a beta.
----------------------------------------------------------------------
\startluacode
fonts.handlers.otf.addfeature {
name = "stest",
type = "substitution",
data = {
a = "X",
b = "P",
}
}
\stopluacode
\startluacode
fonts.handlers.otf.addfeature {
name = "atest",
type = "alternate",
data = {
a = { "X", "Y" },
b = { "P", "Q" },
}
}
\stopluacode
\startluacode
fonts.handlers.otf.addfeature {
name = "mtest",
type = "multiple",
data = {
a = { "X", "Y" },
b = { "P", "Q" },
}
}
\stopluacode
\startluacode
fonts.handlers.otf.addfeature {
name = "ltest",
type = "ligature",
data = {
['1'] = { "a", "b" },
['2'] = { "d", "a" },
}
}
\stopluacode
\startluacode
fonts.handlers.otf.addfeature {
name = "ktest",
type = "kern",
data = {
a = { b = -500 },
}
}
\stopluacode
\startluacode
fonts.handlers.otf.addfeature {
name = "ytest",
type = "chainsubstitution",
-- flags = { false, false, false, false },
lookups = {
{
type = "substitution",
data = {
["b"] = "B",
["c"] = "C",
},
},
},
-- steps = {
-- {
-- rules = {
-- {
-- before = { { "a" } },
-- current = { { "b", "c" } },
-- lookups = { 1 },
-- },
-- },
-- },
-- },
data = {
rules = {
{
before = { { "a" } },
current = { { "b", "c" } },
lookups = { 1 },
},
},
},
}
\stopluacode
\definefontfeature[stest][stest=yes]
\definefontfeature[atest][atest=yes]
\definefontfeature[mtest][mtest=yes]
\definefontfeature[ltest][ltest=yes]
\definefontfeature[ktest][ktest=yes]
\definefontfeature[ytest][ytest=yes]
\starttext
\startTEXpage
\definedfont[file:dejavu-serif.ttf*default]%
abracadabra\par
{\addff{stest}abracadabra\par}
{\addff{atest}abracadabra\par}
{\addff{mtest}abracadabra\par}
{\addff{ltest}abracadabra\par}
{\addff{ktest}abracadabra\par}
\enabletrackers[otf.*]
{\addff{ytest}abracadabra\par}
\disabletrackers[otf.*]
\stopTEXpage
\stoptext
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com
| www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to
the Wiki!
maillist : ntg-context@ntg.nl /
http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
archive : http://foundry.supelec.fr/projects/contextrev/
wiki : http://contextgarden.net
___________________________________________________________________________________