mirror of
https://github.com/google/fonts.git
synced 2024-12-18 14:21:47 +03:00
ae08ef115b
axisregistry_st/ subtree dir replaces axisregistry/ lang_st/ subtree dir replaces lang/
88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
#
|
|
# Copyright 2022 The Google Fonts Tools Authors.
|
|
# Copyright 2017,2022 Google LLC All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS-IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# =======================================================================
|
|
# ======= This code-snippet uses hyperglot, which is licensed =======
|
|
# ======= under the GNU GPLv3. So, the resulting license for =======
|
|
# ======= any program using this snippet will also have to be =======
|
|
# ======= the GNU GPLv3. =======
|
|
# =======================================================================
|
|
|
|
from gflanguages import LoadLanguages
|
|
from hyperglot import parse as hyperglot_parse
|
|
|
|
|
|
def _ParseFontChars(path):
|
|
"""
|
|
Open the provided font path and extract the codepoints encoded in the font
|
|
@return list of characters
|
|
"""
|
|
from fontTools.ttLib import TTFont
|
|
font = TTFont(path, lazy=True)
|
|
cmap = font["cmap"].getBestCmap()
|
|
font.close()
|
|
|
|
# The cmap keys are int codepoints
|
|
return [chr(c) for c in cmap.keys()]
|
|
|
|
|
|
def SupportedLanguages(font_path, languages=None):
|
|
"""
|
|
Get languages supported by given font file.
|
|
|
|
Languages are pulled from the given set. Based on whether exemplar character
|
|
sets are present in the given font.
|
|
|
|
Logic based on Hyperglot:
|
|
https://github.com/rosettatype/hyperglot/blob/3172061ca05a62c0ff330eb802a17d4fad8b1a4d/lib/hyperglot/language.py#L273-L301
|
|
"""
|
|
if languages is None:
|
|
languages = LoadLanguages()
|
|
|
|
chars = _ParseFontChars(font_path)
|
|
|
|
supported = []
|
|
for lang in languages.values():
|
|
if not lang.HasField('exemplar_chars') or \
|
|
not lang.exemplar_chars.HasField('base'):
|
|
continue
|
|
|
|
base = hyperglot_parse.parse_chars(lang.exemplar_chars.base,
|
|
decompose=False,
|
|
retainDecomposed=False)
|
|
if set(base).issubset(chars):
|
|
supported.append(lang)
|
|
|
|
return supported
|
|
|
|
|
|
def portable_path(p):
|
|
import os
|
|
return os.path.join(*p.split('/'))
|
|
|
|
|
|
def TEST_FILE(f):
|
|
return portable_path("data/test/" + f)
|
|
|
|
|
|
def test_SupportedLanguages():
|
|
font = TEST_FILE('nunito/Nunito-Regular.ttf')
|
|
supported = SupportedLanguages(font)
|
|
langs = [supported[i].name for i, _ in enumerate(supported)]
|
|
assert len(langs) == 225
|
|
assert 'Lithuanian' in langs
|