123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #!/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
|