|
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() |