Improve escaping of some data in HTML export.

This commit is contained in:
John Preston 2021-02-01 16:57:42 +04:00
parent 4e5c81dac2
commit eb11185de7
1 changed files with 17 additions and 54 deletions

View File

@ -151,6 +151,7 @@ QByteArray SerializeList(const std::vector<QByteArray> &values) {
} }
return QByteArray(); return QByteArray();
} }
QByteArray MakeLinks(const QByteArray &value) { QByteArray MakeLinks(const QByteArray &value) {
const auto domain = QByteArray("https://telegram.org/"); const auto domain = QByteArray("https://telegram.org/");
auto result = QByteArray(); auto result = QByteArray();
@ -190,27 +191,6 @@ QByteArray MakeLinks(const QByteArray &value) {
return result; return result;
} }
void SerializeMultiline(
QByteArray &appendTo,
const QByteArray &value,
int newline) {
const auto data = value.data();
auto offset = 0;
do {
appendTo.append("> ");
const auto win = (newline > 0 && *(data + newline - 1) == '\r');
if (win) --newline;
appendTo.append(data + offset, newline - offset).append(kLineBreak);
if (win) ++newline;
offset = newline + 1;
newline = value.indexOf('\n', offset);
} while (newline > 0);
if (const auto size = value.size(); size > offset) {
appendTo.append("> ");
appendTo.append(data + offset, size - offset).append(kLineBreak);
}
}
QByteArray JoinList( QByteArray JoinList(
const QByteArray &separator, const QByteArray &separator,
const std::vector<QByteArray> &list) { const std::vector<QByteArray> &list) {
@ -294,31 +274,6 @@ QByteArray FormatText(
}) | ranges::to_vector); }) | ranges::to_vector);
} }
QByteArray SerializeKeyValue(
std::vector<std::pair<QByteArray, QByteArray>> &&values) {
auto result = QByteArray();
for (const auto &[key, value] : values) {
if (value.isEmpty()) {
continue;
}
result.append(key);
if (const auto newline = value.indexOf('\n'); newline >= 0) {
result.append(':').append(kLineBreak);
SerializeMultiline(result, value, newline);
} else {
result.append(": ").append(value).append(kLineBreak);
}
}
return result;
}
QByteArray SerializeBlockquote(
std::vector<std::pair<QByteArray, QByteArray>> &&values) {
return "<blockquote>"
+ SerializeKeyValue(std::move(values))
+ "</blockquote>";
}
Data::Utf8String FormatUsername(const Data::Utf8String &username) { Data::Utf8String FormatUsername(const Data::Utf8String &username) {
return username.isEmpty() ? username : ('@' + username); return username.isEmpty() ? username : ('@' + username);
} }
@ -766,7 +721,9 @@ QByteArray HtmlWriter::Wrap::pushUserpic(const UserpicData &userpic) {
"line-height: " + size)); "line-height: " + size));
auto character = [](const QByteArray &from) { auto character = [](const QByteArray &from) {
const auto utf = QString::fromUtf8(from).trimmed(); const auto utf = QString::fromUtf8(from).trimmed();
return utf.isEmpty() ? QByteArray() : utf.mid(0, 1).toUtf8(); return utf.isEmpty()
? QByteArray()
: SerializeString(utf.mid(0, 1).toUtf8());
}; };
result.append(character(userpic.firstName)); result.append(character(userpic.firstName));
result.append(character(userpic.lastName)); result.append(character(userpic.lastName));
@ -997,16 +954,20 @@ auto HtmlWriter::Wrap::pushMessage(
const auto serviceText = v::match(message.action.content, [&]( const auto serviceText = v::match(message.action.content, [&](
const ActionChatCreate &data) { const ActionChatCreate &data) {
return serviceFrom return serviceFrom
+ " created group &laquo;" + data.title + "&raquo;" + " created group &laquo;"
+ SerializeString(data.title)
+ "&raquo;"
+ (data.userIds.empty() + (data.userIds.empty()
? QByteArray() ? QByteArray()
: " with members " + peers.wrapUserNames(data.userIds)); : " with members " + peers.wrapUserNames(data.userIds));
}, [&](const ActionChatEditTitle &data) { }, [&](const ActionChatEditTitle &data) {
return isChannel return isChannel
? ("Channel title changed to &laquo;" + data.title + "&raquo;") ? ("Channel title changed to &laquo;"
+ SerializeString(data.title)
+ "&raquo;")
: (serviceFrom : (serviceFrom
+ " changed group title to &laquo;" + " fchanged group title to &laquo;"
+ data.title + SerializeString(data.title)
+ "&raquo;"); + "&raquo;");
}, [&](const ActionChatEditPhoto &data) { }, [&](const ActionChatEditPhoto &data) {
return isChannel return isChannel
@ -1029,14 +990,16 @@ auto HtmlWriter::Wrap::pushMessage(
+ " joined group by link from " + " joined group by link from "
+ peers.wrapUserName(data.inviterId); + peers.wrapUserName(data.inviterId);
}, [&](const ActionChannelCreate &data) { }, [&](const ActionChannelCreate &data) {
return "Channel &laquo;" + data.title + "&raquo; created"; return "Channel &laquo;"
+ SerializeString(data.title)
+ "&raquo; created";
}, [&](const ActionChatMigrateTo &data) { }, [&](const ActionChatMigrateTo &data) {
return serviceFrom return serviceFrom
+ " converted this group to a supergroup"; + " converted this group to a supergroup";
}, [&](const ActionChannelMigrateFrom &data) { }, [&](const ActionChannelMigrateFrom &data) {
return serviceFrom return serviceFrom
+ " converted a basic group to this supergroup " + " converted a basic group to this supergroup "
+ "&laquo;" + data.title + "&raquo;"; + "&laquo;" + SerializeString(data.title) + "&raquo;";
}, [&](const ActionPinMessage &data) { }, [&](const ActionPinMessage &data) {
return serviceFrom return serviceFrom
+ " pinned " + " pinned "
@ -1062,7 +1025,7 @@ auto HtmlWriter::Wrap::pushMessage(
return data.message; return data.message;
}, [&](const ActionBotAllowed &data) { }, [&](const ActionBotAllowed &data) {
return "You allowed this bot to message you when you logged in on " return "You allowed this bot to message you when you logged in on "
+ data.domain; + SerializeString(data.domain);
}, [&](const ActionSecureValuesSent &data) { }, [&](const ActionSecureValuesSent &data) {
auto list = std::vector<QByteArray>(); auto list = std::vector<QByteArray>();
for (const auto type : data.types) { for (const auto type : data.types) {