export_output_html.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. #pragma once
  8. #include "export/output/export_output_abstract.h"
  9. #include "export/output/export_output_file.h"
  10. #include "export/export_settings.h"
  11. #include "export/data/export_data_types.h"
  12. namespace Export {
  13. namespace Output {
  14. namespace details {
  15. class HtmlContext {
  16. public:
  17. [[nodiscard]] QByteArray pushTag(
  18. const QByteArray &tag,
  19. std::map<QByteArray, QByteArray> &&attributes = {});
  20. [[nodiscard]] QByteArray popTag();
  21. [[nodiscard]] QByteArray indent() const;
  22. [[nodiscard]] bool empty() const;
  23. private:
  24. struct Tag {
  25. QByteArray name;
  26. bool block = true;
  27. };
  28. std::vector<Tag> _tags;
  29. };
  30. struct UserpicData;
  31. struct StoryData;
  32. class PeersMap;
  33. struct MediaData;
  34. } // namespace details
  35. class HtmlWriter : public AbstractWriter {
  36. public:
  37. HtmlWriter();
  38. Format format() override {
  39. return Format::Html;
  40. }
  41. Result start(
  42. const Settings &settings,
  43. const Environment &environment,
  44. Stats *stats) override;
  45. Result writePersonal(const Data::PersonalInfo &data) override;
  46. Result writeUserpicsStart(const Data::UserpicsInfo &data) override;
  47. Result writeUserpicsSlice(const Data::UserpicsSlice &data) override;
  48. Result writeUserpicsEnd() override;
  49. Result writeStoriesStart(const Data::StoriesInfo &data) override;
  50. Result writeStoriesSlice(const Data::StoriesSlice &data) override;
  51. Result writeStoriesEnd() override;
  52. Result writeContactsList(const Data::ContactsList &data) override;
  53. Result writeSessionsList(const Data::SessionsList &data) override;
  54. Result writeOtherData(const Data::File &data) override;
  55. Result writeDialogsStart(const Data::DialogsInfo &data) override;
  56. Result writeDialogStart(const Data::DialogInfo &data) override;
  57. Result writeDialogSlice(const Data::MessagesSlice &data) override;
  58. Result writeDialogEnd() override;
  59. Result writeDialogsEnd() override;
  60. Result finish() override;
  61. QString mainFilePath() override;
  62. ~HtmlWriter();
  63. private:
  64. using Context = details::HtmlContext;
  65. using UserpicData = details::UserpicData;
  66. using MediaData = details::MediaData;
  67. class Wrap;
  68. struct MessageInfo;
  69. enum class DialogsMode {
  70. None,
  71. Chats,
  72. Left,
  73. };
  74. [[nodiscard]] Result copyFile(
  75. const QString &source,
  76. const QString &relativePath) const;
  77. [[nodiscard]] QString mainFileRelativePath() const;
  78. [[nodiscard]] QString pathWithRelativePath(const QString &path) const;
  79. [[nodiscard]] std::unique_ptr<Wrap> fileWithRelativePath(
  80. const QString &path) const;
  81. [[nodiscard]] QString messagesFile(int index) const;
  82. [[nodiscard]] Result writeSavedContacts(const Data::ContactsList &data);
  83. [[nodiscard]] Result writeFrequentContacts(const Data::ContactsList &data);
  84. [[nodiscard]] Result writeSessions(const Data::SessionsList &data);
  85. [[nodiscard]] Result writeWebSessions(const Data::SessionsList &data);
  86. [[nodiscard]] Result validateDialogsMode(bool isLeftChannel);
  87. [[nodiscard]] Result writeDialogOpening(int index);
  88. [[nodiscard]] Result switchToNextChatFile(int index);
  89. [[nodiscard]] Result writeEmptySinglePeer();
  90. void pushSection(
  91. int priority,
  92. const QByteArray &label,
  93. const QByteArray &type,
  94. int count,
  95. const QString &path);
  96. [[nodiscard]] Result writeSections();
  97. [[nodiscard]] Result writeDefaultPersonal(
  98. const Data::PersonalInfo &data);
  99. [[nodiscard]] Result writeDelayedPersonal(const QString &userpicPath);
  100. [[nodiscard]] Result writePreparedPersonal(
  101. const Data::PersonalInfo &data,
  102. const QString &userpicPath);
  103. void pushUserpicsSection();
  104. void pushStoriesSection();
  105. [[nodiscard]] QString userpicsFilePath() const;
  106. [[nodiscard]] QString storiesFilePath() const;
  107. [[nodiscard]] QByteArray wrapMessageLink(
  108. int messageId,
  109. QByteArray text);
  110. Settings _settings;
  111. Environment _environment;
  112. Stats *_stats = nullptr;
  113. struct SavedSection;
  114. std::vector<SavedSection> _savedSections;
  115. std::unique_ptr<Wrap> _summary;
  116. bool _summaryNeedDivider = false;
  117. bool _haveSections = false;
  118. uint8 _selfColorIndex = 0;
  119. std::unique_ptr<Data::PersonalInfo> _delayedPersonalInfo;
  120. int _userpicsCount = 0;
  121. std::unique_ptr<Wrap> _userpics;
  122. int _storiesCount = 0;
  123. std::unique_ptr<Wrap> _stories;
  124. QString _dialogsRelativePath;
  125. Data::DialogInfo _dialog;
  126. DialogsMode _dialogsMode = DialogsMode::None;
  127. int _messagesCount = 0;
  128. std::unique_ptr<MessageInfo> _lastMessageInfo;
  129. int _dateMessageId = 0;
  130. std::unique_ptr<Wrap> _chats;
  131. std::unique_ptr<Wrap> _chat;
  132. std::vector<int> _lastMessageIdsPerFile;
  133. bool _chatFileEmpty = false;
  134. };
  135. } // namespace Output
  136. } // namespace Export