[visitor] Fix up attrs visiting

This commit is contained in:
Behdad Esfahbod 2022-08-15 13:59:05 -06:00
parent 8213c58a38
commit ef1a009bea
2 changed files with 28 additions and 23 deletions

View File

@ -8,46 +8,50 @@ class Visitor(object):
defaultStop = False defaultStop = False
@classmethod @classmethod
def _register(celf, clazzes, attrs=(None,)): def _register(celf, clazzes_attrs):
assert celf != Visitor, "Subclass Visitor instead." assert celf != Visitor, "Subclass Visitor instead."
if "_visitors" not in celf.__dict__: if "_visitors" not in celf.__dict__:
celf._visitors = {} celf._visitors = {}
if type(clazzes) != tuple:
clazzes = (clazzes,)
if type(attrs) == str:
attrs = (attrs,)
def wrapper(method): def wrapper(method):
assert method.__name__ == "visit" assert method.__name__ == "visit"
done = [] for clazzes,attrs in clazzes_attrs:
for clazz in clazzes: if type(clazzes) != tuple:
if clazz in done: clazzes = (clazzes,)
continue # Support multiple names of a clazz if type(attrs) == str:
done.append(clazz) attrs = (attrs,)
_visitors = celf._visitors.setdefault(clazz, {}) for clazz in clazzes:
for attr in attrs: _visitors = celf._visitors.setdefault(clazz, {})
assert attr not in _visitors, ( for attr in attrs:
"Oops, class '%s' has visitor function for '%s' defined already." assert attr not in _visitors, (
% (clazz.__name__, attr) "Oops, class '%s' has visitor function for '%s' defined already."
) % (clazz.__name__, attr)
_visitors[attr] = method )
_visitors[attr] = method
return None return None
return wrapper return wrapper
@classmethod @classmethod
def register(celf, clazzes): def register(celf, clazzes):
return celf._register(clazzes) if type(clazzes) != tuple:
clazzes = (clazzes,)
return celf._register([(clazzes, (None,))])
@classmethod @classmethod
def register_attr(celf, clazzes, attrs): def register_attr(celf, clazzes, attrs):
return celf._register(clazzes, attrs) clazzes_attrs = []
if type(clazzes) != tuple:
clazzes = (clazzes,)
if type(attrs) == str:
attrs = (attrs,)
for clazz in clazzes:
clazzes_attrs.append((clazz, attrs))
return celf._register(clazzes_attrs)
@classmethod @classmethod
def register_attrs(celf, clazzes_attrs): def register_attrs(celf, clazzes_attrs):
for clazz, attrs in clazzes_attrs: return celf._register(clazzes_attrs)
celf._register(clazz, attrs)
return lambda _: None
@classmethod @classmethod
def _visitorsFor(celf, thing, _default={}): def _visitorsFor(celf, thing, _default={}):

View File

@ -41,7 +41,6 @@ class ScalerVisitor(TTVisitor):
"ySuperscriptXOffset", "ySuperscriptXOffset",
"ySuperscriptYOffset", "ySuperscriptYOffset",
"yStrikeoutSize", "yStrikeoutSize",
"yStrikeoutSize",
"yStrikeoutPosition", "yStrikeoutPosition",
"sTypoAscender", "sTypoAscender",
"sTypoDescender", "sTypoDescender",
@ -130,3 +129,5 @@ if __name__ == "__main__":
visitor = ScalerVisitor(new_upem / upem) visitor = ScalerVisitor(new_upem / upem)
visitor.visit(font) visitor.visit(font)
font.save("out.ttf")