[print-json] Towards valid json syntax
This commit is contained in:
parent
dcff7a2d8b
commit
f8e5ea4f95
@ -4,14 +4,15 @@ from fontTools.misc.textTools import Tag
|
|||||||
|
|
||||||
|
|
||||||
class JsonVisitor(TTVisitor):
|
class JsonVisitor(TTVisitor):
|
||||||
|
|
||||||
def _open(self, s):
|
def _open(self, s):
|
||||||
print(s, file=self.file)
|
print(s, file=self.file)
|
||||||
self._indent += self.indent
|
self._indent += self.indent
|
||||||
|
self.comma = False
|
||||||
|
|
||||||
def _close(self, s):
|
def _close(self, s):
|
||||||
self._indent = self._indent[:-len(self.indent)]
|
self._indent = self._indent[: -len(self.indent)]
|
||||||
print("%s%s," % (self._indent, s), file=self.file)
|
print("\n%s%s" % (self._indent, s), end="", file=self.file)
|
||||||
|
self.comma = True
|
||||||
|
|
||||||
def __init__(self, file, indent=" "):
|
def __init__(self, file, indent=" "):
|
||||||
self.file = file
|
self.file = file
|
||||||
@ -21,32 +22,57 @@ class JsonVisitor(TTVisitor):
|
|||||||
def visitObject(self, obj):
|
def visitObject(self, obj):
|
||||||
self._open("{")
|
self._open("{")
|
||||||
super().visitObject(obj)
|
super().visitObject(obj)
|
||||||
print('%s"type": "%s"' % (self._indent, obj.__class__.__name__), file=self.file)
|
if self.comma:
|
||||||
|
print(",", end="", file=self.file)
|
||||||
|
print(
|
||||||
|
'\n%s"type": "%s"' % (self._indent, obj.__class__.__name__),
|
||||||
|
end="",
|
||||||
|
file=self.file,
|
||||||
|
)
|
||||||
self._close("}")
|
self._close("}")
|
||||||
|
|
||||||
def visitAttr(self, obj, attr, value):
|
def visitAttr(self, obj, attr, value):
|
||||||
|
if self.comma:
|
||||||
|
print(",", file=self.file)
|
||||||
print('%s"%s": ' % (self._indent, attr), end="", file=self.file)
|
print('%s"%s": ' % (self._indent, attr), end="", file=self.file)
|
||||||
self.visit(value)
|
self.visit(value)
|
||||||
|
self.comma = True
|
||||||
|
|
||||||
def visitList(self, obj, *args, **kwargs):
|
def visitList(self, obj, *args, **kwargs):
|
||||||
self._open("[")
|
self._open("[")
|
||||||
|
comma = False
|
||||||
for value in obj:
|
for value in obj:
|
||||||
|
if comma:
|
||||||
|
print(",", end="", file=self.file)
|
||||||
|
print(file=self.file)
|
||||||
print(self._indent, end="", file=self.file)
|
print(self._indent, end="", file=self.file)
|
||||||
self.visit(value, *args, **kwargs)
|
self.visit(value, *args, **kwargs)
|
||||||
|
comma = True
|
||||||
self._close("]")
|
self._close("]")
|
||||||
|
|
||||||
def visitDict(self, obj, *args, **kwargs):
|
def visitDict(self, obj, *args, **kwargs):
|
||||||
self._open("{")
|
self._open("{")
|
||||||
|
comma = False
|
||||||
for key, value in obj.items():
|
for key, value in obj.items():
|
||||||
|
if comma:
|
||||||
|
print(",", end="", file=self.file)
|
||||||
|
print(file=self.file)
|
||||||
print('%s"%s": ' % (self._indent, key), end="", file=self.file)
|
print('%s"%s": ' % (self._indent, key), end="", file=self.file)
|
||||||
self.visit(value, *args, **kwargs)
|
self.visit(value, *args, **kwargs)
|
||||||
|
comma = True
|
||||||
self._close("}")
|
self._close("}")
|
||||||
|
|
||||||
def visitLeaf(self, obj):
|
def visitLeaf(self, obj):
|
||||||
if isinstance(obj, tuple):
|
if isinstance(obj, tuple):
|
||||||
obj = list(obj)
|
obj = list(obj)
|
||||||
|
|
||||||
if isinstance(obj, bytes):
|
if obj is None:
|
||||||
|
s = "null"
|
||||||
|
elif obj == True:
|
||||||
|
s = "true"
|
||||||
|
elif obj == False:
|
||||||
|
s = "false"
|
||||||
|
elif isinstance(obj, bytes):
|
||||||
s = repr(obj)
|
s = repr(obj)
|
||||||
s = s[1:]
|
s = s[1:]
|
||||||
else:
|
else:
|
||||||
@ -55,18 +81,21 @@ class JsonVisitor(TTVisitor):
|
|||||||
if s[0] == "'":
|
if s[0] == "'":
|
||||||
s = '"' + s[1:-1] + '"'
|
s = '"' + s[1:-1] + '"'
|
||||||
|
|
||||||
print("%s," % s, file=self.file)
|
print("%s" % s, end="", file=self.file)
|
||||||
|
|
||||||
|
|
||||||
@JsonVisitor.register(ttLib.TTFont)
|
@JsonVisitor.register(ttLib.TTFont)
|
||||||
def visit(self, font):
|
def visit(self, font):
|
||||||
if hasattr(visitor, "font"):
|
if hasattr(visitor, "font"):
|
||||||
|
print("{}", end="", file=self.file)
|
||||||
return False
|
return False
|
||||||
visitor.font = font
|
visitor.font = font
|
||||||
|
|
||||||
self._open("{")
|
self._open("{")
|
||||||
for tag in font.keys():
|
for tag in font.keys():
|
||||||
print('%s"%s": ' % (self._indent, tag), end="", file=self.file)
|
if self.comma:
|
||||||
|
print(",", file=self.file)
|
||||||
|
print('\n%s"%s": ' % (self._indent, tag), end="", file=self.file)
|
||||||
visitor.visit(font[tag])
|
visitor.visit(font[tag])
|
||||||
self._close("}")
|
self._close("}")
|
||||||
|
|
||||||
@ -87,7 +116,7 @@ def visit(self, obj):
|
|||||||
|
|
||||||
@JsonVisitor.register(Tag)
|
@JsonVisitor.register(Tag)
|
||||||
def visit(self, obj):
|
def visit(self, obj):
|
||||||
print('"%s",' % str(obj), file=self.file)
|
print('"%s"' % str(obj), end="", file=self.file)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user