Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit fbeddba

Browse files
authored
Add link to next file in the export (#10190)
Co-authored-by: grimhilt <[email protected]>
1 parent 168f6df commit fbeddba

File tree

3 files changed

+94
-17
lines changed

3 files changed

+94
-17
lines changed

src/utils/exportUtils/HtmlExport.tsx

+45-11
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export default class HTMLExporter extends Exporter {
8989
return renderToStaticMarkup(avatar);
9090
}
9191

92-
protected async wrapHTML(content: string): Promise<string> {
92+
protected async wrapHTML(content: string, currentPage: number, nbPages: number): Promise<string> {
9393
const roomAvatar = await this.getRoomAvatar();
9494
const exportDate = formatFullDateNoDayNoTime(new Date());
9595
const creator = this.room.currentState.getStateEvents(EventType.RoomCreate, "")?.getSender();
@@ -128,6 +128,29 @@ export default class HTMLExporter extends Exporter {
128128
);
129129

130130
const topicText = topic ? _t("Topic: %(topic)s", { topic }) : "";
131+
const previousMessagesLink = renderToStaticMarkup(
132+
currentPage !== 0 ? (
133+
<div style={{ textAlign: "center" }}>
134+
<a href={`./messages${currentPage === 1 ? "" : currentPage}.html`} style={{ fontWeight: "bold" }}>
135+
Previous group of messages
136+
</a>
137+
</div>
138+
) : (
139+
<></>
140+
),
141+
);
142+
143+
const nextMessagesLink = renderToStaticMarkup(
144+
currentPage < nbPages - 1 ? (
145+
<div style={{ textAlign: "center", margin: "10px" }}>
146+
<a href={"./messages" + (currentPage + 2) + ".html"} style={{ fontWeight: "bold" }}>
147+
Next group of messages
148+
</a>
149+
</div>
150+
) : (
151+
<></>
152+
),
153+
);
131154

132155
return `
133156
<!DOCTYPE html>
@@ -168,6 +191,7 @@ export default class HTMLExporter extends Exporter {
168191
<div class="mx_RoomHeader_topic" dir="auto"> ${topic} </div>
169192
</div>
170193
</div>
194+
${previousMessagesLink}
171195
<div class="mx_MainSplit">
172196
<div class="mx_RoomView_body">
173197
<div
@@ -186,13 +210,17 @@ export default class HTMLExporter extends Exporter {
186210
aria-live="polite"
187211
role="list"
188212
>
189-
<div class="mx_NewRoomIntro">
190-
${roomAvatar}
191-
<h2> ${this.room.name} </h2>
192-
<p> ${createdText} <br/><br/> ${exportedText} </p>
193-
<br/>
194-
<p> ${topicText} </p>
195-
</div>
213+
${
214+
currentPage == 0
215+
? `<div class="mx_NewRoomIntro">
216+
${roomAvatar}
217+
<h2> ${this.room.name} </h2>
218+
<p> ${createdText} <br/><br/> ${exportedText} </p>
219+
<br/>
220+
<p> ${topicText} </p>
221+
</div>`
222+
: ""
223+
}
196224
${content}
197225
</ol>
198226
</div>
@@ -205,6 +233,7 @@ export default class HTMLExporter extends Exporter {
205233
</div>
206234
</div>
207235
</div>
236+
${nextMessagesLink}
208237
</main>
209238
</div>
210239
</div>
@@ -381,7 +410,12 @@ export default class HTMLExporter extends Exporter {
381410
return eventTile;
382411
}
383412

384-
protected async createHTML(events: MatrixEvent[], start: number): Promise<string> {
413+
protected async createHTML(
414+
events: MatrixEvent[],
415+
start: number,
416+
currentPage: number,
417+
nbPages: number,
418+
): Promise<string> {
385419
let content = "";
386420
let prevEvent: MatrixEvent | null = null;
387421
for (let i = start; i < Math.min(start + 1000, events.length); i++) {
@@ -405,7 +439,7 @@ export default class HTMLExporter extends Exporter {
405439
content += body;
406440
prevEvent = event;
407441
}
408-
return this.wrapHTML(content);
442+
return this.wrapHTML(content, currentPage, nbPages);
409443
}
410444

411445
public async export(): Promise<void> {
@@ -428,7 +462,7 @@ export default class HTMLExporter extends Exporter {
428462

429463
const usedClasses = new Set<string>();
430464
for (let page = 0; page < res.length / 1000; page++) {
431-
const html = await this.createHTML(res, page * 1000);
465+
const html = await this.createHTML(res, page * 1000, page, res.length / 1000);
432466
const document = new DOMParser().parseFromString(html, "text/html");
433467
document.querySelectorAll("*").forEach((element) => {
434468
element.classList.forEach((c) => usedClasses.add(c));

test/utils/exportUtils/HTMLExport-test.ts

+41
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,45 @@ describe("HTMLExport", () => {
315315
expect(fileName).not.toMatch(/^files\/hello/);
316316
}
317317
});
318+
319+
it("should add link to next and previous file", async () => {
320+
const exporter = new HTMLExporter(
321+
room,
322+
ExportType.LastNMessages,
323+
{
324+
attachmentsIncluded: false,
325+
maxSize: 1_024 * 1_024,
326+
},
327+
() => {},
328+
);
329+
330+
// test link to the first page
331+
//@ts-ignore private access
332+
exporter.wrapHTML("", 0, 3).then((res) => {
333+
expect(res).not.toContain("Previous group of messages");
334+
expect(res).toContain(
335+
'<div style="text-align:center;margin:10px"><a href="./messages2.html" style="font-weight:bold">Next group of messages</a></div>',
336+
);
337+
});
338+
339+
// test link for a middle page
340+
//@ts-ignore private access
341+
exporter.wrapHTML("", 1, 3).then((res) => {
342+
expect(res).toContain(
343+
'<div style="text-align:center"><a href="./messages.html" style="font-weight:bold">Previous group of messages</a></div>',
344+
);
345+
expect(res).toContain(
346+
'<div style="text-align:center;margin:10px"><a href="./messages3.html" style="font-weight:bold">Next group of messages</a></div>',
347+
);
348+
});
349+
350+
// test link for last page
351+
//@ts-ignore private access
352+
exporter.wrapHTML("", 2, 3).then((res) => {
353+
expect(res).toContain(
354+
'<div style="text-align:center"><a href="./messages2.html" style="font-weight:bold">Previous group of messages</a></div>',
355+
);
356+
expect(res).not.toContain("Next group of messages");
357+
});
358+
});
318359
});

test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap

+8-6
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)