def add_name(font, string, nameID): nameTable = font.get("name") if nameTable is None: nameTable = font["name"] = table__n_a_m_e() nameTable.names = [] namerec = NameRecord() namerec.nameID = nameID namerec.string = string.encode('mac_roman') namerec.platformID, namerec.platEncID, namerec.langID = (1, 0, 0) nameTable.names.append(namerec)
def AddName(font, name): nameTable = font.get("name") if nameTable is None: nameTable = font["name"] = table__n_a_m_e() nameTable.names = [] namerec = NameRecord() namerec.nameID = 1 + max([n.nameID for n in nameTable.names] + [256]) namerec.string = name.encode('mac_roman') namerec.platformID, namerec.platEncID, namerec.langID = (1, 0, 0) nameTable.names.append(namerec) return namerec
def getOrCreateNameRecord(self, nameId, val): logger.error('NAMEID {}: "{}"'.format(nameId, val)) return result_namerec = None for k, p in [[1, 0], [3, 1]]: result_namerec = self.font['name'].getName(nameId, k, p) if result_namerec: result_namerec.string = (val or '').encode( result_namerec.getEncoding()) if result_namerec: return result_namerec ot_namerecord = NameRecord() ot_namerecord.nameID = nameId ot_namerecord.platformID = 3 ot_namerecord.langID = 0x409 # When building a Unicode font for Windows, the platform ID # should be 3 and the encoding ID should be 1 ot_namerecord.platEncID = 1 ot_namerecord.string = (val or '').encode(ot_namerecord.getEncoding()) self.font['name'].names.append(ot_namerecord) return ot_namerecord
def nameTableTweak(font): from fontTools.ttLib.tables._n_a_m_e import NameRecord, table__n_a_m_e nameIDs = [(16, 1, 0, 0), (17, 1, 0, 0)] nameTable = font["name"] for n in nameIDs: nameRecord = nameTable.getName(n[0], n[1], n[2], n[3]) if nameRecord is not None: nameTable.names.remove(nameRecord) nameIDs = [(4, 1, 0, 0), (4, 3, 1, 1033)] nameTable = font["name"] nameRecord = nameTable.getName(4, 1, 0, 0) if nameRecord is not None: if "Italic" in nameRecord.string: for n in nameIDs: nameRecord = nameTable.getName(n[0], n[1], n[2], n[3]) if nameRecord is not None: s = nameRecord.string nameTable.names.remove(nameRecord) record = NameRecord() record.nameID = n[0] record.platformID = n[1] record.platEncID = n[2] record.langID = n[3] if n[1] == 3: record.string = s[:-8] else: record.string = s[:-4] nameTable.names.append(record)
def versionClean(font): from fontTools.ttLib.tables._n_a_m_e import NameRecord, table__n_a_m_e nameIDs = [(5, 1, 0, 0), (5, 3, 1, 1033)] nameTable = font["name"] for n in nameIDs: nameRecord = nameTable.getName(n[0], n[1], n[2], n[3]) s = nameRecord.string nameTable.names.remove(nameRecord) parts = s.split(';') s = '' for p in parts: if p != 'PS (version unavailable)': s = s + p + ';' s = s[:-1] record = NameRecord() record.nameID = n[0] record.platformID = n[1] record.platEncID = n[2] record.langID = n[3] record.string = s nameTable.names.append(record)
def getName(self, *args, **kwargs): record = NameRecord() record.nameID = 16 record.platformID = 1 record.platEncID = 0 record.string = 'Gaa' return record
def _add_name_record(self, text, name_id, platform_id, plat_enc_id, lang_id): # TODO: The installed version of fontTools doesn't have # table__n_a_m_e.setName(). record = NameRecord() # PyYAML creates strings, force to Unicode record.string = unicode(text) record.nameID = name_id record.platformID = platform_id record.platEncID = plat_enc_id record.langID = lang_id self.name_table.names.append(record)
def _add_name_record(self, text, name_id, platform_id, plat_enc_id, lang_id): # TODO: The installed version of fontTools doesn't have # table__n_a_m_e.setName(). record = NameRecord() # PyYAML creates strings, which are unicode as of Python3 if sys.version_info.major == 2: text = unicode(text) record.string = text record.nameID = name_id record.platformID = platform_id record.platEncID = plat_enc_id record.langID = lang_id self.name_table.names.append(record)
def setValidNameRecord(font, nameId, val): result_namerec = None for k, p in [[1, 0], [3, 1]]: result_namerec = font['name'].getName(nameId, k, p) if result_namerec: result_namerec.string = (val or '').encode(result_namerec.getEncoding()) if result_namerec: return ot_namerecord = NameRecord() ot_namerecord.nameID = nameId ot_namerecord.platformID = 3 ot_namerecord.langID = 0x409 # When building a Unicode font for Windows, the platform ID # should be 3 and the encoding ID should be 1 ot_namerecord.platEncID = 1 ot_namerecord.string = (val or '').encode(ot_namerecord.getEncoding()) font['name'].names.append(ot_namerecord) return
def findOrCreateNameRecord(nametable, nameId, platformId=3, langId=0x409, platEncId=1): result_namerec = nametable.getName(nameId, platformId, platEncId) if result_namerec: return result_namerec ot_namerecord = NameRecord() ot_namerecord.nameID = nameId ot_namerecord.platformID = platformId ot_namerecord.langID = langId # When building a Unicode font for Windows, the platform ID # should be 3 and the encoding ID should be 1 ot_namerecord.platEncID = platEncId nametable.names.append(ot_namerecord) return ot_namerecord
def versionClean(font): from fontTools.ttLib.tables._n_a_m_e import NameRecord, table__n_a_m_e nameIDs = [(5, 1, 0, 0), (5, 3, 1, 1033)] nameTable = font["name"] for n in nameIDs: nameRecord = nameTable.getName(n[0], 1, 0, 0) s = nameRecord.string nameTable.names.remove(nameTable.getName(n[0], n[1], n[2], n[3])) parts = s.split(';') if nameTable.getName(4, 1, 0, 0) is not None: f = parts[0] + '; ' + nameTable.getName(4, 1, 0, 0).string if n[1] == 3: f = _convert_line_endings(f, 2) f = f.encode("utf_16_be") record = NameRecord() record.nameID = n[0] record.platformID = n[1] record.platEncID = n[2] record.langID = n[3] record.string = f nameTable.names.append(record)
def setupTable_name(self): """ Make the name table. **This should not be called externally.** Subclasses may override or supplement this method to handle the table creation in a different way if desired. """ font = self.ufo familyName = getAttrWithFallback(font.info, "styleMapFamilyName") styleName = getAttrWithFallback(font.info, "styleMapStyleName").title() # If name ID 2 is "Regular", it can be omitted from name ID 4 fullName = familyName if styleName != "Regular": fullName += " %s" % styleName nameVals = { "0": getAttrWithFallback(font.info, "copyright"), "1": familyName, "2": styleName, "3": getAttrWithFallback(font.info, "openTypeNameUniqueID"), "4": fullName, "5": getAttrWithFallback(font.info, "openTypeNameVersion"), "6": getAttrWithFallback(font.info, "postscriptFontName"), "7": getAttrWithFallback(font.info, "trademark"), "8": getAttrWithFallback(font.info, "openTypeNameManufacturer"), "9": getAttrWithFallback(font.info, "openTypeNameDesigner"), "10": getAttrWithFallback(font.info, "openTypeNameDescription"), "11": getAttrWithFallback(font.info, "openTypeNameManufacturerURL"), "12": getAttrWithFallback(font.info, "openTypeNameDesignerURL"), "13": getAttrWithFallback(font.info, "openTypeNameLicense"), "14": getAttrWithFallback(font.info, "openTypeNameLicenseURL") } # don't add typographic names if they are the same as the legacy ones typographicFamilyName = getAttrWithFallback( font.info, "openTypeNamePreferredFamilyName") typographicSubfamilyName = getAttrWithFallback( font.info, "openTypeNamePreferredSubfamilyName") if nameVals["1"] != typographicFamilyName: nameVals["16"] = typographicFamilyName if nameVals["2"] != typographicSubfamilyName: nameVals["17"] = typographicSubfamilyName self.otf["name"] = name = newTable("name") name.names = [] for nameId in sorted(nameVals.keys()): nameVal = nameVals[nameId] if not nameVal: continue nameIdVal = int(nameId) if nameIdVal == 6: # postscript font name nameVal = normalizeStringForPostscript(nameVal) rec = NameRecord() rec.platformID = 3 rec.platEncID = 10 if _isNonBMP(nameVal) else 1 rec.langID = 0x409 rec.nameID = nameIdVal rec.string = nameVal.encode(rec.getEncoding()) name.names.append(rec)
def set_name_record(font, record_id, value, addIfMissing=''): """Sets a record in the 'name' table to a given string. Assumes that the record already exists. If it doesn't, it only adds it if addIfMissing is set. Pass 'win' to add a record in 3/1/0x409 (win UCS2 en-US) and/or 'mac' to add a record in 1/0/0 (mac-roman English), separate by comma if you want both. If 'value' is None, the name record is dropped.""" records_to_drop = set() names = font['name'].names added = [] for record_number, record in enumerate(names): name_ids = (record.platformID, record.platEncID, record.langID) if name_ids not in [(3, 1, 0x409), (1, 0, 0)]: continue if record.nameID == record_id: if value is None: records_to_drop.add(record_number) else: if name_ids == (1, 0, 0): record.string = value.encode('mac-roman') added.append('mac') else: # (3, 1, 0x409) record.string = value.encode('UTF-16BE') added.append('win') if addIfMissing and value: for key in addIfMissing.split(','): if key in added: continue if key == 'win': nr = NameRecord() nr.nameID = record_id nr.platformID = 3 nr.platEncID = 1 nr.langID = 0x409 nr.string = value.encode('UTF-16BE') elif key == 'mac': nr = NameRecord() nr.nameID = record_id nr.platformID = 1 nr.platEncID = 0 nr.langID = 0 nr.string = value.encode('mac-roman') else: nr = None if nr: names.append(nr) if records_to_drop: font['name'].names = [ record for record_number, record in enumerate(names) if record_number not in records_to_drop ]
def main(): args = parser.parse_args() font = ttLib.TTFont(args.ttf_font) print('[INFO] Fixing name table...') #print(font) #print(font['name']) #nameTable = font['name'].names #print(nameTable) print('[INFO] Adding new records...') sixteen = NameRecord() sixteen.nameID = 16 sixteen.platformID = 0 sixteen.platEncID = 1 sixteen.langID = 0x409 sixteen.string = 'Lemonada' seventeen = NameRecord() seventeen.nameID = 17 seventeen.platformID = 0 seventeen.platEncID = 1 seventeen.langID = 0x409 seventeen.string = 'Regular' font['name'].names.append(sixteen) font['name'].names.append(seventeen) font.save(args.ttf_font) print('[INFO] Done fixing name table...')