python-lottie  0.7.0+dev66cafb9
A framework to work with lottie files and telegram animated stickers (tgs)
core_nodes.py
Go to the documentation of this file.
1 from xml.dom import minidom
2 import copy
3 from uuid import uuid4
4 
5 from .utils import *
6 from lottie.parsers.sif.sif.core import ObjectRegistry
7 
8 
10  def __init__(self, name):
11  self.namename = name
12  self.att_nameatt_name = name.replace("-", "_").replace("[", "_").replace("]", "").replace(".", "_")
13 
14  def to_xml(self, obj, parent: minidom.Element, dom: minidom.Document):
15  raise NotImplementedError
16 
17  def from_xml(self, obj, parent: minidom.Element, registry: ObjectRegistry):
18  raise NotImplementedError
19 
20  def from_python(self, value):
21  raise NotImplementedError
22 
23  def initialize_object(self, dict, obj):
24  if self.att_nameatt_name in dict:
25  setattr(obj, self.att_nameatt_name, self.from_pythonfrom_python(dict[self.att_nameatt_name]))
26  else:
27  setattr(obj, self.att_nameatt_name, self.defaultdefault())
28 
29  def clean(self, value):
30  return self.from_pythonfrom_python(value)
31 
32  def default(self):
33  return None
34 
35  def __repr__(self):
36  return "%s(%r)" % (self.__class__.__name__, self.namename)
37 
38 
40  def __init__(self, name, type=str, default_value=None, att_name=None):
41  super().__init__(name)
42  self.typetype = type
43  self.default_valuedefault_value = default_value
44  if att_name is not None:
45  self.att_nameatt_nameatt_name = att_name
46 
47  def from_python(self, value):
48  if value is None and self.default_valuedefault_value is None:
49  return None
50  if not value_isinstance(value, self.typetype):
51  return self.typetype(value)
52  return value
53 
54  def default(self):
55  return copy.deepcopy(self.default_valuedefault_value)
56 
57 
59  def __init__(self, id, value=None):
60  self.valuevalue = value
61  self.idid = id
62 
63  @classmethod
64  def from_registry(cls, id, registry: ObjectRegistry):
65  return cls(id, registry.get_object(id))
66 
67 
69  def from_xml(self, obj, parent: minidom.Element, registry: ObjectRegistry):
70  xml_str = parent.getAttribute(self.namename)
71  if xml_str:
72  if xml_str.startswith(":") and xml_str[1:] in registry.registry:
73  value = ValueReference.from_registry(xml_str[1:], registry)
74  else:
75  value = value_from_xml_string(xml_str, self.typetype, registry)
76  setattr(obj, self.att_nameatt_nameatt_name, value)
77 
78  def to_xml(self, obj, parent: minidom.Element, dom: minidom.Document):
79  value = getattr(obj, self.att_nameatt_nameatt_name)
80  if value is not None:
81  if isinstance(value, ValueReference):
82  xml_str = ":" + value.id
83  else:
84  xml_str = value_to_xml_string(value, self.typetype)
85  parent.setAttribute(self.namename, xml_str)
86 
87 
89  def __init__(self, name, value, type=str):
90  super().__init__(name)
91  self.valuevalue = value
92  self.typetype = type
93 
94  def to_xml(self, obj, parent: minidom.Element, dom: minidom.Document):
95  parent.setAttribute(self.namename, value_to_xml_string(self.valuevalue, self.typetype))
96 
97  def from_python(self, value):
98  if value != self.valuevalue:
99  raise ValueError("Value of %s should be %s, got %s" % (self.namename, self.valuevalue, value))
100  return value
101 
102  def from_xml(self, obj, parent: minidom.Element, registry: ObjectRegistry):
103  xml_str = parent.getAttribute(self.namename)
104  setattr(obj, self.att_nameatt_name, value_from_xml_string(xml_str, self.typetype, registry))
105 
106  def default(self):
107  return self.valuevalue
108 
109 
111  def from_xml(self, obj, parent: minidom.Element, registry: ObjectRegistry):
112  cn = xml_first_element_child(parent, self.namename, allow_none=True)
113  if cn:
114  value = value_from_xml_string(xml_text(cn), self.typetype, registry)
115  else:
116  value = self.default_valuedefault_value
117 
118  setattr(obj, self.att_nameatt_nameatt_name, value)
119 
120  def to_xml(self, obj, parent: minidom.Element, dom: minidom.Document):
121  value = getattr(obj, self.att_nameatt_nameatt_name)
122  if value is not None:
123  parent.appendChild(xml_make_text(dom, self.namename, value_to_xml_string(value, self.typetype)))
124 
125 
127  def from_xml(self, obj, parent: minidom.Element, registry: ObjectRegistry):
128  for cn in xml_child_elements(parent, "meta"):
129  if cn.getAttribute("name") == self.namename:
130  value = value_from_xml_string(cn.getAttribute("content"), self.typetype, registry)
131  break
132  else:
133  value = self.default_valuedefault_value
134 
135  setattr(obj, self.att_nameatt_nameatt_name, value)
136 
137  def to_xml(self, obj, parent: minidom.Element, dom: minidom.Document):
138  value = getattr(obj, self.att_nameatt_nameatt_name)
139  if value is not None:
140  meta = parent.appendChild(dom.createElement("meta"))
141  meta.setAttribute("name", self.namename)
142  meta.setAttribute("content", value_to_xml_string(value, self.typetype))
def __init__(self, name, type=str, default_value=None, att_name=None)
Definition: core_nodes.py:40
def from_registry(cls, id, ObjectRegistry registry)
Definition: core_nodes.py:64
def from_xml(self, obj, minidom.Element parent, ObjectRegistry registry)
Definition: core_nodes.py:69
def to_xml(self, obj, minidom.Element parent, minidom.Document dom)
Definition: core_nodes.py:78
def from_xml(self, obj, minidom.Element parent, ObjectRegistry registry)
Definition: core_nodes.py:17
def to_xml(self, obj, minidom.Element parent, minidom.Document dom)
Definition: core_nodes.py:14
def to_xml(self, obj, minidom.Element parent, minidom.Document dom)
Definition: core_nodes.py:94
def __init__(self, name, value, type=str)
Definition: core_nodes.py:89
def from_xml(self, obj, minidom.Element parent, ObjectRegistry registry)
Definition: core_nodes.py:102
def to_xml(self, obj, minidom.Element parent, minidom.Document dom)
Definition: core_nodes.py:137
def from_xml(self, obj, minidom.Element parent, ObjectRegistry registry)
Definition: core_nodes.py:127
def from_xml(self, obj, minidom.Element parent, ObjectRegistry registry)
Definition: core_nodes.py:111
def to_xml(self, obj, minidom.Element parent, minidom.Document dom)
Definition: core_nodes.py:120
def xml_first_element_child(minidom.Node xml, tagname=None, allow_none=False)
Definition: utils.py:79
def xml_make_text(minidom.Document dom, tag_name, text)
Definition: utils.py:57
def xml_child_elements(minidom.Node xml, tagname=None)
Definition: utils.py:73
def value_to_xml_string(value, type)
Definition: utils.py:33
def value_from_xml_string(xml_str, type, registry)
Definition: utils.py:23
def value_isinstance(value, type)
Definition: utils.py:43