Fall back to a fallback when all names are elided
diff --git a/Lib/fontTools/designspaceLib/statNames.py b/Lib/fontTools/designspaceLib/statNames.py index 3b8ab2f..ec59789 100644 --- a/Lib/fontTools/designspaceLib/statNames.py +++ b/Lib/fontTools/designspaceLib/statNames.py
@@ -49,10 +49,13 @@ def getStatNames( - doc: DesignSpaceDocument, userLocation: SimpleLocationDict + doc: DesignSpaceDocument, + userLocation: SimpleLocationDict, + defaultElidedFallbackName: Dict[str, str] | None = None, ) -> StatNames: """Compute the family, style, PostScript names of the given ``userLocation`` - using the document's STAT information. + using the document's STAT information, falling back to the names in + ``defaultElidedFallbackName`` if all names are elided. Also computes localizations. @@ -66,6 +69,9 @@ .. versionadded:: 5.0 """ + if defaultElidedFallbackName is None: + defaultElidedFallbackName = {"en": "Regular"} + familyNames: Dict[str, str] = {} defaultSource: Optional[SourceDescriptor] = doc.findDefault() if defaultSource is None: @@ -102,8 +108,13 @@ for label in labels if not label.elidable ) - if not styleName and doc.elidedFallbackName is not None: - styleName = doc.elidedFallbackName + if not styleName: + if doc.elidedFallbackName is not None: + styleName = doc.elidedFallbackName + else: + styleName = defaultElidedFallbackName.get( + language, defaultElidedFallbackName["en"] + ) styleNames[language] = styleName if "en" not in familyNames or "en" not in styleNames: @@ -129,7 +140,10 @@ for language in set(familyNames).union(styleNames.keys()): familyName = familyNames.get(language, familyNames["en"]) styleName = styleNamesForStyleMap.get(language, styleNamesForStyleMap["en"]) - styleMapFamilyNames[language] = (familyName + " " + styleName).strip() + if styleName.lower() in BOLD_ITALIC_TO_RIBBI_STYLE.values(): + styleMapFamilyNames[language] = familyName.strip() + else: + styleMapFamilyNames[language] = f"{familyName} {styleName}".strip() return StatNames( familyNames=familyNames,
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace index 2ae35f7..1f7e56c 100644 --- a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace +++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace
@@ -57,7 +57,7 @@ <kerning/> <info/> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> </location>
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace index 219d226..e0c9165 100644 --- a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace +++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace
@@ -167,7 +167,7 @@ <kerning/> <info/> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> <dimension name="Width" xvalue="100"/>
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace index 5b419ba..dc557a4 100644 --- a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace +++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace
@@ -360,7 +360,7 @@ <kerning/> <info/> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> <dimension name="Width" xvalue="100"/>
diff --git a/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace index adfe245..d2231c1 100644 --- a/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace +++ b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace
@@ -180,7 +180,7 @@ <kerning/> <info/> </instance> - <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4 Italic" stylemapstylename="regular"> + <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="394"/> <dimension name="optical" xvalue="20"/> @@ -196,7 +196,7 @@ <kerning/> <info/> </instance> - <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4 Bold Italic" stylemapstylename="regular"> + <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="823"/> <dimension name="optical" xvalue="20"/>
diff --git a/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace index 30f181e..3bc687c 100644 --- a/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace +++ b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace
@@ -196,7 +196,7 @@ <kerning/> <info/> </instance> - <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4 Bold" stylemapstylename="regular"> + <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="823"/> <dimension name="optical" xvalue="20"/>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace index db62165..20d1e24 100644 --- a/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace +++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace
@@ -51,7 +51,7 @@ <dimension name="Weight" xvalue="57"/> </location> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> </location>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace index 113c689..de505fe 100644 --- a/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace +++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace
@@ -147,7 +147,7 @@ <dimension name="Width" xvalue="75"/> </location> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> <dimension name="Width" xvalue="100"/>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace index 4a1ef48..d9d1b8c 100644 --- a/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace +++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace
@@ -320,7 +320,7 @@ <dimension name="Italic" xvalue="1"/> </location> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> <dimension name="Width" xvalue="100"/>
diff --git a/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace index c1eb95d..e08c2da 100644 --- a/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace +++ b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace
@@ -152,7 +152,7 @@ <dimension name="optical" xvalue="20"/> </location> </instance> - <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4 Italic" stylemapstylename="regular"> + <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="394"/> <dimension name="optical" xvalue="20"/> @@ -164,7 +164,7 @@ <dimension name="optical" xvalue="20"/> </location> </instance> - <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4 Bold Italic" stylemapstylename="regular"> + <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="823"/> <dimension name="optical" xvalue="20"/>
diff --git a/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace index 1eee53e..8f0e22c 100644 --- a/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace +++ b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace
@@ -164,7 +164,7 @@ <dimension name="optical" xvalue="20"/> </location> </instance> - <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4 Bold" stylemapstylename="regular"> + <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="823"/> <dimension name="optical" xvalue="20"/>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace b/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace index 4451e6e..d0c01bb 100644 --- a/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace +++ b/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace
@@ -353,7 +353,7 @@ <dimension name="Italic" xvalue="1"/> </location> </instance> - <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> + <instance name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk" stylename="Regular" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-Regular" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular"> <location> <dimension name="Weight" xvalue="84"/> <dimension name="Width" xvalue="100"/>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace index 447461f..4f58f89 100644 --- a/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace +++ b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace
@@ -194,7 +194,7 @@ <dimension name="optical" xvalue="20"/> </location> </instance> - <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4 Bold" stylemapstylename="regular"> + <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="823"/> <dimension name="optical" xvalue="20"/>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace index e1ef12f..d7af8e7 100644 --- a/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace +++ b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace
@@ -174,7 +174,7 @@ <dimension name="optical" xvalue="20"/> </location> </instance> - <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4 Italic" stylemapstylename="regular"> + <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="394"/> <dimension name="optical" xvalue="20"/> @@ -186,7 +186,7 @@ <dimension name="optical" xvalue="20"/> </location> </instance> - <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4 Bold Italic" stylemapstylename="regular"> + <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4" stylemapstylename="regular"> <location> <dimension name="weight" xvalue="823"/> <dimension name="optical" xvalue="20"/>
diff --git a/Tests/designspaceLib/statNames_test.py b/Tests/designspaceLib/statNames_test.py index dd5fb10..5c967dc 100644 --- a/Tests/designspaceLib/statNames_test.py +++ b/Tests/designspaceLib/statNames_test.py
@@ -16,6 +16,19 @@ ) +def test_instance_getStatNames_no_style_links(datadir): + """Tests that without style linking in the DS, all styleMapStyleNames are + `regular`. + + This is not necessarily a feature, just the code following orders. + """ + doc = DesignSpaceDocument.fromfile(datadir / "test_v5_sourceserif.designspace") + + for instance in doc.instances: + location = instance.getFullUserLocation(doc) + assert getStatNames(doc, location).styleMapStyleName == "regular" + + def test_not_all_ordering_specified_and_translations(datadir): doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace") @@ -44,6 +57,16 @@ def test_detect_ribbi_aktiv(datadir): doc = DesignSpaceDocument.fromfile(datadir / "test_v5_aktiv.designspace") + # The default location has all names elided, so getStatNames must fall back + # to the fallback. + assert getStatNames(doc, doc.newDefaultLocation()) == StatNames( + familyNames={"en": "Aktiv Grotesk"}, + styleNames={"en": "Regular"}, + postScriptFontName="AktivGrotesk-Regular", + styleMapFamilyNames={"en": "Aktiv Grotesk"}, + styleMapStyleName="regular", + ) + assert getStatNames(doc, {"Weight": 600, "Width": 125, "Italic": 1}) == StatNames( familyNames={"en": "Aktiv Grotesk"}, styleNames={"en": "Ex SemiBold Italic"}, @@ -52,6 +75,14 @@ styleMapStyleName="italic", ) + assert getStatNames(doc, {"Weight": 700, "Width": 100, "Italic": 0}) == StatNames( + familyNames={"en": "Aktiv Grotesk"}, + styleNames={"en": "Bold"}, + postScriptFontName="AktivGrotesk-Bold", + styleMapFamilyNames={"en": "Aktiv Grotesk"}, + styleMapStyleName="bold", + ) + assert getStatNames(doc, {"Weight": 700, "Width": 75, "Italic": 1}) == StatNames( familyNames={"en": "Aktiv Grotesk"}, styleNames={"en": "Cd Bold Italic"},