• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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