# Copyright 2015 Google Inc. 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. from datetime import date import re from random import randint import string class InstanceNames: "Class that allows easy setting of FontLab name fields. TODO: Add proper italic flags" foundry = "" foundryURL = "" copyrightHolderName = "" build = "" version = "1.0" year = date.today().year designer = "" designerURL = "" license = "" licenseURL = "" def __init__(self,names): if type(names) == type(" "): names = names.split("/") #print names self.longfamily = names[0] self.longstyle = names[1] self.shortstyle = names[2] self.subfamilyAbbrev = names[3] self.width = self._getWidth() self.italic = self._getItalic() self.weight = self._getWeight() self.fullname = "%s %s" %(self.longfamily, self.longstyle) self.postscript = re.sub(' ','', self.longfamily) + "-" + re.sub(' ','',self.longstyle) if self.subfamilyAbbrev != "" and self.subfamilyAbbrev != None and self.subfamilyAbbrev != "Rg": self.shortfamily = "%s %s" %(self.longfamily, self.longstyle.split()[0]) else: self.shortfamily = self.longfamily def setRFNames(self,f, version=1, versionMinor=0): f.info.familyName = self.longfamily f.info.styleName = self.longstyle f.info.styleMapFamilyName = self.shortfamily f.info.styleMapStyleName = self.shortstyle.lower() f.info.versionMajor = version f.info.versionMinor = versionMinor f.info.year = self.year if len(self.copyrightHolderName) > 0: f.info.copyright = "Copyright %s %s" % (self.year, self.copyrightHolderName) f.info.trademark = "%s is a trademark of %s." %(self.longfamily, self.foundry.rstrip('.')) if len(self.designer) > 0: f.info.openTypeNameDesigner = self.designer if len(self.designerURL) > 0: f.info.openTypeNameDesignerURL = self.designerURL f.info.openTypeNameManufacturer = self.foundry f.info.openTypeNameManufacturerURL = self.foundryURL f.info.openTypeNameLicense = self.license f.info.openTypeNameLicenseURL = self.licenseURL f.info.openTypeNameVersion = "Version %i.%i" %(version, versionMinor) if self.build is not None and len(self.build): f.info.openTypeNameUniqueID = "%s:%s:%s" %(self.fullname, self.build, self.year) else: f.info.openTypeNameUniqueID = "%s:%s" %(self.fullname, self.year) # f.info.openTypeNameDescription = "" # f.info.openTypeNameCompatibleFullName = "" # f.info.openTypeNameSampleText = "" if (self.subfamilyAbbrev != "Rg"): f.info.openTypeNamePreferredFamilyName = self.longfamily f.info.openTypeNamePreferredSubfamilyName = self.longstyle f.info.openTypeOS2WeightClass = self._getWeightCode(self.weight) f.info.macintoshFONDName = re.sub(' ','',self.longfamily) + " " + re.sub(' ','',self.longstyle) f.info.postscriptFontName = f.info.macintoshFONDName.replace(" ", "-") if self.italic: f.info.italicAngle = -12.0 def setFLNames(self,flFont): from FL import NameRecord flFont.family_name = self.shortfamily flFont.mac_compatible = self.fullname flFont.style_name = self.longstyle flFont.full_name = self.fullname flFont.font_name = self.postscript flFont.font_style = self._getStyleCode() flFont.menu_name = self.shortfamily flFont.apple_name = re.sub(' ','',self.longfamily) + " " + re.sub(' ','',self.longstyle) flFont.fond_id = randint(1000,9999) flFont.pref_family_name = self.longfamily flFont.pref_style_name = self.longstyle flFont.weight = self.weight flFont.weight_code = self._getWeightCode(self.weight) flFont.width = self.width if len(self.italic): flFont.italic_angle = -12 fn = flFont.fontnames fn.clean() #fn.append(NameRecord(0,1,0,0, "Font data copyright %s %s" %(self.foundry, self.year) )) #fn.append(NameRecord(0,3,1,1033, "Font data copyright %s %s" %(self.foundry, self.year) )) copyrightHolderName = self.copyrightHolderName if len(self.copyrightHolderName) > 0 else self.foundry fn.append(NameRecord(0,1,0,0, "Copyright %s %s" %(self.year, copyrightHolderName) )) fn.append(NameRecord(0,3,1,1033, "Copyright %s %s" %(self.year, copyrightHolderName) )) fn.append(NameRecord(1,1,0,0, self.longfamily )) fn.append(NameRecord(1,3,1,1033, self.shortfamily )) fn.append(NameRecord(2,1,0,0, self.longstyle )) fn.append(NameRecord(2,3,1,1033, self.longstyle )) #fn.append(NameRecord(3,1,0,0, "%s:%s:%s" %(self.foundry, self.longfamily, self.year) )) #fn.append(NameRecord(3,3,1,1033, "%s:%s:%s" %(self.foundry, self.longfamily, self.year) )) fn.append(NameRecord(3,1,0,0, "%s:%s:%s" %(self.foundry, self.fullname, self.year) )) fn.append(NameRecord(3,3,1,1033, "%s:%s:%s" %(self.foundry, self.fullname, self.year) )) fn.append(NameRecord(4,1,0,0, self.fullname )) fn.append(NameRecord(4,3,1,1033, self.fullname )) if len(self.build) > 0: fn.append(NameRecord(5,1,0,0, "Version %s%s; %s" %(self.version, self.build, self.year) )) fn.append(NameRecord(5,3,1,1033, "Version %s%s; %s" %(self.version, self.build, self.year) )) else: fn.append(NameRecord(5,1,0,0, "Version %s; %s" %(self.version, self.year) )) fn.append(NameRecord(5,3,1,1033, "Version %s; %s" %(self.version, self.year) )) fn.append(NameRecord(6,1,0,0, self.postscript )) fn.append(NameRecord(6,3,1,1033, self.postscript )) fn.append(NameRecord(7,1,0,0, "%s is a trademark of %s." %(self.longfamily, self.foundry) )) fn.append(NameRecord(7,3,1,1033, "%s is a trademark of %s." %(self.longfamily, self.foundry) )) fn.append(NameRecord(9,1,0,0, self.foundry )) fn.append(NameRecord(9,3,1,1033, self.foundry )) fn.append(NameRecord(11,1,0,0, self.foundryURL )) fn.append(NameRecord(11,3,1,1033, self.foundryURL )) fn.append(NameRecord(12,1,0,0, self.designer )) fn.append(NameRecord(12,3,1,1033, self.designer )) fn.append(NameRecord(13,1,0,0, self.license )) fn.append(NameRecord(13,3,1,1033, self.license )) fn.append(NameRecord(14,1,0,0, self.licenseURL )) fn.append(NameRecord(14,3,1,1033, self.licenseURL )) if (self.subfamilyAbbrev != "Rg"): fn.append(NameRecord(16,3,1,1033, self.longfamily )) fn.append(NameRecord(17,3,1,1033, self.longstyle)) #else: #fn.append(NameRecord(17,3,1,1033,"")) #fn.append(NameRecord(18,1,0,0, re.sub("Italic","It", self.fullname))) def _getSubstyle(self, regex): substyle = re.findall(regex, self.longstyle) if len(substyle) > 0: return substyle[0] else: return "" def _getItalic(self): return self._getSubstyle(r"Italic|Oblique|Obliq") def _getWeight(self): w = self._getSubstyle(r"Extrabold|Superbold|Super|Fat|Black|Bold|Semibold|Demibold|Medium|Light|Thin") if w == "": w = "Regular" return w def _getWidth(self): w = self._getSubstyle(r"Condensed|Extended|Narrow|Wide") if w == "": w = "Normal" return w def _getStyleCode(self): #print "shortstyle:", self.shortstyle styleCode = 0 if self.shortstyle == "Bold": styleCode = 32 if self.shortstyle == "Italic": styleCode = 1 if self.shortstyle == "Bold Italic": styleCode = 33 if self.longstyle == "Regular": styleCode = 64 return styleCode def _getWeightCode(self,weight): if weight == "Thin": return 250 elif weight == "Light": return 300 elif weight == "Bold": return 700 elif weight == "Medium": return 500 elif weight == "Semibold": return 600 elif weight == "Black": return 900 elif weight == "Fat": return 900 return 400 def setNames(f,names,foundry="",version="1.0",build=""): InstanceNames.foundry = foundry InstanceNames.version = version InstanceNames.build = build i = InstanceNames(names) i.setFLNames(f) def setInfoRF(f, names, attrs={}): i = InstanceNames(names) version, versionMinor = (1, 0) for k,v in attrs.iteritems(): if k == 'version': if v.find('.') != -1: version, versionMinor = [int(num) for num in v.split(".")] else: version = int(v) setattr(i, k, v) i.setRFNames(f, version=version, versionMinor=versionMinor)