mirror of
https://github.com/docmost/docmost.git
synced 2025-11-12 15:12:39 +10:00
* refactor imports - WIP * Add readstream * WIP * fix attachmentId render * fix attachmentId render * turndown video tag * feat: add stream upload support and improve file handling - Add stream upload functionality to storage drivers\n- Improve ZIP file extraction with better encoding handling\n- Fix attachment ID rendering issues\n- Add AWS S3 upload stream support\n- Update dependencies for better compatibility * WIP * notion formatter * move embed parser to editor-ext package * import embeds * utility files * cleanup * Switch from happy-dom to cheerio * Refine code * WIP * bug fixes and UI * sync * WIP * sync * keep import modal mounted * Show modal during upload * WIP * WIP
67 lines
1.7 KiB
TypeScript
67 lines
1.7 KiB
TypeScript
import { promises as fs } from 'fs';
|
|
import * as path from 'path';
|
|
|
|
export async function buildAttachmentCandidates(
|
|
extractDir: string,
|
|
): Promise<Map<string, string>> {
|
|
const map = new Map<string, string>();
|
|
async function walk(dir: string) {
|
|
for (const ent of await fs.readdir(dir, { withFileTypes: true })) {
|
|
const abs = path.join(dir, ent.name);
|
|
if (ent.isDirectory()) {
|
|
await walk(abs);
|
|
} else {
|
|
if (['.md', '.html'].includes(path.extname(ent.name).toLowerCase())) {
|
|
continue;
|
|
}
|
|
|
|
const rel = path.relative(extractDir, abs).split(path.sep).join('/');
|
|
map.set(rel, abs);
|
|
}
|
|
}
|
|
}
|
|
|
|
await walk(extractDir);
|
|
return map;
|
|
}
|
|
|
|
export function resolveRelativeAttachmentPath(
|
|
raw: string,
|
|
pageDir: string,
|
|
attachmentCandidates: Map<string, string>,
|
|
): string | null {
|
|
const mainRel = decodeURIComponent(raw.replace(/^\.?\/+/, ''));
|
|
const fallback = path.normalize(path.join(pageDir, mainRel));
|
|
|
|
if (attachmentCandidates.has(mainRel)) {
|
|
return mainRel;
|
|
}
|
|
if (attachmentCandidates.has(fallback)) {
|
|
return fallback;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export async function collectMarkdownAndHtmlFiles(
|
|
dir: string,
|
|
): Promise<string[]> {
|
|
const results: string[] = [];
|
|
|
|
async function walk(current: string) {
|
|
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
for (const ent of entries) {
|
|
const fullPath = path.join(current, ent.name);
|
|
if (ent.isDirectory()) {
|
|
await walk(fullPath);
|
|
} else if (
|
|
['.md', '.html'].includes(path.extname(ent.name).toLowerCase())
|
|
) {
|
|
results.push(fullPath);
|
|
}
|
|
}
|
|
}
|
|
|
|
await walk(dir);
|
|
return results;
|
|
}
|