"""ttLib.macUtils.py -- Various Mac-specific stuff.""" from io import BytesIO from fontTools.misc.macRes import ResourceReader, ResourceError def getSFNTResIndices(path): """Determine whether a file has a 'sfnt' resource fork or not.""" try: reader = ResourceReader(path) indices = reader.getIndices('sfnt') reader.close() return indices except ResourceError: return [] def openTTFonts(path): """Given a pathname, return a list of TTFont objects. In the case of a flat TTF/OTF file, the list will contain just one font object; but in the case of a Mac font suitcase it will contain as many font objects as there are sfnt resources in the file. """ from fontTools import ttLib fonts = [] sfnts = getSFNTResIndices(path) if not sfnts: fonts.append(ttLib.TTFont(path)) else: for index in sfnts: fonts.append(ttLib.TTFont(path, index)) if not fonts: raise ttLib.TTLibError("no fonts found in file '%s'" % path) return fonts class SFNTResourceReader(BytesIO): """Simple read-only file wrapper for 'sfnt' resources.""" def __init__(self, path, res_name_or_index): from fontTools import ttLib reader = ResourceReader(path) if isinstance(res_name_or_index, str): rsrc = reader.getNamedResource('sfnt', res_name_or_index) else: rsrc = reader.getIndResource('sfnt', res_name_or_index) if rsrc is None: raise ttLib.TTLibError("sfnt resource not found: %s" % res_name_or_index) reader.close() self.rsrc = rsrc super(SFNTResourceReader, self).__init__(rsrc.data) self.name = path