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