12 QByteArray buildTableDivision(
const QVector<int> &columnsSize)
15 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
16 QTextStream out(&buffer, QTextStream::WriteOnly);
18 QTextStream out(&buffer, QIODevice::WriteOnly);
20 for (
int i = 0; i < columnsSize.size(); ++i) {
26 out << QByteArray().fill(
'-', columnsSize[i] + 2).data();
33 QByteArray Utils::buildTable(
const QVector<QStringList> &table,
const QStringList &headers,
const QString &title)
36 QVector<int> columnsSize;
38 if (!headers.isEmpty()) {
39 for (
const QString &header : headers) {
40 columnsSize.push_back(header.size());
43 for (
const QStringList &rows : table) {
44 if (columnsSize.empty()) {
45 for (
const QString &row : rows) {
46 columnsSize.push_back(row.size());
48 }
else if (rows.size() != columnsSize.size()) {
49 qFatal(
"Incomplete table");
54 for (
const QStringList &row : table) {
55 if (row.size() > columnsSize.size()) {
56 qFatal(
"Incomplete table");
60 for (
int i = 0; i < row.size(); ++i) {
61 columnsSize[i] = qMax(columnsSize[i], row[i].size());
66 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
67 QTextStream out(&buffer, QTextStream::WriteOnly);
69 QTextStream out(&buffer, QIODevice::WriteOnly);
72 out.setFieldAlignment(QTextStream::AlignLeft);
73 QByteArray div = buildTableDivision(columnsSize);
75 if (!title.isEmpty()) {
82 if (!headers.isEmpty()) {
84 for (
int i = 0; i < headers.size(); ++i) {
87 out.setFieldWidth(columnsSize[i]);
99 for (
const QStringList &row : table) {
101 for (
int i = 0; i < row.size(); ++i) {
104 out.setFieldWidth(columnsSize[i]);
107 out.setFieldWidth(0);
119 QString Utils::decodePercentEncoding(QString *s)
125 QByteArray ba = s->toLatin1();
127 char *data = ba.data();
128 const char *inputPtr = data;
130 const int len = ba.count();
131 bool skipUtf8 =
true;
133 for (
int i = 0 ; i < len; ++i, ++outlen) {
134 const char c = inputPtr[i];
135 if (c ==
'%' && i + 2 < len) {
136 int a = inputPtr[++i];
137 int b = inputPtr[++i];
139 if (a >=
'0' && a <=
'9') a -=
'0';
140 else if (a >=
'a' && a <=
'f') a = a -
'a' + 10;
141 else if (a >=
'A' && a <=
'F') a = a -
'A' + 10;
143 if (b >=
'0' && b <=
'9') b -=
'0';
144 else if (b >=
'a' && b <=
'f') b = b -
'a' + 10;
145 else if (b >=
'A' && b <=
'F') b = b -
'A' + 10;
147 *data++ = (char)((a << 4) | b);
149 }
else if (c ==
'+') {
160 return QString::fromUtf8(ba.data(), outlen);
172 const char *inputPtr = data;
175 bool skipUtf8 =
true;
179 auto processKeyPair = [&] {
181 if ((data - from) == 0) {
182 if (!key.isEmpty()) {
183 ret.insertMulti(key, {});
186 ret.insertMulti(key, skipUtf8 ? QString::fromLatin1(from, data - from) : QString::fromUtf8(from, data - from));
188 }
else if ((data - from) > 0) {
189 ret.insertMulti(skipUtf8 ? QString::fromLatin1(from, data - from) : QString::fromUtf8(from, data - from), {});
193 for (
int i = 0; i < len; ++i, ++outlen) {
194 const char c = inputPtr[i];
195 if (c ==
'%' && i + 2 < len) {
196 int a = inputPtr[++i];
197 int b = inputPtr[++i];
199 if (a >=
'0' && a <=
'9') a -=
'0';
200 else if (a >=
'a' && a <=
'f') a = a -
'a' + 10;
201 else if (a >=
'A' && a <=
'F') a = a -
'A' + 10;
203 if (b >=
'0' && b <=
'9') b -=
'0';
204 else if (b >=
'a' && b <=
'f') b = b -
'a' + 10;
205 else if (b >=
'A' && b <=
'F') b = b -
'A' + 10;
207 *data++ = (char)((a << 4) | b);
209 }
else if (c ==
'+') {
211 }
else if (c ==
'=') {
212 key = skipUtf8 ? QString::fromLatin1(from, data - from) : QString::fromUtf8(from, data - from);
216 }
else if (c ==
'&') {
232 QString Utils::decodePercentEncoding(QByteArray *ba)
238 char *data = ba->data();
239 const char *inputPtr = data;
241 int len = ba->count();
242 bool skipUtf8 =
true;
244 for (
int i = 0; i < len; ++i, ++outlen) {
245 const char c = inputPtr[i];
246 if (c ==
'%' && i + 2 < len) {
247 int a = inputPtr[++i];
248 int b = inputPtr[++i];
250 if (a >=
'0' && a <=
'9') a -=
'0';
251 else if (a >=
'a' && a <=
'f') a = a -
'a' + 10;
252 else if (a >=
'A' && a <=
'F') a = a -
'A' + 10;
254 if (b >=
'0' && b <=
'9') b -=
'0';
255 else if (b >=
'a' && b <=
'f') b = b -
'a' + 10;
256 else if (b >=
'A' && b <=
'F') b = b -
'A' + 10;
258 *data++ = (char)((a << 4) | b);
260 }
else if (c ==
'+') {
268 return QString::fromLatin1(ba->data(), outlen);
270 return QString::fromUtf8(ba->data(), outlen);
The Cutelyst namespace holds all public Cutelyst API.
QMultiMap< QString, QString > ParamsMultiMap