blob: b70fc48f6a033e6705fe4038adb339483d3fd6e5 (
plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/*
* Copyright (c) 2011 Tobias Markmann
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
#include <sstream>
#include <stack>
#include <Swiften/Base/foreach.h>
#include <Swiften/Base/Log.h>
#include <Swiften/Client/XMLBeautifier.h>
#include <Swiften/Parser/PlatformXMLParserFactory.h>
namespace Swift {
XMLBeautifier::XMLBeautifier(bool indention, bool coloring) : doIndention(indention), doColoring(coloring), intLevel(0), parser(NULL), lastWasStepDown(false) {
factory = new PlatformXMLParserFactory();
}
XMLBeautifier::~XMLBeautifier() {
delete factory;
}
std::string XMLBeautifier::beautify(const std::string &text) {
parser = factory->createXMLParser(this);
intLevel = 0;
buffer.str(std::string());
parser->parse(text);
delete parser;
return buffer.str();
}
void XMLBeautifier::indent() {
for (int i = 0; i < intLevel; ++i) {
buffer << " ";
}
}
// all bold but reset
const char colorBlue[] = "\x1b[01;34m";
const char colorCyan[] = "\x1b[01;36m";
const char colorGreen[] = "\x1b[01;32m";
const char colorMagenta[] = "\x1b[01;35m";
const char colorRed[] = "\x1b[01;31m";
const char colorReset[] = "\x1b[0m";
const char colorYellow[] = "\x1b[01;33m";
std::string XMLBeautifier::styleTag(const std::string& text) const {
std::string result;
result += colorYellow;
result += text;
result += colorReset;
return result;
}
std::string XMLBeautifier::styleNamespace(const std::string& text) const {
std::string result;
result += colorRed;
result += text;
result += colorReset;
return result;
}
std::string XMLBeautifier::styleAttribute(const std::string& text) const {
std::string result;
result += colorGreen;
result += text;
result += colorReset;
return result;
}
std::string XMLBeautifier::styleValue(const std::string& text) const {
std::string result;
result += colorCyan;
result += text;
result += colorReset;
return result;
}
void XMLBeautifier::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) {
if (doIndention) {
if (intLevel) buffer << std::endl;
}
indent();
buffer << "<" << (doColoring ? styleTag(element) : element);
if (!ns.empty() && (!parentNSs.empty() && parentNSs.top() != ns)) {
buffer << " ";
buffer << (doColoring ? styleAttribute("xmlns") : "xmlns");
buffer << "=";
buffer << "\"" << (doColoring ? styleNamespace(ns) : ns) << "\"";
}
if (!attributes.getEntries().empty()) {
foreach(AttributeMap::Entry entry, attributes.getEntries()) {
buffer << " ";
buffer << (doColoring ? styleAttribute(entry.getAttribute().getName()) : entry.getAttribute().getName());
buffer << "=";
buffer << "\"" << (doColoring ? styleValue(entry.getValue()) : entry.getValue()) << "\"";
}
}
buffer << ">";
++intLevel;
lastWasStepDown = false;
parentNSs.push(ns);
}
void XMLBeautifier::handleEndElement(const std::string& element, const std::string& /* ns */) {
--intLevel;
parentNSs.pop();
if (/*hadCDATA.top() ||*/ lastWasStepDown) {
if (doIndention) {
buffer << std::endl;
}
indent();
}
buffer << "</" << (doColoring ? styleTag(element) : element) << ">";
lastWasStepDown = true;
}
void XMLBeautifier::handleCharacterData(const std::string& data) {
buffer << data;
lastWasStepDown = false;
}
}
|