history_item_text.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "history/history_item_text.h"
  8. #include "history/history_item.h"
  9. #include "history/history_item_components.h"
  10. #include "data/data_media_types.h"
  11. #include "data/data_web_page.h"
  12. #include "data/data_groups.h"
  13. #include "data/data_peer.h"
  14. #include "lang/lang_keys.h"
  15. #include "ui/text/text_options.h"
  16. TextForMimeData HistoryItemText(not_null<HistoryItem*> item) {
  17. const auto media = item->media();
  18. auto mediaResult = media ? media->clipboardText() : TextForMimeData();
  19. auto textResult = mediaResult.empty()
  20. ? item->clipboardText()
  21. : TextForMimeData();
  22. auto logEntryOriginalResult = [&] {
  23. const auto entry = item->Get<HistoryMessageLogEntryOriginal>();
  24. if (!entry) {
  25. return TextForMimeData();
  26. }
  27. const auto title = TextUtilities::SingleLine(
  28. entry->page->title.isEmpty()
  29. ? entry->page->author
  30. : entry->page->title);
  31. auto titleResult = TextForMimeData::Rich(
  32. TextUtilities::ParseEntities(
  33. title,
  34. Ui::WebpageTextTitleOptions().flags));
  35. auto descriptionResult = TextForMimeData::Rich(
  36. base::duplicate(entry->page->description));
  37. if (titleResult.empty()) {
  38. return descriptionResult;
  39. } else if (descriptionResult.empty()) {
  40. return titleResult;
  41. }
  42. titleResult.append('\n').append(std::move(descriptionResult));
  43. return titleResult;
  44. }();
  45. auto factcheckResult = [&] {
  46. const auto factcheck = item->Get<HistoryMessageFactcheck>();
  47. return factcheck
  48. ? TextForMimeData::Rich(base::duplicate(factcheck->data.text))
  49. : TextForMimeData();
  50. }();
  51. auto result = textResult;
  52. if (result.empty()) {
  53. result = std::move(mediaResult);
  54. } else if (!mediaResult.empty()) {
  55. result.append(qstr("\n\n")).append(std::move(mediaResult));
  56. }
  57. if (result.empty()) {
  58. result = std::move(logEntryOriginalResult);
  59. } else if (!logEntryOriginalResult.empty()) {
  60. result.append(u"\n\n"_q).append(std::move(logEntryOriginalResult));
  61. }
  62. if (result.empty()) {
  63. result = std::move(factcheckResult);
  64. } else if (!factcheckResult.empty()) {
  65. result.append(u"\n\n"_q).append(std::move(factcheckResult));
  66. }
  67. return result;
  68. }
  69. TextForMimeData HistoryGroupText(not_null<const Data::Group*> group) {
  70. Expects(!group->items.empty());
  71. const auto columnAlbum = [&] {
  72. const auto item = group->items.front();
  73. if (const auto media = item->media()) {
  74. if (const auto document = media->document()) {
  75. return !document->isVideoFile();
  76. }
  77. }
  78. return false;
  79. }();
  80. const auto hasCaption = [](not_null<HistoryItem*> item) {
  81. return !item->clipboardText().empty();
  82. };
  83. if (columnAlbum) {
  84. const auto simple = !ranges::any_of(group->items, hasCaption);
  85. if (!simple) {
  86. auto result = TextForMimeData();
  87. for (const auto &item : group->items) {
  88. if (result.empty()) {
  89. result = HistoryItemText(item);
  90. } else {
  91. result.append(u"\n\n"_q).append(HistoryItemText(item));
  92. }
  93. }
  94. return result;
  95. }
  96. }
  97. return [&] {
  98. auto &&nonempty = ranges::views::all(
  99. group->items
  100. ) | ranges::views::filter(
  101. hasCaption
  102. ) | ranges::views::take(2);
  103. auto first = nonempty.begin();
  104. auto end = nonempty.end();
  105. if (first == end) {
  106. return TextForMimeData();
  107. }
  108. auto result = (*first)->clipboardText();
  109. return (++first == end) ? result : TextForMimeData();
  110. }();
  111. }