Example #1
0
	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)
Example #2
0
    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'
Example #4
0
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'
Example #5
0
		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)