mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2024-09-19 18:20:06 +02:00
209 lines
6.8 KiB
Python
209 lines
6.8 KiB
Python
|
import json
|
||
|
from .. import constants
|
||
|
|
||
|
ROUND = constants.DEFAULT_PRECISION
|
||
|
|
||
|
## THREE override function
|
||
|
def _json_floatstr(o):
|
||
|
if ROUND is not None:
|
||
|
o = round(o, ROUND)
|
||
|
|
||
|
return '%g' % o
|
||
|
|
||
|
|
||
|
def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
|
||
|
_key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
|
||
|
## HACK: hand-optimized bytecode; turn globals into locals
|
||
|
ValueError=ValueError,
|
||
|
dict=dict,
|
||
|
float=float,
|
||
|
id=id,
|
||
|
int=int,
|
||
|
isinstance=isinstance,
|
||
|
list=list,
|
||
|
str=str,
|
||
|
tuple=tuple,
|
||
|
):
|
||
|
'''
|
||
|
Overwrite json.encoder for Python 2.7 and above to not
|
||
|
assign each index of a list or tuple to its own row as
|
||
|
this is completely asinine behaviour
|
||
|
'''
|
||
|
|
||
|
## @THREE
|
||
|
# Override the function
|
||
|
_floatstr = _json_floatstr
|
||
|
|
||
|
if _indent is not None and not isinstance(_indent, str):
|
||
|
_indent = ' ' * _indent
|
||
|
|
||
|
def _iterencode_list(lst, _current_indent_level):
|
||
|
if not lst:
|
||
|
yield '[]'
|
||
|
return
|
||
|
if markers is not None:
|
||
|
markerid = id(lst)
|
||
|
if markerid in markers:
|
||
|
raise ValueError("Circular reference detected")
|
||
|
markers[markerid] = lst
|
||
|
buf = '['
|
||
|
## @THREEJS
|
||
|
# - block the moronic functionality that puts each
|
||
|
# index on its own line causing insane row counts
|
||
|
#if _indent is not None:
|
||
|
# _current_indent_level += 1
|
||
|
# newline_indent = '\n' + _indent * _current_indent_level
|
||
|
# separator = _item_separator + newline_indent
|
||
|
# buf += newline_indent
|
||
|
#else:
|
||
|
newline_indent = None
|
||
|
separator = _item_separator
|
||
|
first = True
|
||
|
for value in lst:
|
||
|
if first:
|
||
|
first = False
|
||
|
else:
|
||
|
buf = separator
|
||
|
if isinstance(value, str):
|
||
|
yield buf + _encoder(value)
|
||
|
elif value is None:
|
||
|
yield buf + 'null'
|
||
|
elif value is True:
|
||
|
yield buf + 'true'
|
||
|
elif value is False:
|
||
|
yield buf + 'false'
|
||
|
elif isinstance(value, int):
|
||
|
yield buf + str(value)
|
||
|
elif isinstance(value, float):
|
||
|
yield buf + _floatstr(value)
|
||
|
else:
|
||
|
yield buf
|
||
|
if isinstance(value, (list, tuple)):
|
||
|
chunks = _iterencode_list(value, _current_indent_level)
|
||
|
elif isinstance(value, dict):
|
||
|
chunks = _iterencode_dict(value, _current_indent_level)
|
||
|
else:
|
||
|
chunks = _iterencode(value, _current_indent_level)
|
||
|
for chunk in chunks:
|
||
|
yield chunk
|
||
|
if newline_indent is not None:
|
||
|
_current_indent_level -= 1
|
||
|
yield '\n' + _indent * _current_indent_level
|
||
|
yield ']'
|
||
|
if markers is not None:
|
||
|
del markers[markerid]
|
||
|
|
||
|
def _iterencode_dict(dct, _current_indent_level):
|
||
|
if not dct:
|
||
|
yield '{}'
|
||
|
return
|
||
|
if markers is not None:
|
||
|
markerid = id(dct)
|
||
|
if markerid in markers:
|
||
|
raise ValueError("Circular reference detected")
|
||
|
markers[markerid] = dct
|
||
|
yield '{'
|
||
|
if _indent is not None:
|
||
|
_current_indent_level += 1
|
||
|
newline_indent = '\n' + _indent * _current_indent_level
|
||
|
item_separator = _item_separator + newline_indent
|
||
|
yield newline_indent
|
||
|
else:
|
||
|
newline_indent = None
|
||
|
item_separator = _item_separator
|
||
|
first = True
|
||
|
if _sort_keys:
|
||
|
items = sorted(dct.items(), key=lambda kv: kv[0])
|
||
|
else:
|
||
|
items = dct.items()
|
||
|
for key, value in items:
|
||
|
if isinstance(key, str):
|
||
|
pass
|
||
|
# JavaScript is weakly typed for these, so it makes sense to
|
||
|
# also allow them. Many encoders seem to do something like this.
|
||
|
elif isinstance(key, float):
|
||
|
key = _floatstr(key)
|
||
|
elif key is True:
|
||
|
key = 'true'
|
||
|
elif key is False:
|
||
|
key = 'false'
|
||
|
elif key is None:
|
||
|
key = 'null'
|
||
|
elif isinstance(key, int):
|
||
|
key = str(key)
|
||
|
elif _skipkeys:
|
||
|
continue
|
||
|
else:
|
||
|
raise TypeError("key " + repr(key) + " is not a string")
|
||
|
if first:
|
||
|
first = False
|
||
|
else:
|
||
|
yield item_separator
|
||
|
yield _encoder(key)
|
||
|
yield _key_separator
|
||
|
if isinstance(value, str):
|
||
|
yield _encoder(value)
|
||
|
elif value is None:
|
||
|
yield 'null'
|
||
|
elif value is True:
|
||
|
yield 'true'
|
||
|
elif value is False:
|
||
|
yield 'false'
|
||
|
elif isinstance(value, int):
|
||
|
yield str(value)
|
||
|
elif isinstance(value, float):
|
||
|
yield _floatstr(value)
|
||
|
else:
|
||
|
if isinstance(value, (list, tuple)):
|
||
|
chunks = _iterencode_list(value, _current_indent_level)
|
||
|
elif isinstance(value, dict):
|
||
|
chunks = _iterencode_dict(value, _current_indent_level)
|
||
|
else:
|
||
|
chunks = _iterencode(value, _current_indent_level)
|
||
|
for chunk in chunks:
|
||
|
yield chunk
|
||
|
if newline_indent is not None:
|
||
|
_current_indent_level -= 1
|
||
|
yield '\n' + _indent * _current_indent_level
|
||
|
yield '}'
|
||
|
if markers is not None:
|
||
|
del markers[markerid]
|
||
|
|
||
|
def _iterencode(o, _current_indent_level):
|
||
|
if isinstance(o, str):
|
||
|
yield _encoder(o)
|
||
|
elif o is None:
|
||
|
yield 'null'
|
||
|
elif o is True:
|
||
|
yield 'true'
|
||
|
elif o is False:
|
||
|
yield 'false'
|
||
|
elif isinstance(o, int):
|
||
|
yield str(o)
|
||
|
elif isinstance(o, float):
|
||
|
yield _floatstr(o)
|
||
|
elif isinstance(o, (list, tuple)):
|
||
|
for chunk in _iterencode_list(o, _current_indent_level):
|
||
|
yield chunk
|
||
|
elif isinstance(o, dict):
|
||
|
for chunk in _iterencode_dict(o, _current_indent_level):
|
||
|
yield chunk
|
||
|
else:
|
||
|
if markers is not None:
|
||
|
markerid = id(o)
|
||
|
if markerid in markers:
|
||
|
raise ValueError("Circular reference detected")
|
||
|
markers[markerid] = o
|
||
|
o = _default(o)
|
||
|
for chunk in _iterencode(o, _current_indent_level):
|
||
|
yield chunk
|
||
|
if markers is not None:
|
||
|
del markers[markerid]
|
||
|
return _iterencode
|
||
|
|
||
|
|
||
|
# override the encoder
|
||
|
json.encoder._make_iterencode = _make_iterencode
|
||
|
|
||
|
|