File size: 1,771 Bytes
158b61b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#include "xml_tree_writer.h"
#include <cassert>
#include <ostream>
#include <vector>
#include <string>
#include "SyntaxTree.h"
#include "XmlTree.h"
namespace MosesTraining {
namespace Syntax {
void XmlTreeWriter::Write(const SyntaxTree &tree) const {
assert(!tree.IsLeaf());
// Opening tag
out_ << "<tree label=\"" << Escape(tree.value().label) << "\"";
for (SyntaxNode::AttributeMap::const_iterator
p = tree.value().attributes.begin();
p != tree.value().attributes.end(); ++p) {
if (p->first != "label") {
out_ << " " << p->first << "=\"" << p->second << "\"";
}
}
out_ << ">";
// Children
for (std::vector<SyntaxTree *>::const_iterator p = tree.children().begin();
p != tree.children().end(); ++p) {
SyntaxTree &child = **p;
if (child.IsLeaf()) {
out_ << " " << Escape(child.value().label);
} else {
out_ << " ";
Write(child);
}
}
// Closing tag
out_ << " </tree>";
if (tree.parent() == 0) {
out_ << std::endl;
}
}
// Escapes XML special characters.
std::string XmlTreeWriter::Escape(const std::string &s) const {
if (!escape_) {
return s;
}
std::string t;
std::size_t len = s.size();
t.reserve(len);
for (std::size_t i = 0; i < len; ++i) {
if (s[i] == '<') {
t += "<";
} else if (s[i] == '>') {
t += ">";
} else if (s[i] == '[') {
t += "[";
} else if (s[i] == ']') {
t += "]";
} else if (s[i] == '|') {
t += "|";
} else if (s[i] == '&') {
t += "&";
} else if (s[i] == '\'') {
t += "'";
} else if (s[i] == '"') {
t += """;
} else {
t += s[i];
}
}
return t;
}
} // namespace Syntax
} // namespace MosesTraining
|