20 #include <QTextStream>
25 QByteArray buildTableDivision(
const QVector<int> &columnsSize)
28 QTextStream out(&buffer, QIODevice::WriteOnly);
29 for (
int i = 0; i < columnsSize.size(); ++i) {
35 out << QByteArray().fill(
'-', columnsSize[i] + 2).data();
42 QByteArray Utils::buildTable(
const QVector<QStringList> &table,
const QStringList &headers,
const QString &title)
45 QVector<int> columnsSize;
47 if (!headers.isEmpty()) {
48 for (
const QString &header : headers) {
49 columnsSize.push_back(header.size());
52 for (
const QStringList &rows : table) {
53 if (columnsSize.empty()) {
54 for (
const QString &row : rows) {
55 columnsSize.push_back(row.size());
57 }
else if (rows.size() != columnsSize.size()) {
58 qFatal(
"Incomplete table");
63 for (
const QStringList &row : table) {
64 if (row.size() > columnsSize.size()) {
65 qFatal(
"Incomplete table");
69 for (
int i = 0; i < row.size(); ++i) {
70 columnsSize[i] = qMax(columnsSize[i], row[i].size());
75 QTextStream out(&buffer, QIODevice::WriteOnly);
76 out.setFieldAlignment(QTextStream::AlignLeft);
77 QByteArray div = buildTableDivision(columnsSize);
79 if (!title.isEmpty()) {
86 if (!headers.isEmpty()) {
88 for (
int i = 0; i < headers.size(); ++i) {
91 out.setFieldWidth(columnsSize[i]);
103 for (
const QStringList &row : table) {
105 for (
int i = 0; i < row.size(); ++i) {
108 out.setFieldWidth(columnsSize[i]);
111 out.setFieldWidth(0);
123 QString Utils::decodePercentEncoding(QString *s)
129 QByteArray ba = s->toLatin1();
131 char *data = ba.data();
132 const char *inputPtr = data;
134 const int len = ba.count();
135 bool skipUtf8 =
true;
137 for (
int i = 0 ; i < len; ++i, ++outlen) {
138 const char c = inputPtr[i];
139 if (c ==
'%' && i + 2 < len) {
140 int a = inputPtr[++i];
141 int b = inputPtr[++i];
143 if (a >=
'0' && a <=
'9') a -=
'0';
144 else if (a >=
'a' && a <=
'f') a = a -
'a' + 10;
145 else if (a >=
'A' && a <=
'F') a = a -
'A' + 10;
147 if (b >=
'0' && b <=
'9') b -=
'0';
148 else if (b >=
'a' && b <=
'f') b = b -
'a' + 10;
149 else if (b >=
'A' && b <=
'F') b = b -
'A' + 10;
151 *data++ = (char)((a << 4) | b);
153 }
else if (c ==
'+') {
164 return QString::fromUtf8(ba.data(), outlen);
167 QString Utils::decodePercentEncoding(QByteArray *ba)
172 char *data = ba->data();
173 const char *inputPtr = data;
175 int len = ba->count();
176 bool skipUtf8 =
true;
178 for (
int i = 0; i < len; ++i, ++outlen) {
179 const char c = inputPtr[i];
180 if (c ==
'%' && i + 2 < len) {
181 int a = inputPtr[++i];
182 int b = inputPtr[++i];
184 if (a >=
'0' && a <=
'9') a -=
'0';
185 else if (a >=
'a' && a <=
'f') a = a -
'a' + 10;
186 else if (a >=
'A' && a <=
'F') a = a -
'A' + 10;
188 if (b >=
'0' && b <=
'9') b -=
'0';
189 else if (b >=
'a' && b <=
'f') b = b -
'a' + 10;
190 else if (b >=
'A' && b <=
'F') b = b -
'A' + 10;
192 *data++ = (char)((a << 4) | b);
194 }
else if (c ==
'+') {
202 return QString::fromLatin1(ba->data(), outlen);
204 return QString::fromUtf8(ba->data(), outlen);