diff --git a/Lib/fontTools/feaLib/builder.py b/Lib/fontTools/feaLib/builder.py index 1836ebb68..c5c75a7ae 100644 --- a/Lib/fontTools/feaLib/builder.py +++ b/Lib/fontTools/feaLib/builder.py @@ -892,9 +892,17 @@ class Builder(object): return lookup = self.get_lookup_(location, MultipleSubstBuilder) if glyph in lookup.mapping: - raise FeatureLibError( - 'Already defined substitution for glyph "%s"' % glyph, - location) + if replacements == lookup.mapping[glyph]: + log.info( + 'Removing duplicate multiple substitution from glyph' + ' "%s" to %s%s', + glyph, replacements, + ' at {}:{}:{}'.format(*location) if location else '', + ) + else: + raise FeatureLibError( + 'Already defined substitution for glyph "%s"' % glyph, + location) lookup.mapping[glyph] = replacements def add_reverse_chain_single_subst(self, location, old_prefix, diff --git a/Tests/feaLib/builder_test.py b/Tests/feaLib/builder_test.py index 329b3fdf6..b36a6d5d5 100644 --- a/Tests/feaLib/builder_test.py +++ b/Tests/feaLib/builder_test.py @@ -206,9 +206,20 @@ class BuilderTest(unittest.TestCase): "feature test {" " sub f_f_i by f f i;" " sub c_t by c t;" - " sub f_f_i by f f i;" + " sub f_f_i by f_f i;" "} test;") + def test_multipleSubst_multipleIdenticalSubstitutionsForSameGlyph_info(self): + logger = logging.getLogger("fontTools.feaLib.builder") + with CapturingLogHandler(logger, "INFO") as captor: + self.build( + "feature test {" + " sub f_f_i by f f i;" + " sub c_t by c t;" + " sub f_f_i by f f i;" + "} test;") + captor.assertRegex(r"Removing duplicate multiple substitution from glyph \"f_f_i\" to \('f', 'f', 'i'\)") + def test_pairPos_redefinition_warning(self): # https://github.com/fonttools/fonttools/issues/1147 logger = logging.getLogger("fontTools.feaLib.builder")