def save(self, destDir=None, doProgress=False, formatVersion=2): """Save the Font in UFO format.""" # XXX note that when doing "save as" by specifying the destDir argument # _all_ glyphs get loaded into memory. This could be optimized by either # copying those .glif files that have not been edited or (not sure how # well that would work) by simply clearing out self._objects after the # save. from robofab.ufoLib import UFOWriter from robofab.tools.fontlabFeatureSplitter import splitFeaturesForFontLab # if no destination is given, or if # the given destination is the current # path, this is not a save as operation if destDir is None or destDir == self._path: saveAs = False destDir = self._path else: saveAs = True # start a progress bar nonGlyphCount = 5 bar = None if doProgress: from robofab.interface.all.dialogs import ProgressBar bar = ProgressBar("Exporting UFO", nonGlyphCount + len(self._object.keys())) # write writer = UFOWriter(destDir, formatVersion=formatVersion) try: # make a shallow copy of the lib. stuff may be added to it. fontLib = dict(self.lib) # info if bar: bar.label("Saving info...") writer.writeInfo(self.info) if bar: bar.tick() # kerning if self.kerning.changed or saveAs: if bar: bar.label("Saving kerning...") writer.writeKerning(self.kerning.asDict()) if bar: bar.tick() # groups if bar: bar.label("Saving groups...") writer.writeGroups(self.groups) if bar: bar.tick() # features if bar: bar.label("Saving features...") features = self.features.text if features is None: features = "" if formatVersion == 2: writer.writeFeatures(features) elif formatVersion == 1: classes, features = splitFeaturesForFontLab(features) if classes: fontLib["org.robofab.opentype.classes"] = classes.strip() + "\n" if features: featureDict = {} for featureName, featureText in features: featureDict[featureName] = featureText.strip() + "\n" fontLib["org.robofab.opentype.features"] = featureDict fontLib["org.robofab.opentype.featureorder"] = [featureName for featureName, featureText in features] if bar: bar.tick() # lib if formatVersion == 1: fontLib[postScriptHintDataLibKey] = self.psHints.asDict() if bar: bar.label("Saving lib...") writer.writeLib(fontLib) if bar: bar.tick() # glyphs glyphNameToFileNameFunc = self.getGlyphNameToFileNameFunc() glyphSet = writer.getGlyphSet(glyphNameToFileNameFunc) if len(self._scheduledForDeletion) != 0: if bar: bar.label("Removing deleted glyphs...") for glyphName in self._scheduledForDeletion: if glyphSet.has_key(glyphName): glyphSet.deleteGlyph(glyphName) if bar: bar.tick() if bar: bar.label("Saving glyphs...") count = nonGlyphCount if saveAs: glyphNames = self.keys() else: glyphNames = self._object.keys() for glyphName in glyphNames: glyph = self[glyphName] glyph.psHints._saveToLib(glyph.lib) glyph._saveToGlyphSet(glyphSet, glyphName=glyphName, force=saveAs) if bar and not count % 10: bar.tick(count) count = count + 1 glyphSet.writeContents() self._glyphSet = glyphSet # only blindly stop if the user says to except KeyboardInterrupt: bar.close() bar = None # kill the progress bar if bar: bar.close() # reset internal stuff self._path = destDir self._scheduledForDeletion = [] self.setChanged(False)
def save(self, destDir=None, doProgress=False, formatVersion=2): """Save the Font in UFO format.""" # XXX note that when doing "save as" by specifying the destDir argument # _all_ glyphs get loaded into memory. This could be optimized by either # copying those .glif files that have not been edited or (not sure how # well that would work) by simply clearing out self._objects after the # save. from robofab.ufoLib import UFOWriter from robofab.tools.fontlabFeatureSplitter import splitFeaturesForFontLab # if no destination is given, or if # the given destination is the current # path, this is not a save as operation if destDir is None or destDir == self._path: saveAs = False destDir = self._path else: saveAs = True # start a progress bar nonGlyphCount = 5 bar = None if doProgress: from robofab.interface.all.dialogs import ProgressBar bar = ProgressBar("Exporting UFO", nonGlyphCount + len(self._object.keys())) # write writer = UFOWriter(destDir, formatVersion=formatVersion) try: # make a shallow copy of the lib. stuff may be added to it. fontLib = dict(self.lib) # info if bar: bar.label("Saving info...") writer.writeInfo(self.info) if bar: bar.tick() # kerning if self.kerning.changed or saveAs: if bar: bar.label("Saving kerning...") writer.writeKerning(self.kerning.asDict()) if bar: bar.tick() # groups if bar: bar.label("Saving groups...") writer.writeGroups(self.groups) if bar: bar.tick() # features if bar: bar.label("Saving features...") features = self.features.text if features is None: features = "" if formatVersion == 2: writer.writeFeatures(features) elif formatVersion == 1: classes, features = splitFeaturesForFontLab(features) if classes: fontLib["org.robofab.opentype.classes"] = classes.strip( ) + "\n" if features: featureDict = {} for featureName, featureText in features: featureDict[featureName] = featureText.strip() + "\n" fontLib["org.robofab.opentype.features"] = featureDict fontLib["org.robofab.opentype.featureorder"] = [ featureName for featureName, featureText in features ] if bar: bar.tick() # lib if formatVersion == 1: fontLib[postScriptHintDataLibKey] = self.psHints.asDict() if bar: bar.label("Saving lib...") writer.writeLib(fontLib) if bar: bar.tick() # glyphs glyphNameToFileNameFunc = self.getGlyphNameToFileNameFunc() glyphSet = writer.getGlyphSet(glyphNameToFileNameFunc) if len(self._scheduledForDeletion) != 0: if bar: bar.label("Removing deleted glyphs...") for glyphName in self._scheduledForDeletion: if glyphSet.has_key(glyphName): glyphSet.deleteGlyph(glyphName) if bar: bar.tick() if bar: bar.label("Saving glyphs...") count = nonGlyphCount if saveAs: glyphNames = self.keys() else: glyphNames = self._object.keys() for glyphName in glyphNames: glyph = self[glyphName] glyph.psHints._saveToLib(glyph.lib) glyph._saveToGlyphSet(glyphSet, glyphName=glyphName, force=saveAs) if bar and not count % 10: bar.tick(count) count = count + 1 glyphSet.writeContents() self._glyphSet = glyphSet # only blindly stop if the user says to except KeyboardInterrupt: bar.close() bar = None # kill the progress bar if bar: bar.close() # reset internal stuff self._path = destDir self._scheduledForDeletion = [] self.setChanged(False)
def exportKerningFL (font, UFOfilepath): MMK_kernClasses = [] MMK_baseGlyph_Left = {} MMK_baseGlyph_Right = {} UFO = UFOWriter(UFOfilepath) kernClasses, kern_L_R_table, feaClasses = getKernStrukt(font) for glyphClass in kernClasses: MMK_glyphClass = glyphClass.replace('\'', '') MMK_Name_glyphClass, MMK_Content_glyphClass = MMK_glyphClass.split(':')[0], MMK_glyphClass.split(':')[1] MMK_Base_Glyph = MMK_Content_glyphClass.split(' ')[1] leftClass, rightClass = kern_L_R_table[glyphClass] if (leftClass == 1) and (rightClass == 1): MMK_Name_glyphClass_L = '@MMK_L' + MMK_Name_glyphClass MMK_kernClasses.append([MMK_Name_glyphClass_L, MMK_Content_glyphClass]) MMK_baseGlyph_Left[MMK_Base_Glyph] = MMK_Name_glyphClass_L MMK_Name_glyphClass_R = '@MMK_R' + MMK_Name_glyphClass MMK_kernClasses.append([MMK_Name_glyphClass_R, MMK_Content_glyphClass]) MMK_baseGlyph_Right[MMK_Base_Glyph] = MMK_Name_glyphClass_R else: if leftClass == 1: MMK_Name_glyphClass = '@MMK_L' + MMK_Name_glyphClass MMK_baseGlyph_Left[MMK_Base_Glyph] = MMK_Name_glyphClass MMK_kernClasses.append([MMK_Name_glyphClass, MMK_Content_glyphClass]) if rightClass == 1: MMK_Name_glyphClass = '@MMK_R' + MMK_Name_glyphClass MMK_baseGlyph_Right[MMK_Base_Glyph] = MMK_Name_glyphClass MMK_kernClasses.append([MMK_Name_glyphClass, MMK_Content_glyphClass]) if (leftClass == 0) and (rightClass == 0): print 'WARNING! Wrong Kern group:', MMK_Name_glyphClass, '* NOT Left and NOT Right *. Please fix it.' for glyphClass in feaClasses: FEA_Name_glyphClass, FEA_Content_glyphClass = glyphClass.split(':')[0], glyphClass.split(':')[1] MMK_kernClasses.append([FEA_Name_glyphClass, FEA_Content_glyphClass]) cycleCountColors = len(GROUP_COLORS) dicColors = {} groups = {} for index, gl in enumerate(MMK_kernClasses): content = gl[1].split(' ') nameClass = gl[0] content = checkContent(content) groups[nameClass] = content dicColors[nameClass] = GROUP_COLORS[index % cycleCountColors] font.lib[KEY_MMK_Colors] = dicColors font.update() UFO.writeGroups(groups) # TODO maybe need to compare UFO and VFB before overwriting font.LIB , and merge LIB if they are not equal UFO.writeLib(font.lib) kerntabl = font.kerning new_kern1 = {} new_kern2 = {} for (left, right), value in kerntabl.items(): #font.kerning.items(): if MMK_baseGlyph_Left.has_key(left): new_L = MMK_baseGlyph_Left[left] new_kern1[(new_L, right)] = value else: new_kern1[(left, right)] = value for (left, right), value in new_kern1.items(): #font.kerning.items(): if MMK_baseGlyph_Right.has_key(right): new_R = MMK_baseGlyph_Right[right] new_kern2[(left, new_R)] = value else: new_kern2[(left, right)] = value UFO.writeKerning(new_kern2) print 'Converting Classes and Kerning from Fontlab to MetricsMachine: DONE'
def exportKerningFL(font, UFOfilepath): MMK_kernClasses = [] MMK_baseGlyph_Left = {} MMK_baseGlyph_Right = {} UFO = UFOWriter(UFOfilepath) kernClasses, kern_L_R_table, feaClasses = getKernStrukt(font) for glyphClass in kernClasses: MMK_glyphClass = glyphClass.replace('\'', '') MMK_Name_glyphClass, MMK_Content_glyphClass = MMK_glyphClass.split( ':')[0], MMK_glyphClass.split(':')[1] MMK_Base_Glyph = MMK_Content_glyphClass.split(' ')[1] leftClass, rightClass = kern_L_R_table[glyphClass] if (leftClass == 1) and (rightClass == 1): MMK_Name_glyphClass_L = '@MMK_L' + MMK_Name_glyphClass MMK_kernClasses.append( [MMK_Name_glyphClass_L, MMK_Content_glyphClass]) MMK_baseGlyph_Left[MMK_Base_Glyph] = MMK_Name_glyphClass_L MMK_Name_glyphClass_R = '@MMK_R' + MMK_Name_glyphClass MMK_kernClasses.append( [MMK_Name_glyphClass_R, MMK_Content_glyphClass]) MMK_baseGlyph_Right[MMK_Base_Glyph] = MMK_Name_glyphClass_R else: if leftClass == 1: MMK_Name_glyphClass = '@MMK_L' + MMK_Name_glyphClass MMK_baseGlyph_Left[MMK_Base_Glyph] = MMK_Name_glyphClass MMK_kernClasses.append( [MMK_Name_glyphClass, MMK_Content_glyphClass]) if rightClass == 1: MMK_Name_glyphClass = '@MMK_R' + MMK_Name_glyphClass MMK_baseGlyph_Right[MMK_Base_Glyph] = MMK_Name_glyphClass MMK_kernClasses.append( [MMK_Name_glyphClass, MMK_Content_glyphClass]) if (leftClass == 0) and (rightClass == 0): print 'WARNING! Wrong Kern group:', MMK_Name_glyphClass, '* NOT Left and NOT Right *. Please fix it.' for glyphClass in feaClasses: FEA_Name_glyphClass, FEA_Content_glyphClass = glyphClass.split( ':')[0], glyphClass.split(':')[1] MMK_kernClasses.append([FEA_Name_glyphClass, FEA_Content_glyphClass]) cycleCountColors = len(GROUP_COLORS) dicColors = {} groups = {} for index, gl in enumerate(MMK_kernClasses): content = gl[1].split(' ') nameClass = gl[0] content = checkContent(content) groups[nameClass] = content dicColors[nameClass] = GROUP_COLORS[index % cycleCountColors] font.lib[KEY_MMK_Colors] = dicColors font.update() UFO.writeGroups(groups) # TODO maybe need to compare UFO and VFB before overwriting font.LIB , and merge LIB if they are not equal UFO.writeLib(font.lib) kerntabl = font.kerning new_kern1 = {} new_kern2 = {} for (left, right), value in kerntabl.items(): #font.kerning.items(): if MMK_baseGlyph_Left.has_key(left): new_L = MMK_baseGlyph_Left[left] new_kern1[(new_L, right)] = value else: new_kern1[(left, right)] = value for (left, right), value in new_kern1.items(): #font.kerning.items(): if MMK_baseGlyph_Right.has_key(right): new_R = MMK_baseGlyph_Right[right] new_kern2[(left, new_R)] = value else: new_kern2[(left, right)] = value UFO.writeKerning(new_kern2) print 'Converting Classes and Kerning from Fontlab to MetricsMachine: DONE'
print "exporting features.." glyphOrder = [] for nakedGlyph in f.naked().glyphs: glyph = RGlyph(nakedGlyph) glyphOrder.append(glyph.name) assert None not in glyphOrder, glyphOrder # We make a shallow copy if lib, since we add some stuff for export # that doesn't need to be retained in memory. fontLib = dict(f.lib) if supportHints: psh = PostScriptFontHintValues(f) d = psh.asDict() fontLib[postScriptHintDataLibKey] = d fontLib["org.robofab.glyphOrder"] = glyphOrder f._writeOpenTypeFeaturesToLib(fontLib) print "fontLib", fontLib u.writeLib(fontLib) f.close() else: print "Making a new UFO at", ufoPath f = OpenFont(p) f.writeUFO() f.close() for p in paths: OpenFont(p)