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