1"""Specialization of fontTools.misc.visitor to work with TTFont.""" 2 3from fontTools.misc.visitor import Visitor 4from fontTools.ttLib import TTFont 5 6 7class TTVisitor(Visitor): 8 def visitAttr(self, obj, attr, value, *args, **kwargs): 9 if isinstance(value, TTFont): 10 return False 11 super().visitAttr(obj, attr, value, *args, **kwargs) 12 13 def visit(self, obj, *args, **kwargs): 14 if hasattr(obj, "ensureDecompiled"): 15 obj.ensureDecompiled(recurse=False) 16 super().visit(obj, *args, **kwargs) 17 18 19@TTVisitor.register(TTFont) 20def visit(visitor, font, *args, **kwargs): 21 # Some objects have links back to TTFont; even though we 22 # have a check in visitAttr to stop them from recursing 23 # onto TTFont, sometimes they still do, for example when 24 # someone overrides visitAttr. 25 if hasattr(visitor, "font"): 26 return False 27 28 visitor.font = font 29 for tag in font.keys(): 30 visitor.visit(font[tag], *args, **kwargs) 31 del visitor.font 32 return False 33