| """Specialization of fontTools.misc.visitor to work with TTFont.""" |
| |
| from fontTools.misc.visitor import Visitor |
| from fontTools.ttLib import TTFont |
| |
| |
| class TTVisitor(Visitor): |
| def visitAttr(self, obj, attr, value, *args, **kwargs): |
| if isinstance(value, TTFont): |
| return False |
| super().visitAttr(obj, attr, value, *args, **kwargs) |
| |
| def visit(self, obj, *args, **kwargs): |
| if hasattr(obj, "ensureDecompiled"): |
| obj.ensureDecompiled(recurse=False) |
| super().visit(obj, *args, **kwargs) |
| |
| |
| @TTVisitor.register(TTFont) |
| def visit(visitor, font, *args, **kwargs): |
| # Some objects have links back to TTFont; even though we |
| # have a check in visitAttr to stop them from recursing |
| # onto TTFont, sometimes they still do, for example when |
| # someone overrides visitAttr. |
| if hasattr(visitor, "font"): |
| return False |
| |
| visitor.font = font |
| for tag in font.keys(): |
| visitor.visit(font[tag], *args, **kwargs) |
| del visitor.font |
| return False |