def readGlyphsFile(filePath): print "Import Glyphs File" pool = NSAutoreleasePool.alloc().init() GlyphsDoc = NSDictionary.alloc().initWithContentsOfFile_(filePath) loadGlyphsInfo() from FL import fl, Font folder, base = os.path.split(filePath) base = base.replace(".glyphs", ".vfb") dest = os.path.join(folder, base) f = Font() fl.Add(f) global convertName try: convertName = GlyphsDoc["disablesNiceNames"] != None except: pass if not setFontInfo(f, GlyphsDoc): return False readGlyphs(f, GlyphsDoc) readKerning(f, GlyphsDoc) setLegacyNames(f) readFeatures(f, GlyphsDoc) fl.UpdateFont() f.modified = 0 pool.drain()
def readGlyphsFile(filePath): print "Import Glyphs File" pool = None try: from Foundation import NSAutoreleasePool, NSDictionary except ImportError: # on Windows, PyObjC is not available with open(filePath, 'rb') as f: data = f.read() if data.startswith("<?xml"): # use the built-in plistlib module for XML plist from plistlib import readPlistFromString GlyphsDoc = readPlistFromString(data) else: # use glyphsLib's Parser for ASCII plist. # Download it from: https://github.com/googlei18n/glyphsLib from glyphsLib.parser import Parser GlyphsDoc = Parser(dict_type=dict).parse(data) else: # on OS X, use NSDictionary pool = NSAutoreleasePool.alloc().init() GlyphsDoc = NSDictionary.alloc().initWithContentsOfFile_(filePath) if not GlyphsDoc: print "Could not load .glyphs file." if pool: pool.drain() return from FL import fl, Font folder, base = os.path.split(filePath) base = base.replace(".glyphs", ".vfb") dest = os.path.join(folder, base) f = Font( ) fl.Add(f) global convertName try: convertName = GlyphsDoc["disablesNiceNames"] != None except: pass if not setFontInfo(f, GlyphsDoc): return False readGlyphs(f, GlyphsDoc) readKerning(f, GlyphsDoc) setLegacyNames(f) readFeatures(f, GlyphsDoc) fl.UpdateFont() f.modified = 0 if pool: pool.drain()
def importAllGlifFiles(font, dirName=None, doProgress=True, bar=None): """import all GLIFs into a FontLab font""" if dirName is None: if font.file_name: dir, base = os.path.split(font.file_name) base = base.split(".")[0] + ".glyphs" dirName = os.path.join(dir, base) else: dirName = GetFolder("Please select a folder with .glif files") glyphSet = GlyphSet(dirName) glyphNames = glyphSet.keys() glyphNames.sort() barStart = 0 closeBar = False if doProgress: if not bar: bar = ProgressBar("Importing Glyphs", len(glyphNames)) closeBar = True else: barStart = bar.getCurrentTick() else: bar = None try: for i in range(len(glyphNames)): #if not (i % 10) and not bar.tick(barStart + i): # raise KeyboardInterrupt glyphName = glyphNames[i] flGlyph = NewGlyph(font, glyphName, clear=True) pen = FLPointPen(flGlyph) glyph = GlyphPlaceholder() glyphSet.readGlyph(glyphName, glyph, pen) if hasattr(glyph, "width"): flGlyph.width = int(round(glyph.width)) if hasattr(glyph, "unicodes"): flGlyph.unicodes = glyph.unicodes if hasattr(glyph, "note"): flGlyph.note = glyph.note # XXX must encode if hasattr(glyph, "lib"): from cStringIO import StringIO from robofab.plistlib import writePlist lib = glyph.lib if lib: if len(lib ) == 1 and "org.robofab.fontlab.customdata" in lib: data = lib["org.robofab.fontlab.customdata"].data else: f = StringIO() writePlist(glyph.lib, f) data = f.getvalue() flGlyph.customdata = data # XXX the next bit is only correct when font is the current font :-( fl.UpdateGlyph(font.FindGlyph(glyphName)) if bar and not i % 10: bar.tick(barStart + i) except KeyboardInterrupt: if bar: bar.close() bar = None fl.UpdateFont(FontIndex(font)) if bar and closeBar: bar.close()