inter/misc/ufo-color-glyphs.py
2017-08-22 02:23:08 -07:00

105 lines
3 KiB
Python
Executable file

#!/usr/bin/env python
# encoding: utf8
#
# Grab http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
#
from __future__ import print_function
import os, sys
from argparse import ArgumentParser
from robofab.objects.objectsRF import OpenFont
from unicode_util import parseUnicodeDataFile, MainCategories as UniMainCategories
lightBlueColor = (0.86, 0.92, 0.97, 1.0)
lightTealColor = (0.8, 0.94, 0.95, 1.0)
lightYellowColor = (0.97, 0.95, 0.83, 1.0)
lightPurpleColor = (0.93, 0.9, 0.98, 1.0)
lightGreyColor = (0.94, 0.94, 0.94, 1.0)
mediumGreyColor = (0.87, 0.87, 0.87, 1.0)
lightGreenColor = (0.89, 0.96, 0.92, 1.0)
mediumGreenColor = (0.77, 0.95, 0.76, 1.0)
lightRedColor = (0.98, 0.89, 0.89, 1.0)
lightOrangeColor = (1.0, 0.89, 0.82, 1.0)
redColor = (1, 0.3, 0.3, 1)
colorsByGlyphName = [
(set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), lightBlueColor), # light blue 1
]
colorsByUCMainCategory = {
# UniMainCategories.Letter: (1, 1, 1, 1),
UniMainCategories.Mark: lightRedColor,
UniMainCategories.Punctuation: lightGreyColor,
UniMainCategories.Format: lightGreyColor,
UniMainCategories.Number: lightGreenColor,
UniMainCategories.Symbol: lightTealColor,
UniMainCategories.Separator: lightPurpleColor,
UniMainCategories.Control: redColor,
UniMainCategories.Surrogate: redColor,
UniMainCategories.PrivateUse: lightYellowColor,
UniMainCategories.Unassigned: lightYellowColor,
UniMainCategories.Other: lightOrangeColor,
}
def colorForGlyph(name, unicodes, ucd):
for nameSet, color in colorsByGlyphName:
if name in nameSet:
return color
for uc in unicodes:
cp = ucd.get(uc)
if cp is None:
continue
return colorsByUCMainCategory.get(cp.mainCategory)
if len(unicodes) == 0:
if name.find('.cn') != -1:
# pure component
return mediumGreenColor
else:
# precomposed
return mediumGreyColor
return None
def main():
argparser = ArgumentParser(
description='Set robofont color marks on glyphs based on unicode categories')
argparser.add_argument(
'-dry', dest='dryRun', action='store_const', const=True, default=False,
help='Do not modify anything, but instead just print what would happen.')
argparser.add_argument(
'-ucd', dest='ucdFile', metavar='<file>', type=str,
help='UnicodeData.txt file from http://www.unicode.org/')
argparser.add_argument(
'fontPaths', metavar='<ufofile>', type=str, nargs='+', help='UFO fonts to update')
args = argparser.parse_args()
dryRun = args.dryRun
markLibKey = 'com.typemytype.robofont.mark'
ucd = {}
if args.ucdFile:
ucd = parseUnicodeDataFile(args.ucdFile)
for fontPath in args.fontPaths:
font = OpenFont(fontPath)
for g in font:
rgba = colorForGlyph(g.name, g.unicodes, ucd)
if rgba is None:
if markLibKey in g.lib:
del g.lib[markLibKey]
else:
g.lib[markLibKey] = [float(n) for n in rgba]
print('Write', fontPath)
if not dryRun:
font.save()
if __name__ == '__main__':
main()