mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added support of inline markup reply to HTML export.
This commit is contained in:
parent
de1bd6ef28
commit
52c779bffa
6 changed files with 106 additions and 24 deletions
|
@ -559,3 +559,26 @@ div.toast_shown {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.bot_buttons_table {
|
||||||
|
border-spacing: 0px 2px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bot_button {
|
||||||
|
border-radius: 8px;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-color: #168acd40;
|
||||||
|
}
|
||||||
|
.bot_button_row {
|
||||||
|
display: table;
|
||||||
|
table-layout: fixed;
|
||||||
|
padding: 0px;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
.bot_button_row div {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
.bot_button_column_separator {
|
||||||
|
width: 2px
|
||||||
|
}
|
||||||
|
|
|
@ -62,6 +62,12 @@ function ShowNotAvailableEmoji() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ShowTextCopied(content) {
|
||||||
|
navigator.clipboard.writeText(content);
|
||||||
|
ShowToast("Text copied to clipboard.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
function ShowSpoiler(target) {
|
function ShowSpoiler(target) {
|
||||||
if (target.classList.contains("hidden")) {
|
if (target.classList.contains("hidden")) {
|
||||||
target.classList.toggle("hidden");
|
target.classList.toggle("hidden");
|
||||||
|
|
|
@ -160,6 +160,30 @@ std::vector<std::vector<HistoryMessageMarkupButton>> ButtonRowsFromTL(
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
QByteArray HistoryMessageMarkupButton::TypeToString(
|
||||||
|
const HistoryMessageMarkupButton &button) {
|
||||||
|
using Type = HistoryMessageMarkupButton::Type;
|
||||||
|
switch (button.type) {
|
||||||
|
case Type::Default: return "default";
|
||||||
|
case Type::Url: return "url";
|
||||||
|
case Type::Callback: return "callback";
|
||||||
|
case Type::CallbackWithPassword: return "callback_with_password";
|
||||||
|
case Type::RequestPhone: return "request_phone";
|
||||||
|
case Type::RequestLocation: return "request_location";
|
||||||
|
case Type::RequestPoll: return "request_poll";
|
||||||
|
case Type::RequestPeer: return "request_peer";
|
||||||
|
case Type::SwitchInline: return "switch_inline";
|
||||||
|
case Type::SwitchInlineSame: return "switch_inline_same";
|
||||||
|
case Type::Game: return "game";
|
||||||
|
case Type::Buy: return "buy";
|
||||||
|
case Type::Auth: return "auth";
|
||||||
|
case Type::UserProfile: return "user_profile";
|
||||||
|
case Type::WebView: return "web_view";
|
||||||
|
case Type::SimpleWebView: return "simple_web_view";
|
||||||
|
}
|
||||||
|
Unexpected("Type in HistoryMessageMarkupButton::Type.");
|
||||||
|
}
|
||||||
|
|
||||||
uint8 PeerColorIndex(BareId bareId) {
|
uint8 PeerColorIndex(BareId bareId) {
|
||||||
const uint8 map[] = { 0, 7, 4, 1, 6, 3, 5 };
|
const uint8 map[] = { 0, 7, 4, 1, 6, 3, 5 };
|
||||||
return map[bareId % base::array_size(map)];
|
return map[bareId % base::array_size(map)];
|
||||||
|
|
|
@ -690,6 +690,8 @@ struct HistoryMessageMarkupButton {
|
||||||
SimpleWebView,
|
SimpleWebView,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static QByteArray TypeToString(const HistoryMessageMarkupButton &);
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
QString text;
|
QString text;
|
||||||
QByteArray data;
|
QByteArray data;
|
||||||
|
|
|
@ -1443,6 +1443,55 @@ auto HtmlWriter::Wrap::pushMessage(
|
||||||
block.append(text);
|
block.append(text);
|
||||||
block.append(popTag());
|
block.append(popTag());
|
||||||
}
|
}
|
||||||
|
if (!message.inlineButtonRows.empty()) {
|
||||||
|
using Type = HistoryMessageMarkupButton::Type;
|
||||||
|
const auto endline = u" | "_q;
|
||||||
|
block.append(pushTag("table", { { "class", "bot_buttons_table" } }));
|
||||||
|
block.append(pushTag("tbody"));
|
||||||
|
for (const auto &row : message.inlineButtonRows) {
|
||||||
|
block.append(pushTag("tr"));
|
||||||
|
block.append(pushTag("td", { { "class", "bot_button_row" } }));
|
||||||
|
for (const auto &button : row) {
|
||||||
|
using Attribute = std::pair<QByteArray, QByteArray>;
|
||||||
|
const auto content = (!button.data.isEmpty()
|
||||||
|
? (u"Data: "_q + button.data + endline)
|
||||||
|
: QString())
|
||||||
|
+ (!button.forwardText.isEmpty()
|
||||||
|
? (u"Forward text: "_q + button.forwardText + endline)
|
||||||
|
: QString())
|
||||||
|
+ (u"Type: "_q
|
||||||
|
+ HistoryMessageMarkupButton::TypeToString(button));
|
||||||
|
const auto link = (button.type == Type::Url)
|
||||||
|
? button.data
|
||||||
|
: QByteArray();
|
||||||
|
const auto onclick = (button.type != Type::Url)
|
||||||
|
? ("return ShowTextCopied('" + content + "');").toUtf8()
|
||||||
|
: QByteArray();
|
||||||
|
block.append(pushTag("div", { { "class", "bot_button" } }));
|
||||||
|
block.append(pushTag("a", {
|
||||||
|
link.isEmpty() ? Attribute() : Attribute{ "href", link },
|
||||||
|
onclick.isEmpty()
|
||||||
|
? Attribute()
|
||||||
|
: Attribute{ "onclick", onclick },
|
||||||
|
}));
|
||||||
|
block.append(pushTag("div"));
|
||||||
|
block.append(button.text.toUtf8());
|
||||||
|
block.append(popTag());
|
||||||
|
block.append(popTag());
|
||||||
|
block.append(popTag());
|
||||||
|
|
||||||
|
if (&button != &row.back()) {
|
||||||
|
block.append(pushTag("div", {
|
||||||
|
{ "class", "bot_button_column_separator" }
|
||||||
|
}));
|
||||||
|
block.append(popTag());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
block.append(popTag());
|
||||||
|
block.append(popTag());
|
||||||
|
}
|
||||||
|
block.append(popTag());
|
||||||
|
}
|
||||||
if (!message.signature.isEmpty()) {
|
if (!message.signature.isEmpty()) {
|
||||||
block.append(pushDiv("signature details"));
|
block.append(pushDiv("signature details"));
|
||||||
block.append(SerializeString(message.signature));
|
block.append(SerializeString(message.signature));
|
||||||
|
|
|
@ -784,29 +784,6 @@ QByteArray SerializeMessage(
|
||||||
pushBare("text_entities", SerializeText(context, message.text, true));
|
pushBare("text_entities", SerializeText(context, message.text, true));
|
||||||
|
|
||||||
if (!message.inlineButtonRows.empty()) {
|
if (!message.inlineButtonRows.empty()) {
|
||||||
const auto typeString = [](
|
|
||||||
const HistoryMessageMarkupButton &entry) -> QByteArray {
|
|
||||||
using Type = HistoryMessageMarkupButton::Type;
|
|
||||||
switch (entry.type) {
|
|
||||||
case Type::Default: return "default";
|
|
||||||
case Type::Url: return "url";
|
|
||||||
case Type::Callback: return "callback";
|
|
||||||
case Type::CallbackWithPassword: return "callback_with_password";
|
|
||||||
case Type::RequestPhone: return "request_phone";
|
|
||||||
case Type::RequestLocation: return "request_location";
|
|
||||||
case Type::RequestPoll: return "request_poll";
|
|
||||||
case Type::RequestPeer: return "request_peer";
|
|
||||||
case Type::SwitchInline: return "switch_inline";
|
|
||||||
case Type::SwitchInlineSame: return "switch_inline_same";
|
|
||||||
case Type::Game: return "game";
|
|
||||||
case Type::Buy: return "buy";
|
|
||||||
case Type::Auth: return "auth";
|
|
||||||
case Type::UserProfile: return "user_profile";
|
|
||||||
case Type::WebView: return "web_view";
|
|
||||||
case Type::SimpleWebView: return "simple_web_view";
|
|
||||||
}
|
|
||||||
Unexpected("Type in HistoryMessageMarkupButton::Type.");
|
|
||||||
};
|
|
||||||
const auto serializeRow = [&](
|
const auto serializeRow = [&](
|
||||||
const std::vector<HistoryMessageMarkupButton> &row) {
|
const std::vector<HistoryMessageMarkupButton> &row) {
|
||||||
context.nesting.push_back(Context::kArray);
|
context.nesting.push_back(Context::kArray);
|
||||||
|
@ -817,7 +794,8 @@ QByteArray SerializeMessage(
|
||||||
auto pairs = std::vector<std::pair<QByteArray, QByteArray>>();
|
auto pairs = std::vector<std::pair<QByteArray, QByteArray>>();
|
||||||
pairs.push_back({
|
pairs.push_back({
|
||||||
"type",
|
"type",
|
||||||
SerializeString(typeString(entry)),
|
SerializeString(
|
||||||
|
HistoryMessageMarkupButton::TypeToString(entry)),
|
||||||
});
|
});
|
||||||
if (!entry.text.isEmpty()) {
|
if (!entry.text.isEmpty()) {
|
||||||
pairs.push_back({
|
pairs.push_back({
|
||||||
|
|
Loading…
Add table
Reference in a new issue