src/eric7/EricXML/XMLStreamReaderBase.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
5 5
6 """ 6 """
7 Module implementing a base class for all of eric7s XML stream writers. 7 Module implementing a base class for all of eric7s XML stream writers.
8 """ 8 """
9 9
10 import pickle # secok 10 import pickle # secok
11 import base64 11 import base64
12 12
13 from PyQt6.QtCore import QXmlStreamReader, QCoreApplication 13 from PyQt6.QtCore import QXmlStreamReader, QCoreApplication
14 14
15 from EricWidgets import EricMessageBox 15 from EricWidgets import EricMessageBox
17 17
18 class XMLStreamReaderBase(QXmlStreamReader): 18 class XMLStreamReaderBase(QXmlStreamReader):
19 """ 19 """
20 Class implementing a base class for all of eric7s XML stream readers. 20 Class implementing a base class for all of eric7s XML stream readers.
21 """ 21 """
22
22 def __init__(self, device): 23 def __init__(self, device):
23 """ 24 """
24 Constructor 25 Constructor
25 26
26 @param device reference to the I/O device to read from (QIODevice) 27 @param device reference to the I/O device to read from (QIODevice)
27 """ 28 """
28 super().__init__(device) 29 super().__init__(device)
29 30
30 def toBool(self, value): 31 def toBool(self, value):
31 """ 32 """
32 Public method to convert the given value to bool. 33 Public method to convert the given value to bool.
33 34
34 @param value value to be converted ("True", "False", "1", "0") 35 @param value value to be converted ("True", "False", "1", "0")
35 @return converted value (boolean) or None in case of an error 36 @return converted value (boolean) or None in case of an error
36 """ 37 """
37 if value.lower() in ["true", "false"]: 38 if value.lower() in ["true", "false"]:
38 return value.lower() == "true" 39 return value.lower() == "true"
39 40
40 if value in ["1", "0"]: 41 if value in ["1", "0"]:
41 return bool(int(value)) 42 return bool(int(value))
42 43
43 self.raiseBadValue(value) 44 self.raiseBadValue(value)
44 return None 45 return None
45 46
46 def showErrorMessage(self): 47 def showErrorMessage(self):
47 """ 48 """
48 Public method to show an error message. 49 Public method to show an error message.
49 """ 50 """
50 if self.hasError(): 51 if self.hasError():
51 if self.device() is not None: 52 if self.device() is not None:
52 msg = QCoreApplication.translate( 53 msg = QCoreApplication.translate(
53 "XMLStreamReaderBase", 54 "XMLStreamReaderBase",
54 "<p>XML parse error in file <b>{0}</b>, line {1}," 55 "<p>XML parse error in file <b>{0}</b>, line {1},"
55 " column {2}</p><p>Error: {3}</p>").format( 56 " column {2}</p><p>Error: {3}</p>",
57 ).format(
56 self.device().fileName(), 58 self.device().fileName(),
57 self.lineNumber(), self.columnNumber(), 59 self.lineNumber(),
58 self.errorString()) 60 self.columnNumber(),
61 self.errorString(),
62 )
59 else: 63 else:
60 msg = QCoreApplication.translate( 64 msg = QCoreApplication.translate(
61 "XMLStreamReaderBase", 65 "XMLStreamReaderBase",
62 "<p>XML parse error (line {0}," 66 "<p>XML parse error (line {0}," " column {1})</p><p>Error: {2}</p>",
63 " column {1})</p><p>Error: {2}</p>").format( 67 ).format(self.lineNumber(), self.columnNumber(), self.errorString())
64 self.lineNumber(), self.columnNumber(),
65 self.errorString())
66 EricMessageBox.warning( 68 EricMessageBox.warning(
67 None, 69 None,
68 QCoreApplication.translate( 70 QCoreApplication.translate("XMLStreamReaderBase", "XML parse error"),
69 "XMLStreamReaderBase", "XML parse error"), 71 msg,
70 msg) 72 )
71 73
72 def raiseUnexpectedStartTag(self, tag): 74 def raiseUnexpectedStartTag(self, tag):
73 """ 75 """
74 Public method to raise an error for an unexpected start tag. 76 Public method to raise an error for an unexpected start tag.
75 77
76 @param tag name of the unexpected tag (string) 78 @param tag name of the unexpected tag (string)
77 """ 79 """
78 self.raiseError(QCoreApplication.translate( 80 self.raiseError(
79 "XMLStreamReaderBase", "Unexpected start tag '{0}'.".format(tag))) 81 QCoreApplication.translate(
80 82 "XMLStreamReaderBase", "Unexpected start tag '{0}'.".format(tag)
83 )
84 )
85
81 def raiseUnsupportedFormatVersion(self, version): 86 def raiseUnsupportedFormatVersion(self, version):
82 """ 87 """
83 Public method to raise an error for an unsupported file format version. 88 Public method to raise an error for an unsupported file format version.
84 89
85 @param version unsupported version (string) 90 @param version unsupported version (string)
86 """ 91 """
87 self.raiseError(QCoreApplication.translate( 92 self.raiseError(
88 "XMLStreamReaderBase", 93 QCoreApplication.translate(
89 "File format version '{0}' is not supported.").format(version)) 94 "XMLStreamReaderBase", "File format version '{0}' is not supported."
90 95 ).format(version)
96 )
97
91 def raiseBadValue(self, value): 98 def raiseBadValue(self, value):
92 """ 99 """
93 Public method to raise an error for a bad value. 100 Public method to raise an error for a bad value.
94 101
95 @param value bad value (string) 102 @param value bad value (string)
96 """ 103 """
97 self.raiseError(QCoreApplication.translate( 104 self.raiseError(
98 "XMLStreamReaderBase", "Bad value: {0}").format(value)) 105 QCoreApplication.translate("XMLStreamReaderBase", "Bad value: {0}").format(
99 106 value
107 )
108 )
109
100 def readXML(self): 110 def readXML(self):
101 """ 111 """
102 Public method to read and parse the XML document. 112 Public method to read and parse the XML document.
103 """ 113 """
104 pass 114 pass
105 115
106 def attribute(self, name, default=""): 116 def attribute(self, name, default=""):
107 """ 117 """
108 Public method to read the given attribute of the current tag. 118 Public method to read the given attribute of the current tag.
109 119
110 @param name name of the attribute (string) 120 @param name name of the attribute (string)
111 @param default default value (string) 121 @param default default value (string)
112 @return value of the requested tag attribute (string) 122 @return value of the requested tag attribute (string)
113 """ 123 """
114 try: 124 try:
126 value = default 136 value = default
127 break 137 break
128 else: 138 else:
129 value = default 139 value = default
130 return value 140 return value
131 141
132 def _skipUnknownElement(self): 142 def _skipUnknownElement(self):
133 """ 143 """
134 Protected method to skip over all unknown elements. 144 Protected method to skip over all unknown elements.
135 """ 145 """
136 if not self.isStartElement(): 146 if not self.isStartElement():
137 return 147 return
138 148
139 while not self.atEnd(): 149 while not self.atEnd():
140 self.readNext() 150 self.readNext()
141 if self.isEndElement(): 151 if self.isEndElement():
142 break 152 break
143 153
144 if self.isStartElement(): 154 if self.isStartElement():
145 self._skipUnknownElement() 155 self._skipUnknownElement()
146 156
147 def _readBasics(self): 157 def _readBasics(self):
148 """ 158 """
149 Protected method to read an object of a basic Python type. 159 Protected method to read an object of a basic Python type.
150 160
151 @return Python object read 161 @return Python object read
152 """ 162 """
153 while not self.atEnd(): 163 while not self.atEnd():
154 self.readNext() 164 self.readNext()
155 if self.isStartElement(): 165 if self.isStartElement():
170 real, imag = self.readElementText().split() 180 real, imag = self.readElementText().split()
171 val = float(real) + float(imag) * 1j 181 val = float(real) + float(imag) * 1j
172 elif self.name() == "string": 182 elif self.name() == "string":
173 val = self.readElementText() 183 val = self.readElementText()
174 elif self.name() == "bytes": 184 elif self.name() == "bytes":
175 by = bytes([int(b) for b in 185 by = bytes([int(b) for b in self.readElementText().split(",")])
176 self.readElementText().split(",")])
177 val = by 186 val = by
178 elif self.name() == "bytearray": 187 elif self.name() == "bytearray":
179 by = bytearray([int(b) for b in 188 by = bytearray(
180 self.readElementText().split(",")]) 189 [int(b) for b in self.readElementText().split(",")]
190 )
181 val = by 191 val = by
182 elif self.name() == "tuple": 192 elif self.name() == "tuple":
183 val = self.__readTuple() 193 val = self.__readTuple()
184 return val 194 return val
185 elif self.name() == "list": 195 elif self.name() == "list":
195 val = self.__readFrozenset() 205 val = self.__readFrozenset()
196 return val 206 return val
197 elif self.name() == "pickle": 207 elif self.name() == "pickle":
198 encoding = self.attribute("encoding") 208 encoding = self.attribute("encoding")
199 if encoding != "base64": 209 if encoding != "base64":
200 self.raiseError(QCoreApplication.translate( 210 self.raiseError(
201 "XMLStreamReaderBase", 211 QCoreApplication.translate(
202 "Pickle data encoding '{0}' is not" 212 "XMLStreamReaderBase",
203 " supported.").format(encoding)) 213 "Pickle data encoding '{0}' is not" " supported.",
214 ).format(encoding)
215 )
204 continue 216 continue
205 b64 = self.readElementText() 217 b64 = self.readElementText()
206 pic = base64.b64decode(b64.encode("ASCII")) 218 pic = base64.b64decode(b64.encode("ASCII"))
207 val = pickle.loads(pic) # secok 219 val = pickle.loads(pic) # secok
208 else: 220 else:
209 self._skipUnknownElement() 221 self._skipUnknownElement()
210 except ValueError as err: 222 except ValueError as err:
211 self.raiseError(str(err)) 223 self.raiseError(str(err))
212 continue 224 continue
213 225
214 if self.isEndElement(): 226 if self.isEndElement():
215 if self.name() in [ 227 if self.name() in ["tuple", "list", "dict", "set", "frozenset"]:
216 "tuple", "list", "dict", "set", "frozenset"]:
217 return None 228 return None
218 else: 229 else:
219 return val 230 return val
220 231
221 def __readTuple(self): 232 def __readTuple(self):
222 """ 233 """
223 Private method to read a Python tuple. 234 Private method to read a Python tuple.
224 235
225 @return Python tuple 236 @return Python tuple
226 """ 237 """
227 li = [] 238 li = []
228 while not self.atEnd(): 239 while not self.atEnd():
229 val = self._readBasics() 240 val = self._readBasics()
230 if self.isEndElement() and self.name() == "tuple" and val is None: 241 if self.isEndElement() and self.name() == "tuple" and val is None:
231 return tuple(li) 242 return tuple(li)
232 else: 243 else:
233 li.append(val) 244 li.append(val)
234 245
235 def __readList(self): 246 def __readList(self):
236 """ 247 """
237 Private method to read a Python list. 248 Private method to read a Python list.
238 249
239 @return Python list 250 @return Python list
240 """ 251 """
241 li = [] 252 li = []
242 while not self.atEnd(): 253 while not self.atEnd():
243 val = self._readBasics() 254 val = self._readBasics()
244 if self.isEndElement() and self.name() == "list" and val is None: 255 if self.isEndElement() and self.name() == "list" and val is None:
245 return li 256 return li
246 else: 257 else:
247 li.append(val) 258 li.append(val)
248 259
249 def __readDict(self): 260 def __readDict(self):
250 """ 261 """
251 Private method to read a Python dictionary. 262 Private method to read a Python dictionary.
252 263
253 @return Python dictionary 264 @return Python dictionary
254 """ 265 """
255 d = {} 266 d = {}
256 while not self.atEnd(): 267 while not self.atEnd():
257 self.readNext() 268 self.readNext()
260 key = self._readBasics() 271 key = self._readBasics()
261 elif self.name() == "value": 272 elif self.name() == "value":
262 d[key] = self._readBasics() 273 d[key] = self._readBasics()
263 if self.isEndElement() and self.name() == "dict": 274 if self.isEndElement() and self.name() == "dict":
264 self.readNext() 275 self.readNext()
265 276
266 if self.isEndElement() and self.name() == "dict": 277 if self.isEndElement() and self.name() == "dict":
267 return d 278 return d
268 279
269 def __readSet(self): 280 def __readSet(self):
270 """ 281 """
271 Private method to read a Python set. 282 Private method to read a Python set.
272 283
273 @return Python set 284 @return Python set
274 """ 285 """
275 li = [] 286 li = []
276 while not self.atEnd(): 287 while not self.atEnd():
277 val = self._readBasics() 288 val = self._readBasics()
278 if self.isEndElement() and self.name() == "set" and val is None: 289 if self.isEndElement() and self.name() == "set" and val is None:
279 return set(li) 290 return set(li)
280 else: 291 else:
281 li.append(val) 292 li.append(val)
282 293
283 def __readFrozenset(self): 294 def __readFrozenset(self):
284 """ 295 """
285 Private method to read a Python set. 296 Private method to read a Python set.
286 297
287 @return Python set 298 @return Python set
288 """ 299 """
289 li = [] 300 li = []
290 while not self.atEnd(): 301 while not self.atEnd():
291 val = self._readBasics() 302 val = self._readBasics()
292 if ( 303 if self.isEndElement() and self.name() == "frozenset" and val is None:
293 self.isEndElement() and
294 self.name() == "frozenset" and
295 val is None
296 ):
297 return frozenset(li) 304 return frozenset(li)
298 else: 305 else:
299 li.append(val) 306 li.append(val)

eric ide

mercurial