klepas / open-baskerville

An open font project to create a revival of Fry’s Baskerville
http://klepas.org/openbaskerville
GNU General Public License v3.0
390 stars 121 forks source link

FontForge should respect contents.plist Glyphname Filename mapping #13

Closed codingisacopingstrategy closed 12 years ago

codingisacopingstrategy commented 12 years ago

In getting clean diffs in-between FontForge and RoboFab (RoboFont, Fontlab etcetera) based commits, FontForge has already implemented a similar pretty printing for the GLIF files (issue #5)

The remaining problem is that FontForge doesn’t keep track of the glyphname glyphfile relation as stored in glyphs/contents.plist , so that when you save the UFO file (which is generating the UFO over the old one), FontForge chooses filenames based on the glyph names and a predetermined algorithm, disregarding the existing filenames.

The algorithm being used by FontForge is the default one described in the UFO2 specs http://unifiedfontobject.org/versions/ufo2/glyphs.html

The spec also states ‘There is no one standard glyph name to file name conversion’ and indeed the algorithm being used in the RoboFab Fontlab UFO export method is a different one.

It is called glyphNameToShortFileName http://code.robofab.com/browser/trunk/Lib/robofab/objects/objectsFL.py#L950 The source is here: http://code.robofab.com/browser/trunk/Lib/robofab/tools/glyphNameSchemes.py

So if a UFO is generated from Fontlab (like the initial Open Baskerville sources), and then modified in FontForge, FontForge will ignore the contents.plist and because of the differing glyph to filename conversions resave the glyphs under different filenames then in the original UFO.

codingisacopingstrategy commented 12 years ago

In the meantime, here’s a Python implementation of the naming scheme which I think FontForge is using by default now:

def simplefilename(glyphname):
    prefix = '_' if glyphname[0] == '.' else ''
    parts = glyphname.split('.')
    parts[0] = '_'.join([i + '_' if i[0].isupper() else i for i in parts[0].split('_')])   
    return prefix + '.'.join(parts) + '.glif'
codingisacopingstrategy commented 12 years ago

It looks like a lot of this got fixed in FontForge 20120731

The files keep the same know, there’s just some curve="true" being added all over the place:

https://github.com/klepas/open-baskerville/commit/2280bfcc2121fcc69510679ea6a69a9819d55510.diff