# -*- coding: utf-8 -*- # imports #################################################################### import os from sys import platform as _platform if _platform == "darwin": try: from ._cocoa import _get_font except ImportError: pass try: _get_font except NameError: def _get_font(family, bold, italic): # pylint: disable=function-redefined raise LookupError # constants ################################################################## _CONTRIBS_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "contribs", "freefont-20120503")) _FALLBACK_FONTS = { "sans-serif": { (False, False): os.path.join(_CONTRIBS_PATH, "FreeSans.otf"), (False, True): os.path.join(_CONTRIBS_PATH, "FreeSansOblique.otf"), (True, False): os.path.join(_CONTRIBS_PATH, "FreeSansBold.otf"), (True, True): os.path.join(_CONTRIBS_PATH, "FreeSansBoldOblique.otf"), }, "serif": { (False, False): os.path.join(_CONTRIBS_PATH, "FreeSerif.otf"), (False, True): os.path.join(_CONTRIBS_PATH, "FreeSerifItalic.otf"), (True, False): os.path.join(_CONTRIBS_PATH, "FreeSerifBold.otf"), (True, True): os.path.join(_CONTRIBS_PATH, "FreeSerifBoldItalic.otf"), }, "mono": { (False, False): os.path.join(_CONTRIBS_PATH, "FreeMono.otf"), (False, True): os.path.join(_CONTRIBS_PATH, "FreeMonoOblique.otf"), (True, False): os.path.join(_CONTRIBS_PATH, "FreeMonoBold.otf"), (True, True): os.path.join(_CONTRIBS_PATH, "FreeMonoBoldOblique.otf"), }, } # font lookup ################################################################ def _get_fallback_font(family, bold=False, italic=False): return _FALLBACK_FONTS[family][bold, italic], 0 def get_font(families, weight="normal", style="normal"): bold = weight in ["bold", "bolder", "600", "700", "800", "900"] italic = style in ["italic", "oblique"] families = [family.strip() for family in families.split(',')] + ["sans-serif"] font_name, index = None, 0 for font_getter in [_get_font, _get_fallback_font]: for family in families: try: font_name, index = font_getter(family, bold, italic) except LookupError: continue break else: continue break return font_name, index __all__ = [ "get_font", ]