3 #include "cheprep/config.h"
7 #include "cheprep/DefaultHepRepAttValue.h"
8 #include "cheprep/XMLWriter.h"
18 XMLWriter::XMLWriter(ostream* out,
string indentString,
string aDefaultNameSpace)
19 : AbstractXMLWriter(aDefaultNameSpace) {
20 writer =
new IndentPrintWriter(out);
21 writer->setIndentString(indentString);
26 XMLWriter::~XMLWriter() {
31 void XMLWriter::close() {
36 void XMLWriter::openDoc(
string version,
string encoding,
bool standalone) {
37 string indentString = writer->getIndentString();
38 writer->setIndentString(indentString);
41 *writer <<
"<?xml version=\"" << version.c_str() <<
"\" ";
42 if (encoding.compare(
"") != 0) {
44 *writer <<
"encoding=\"" << encoding.c_str() <<
"\" ";
47 *writer <<
"standalone=\"yes\" ";
51 writer->setIndentString(indentString);
54 void XMLWriter::referToDTD(
string name,
string pid,
string ref) {
56 cerr <<
"XMLWriter::ReferToDTD cannot be called twice" << endl;
59 *writer <<
"<!DOCTYPE " << name.c_str() <<
" PUBLIC \"" << pid.c_str() <<
"\" \"" << ref.c_str() <<
"\">" << endl;
62 void XMLWriter::referToDTD(
string name,
string system) {
64 cerr <<
"XMLWriter::ReferToDTD cannot be called twice";
67 *writer <<
"<!DOCTYPE " << name.c_str() <<
" SYSTEM \"" << system.c_str() <<
"\">" << endl;
70 void XMLWriter::closeDoc(
bool force) {
72 if (!openTags.empty()) {
73 if (!force) cerr <<
"Not all tags were closed before closing XML document:" << endl;
74 while (!openTags.empty()) {
78 cerr <<
" </" << openTags.top().c_str() <<
">" << endl;
87 void XMLWriter::printComment(
string comment) {
88 if (comment.find(
"--") != string::npos) {
89 cerr <<
"XMLWriter::printComment '--' sequence not allowed in comment" << endl;
91 *writer <<
"<!--" << normalizeText(comment).c_str() <<
"-->" << endl;
94 void XMLWriter::printPlain(
string text) {
95 *writer << text.c_str();
99 *writer << normalizeText(text).c_str();
102 void XMLWriter::println(
string text) {
107 void XMLWriter::openTag(
string name) {
108 checkNameValid(name);
109 if (openTags.empty() && dtdName.compare(
"") && dtdName.compare(name)) {
110 cerr <<
"XMLWriter::openTag(), First tag: '" << name <<
"' not equal to DTD id: '" << dtdName <<
"'" << endl;
112 *writer <<
"<" << name.c_str();
113 printAttributes(name.length());
114 *writer <<
">" << endl;
119 void XMLWriter::closeTag() {
120 if (openTags.empty()) {
122 cerr <<
"XMLWriter::closeTag(), No open tags" << endl;
124 string name = openTags.top();
127 *writer <<
"</" << name.c_str() <<
">" << endl;
130 void XMLWriter::printTag(
string name) {
131 checkNameValid(name);
132 *writer <<
"<" << name.c_str();
133 printAttributes(name.length());
134 *writer <<
"/>" << endl;
137 void XMLWriter::setAttribute(
string name,
char* value) {
138 setAttribute(name, (
string)value);
141 void XMLWriter::setAttribute(
string name,
string value) {
142 attributes[
name] = value;
146 void XMLWriter::setAttribute(std::string name, std::vector<double> value) {
147 if (name ==
"value") setAttribute(
"type", (std::string)
"Color");
148 setAttribute(name, DefaultHepRepAttValue::getAsString(value));
151 void XMLWriter::setAttribute(std::string name, int64 value) {
152 if (name ==
"value") setAttribute(
"type", (std::string)
"long");
153 setAttribute(name, DefaultHepRepAttValue::getAsString(value));
156 void XMLWriter::setAttribute(std::string name,
int value) {
157 if (name ==
"showlabel") {
158 string label = DefaultHepRepAttValue::toShowLabel(value);
159 setAttribute(
"showlabel", label);
161 if (name ==
"value") setAttribute(
"type", (std::string)
"int");
162 setAttribute(name, DefaultHepRepAttValue::getAsString(value));
166 void XMLWriter::setAttribute(std::string name,
bool value) {
167 if (name ==
"value") setAttribute(
"type", (std::string)
"boolean");
168 setAttribute(name, DefaultHepRepAttValue::getAsString(value));
171 void XMLWriter::setAttribute(
string name,
double value) {
172 if (name ==
"value") setAttribute(
"type", (std::string)
"double");
173 setAttribute(name, DefaultHepRepAttValue::getAsString(value));
176 void XMLWriter::printAttributes(
int tagLength) {
177 int width = tagLength + 1;
178 bool extraIndent =
false;
179 for (map<string,string>::iterator i = attributes.begin(); i != attributes.end(); i++) {
180 string key = i->first;
182 string value = normalize(i->second);
183 int length = key.length() + value.length() + 3;
184 if (width > 0 && width + length + 2*writer->getIndent() > 60) {
195 *writer << key.c_str() <<
"=\"" << value.c_str() <<
"\"";
198 if (extraIndent) writer->outdent();
201 string XMLWriter::normalize(
string s) {
205 int len = s.length();
206 for (
int i = 0; i < len; i++) {
222 str.append(
""");
227 sprintf(buffer,
"&#%ud", ch);
247 string XMLWriter::normalizeText(
string s) {
250 int len = s.length();
251 for (
int i = 0; i < len; i++) {
280 void XMLWriter::checkNameValid(
string) {
void print(const std::vector< T > &data)