[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,22 +8,19 @@ 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 = {}
def wrapper(method):
assert method.__name__ == "visit"
for clazzes,attrs in clazzes_attrs:
if type(clazzes) != tuple: if type(clazzes) != tuple:
clazzes = (clazzes,) clazzes = (clazzes,)
if type(attrs) == str: if type(attrs) == str:
attrs = (attrs,) attrs = (attrs,)
def wrapper(method):
assert method.__name__ == "visit"
done = []
for clazz in clazzes: for clazz in clazzes:
if clazz in done:
continue # Support multiple names of a clazz
done.append(clazz)
_visitors = celf._visitors.setdefault(clazz, {}) _visitors = celf._visitors.setdefault(clazz, {})
for attr in attrs: for attr in attrs:
assert attr not in _visitors, ( assert attr not in _visitors, (
@ -37,17 +34,24 @@ class Visitor(object):
@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")