xref: /aosp_15_r20/external/fonttools/Lib/fontTools/ttLib/ttVisitor.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
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