File indexing completed on 2024-12-01 13:11:47

0001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
0002 /* writerperfect
0003  * Version: MPL 2.0 / LGPLv2.1+
0004  *
0005  * This Source Code Form is subject to the terms of the Mozilla Public
0006  * License, v. 2.0. If a copy of the MPL was not distributed with this
0007  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008  *
0009  * Major Contributor(s):
0010  * Copyright (C) 2002-2004 William Lachance (wrlach@gmail.com)
0011  * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
0012  *
0013  * For minor contributions see the git repository.
0014  *
0015  * Alternatively, the contents of this file may be used under the terms
0016  * of the GNU Lesser General Public License Version 2.1 or later
0017  * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
0018  * applicable instead of those above.
0019  *
0020  * For further information visit http://libwpd.sourceforge.net
0021  */
0022 
0023 #include <string.h>
0024 
0025 #include "StringDocumentHandler.hxx"
0026 
0027 StringDocumentHandler::StringDocumentHandler() : m_data(""), m_isTagOpened(false), m_openedTagName("")
0028 {
0029     m_data.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
0030 }
0031 
0032 void StringDocumentHandler::endDocument()
0033 {
0034     if (!m_isTagOpened) return;
0035     m_data.append(">");
0036     m_isTagOpened = false;
0037 }
0038 
0039 void StringDocumentHandler::startElement(const char *psName, const librevenge::RVNGPropertyList &xPropList)
0040 {
0041     if (m_isTagOpened)
0042     {
0043         m_data.append(">");
0044         m_isTagOpened = false;
0045     }
0046     m_data.append("<");
0047     m_data.append(psName);
0048     librevenge::RVNGPropertyList::Iter i(xPropList);
0049     for (i.rewind(); i.next();)
0050     {
0051         // filter out librevenge elements
0052         if (strncmp(i.key(), "librevenge", 10) == 0) continue;
0053 
0054         m_data.append(" ");
0055         m_data.append(i.key());
0056         m_data.append("=\"");
0057         if (i()->getStr().len()>0)
0058             m_data.append(i()->getStr().cstr());
0059         m_data.append("\"");
0060     }
0061     m_isTagOpened = true;
0062     m_openedTagName.sprintf("%s", psName);
0063 }
0064 void StringDocumentHandler::endElement(const char *psName)
0065 {
0066     if (m_isTagOpened)
0067     {
0068         if (m_openedTagName == psName)
0069         {
0070             m_data.append("/>");
0071             m_isTagOpened = false;
0072         }
0073         else // should not happen, but handle it
0074         {
0075             m_data.append(">");
0076             m_data.append("</");
0077             m_data.append(psName);
0078             m_data.append(">");
0079             m_isTagOpened = false;
0080         }
0081     }
0082     else
0083     {
0084         m_data.append("</");
0085         m_data.append(psName);
0086         m_data.append(">");
0087         m_isTagOpened = false;
0088     }
0089 }
0090 
0091 void StringDocumentHandler::characters(const librevenge::RVNGString &sCharacters)
0092 {
0093     if (m_isTagOpened)
0094     {
0095         m_data.append(">");
0096         m_isTagOpened = false;
0097     }
0098     librevenge::RVNGString sEscapedCharacters;
0099     sEscapedCharacters.appendEscapedXML(sCharacters);
0100     if (sEscapedCharacters.len() > 0)
0101         m_data.append(sEscapedCharacters.cstr());
0102 }
0103 
0104 /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */