E5XML/XMLStreamWriterBase.py

changeset 573
3fd49348ea83
child 605
9c7527ecbf6e
equal deleted inserted replaced
572:5dced3700b78 573:3fd49348ea83
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a base class for all of eric5s XML stream writers.
8 """
9
10 import pickle
11 import base64
12
13 from PyQt4.QtCore import QXmlStreamWriter
14
15 class XMLStreamWriterBase(QXmlStreamWriter):
16 """
17 Class implementing a base class for all of eric5s XML stream writers.
18 """
19 def __init__(self, device):
20 """
21 Constructor
22
23 @param device reference to the I/O device to write to (QIODevice)
24 """
25 QXmlStreamWriter.__init__(self, device)
26
27 self.basics = {
28 type(None) : self._write_none,
29 int : self._write_int,
30 float : self._write_float,
31 complex : self._write_complex,
32 bool : self._write_bool,
33 str : self._write_string,
34 bytes : self._write_bytes,
35 bytearray : self._write_bytearray,
36 tuple : self._write_tuple,
37 list : self._write_list,
38 dict : self._write_dictionary,
39 set : self._write_set,
40 frozenset : self._write_frozenset,
41 }
42
43 self.NEWPARA = chr(0x2029)
44 self.NEWLINE = chr(0x2028)
45
46 self.setAutoFormatting(True)
47 self.setAutoFormattingIndent(2)
48
49 def writeXML(self):
50 """
51 Public method to write the XML to the file.
52 """
53 # write the XML header
54 self.writeStartDocument()
55
56 def encodedNewLines(self, text):
57 """
58 Public method to encode newlines and paragraph breaks.
59
60 @param text text to encode (string)
61 """
62 return text.replace("\n\n", self.NEWPARA).replace("\n", self.NEWLINE)
63
64 def _writeBasics(self, pyobject):
65 """
66 Protected method to dump an object of a basic Python type.
67
68 @param pyobject object to be dumped
69 """
70 writeMethod = self.basics.get(type(pyobject)) or self._write_unimplemented
71 writeMethod(pyobject)
72
73 ############################################################################
74 ## The various writer methods for basic types
75 ############################################################################
76
77 def _write_none(self, value):
78 """
79 Protected method to dump a NoneType object.
80
81 @param value value to be dumped (None) (ignored)
82 """
83 self.writeEmptyElement("none")
84
85 def _write_int(self, value):
86 """
87 Protected method to dump an int object.
88
89 @param value value to be dumped (integer)
90 """
91 self.writeTextElement("int", str(value))
92
93 def _write_bool(self, value):
94 """
95 Protected method to dump a bool object.
96
97 @param value value to be dumped (boolean)
98 """
99 self.writeTextElement("bool", str(value))
100
101 def _write_float(self, value):
102 """
103 Protected method to dump a float object.
104
105 @param value value to be dumped (float)
106 """
107 self.writeTextElement("float", str(value))
108
109 def _write_complex(self, value):
110 """
111 Protected method to dump a complex object.
112
113 @param value value to be dumped (complex)
114 """
115 self.writeTextElement("complex", '{0} {1}'.format(
116 value.real, value.imag))
117
118 def _write_string(self, value):
119 """
120 Protected method to dump a str object.
121
122 @param value value to be dumped (string)
123 """
124 self.writeTextElement("string", str(value))
125
126 def _write_bytes(self, value):
127 """
128 Protected method to dump a bytes object.
129
130 @param value value to be dumped (bytes)
131 """
132 self.writeTextElement("bytes", ",".join(["{0:d}".format(b) for b in value]))
133
134 def _write_bytearray(self, value):
135 """
136 Protected method to dump a bytearray object.
137
138 @param value value to be dumped (bytearray)
139 """
140 self.writeTextElement("bytearray", ",".join(["{0:d}".format(b) for b in value]))
141
142 def _write_tuple(self, value):
143 """
144 Protected method to dump a tuple object.
145
146 @param value value to be dumped (tuple)
147 """
148 self.writeStartElement("tuple")
149 for elem in value:
150 self._writeBasics(elem)
151 self.writeEndElement()
152
153 def _write_list(self, value):
154 """
155 Protected method to dump a list object.
156
157 @param value value to be dumped (list)
158 """
159 self.writeStartElement("list")
160 for elem in value:
161 self._writeBasics(elem)
162 self.writeEndElement()
163
164 def _write_dictionary(self, value):
165 """
166 Protected method to dump a dict object.
167
168 @param value value to be dumped (dictionary)
169 """
170 self.writeStartElement("dict")
171 try:
172 keys = sorted(list(value.keys()))
173 except TypeError:
174 keys = list(value.keys())
175 for key in keys:
176 self.writeStartElement("key")
177 self._writeBasics(key)
178 self.writeEndElement()
179
180 self.writeStartElement("value")
181 self._writeBasics(value[key])
182 self.writeEndElement()
183 self.writeEndElement()
184
185 def _write_set(self, value):
186 """
187 Protected method to dump a set object.
188
189 @param value value to be dumped (set)
190 """
191 self.writeStartElement("set")
192 for elem in value:
193 self._writeBasics(elem)
194 self.writeEndElement()
195
196 def _write_frozenset(self, value):
197 """
198 Protected method to dump a frozenset object.
199
200 @param value value to be dumped (frozenset)
201 """
202 self.writeStartElement("frozenset")
203 for elem in value:
204 self._writeBasics(elem)
205 self.writeEndElement()
206
207 def _write_unimplemented(self, value):
208 """
209 Protected method to dump a type, that has no special method.
210
211 @param value value to be dumped (any pickleable object)
212 """
213 self.writeStartElement("pickle")
214 self.writeAttribute("method", "pickle")
215 self.writeAttribute("encoding", "base64")
216 self.writeCharacters(str(base64.b64encode(pickle.dumps(value)), "ASCII"))
217 self.writeEndElement()

eric ide

mercurial