Indented text printing
This commit is contained in:
parent
3cc875bce3
commit
ddfd2e24a6
|
@ -312,8 +312,10 @@ def parse_with_annotations(bs, **kwargs):
|
||||||
return Parser(input_buffer=bs, include_annotations=True, **kwargs).next()
|
return Parser(input_buffer=bs, include_annotations=True, **kwargs).next()
|
||||||
|
|
||||||
class Formatter(TextCodec):
|
class Formatter(TextCodec):
|
||||||
def __init__(self, format_embedded=lambda x: x):
|
def __init__(self, format_embedded=lambda x: x, indent=None):
|
||||||
super(Formatter, self).__init__()
|
super(Formatter, self).__init__()
|
||||||
|
self.indent_delta = 0 if indent is None else indent
|
||||||
|
self.indent_distance = 0
|
||||||
self.chunks = []
|
self.chunks = []
|
||||||
self._format_embedded = format_embedded
|
self._format_embedded = format_embedded
|
||||||
|
|
||||||
|
@ -325,6 +327,19 @@ class Formatter(TextCodec):
|
||||||
def contents(self):
|
def contents(self):
|
||||||
return u''.join(self.chunks)
|
return u''.join(self.chunks)
|
||||||
|
|
||||||
|
def is_indenting(self):
|
||||||
|
return self.indent_delta > 0
|
||||||
|
|
||||||
|
def write_indent(self):
|
||||||
|
if self.is_indenting():
|
||||||
|
self.chunks.append('\n' + ' ' * self.indent_distance)
|
||||||
|
|
||||||
|
def write_indent_space(self):
|
||||||
|
if self.is_indenting():
|
||||||
|
self.write_indent()
|
||||||
|
else:
|
||||||
|
self.chunks.append(' ')
|
||||||
|
|
||||||
def write_stringlike_char(self, c):
|
def write_stringlike_char(self, c):
|
||||||
if c == '\\': self.chunks.append('\\\\')
|
if c == '\\': self.chunks.append('\\\\')
|
||||||
elif c == '\x08': self.chunks.append('\\b')
|
elif c == '\x08': self.chunks.append('\\b')
|
||||||
|
@ -334,15 +349,23 @@ class Formatter(TextCodec):
|
||||||
elif c == '\x09': self.chunks.append('\\t')
|
elif c == '\x09': self.chunks.append('\\t')
|
||||||
else: self.chunks.append(c)
|
else: self.chunks.append(c)
|
||||||
|
|
||||||
def write_seq(self, opener, closer, vs):
|
def write_seq(self, opener, closer, vs, appender):
|
||||||
|
vs = list(vs)
|
||||||
|
itemcount = len(vs)
|
||||||
self.chunks.append(opener)
|
self.chunks.append(opener)
|
||||||
first_item = True
|
if itemcount == 0:
|
||||||
for v in vs:
|
pass
|
||||||
if first_item:
|
elif itemcount == 1:
|
||||||
first_item = False
|
appender(vs[0])
|
||||||
else:
|
else:
|
||||||
self.chunks.append(' ')
|
self.indent_distance = self.indent_distance + self.indent_delta
|
||||||
self.append(v)
|
self.write_indent()
|
||||||
|
appender(vs[0])
|
||||||
|
for v in vs[1:]:
|
||||||
|
self.write_indent_space()
|
||||||
|
appender(v)
|
||||||
|
self.indent_distance = self.indent_distance - self.indent_delta
|
||||||
|
self.write_indent()
|
||||||
self.chunks.append(closer)
|
self.chunks.append(closer)
|
||||||
|
|
||||||
def append(self, v):
|
def append(self, v):
|
||||||
|
@ -366,25 +389,19 @@ class Formatter(TextCodec):
|
||||||
else: self.write_stringlike_char(c)
|
else: self.write_stringlike_char(c)
|
||||||
self.chunks.append('"')
|
self.chunks.append('"')
|
||||||
elif isinstance(v, list):
|
elif isinstance(v, list):
|
||||||
self.write_seq('[', ']', v)
|
self.write_seq('[', ']', v, self.append)
|
||||||
elif isinstance(v, tuple):
|
elif isinstance(v, tuple):
|
||||||
self.write_seq('[', ']', v)
|
self.write_seq('[', ']', v, self.append)
|
||||||
elif isinstance(v, set):
|
elif isinstance(v, set):
|
||||||
self.write_seq('#{', '}', v)
|
self.write_seq('#{', '}', v, self.append)
|
||||||
elif isinstance(v, frozenset):
|
elif isinstance(v, frozenset):
|
||||||
self.write_seq('#{', '}', v)
|
self.write_seq('#{', '}', v, self.append)
|
||||||
elif isinstance(v, dict):
|
elif isinstance(v, dict):
|
||||||
self.chunks.append('{')
|
def append_kv(kv):
|
||||||
need_comma = False
|
self.append(kv[0])
|
||||||
for (k, v) in v.items():
|
|
||||||
if need_comma:
|
|
||||||
self.chunks.append(', ')
|
|
||||||
else:
|
|
||||||
need_comma = True
|
|
||||||
self.append(k)
|
|
||||||
self.chunks.append(': ')
|
self.chunks.append(': ')
|
||||||
self.append(v)
|
self.append(kv[1])
|
||||||
self.chunks.append('}')
|
self.write_seq('{', '}', v.items(), append_kv)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
i = iter(v)
|
i = iter(v)
|
||||||
|
@ -393,7 +410,7 @@ class Formatter(TextCodec):
|
||||||
if i is None:
|
if i is None:
|
||||||
self.cannot_format(v)
|
self.cannot_format(v)
|
||||||
else:
|
else:
|
||||||
self.write_seq('[', ']', i)
|
self.write_seq('[', ']', i, self.append)
|
||||||
|
|
||||||
def cannot_format(self, v):
|
def cannot_format(self, v):
|
||||||
raise TypeError('Cannot preserves-format: ' + repr(v))
|
raise TypeError('Cannot preserves-format: ' + repr(v))
|
||||||
|
|
|
@ -99,7 +99,12 @@ class Record(object):
|
||||||
encoder.buffer.append(0x84)
|
encoder.buffer.append(0x84)
|
||||||
|
|
||||||
def __preserve_write_text__(self, formatter):
|
def __preserve_write_text__(self, formatter):
|
||||||
formatter.write_seq('<', '>', (self.key,) + self.fields)
|
formatter.chunks.append('<')
|
||||||
|
formatter.append(self.key)
|
||||||
|
for f in self.fields:
|
||||||
|
formatter.chunks.append(' ')
|
||||||
|
formatter.append(f)
|
||||||
|
formatter.chunks.append('>')
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
return self.fields[index]
|
return self.fields[index]
|
||||||
|
|
Loading…
Reference in New Issue