OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkXMLWriter.h" | 10 #include "SkXMLWriter.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 this->addAttribute(name, tmp.c_str()); | 44 this->addAttribute(name, tmp.c_str()); |
45 } | 45 } |
46 | 46 |
47 void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value) | 47 void SkXMLWriter::addScalarAttribute(const char name[], SkScalar value) |
48 { | 48 { |
49 SkString tmp; | 49 SkString tmp; |
50 tmp.appendScalar(value); | 50 tmp.appendScalar(value); |
51 this->addAttribute(name, tmp.c_str()); | 51 this->addAttribute(name, tmp.c_str()); |
52 } | 52 } |
53 | 53 |
| 54 void SkXMLWriter::addText(const SkString& text) |
| 55 { |
| 56 if (fElems.isEmpty()) { |
| 57 return; |
| 58 } |
| 59 |
| 60 this->onAddText(text); |
| 61 |
| 62 fElems.top()->fHasText = true; |
| 63 } |
| 64 |
54 void SkXMLWriter::doEnd(Elem* elem) | 65 void SkXMLWriter::doEnd(Elem* elem) |
55 { | 66 { |
56 delete elem; | 67 delete elem; |
57 } | 68 } |
58 | 69 |
59 bool SkXMLWriter::doStart(const char name[], size_t length) | 70 bool SkXMLWriter::doStart(const char name[], size_t length) |
60 { | 71 { |
61 int level = fElems.count(); | 72 int level = fElems.count(); |
62 bool firstChild = level > 0 && !fElems[level-1]->fHasChildren; | 73 bool firstChild = level > 0 && !fElems[level-1]->fHasChildren; |
63 if (firstChild) | 74 if (firstChild) |
64 fElems[level-1]->fHasChildren = true; | 75 fElems[level-1]->fHasChildren = true; |
65 Elem** elem = fElems.push(); | 76 Elem** elem = fElems.push(); |
66 *elem = new Elem; | 77 *elem = new Elem(name, length); |
67 (*elem)->fName.set(name, length); | |
68 (*elem)->fHasChildren = 0; | |
69 return firstChild; | 78 return firstChild; |
70 } | 79 } |
71 | 80 |
72 SkXMLWriter::Elem* SkXMLWriter::getEnd() | 81 SkXMLWriter::Elem* SkXMLWriter::getEnd() |
73 { | 82 { |
74 Elem* elem; | 83 Elem* elem; |
75 fElems.pop(&elem); | 84 fElems.pop(&elem); |
76 return elem; | 85 return elem; |
77 } | 86 } |
78 | 87 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 { | 214 { |
206 } | 215 } |
207 | 216 |
208 SkXMLStreamWriter::~SkXMLStreamWriter() | 217 SkXMLStreamWriter::~SkXMLStreamWriter() |
209 { | 218 { |
210 this->flush(); | 219 this->flush(); |
211 } | 220 } |
212 | 221 |
213 void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[],
size_t length) | 222 void SkXMLStreamWriter::onAddAttributeLen(const char name[], const char value[],
size_t length) |
214 { | 223 { |
215 SkASSERT(!fElems.top()->fHasChildren); | 224 SkASSERT(!fElems.top()->fHasChildren && !fElems.top()->fHasText); |
216 fStream.writeText(" "); | 225 fStream.writeText(" "); |
217 fStream.writeText(name); | 226 fStream.writeText(name); |
218 fStream.writeText("=\""); | 227 fStream.writeText("=\""); |
219 fStream.write(value, length); | 228 fStream.write(value, length); |
220 fStream.writeText("\""); | 229 fStream.writeText("\""); |
221 } | 230 } |
222 | 231 |
| 232 void SkXMLStreamWriter::onAddText(const SkString& text) |
| 233 { |
| 234 Elem* elem = fElems.top(); |
| 235 |
| 236 if (!elem->fHasChildren && !elem->fHasText) { |
| 237 fStream.writeText(">"); |
| 238 fStream.newline(); |
| 239 } |
| 240 |
| 241 tab(fStream, fElems.count() + 1); |
| 242 fStream.writeText(text.c_str()); |
| 243 fStream.newline(); |
| 244 } |
| 245 |
223 void SkXMLStreamWriter::onEndElement() | 246 void SkXMLStreamWriter::onEndElement() |
224 { | 247 { |
225 Elem* elem = getEnd(); | 248 Elem* elem = getEnd(); |
226 if (elem->fHasChildren) | 249 if (elem->fHasChildren || elem->fHasText) |
227 { | 250 { |
228 tab(fStream, fElems.count()); | 251 tab(fStream, fElems.count()); |
229 fStream.writeText("</"); | 252 fStream.writeText("</"); |
230 fStream.writeText(elem->fName.c_str()); | 253 fStream.writeText(elem->fName.c_str()); |
231 fStream.writeText(">"); | 254 fStream.writeText(">"); |
| 255 } else { |
| 256 fStream.writeText("/>"); |
232 } | 257 } |
233 else | |
234 fStream.writeText("/>"); | |
235 fStream.newline(); | 258 fStream.newline(); |
236 doEnd(elem); | 259 doEnd(elem); |
237 } | 260 } |
238 | 261 |
239 void SkXMLStreamWriter::onStartElementLen(const char name[], size_t length) | 262 void SkXMLStreamWriter::onStartElementLen(const char name[], size_t length) |
240 { | 263 { |
241 int level = fElems.count(); | 264 int level = fElems.count(); |
242 if (this->doStart(name, length)) | 265 if (this->doStart(name, length)) |
243 { | 266 { |
244 // the first child, need to close with > | 267 // the first child, need to close with > |
(...skipping 22 matching lines...) Expand all Loading... |
267 { | 290 { |
268 } | 291 } |
269 | 292 |
270 SkXMLParserWriter::~SkXMLParserWriter() | 293 SkXMLParserWriter::~SkXMLParserWriter() |
271 { | 294 { |
272 this->flush(); | 295 this->flush(); |
273 } | 296 } |
274 | 297 |
275 void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[],
size_t length) | 298 void SkXMLParserWriter::onAddAttributeLen(const char name[], const char value[],
size_t length) |
276 { | 299 { |
277 SkASSERT(fElems.count() == 0 || !fElems.top()->fHasChildren); | 300 SkASSERT(fElems.count() == 0 || (!fElems.top()->fHasChildren && !fElems.top(
)->fHasText)); |
278 SkString str(value, length); | 301 SkString str(value, length); |
279 fParser.addAttribute(name, str.c_str()); | 302 fParser.addAttribute(name, str.c_str()); |
280 } | 303 } |
281 | 304 |
| 305 void SkXMLParserWriter::onAddText(const SkString& text) |
| 306 { |
| 307 fParser.text(text.c_str(), SkToInt(text.size())); |
| 308 } |
| 309 |
282 void SkXMLParserWriter::onEndElement() | 310 void SkXMLParserWriter::onEndElement() |
283 { | 311 { |
284 Elem* elem = this->getEnd(); | 312 Elem* elem = this->getEnd(); |
285 fParser.endElement(elem->fName.c_str()); | 313 fParser.endElement(elem->fName.c_str()); |
286 this->doEnd(elem); | 314 this->doEnd(elem); |
287 } | 315 } |
288 | 316 |
289 void SkXMLParserWriter::onStartElementLen(const char name[], size_t length) | 317 void SkXMLParserWriter::onStartElementLen(const char name[], size_t length) |
290 { | 318 { |
291 (void)this->doStart(name, length); | 319 (void)this->doStart(name, length); |
(...skipping 30 matching lines...) Expand all Loading... |
322 w.endElement(); | 350 w.endElement(); |
323 w.endElement(); | 351 w.endElement(); |
324 w.startElement("elem2"); | 352 w.startElement("elem2"); |
325 w.endElement(); | 353 w.endElement(); |
326 w.endElement(); | 354 w.endElement(); |
327 w.endElement(); | 355 w.endElement(); |
328 #endif | 356 #endif |
329 } | 357 } |
330 | 358 |
331 #endif | 359 #endif |
OLD | NEW |