refactor(export/share): build index file

This commit is contained in:
Elian Doran 2025-06-23 18:46:21 +03:00
parent acb0991d05
commit 0efdf65202
No known key found for this signature in database
3 changed files with 25 additions and 3 deletions

View File

@ -16,7 +16,7 @@ import ValidationError from "../../errors/validation_error.js";
import type NoteMeta from "../meta/note_meta.js"; import type NoteMeta from "../meta/note_meta.js";
import type AttachmentMeta from "../meta/attachment_meta.js"; import type AttachmentMeta from "../meta/attachment_meta.js";
import type AttributeMeta from "../meta/attribute_meta.js"; import type AttributeMeta from "../meta/attribute_meta.js";
import type BBranch from "../../becca/entities/bbranch.js"; import BBranch from "../../becca/entities/bbranch.js";
import type { Response } from "express"; import type { Response } from "express";
import type { NoteMetaFile } from "../meta/note_meta.js"; import type { NoteMetaFile } from "../meta/note_meta.js";
import HtmlExportProvider from "./zip/html.js"; import HtmlExportProvider from "./zip/html.js";
@ -41,7 +41,8 @@ async function exportToZip(taskContext: TaskContext, branch: BBranch, format: "h
getNoteTargetUrl, getNoteTargetUrl,
metaFile, metaFile,
archive, archive,
rootMeta: rootMeta! rootMeta: rootMeta!,
branch
}; };
switch (format) { switch (format) {
case "html": case "html":

View File

@ -22,6 +22,7 @@ export interface AdvancedExportOptions {
} }
export interface ZipExportProviderData { export interface ZipExportProviderData {
branch: BBranch;
getNoteTargetUrl: (targetNoteId: string, sourceMeta: NoteMeta) => string | null; getNoteTargetUrl: (targetNoteId: string, sourceMeta: NoteMeta) => string | null;
metaFile: NoteMetaFile; metaFile: NoteMetaFile;
rootMeta: NoteMeta; rootMeta: NoteMeta;
@ -30,7 +31,7 @@ export interface ZipExportProviderData {
} }
export abstract class ZipExportProvider { export abstract class ZipExportProvider {
branch: BBranch;
metaFile: NoteMetaFile; metaFile: NoteMetaFile;
getNoteTargetUrl: (targetNoteId: string, sourceMeta: NoteMeta) => string | null; getNoteTargetUrl: (targetNoteId: string, sourceMeta: NoteMeta) => string | null;
rootMeta: NoteMeta; rootMeta: NoteMeta;
@ -38,6 +39,7 @@ export abstract class ZipExportProvider {
zipExportOptions?: AdvancedExportOptions; zipExportOptions?: AdvancedExportOptions;
constructor(data: ZipExportProviderData) { constructor(data: ZipExportProviderData) {
this.branch = data.branch;
this.metaFile = data.metaFile; this.metaFile = data.metaFile;
this.getNoteTargetUrl = data.getNoteTargetUrl; this.getNoteTargetUrl = data.getNoteTargetUrl;
this.rootMeta = data.rootMeta; this.rootMeta = data.rootMeta;

View File

@ -11,6 +11,7 @@ import type BBranch from "../../../becca/entities/bbranch.js";
export default class ShareThemeExportProvider extends ZipExportProvider { export default class ShareThemeExportProvider extends ZipExportProvider {
private assetsMeta: NoteMeta[] = []; private assetsMeta: NoteMeta[] = [];
private indexMeta: NoteMeta | null = null;
prepareMeta(): void { prepareMeta(): void {
const assets = [ const assets = [
@ -33,6 +34,13 @@ export default class ShareThemeExportProvider extends ZipExportProvider {
this.assetsMeta.push(assetMeta); this.assetsMeta.push(assetMeta);
this.metaFile.files.push(assetMeta); this.metaFile.files.push(assetMeta);
} }
this.indexMeta = {
noImport: true,
dataFileName: "index.html"
};
this.metaFile.files.push(this.indexMeta);
} }
prepareContent(title: string, content: string | Buffer, noteMeta: NoteMeta, note: BNote | undefined, branch: BBranch): string | Buffer { prepareContent(title: string, content: string | Buffer, noteMeta: NoteMeta, note: BNote | undefined, branch: BBranch): string | Buffer {
@ -50,6 +58,17 @@ export default class ShareThemeExportProvider extends ZipExportProvider {
afterDone(): void { afterDone(): void {
this.#saveAssets(this.rootMeta, this.assetsMeta); this.#saveAssets(this.rootMeta, this.assetsMeta);
this.#saveIndex();
}
#saveIndex() {
if (!this.indexMeta?.dataFileName) {
return;
}
const note = this.branch.getNote();
const fullHtml = this.prepareContent(this.rootMeta.title ?? "", note.getContent(), this.rootMeta, note, this.branch);
this.archive.append(fullHtml, { name: this.indexMeta.dataFileName });
} }
#saveAssets(rootMeta: NoteMeta, assetsMeta: NoteMeta[]) { #saveAssets(rootMeta: NoteMeta, assetsMeta: NoteMeta[]) {