You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lexonomy_custom_editor/src/model/data.py

81 lines
2.1 KiB

empty_doc = __new__(DOMParser()).parseFromString("<empty />", "text/xml").firstChild
def copy(parent):
if type(parent) is None:
console.log("Copying non-transcrypt object, I think, this could go fairly wrong")
return parent
elif type(parent) is dict:
result = {}
for k, v in parent.items():
result[k] = copy(v)
return result
elif type(parent) is list:
return [copy(i) for i in parent]
elif type(parent) is int or \
type(parent) is float or \
type(parent) is str or \
type(parent) is bool or \
parent is None:
return parent
else:
# some fancy object it looks like
result = __pragma__ ('js', "{{}};")
proto = Object.getPrototypeOf(parent)
Object.setPrototypeOf(result, proto)
result["__class__"] = parent.__class__
for key in Object.getOwnPropertyNames(parent):
if key == "__class__":
continue
val = getattr(parent, key)
result[key] = copy(val)
return result
class Data:
def make_copy(self):
# makes an internal copy of self
# delete old copy
if hasattr(self, "_copy"):
if self._copy is not None:
self._copy = None
# make new data only copy
self._copy = copy(self)
def copy(self):
# return internal copy of self
# check if even initialized
if hasattr(self, "_copy"):
return self._copy
else:
return None
def overwrite_with_copy(self):
for key, value in dict(self._copy).items():
# skip functions and _copy
if key == "_copy" or type(value) is None:
continue
setattr(self, key, value)
self._copy = None
def view(self, model, *args):
raise NotImplementedError()
@classmethod
def import_xml(cls, xml, *args):
raise NotImplementedError()