/* 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 << "" << 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 (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 }