diff options
Diffstat (limited to 'kvoctrain/kvoctrain/kvt-core/kvt-xml/XmlWriter.cpp')
-rw-r--r-- | kvoctrain/kvoctrain/kvt-core/kvt-xml/XmlWriter.cpp | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/kvoctrain/kvoctrain/kvt-core/kvt-xml/XmlWriter.cpp b/kvoctrain/kvoctrain/kvt-core/kvt-xml/XmlWriter.cpp new file mode 100644 index 00000000..38dfdbf2 --- /dev/null +++ b/kvoctrain/kvoctrain/kvt-core/kvt-xml/XmlWriter.cpp @@ -0,0 +1,253 @@ +/* -*- C++ -*- + + This file is part of KIllustrator. + Copyright (C) 1998 Kai-Uwe Sattler (kus@iti.cs.uni-magdeburg.de) + + modified for kvoctrain by Ewald Arnold kvoctrain@ewald-arnold.dein April ´99 + + ----------------------------------------------------------------------- + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Library General Public License as + published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "XmlWriter.h" + +XmlWriter::XmlWriter (KOXML_OSTREAM& os) + : strm (os) +{ + autoendl = true; + isapo = false; + apo = 0; + strm << "<?xml version=\"1.0\"?>" << endl; // "encoding=UTF8" +} + + +XmlWriter::~XmlWriter () { + flush (); +} + + +void XmlWriter::startTag (KOXML_STRING id, bool closeIt, bool empty, bool eol) +{ + if (!id) return; + + strm << "<" << id; + if (!empty) { + lastTags.push (id); + } + + if (closeIt) { + if (empty) + strm << "/"; + strm << ">"; + if (eol || autoendl) { + isapo = false; + apo = 0; + strm << endl; + } + } +} + + +void XmlWriter::endTag (KOXML_STRING id, bool eol) +{ + strm << "</"; + if (id.length() != 0) + strm << id; + else { + KOXML_STRING tag = lastTags.top (); + lastTags.pop (); + strm << tag; + } + strm << ">"; + if (eol || autoendl) { + isapo = false; + apo = 0; + strm << endl; + } +} + +void XmlWriter::closeTag (bool empty, bool eol) +{ + if (empty) { + strm << "/"; + lastTags.pop (); + } + strm << ">"; + if (eol || autoendl) { + isapo = false; + apo = 0; + strm << endl; + } +} + + +void XmlWriter::setAutoEndl (const bool flag) +{ + autoendl = flag; +} + + +void XmlWriter::endline() +{ + isapo = false; + apo = 0; + strm << endl; +} + + +void XmlWriter::addAttribute (KOXML_STRING name, const KOXML_STRING& value) +{ + if (!name) return; + + KOXML_STRING val = value; + // escape dangerous characters in sgml-style + int pos = 0; + while ((pos = val.find ('&', pos)) >= 0) { + KOXML_STRING_INSERT( val, pos+1, "amp;"); + pos += 5; // skip & + } + pos = 0; + while ((pos = val.find ('<', pos)) >= 0) { + KOXML_STRING_REMOVE( val, pos, 1); + KOXML_STRING_INSERT( val, pos, "<"); + pos += 4; // skip &nl; + } + pos = 0; + while ((pos = val.find ('\n', pos)) >= 0) { + KOXML_STRING_REMOVE( val, pos, 1); + KOXML_STRING_INSERT( val, pos, "&nl;"); + pos += 4; // skip &nl; + } + pos = 0; + while ((pos = val.find ('\r', pos)) >= 0) { + KOXML_STRING_REMOVE( val, pos, 1); + KOXML_STRING_INSERT( val, pos+1, "lf;"); + pos += 4; // skip &lf; + } + pos = 0; + while ((pos = val.find ('\"', pos)) >= 0) { + KOXML_STRING_REMOVE( val, pos, 1); + KOXML_STRING_INSERT( val, pos, """); + pos += 6; // skip &qout; + } + + strm << " "; + strm << name << "=\""; + strm << val; + strm << "\""; +} + + +void XmlWriter::addAttribute (KOXML_STRING name, int value) +{ + if (name.length() == 0) + return; + + strm << " "; + strm << name << "=\""; + strm << value; + strm << "\""; +} + + +void XmlWriter::addAttribute (KOXML_STRING name, float value) +{ + if (name.length() == 0) + return; + + strm << " "; + strm << name << "=\""; + strm << value; + strm << "\""; +} + + +void XmlWriter::addAttribute (KOXML_STRING name, double value) +{ + if (name.length() == 0) + return; + + strm << " "; + strm << name << "=\""; + strm << value; + strm << "\""; +} + + +void XmlWriter::writeText (KOXML_STRING c) +{ + int i = 0; + while (i < (int) c.length()) { + if (c[i] == '<') + strm << "<"; + else if (c[i] == '&') + strm << "&"; + else if (c[i] == '>') + strm << ">"; + else if (c[i] == '\"' || c[i] == '\'' || c[i] == '`') { + strm << c[i]; + if (isapo) { + if (apo == c[i]) + isapo = false; + } + else { + isapo = true; + apo = c[i]; + } + } + else if (c[i] == '\n') { + if (isapo) + strm << "&nl;"; + else + strm << c[i]; + } + else if (c[i] == '\r') { + if (isapo) + strm << "&lf;"; + else + strm << c[i]; + } + else + strm << c[i]; + i++; + } +} + + +void XmlWriter::indent (int i) +{ + for (; i > 0; i--) + strm << " "; +} + + +void XmlWriter::writeTag (KOXML_STRING s) +{ + strm << "<" + << s + << ">"; +} + + +void XmlWriter::flush () +{ +#ifndef KOXML_USE_STL + stream()->flush (); +#else + strm.flush(); +#endif +} |