diff --git a/fea-rs/src/util/ttx.rs b/fea-rs/src/util/ttx.rs
index b010c60e8..cd6a00626 100644
--- a/fea-rs/src/util/ttx.rs
+++ b/fea-rs/src/util/ttx.rs
@@ -20,9 +20,10 @@ use rayon::prelude::*;
use serde::{Deserialize, Serialize};
static IGNORED_TESTS: &[&str] = &[
- // ## tests with invalid syntax ## //
+ // ## tests with unofficial syntax extensiosn we haven't implemented yet ## //
"AlternateChained.fea",
"GSUB_6.fea",
+ "GSUB_2.fea",
//
// ## tests that should be revisited ## //
//
@@ -32,6 +33,7 @@ static IGNORED_TESTS: &[&str] = &[
"variable_bug2772.fea",
"variable_scalar_anchor.fea",
"variable_scalar_valuerecord.fea",
+ "variable_mark_anchor.fea",
];
/// An environment variable that can be set to specify where to write generated files.
diff --git a/fea-rs/test-data/fonttools-tests/GSUB_2.fea b/fea-rs/test-data/fonttools-tests/GSUB_2.fea
index d2a3cb101..21db452b5 100644
--- a/fea-rs/test-data/fonttools-tests/GSUB_2.fea
+++ b/fea-rs/test-data/fonttools-tests/GSUB_2.fea
@@ -12,3 +12,24 @@ feature f2 {
sub f_i by f i;
sub f_f_i by f f i;
} f2;
+
+feature f3 {
+ sub [f_i f_l f_f_i f_f_l] by f [i l f_i f_l];
+} f3;
+
+feature f4 {
+ sub [f_i f_l f_f_i f_f_l] by [f f f_f f_f] [i l i l];
+} f4;
+
+@class = [f_i f_l];
+lookup l1 {
+ sub @class by f [i l];
+} l1;
+
+feature f5 {
+ sub @class' lookup l1 [i l];
+} f5;
+
+feature f6 {
+ sub [f_i f_i]' j by [f f] [i i];
+} f6;
diff --git a/fea-rs/test-data/fonttools-tests/GSUB_2.ttx b/fea-rs/test-data/fonttools-tests/GSUB_2.ttx
index b91c20fe0..fb87a0590 100644
--- a/fea-rs/test-data/fonttools-tests/GSUB_2.ttx
+++ b/fea-rs/test-data/fonttools-tests/GSUB_2.ttx
@@ -10,16 +10,20 @@
-
+
@@ -34,9 +38,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -57,6 +89,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fea-rs/test-data/fonttools-tests/GSUB_5_formats.expected_diff b/fea-rs/test-data/fonttools-tests/GSUB_5_formats.expected_diff
deleted file mode 100644
index 2b080f8c9..000000000
--- a/fea-rs/test-data/fonttools-tests/GSUB_5_formats.expected_diff
+++ /dev/null
@@ -1,258 +0,0 @@
-# generated automatically by fea-rs
-# this file represents an acceptable difference between the output of
-# fonttools and the output of fea-rs for a given input.
-#
-# Note: fonttools generates format 2 subtables, and we generate format 3.
-# I believe that this is an error in fonttools:
-#
-L64
->
->
->
-L64
-<
-<
-<
-<
-<
-L99
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
-L99
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
diff --git a/fea-rs/test-data/fonttools-tests/GSUB_5_formats.ttx b/fea-rs/test-data/fonttools-tests/GSUB_5_formats.ttx
index 80196aaa4..29d57d5e5 100644
--- a/fea-rs/test-data/fonttools-tests/GSUB_5_formats.ttx
+++ b/fea-rs/test-data/fonttools-tests/GSUB_5_formats.ttx
@@ -62,9 +62,11 @@
-
-
-
+
+
+
+
+
@@ -92,91 +94,160 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fea-rs/test-data/fonttools-tests/GSUB_6_formats.expected_diff b/fea-rs/test-data/fonttools-tests/GSUB_6_formats.expected_diff
deleted file mode 100644
index 754f9263c..000000000
--- a/fea-rs/test-data/fonttools-tests/GSUB_6_formats.expected_diff
+++ /dev/null
@@ -1,398 +0,0 @@
-# generated automatically by fea-rs
-# this file represents an acceptable difference between the output of
-# fonttools and the output of fea-rs for a given input.
-#
-# Note: fonttools generates format 2 subtables, and we generate format 3.
-# I believe that this is an error in fonttools:
-#
-L74
->
->
->
-L74
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-L138
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
-L138
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
diff --git a/fea-rs/test-data/fonttools-tests/GSUB_6_formats.ttx b/fea-rs/test-data/fonttools-tests/GSUB_6_formats.ttx
index ad2a1c5e5..45d5f3a0d 100644
--- a/fea-rs/test-data/fonttools-tests/GSUB_6_formats.ttx
+++ b/fea-rs/test-data/fonttools-tests/GSUB_6_formats.ttx
@@ -72,9 +72,41 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -101,134 +133,227 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fea-rs/test-data/fonttools-tests/bug512.expected_diff b/fea-rs/test-data/fonttools-tests/bug512.expected_diff
new file mode 100644
index 000000000..d52358ed5
--- /dev/null
+++ b/fea-rs/test-data/fonttools-tests/bug512.expected_diff
@@ -0,0 +1,9 @@
+# generated automatically by fea-rs
+# this file represents an acceptable difference between the output of
+# fonttools and the output of fea-rs for a given input.
+L75
+>
+L75
+<
+L97
+<
diff --git a/fea-rs/test-data/fonttools-tests/bug512.ttx b/fea-rs/test-data/fonttools-tests/bug512.ttx
index 693ebeb7c..4ad3af2f9 100644
--- a/fea-rs/test-data/fonttools-tests/bug512.ttx
+++ b/fea-rs/test-data/fonttools-tests/bug512.ttx
@@ -73,7 +73,7 @@
-
+
@@ -94,7 +94,6 @@
-
diff --git a/fea-rs/test-data/fonttools-tests/spec4h1.expected_diff b/fea-rs/test-data/fonttools-tests/spec4h1.expected_diff
deleted file mode 100644
index 7f9704777..000000000
--- a/fea-rs/test-data/fonttools-tests/spec4h1.expected_diff
+++ /dev/null
@@ -1,10 +0,0 @@
-# generated automatically by fea-rs
-# this file represents an acceptable difference between the output of
-# fonttools and the output of fea-rs for a given input.
-
-# our sorting within a ligature set currently differs from fonttools, but we expect
-# fonttools to adopt this: https://github.com/fonttools/fonttools/issues/3428
-L149
->
-L151
-<
diff --git a/fea-rs/test-data/fonttools-tests/spec4h1.ttx b/fea-rs/test-data/fonttools-tests/spec4h1.ttx
index 0e42fc56e..a399ab2b4 100644
--- a/fea-rs/test-data/fonttools-tests/spec4h1.ttx
+++ b/fea-rs/test-data/fonttools-tests/spec4h1.ttx
@@ -147,8 +147,8 @@
-
+
diff --git a/fea-rs/test-data/fonttools-tests/spec5d1.expected_diff b/fea-rs/test-data/fonttools-tests/spec5d1.expected_diff
deleted file mode 100644
index 7d37cb4a6..000000000
--- a/fea-rs/test-data/fonttools-tests/spec5d1.expected_diff
+++ /dev/null
@@ -1,32 +0,0 @@
-# generated automatically by fea-rs
-# this file represents an acceptable difference between the output of
-# fonttools and the output of fea-rs for a given input.
-#
-# our sorting within a ligature set currently differs from fonttools, but we expect
-# fonttools to adopt this: https://github.com/fonttools/fonttools/issues/3428
-L45
->
->
-L49
->
->
-L53
-<
-<
-L57
-<
-<
-L68
->
->
-L71
-<
-L73
-<
-L76
->
->
-L79
-<
-L81
-<
diff --git a/fea-rs/test-data/fonttools-tests/spec5d1.fea b/fea-rs/test-data/fonttools-tests/spec5d1.fea
index cf7d76f70..0b5acdd30 100644
--- a/fea-rs/test-data/fonttools-tests/spec5d1.fea
+++ b/fea-rs/test-data/fonttools-tests/spec5d1.fea
@@ -11,6 +11,16 @@ feature F1 {
# if glyph classes are detected in . Thus, the above
# example produces an identical representation in the font as if all
# the sequences were manually enumerated by the font editor:
+#
+# NOTE(anthrotype): The previous sentence is no longer entirely true, since we
+# now preserve the order in which the ligatures (with same length and first glyph)
+# were specified in the feature file and do not sort them alphabetically
+# by the ligature component names. Therefore, the way this particular example from
+# the FEA spec is written will produce two slightly different representations
+# in the font in which the ligatures are enumerated differently, however the two
+# lookups are functionally equivalent.
+# See: https://github.com/fonttools/fonttools/issues/3428
+# https://github.com/adobe-type-tools/afdko/issues/1727
feature F2 {
sub one slash two by onehalf;
sub one.oldstyle slash two by onehalf;
diff --git a/fea-rs/test-data/fonttools-tests/spec5d1.ttx b/fea-rs/test-data/fonttools-tests/spec5d1.ttx
index 77dfc93b8..8763c931e 100644
--- a/fea-rs/test-data/fonttools-tests/spec5d1.ttx
+++ b/fea-rs/test-data/fonttools-tests/spec5d1.ttx
@@ -43,16 +43,16 @@
-
-
-
-
+
+
+
+
@@ -62,16 +62,16 @@
-
-
+
+
-
-
+
+
diff --git a/fea-rs/test-data/fonttools-tests/spec5f_ii_3.expected_diff b/fea-rs/test-data/fonttools-tests/spec5f_ii_3.expected_diff
deleted file mode 100644
index 714159831..000000000
--- a/fea-rs/test-data/fonttools-tests/spec5f_ii_3.expected_diff
+++ /dev/null
@@ -1,222 +0,0 @@
-# generated automatically by fea-rs
-# this file represents an acceptable difference between the output of
-# fonttools and the output of fea-rs for a given input.
-# NOTE: this is a case where fonttools is choosing a less efficient
-# representation; our output matches afdko/makeotf.
-# See
-L34
->
->
->
-L34
-<
-<
-<
-<
-L42
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
->
-L42
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
-<
diff --git a/fea-rs/test-data/fonttools-tests/spec5f_ii_3.ttx b/fea-rs/test-data/fonttools-tests/spec5f_ii_3.ttx
index c03a81fb7..6ef871b8a 100644
--- a/fea-rs/test-data/fonttools-tests/spec5f_ii_3.ttx
+++ b/fea-rs/test-data/fonttools-tests/spec5f_ii_3.ttx
@@ -1,5 +1,5 @@
-
+
@@ -32,115 +32,111 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fea-rs/test-data/fonttools-tests/spec8a.expected_diff b/fea-rs/test-data/fonttools-tests/spec8a.expected_diff
deleted file mode 100644
index 9342d3719..000000000
--- a/fea-rs/test-data/fonttools-tests/spec8a.expected_diff
+++ /dev/null
@@ -1,18 +0,0 @@
-# generated automatically by fea-rs
-# this file represents an acceptable difference between the output of
-# fonttools and the output of fea-rs for a given input.
-#
-# Note: fonttools currently generates the wrong ordering in aalt.
-# see
-L101
->
-L105
-<
-L108
->
-L110
-<
-L113
->
-L115
-<
diff --git a/fea-rs/test-data/fonttools-tests/spec8a.ttx b/fea-rs/test-data/fonttools-tests/spec8a.ttx
index 787ecfa13..9c8c758ef 100644
--- a/fea-rs/test-data/fonttools-tests/spec8a.ttx
+++ b/fea-rs/test-data/fonttools-tests/spec8a.ttx
@@ -99,18 +99,18 @@
-
+
-
+
-
+
diff --git a/fea-rs/test-data/fonttools-tests/variable_mark_anchor.fea b/fea-rs/test-data/fonttools-tests/variable_mark_anchor.fea
new file mode 100644
index 000000000..39ead93c6
--- /dev/null
+++ b/fea-rs/test-data/fonttools-tests/variable_mark_anchor.fea
@@ -0,0 +1,10 @@
+markClass macron @MC_top;
+
+lookup one {
+ pos base a
+ mark @MC_top;
+} one;
+lookup two {
+ pos base a
+ mark @MC_top;
+} two;
diff --git a/fea-rs/test-data/fonttools-tests/variable_mark_anchor.ttx b/fea-rs/test-data/fonttools-tests/variable_mark_anchor.ttx
new file mode 100644
index 000000000..962cff741
--- /dev/null
+++ b/fea-rs/test-data/fonttools-tests/variable_mark_anchor.ttx
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/scripts/fea_ci_requirements.txt b/resources/scripts/fea_ci_requirements.txt
index f75242ed3..a23ec038a 100644
--- a/resources/scripts/fea_ci_requirements.txt
+++ b/resources/scripts/fea_ci_requirements.txt
@@ -1,2 +1,2 @@
# used in CI to install fonttools for ttx tests
-fonttools[unicode]==4.47.2
+fonttools[unicode]==4.48.1