Keep compact font family names together (#1263)
This commit is contained in:
@@ -5,6 +5,15 @@ from fastapi import APIRouter
|
|||||||
|
|
||||||
CUSTOM_FONTS_DIR = os.path.join("static", "fonts", "custom")
|
CUSTOM_FONTS_DIR = os.path.join("static", "fonts", "custom")
|
||||||
FONT_EXTENSIONS = {".ttf", ".otf", ".woff", ".woff2"}
|
FONT_EXTENSIONS = {".ttf", ".otf", ".woff", ".woff2"}
|
||||||
|
FAMILY_SUFFIX_WORDS = ("Display", "Rounded", "Serif", "Sans", "Mono", "Code", "Text")
|
||||||
|
|
||||||
|
|
||||||
|
def _split_family_token(token):
|
||||||
|
"""Split common compact font-family suffixes without breaking brand names."""
|
||||||
|
for suffix in FAMILY_SUFFIX_WORDS:
|
||||||
|
if token.endswith(suffix) and len(token) > len(suffix):
|
||||||
|
return f"{token[:-len(suffix)]} {suffix}"
|
||||||
|
return re.sub(r'(?<=[a-z])(?=[A-Z])', ' ', token)
|
||||||
|
|
||||||
|
|
||||||
def _derive_family(filename):
|
def _derive_family(filename):
|
||||||
@@ -15,10 +24,9 @@ def _derive_family(filename):
|
|||||||
r'[-_ ]?(Thin|ExtraLight|UltraLight|Light|Regular|Medium|SemiBold|DemiBold|Bold|ExtraBold|UltraBold|Black|Heavy|Italic|Oblique|Variable|VF)$',
|
r'[-_ ]?(Thin|ExtraLight|UltraLight|Light|Regular|Medium|SemiBold|DemiBold|Bold|ExtraBold|UltraBold|Black|Heavy|Italic|Oblique|Variable|VF)$',
|
||||||
'', name, flags=re.IGNORECASE
|
'', name, flags=re.IGNORECASE
|
||||||
)
|
)
|
||||||
# Insert spaces before uppercase runs: "JetBrainsMono" → "Jet Brains Mono"
|
|
||||||
name = re.sub(r'(?<=[a-z])(?=[A-Z])', ' ', name)
|
|
||||||
# Replace dashes/underscores with spaces
|
# Replace dashes/underscores with spaces
|
||||||
name = re.sub(r'[-_]+', ' ', name).strip()
|
name = re.sub(r'[-_]+', ' ', name).strip()
|
||||||
|
name = " ".join(_split_family_token(part) for part in name.split())
|
||||||
return name or filename
|
return name or filename
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
11
tests/test_font_routes.py
Normal file
11
tests/test_font_routes.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
from routes.font_routes import _derive_family
|
||||||
|
|
||||||
|
|
||||||
|
def test_derive_family_keeps_jetbrains_together():
|
||||||
|
assert _derive_family("JetBrainsMono-Regular.woff2") == "JetBrains Mono"
|
||||||
|
|
||||||
|
|
||||||
|
def test_derive_family_splits_common_family_suffixes():
|
||||||
|
assert _derive_family("FiraCode-SemiBold.ttf") == "Fira Code"
|
||||||
|
assert _derive_family("NotoSans-Bold.otf") == "Noto Sans"
|
||||||
|
assert _derive_family("RobotoSlab-Bold.woff2") == "Roboto Slab"
|
||||||
Reference in New Issue
Block a user