Files
vscode-front-matter/src/helpers/MediaLibrary.ts
T
2021-10-12 15:52:54 +02:00

106 lines
3.2 KiB
TypeScript

import { Dashboard } from '../commands/Dashboard';
import { workspace } from 'vscode';
import { JsonDB } from 'node-json-db/dist/JsonDB';
import { basename, dirname, join, parse } from 'path';
import { Folders, WORKSPACE_PLACEHOLDER } from '../commands/Folders';
import { existsSync, renameSync } from 'fs';
import { Notifications } from './Notifications';
import { parseWinPath } from './parseWinPath';
import { LocalStore } from '../constants';
interface MediaRecord {
description: string;
alt: string;
}
export class MediaLibrary {
private db: JsonDB | undefined;
private static instance: MediaLibrary;
private constructor() {
const wsFolder = Folders.getWorkspaceFolder();
if (!wsFolder) {
return;
}
this.db = new JsonDB(join(parseWinPath(wsFolder?.fsPath || ""), LocalStore.rootFolder, LocalStore.contentFolder, LocalStore.mediaDatabaseFile), true, false, '/');
workspace.onDidRenameFiles(e => {
e.files.forEach(f => {
// Check if file is an image
if (f.oldUri.path.endsWith('.jpeg') ||
f.oldUri.path.endsWith('.jpg') ||
f.oldUri.path.endsWith('.png') ||
f.oldUri.path.endsWith('.gif')) {
this.rename(f.oldUri.fsPath, f.newUri.fsPath);
Dashboard.resetMedia();
}
});
});
}
public static getInstance(): MediaLibrary {
if (!MediaLibrary.instance) {
MediaLibrary.instance = new MediaLibrary();
}
return MediaLibrary.instance;
}
public get(id: string): MediaRecord | undefined {
try {
const fileId = this.parsePath(id);
if (this.db?.exists(fileId)) {
return this.db.getData(fileId);
}
return undefined;
} catch {
return undefined;
}
}
public set(id: string, metadata: any): void {
const fileId = this.parsePath(id);
this.db?.push(fileId, metadata, true);
}
public rename(oldId: string, newId: string): void {
const fileId = this.parsePath(oldId);
const newFileId = this.parsePath(newId);
const data = this.db?.getData(fileId);
if (data) {
this.db?.delete(fileId);
this.db?.push(newFileId, data, true);
}
}
public updateFilename(filePath: string, filename: string) {
const name = basename(filePath);
if (name !== filename && filename) {
try {
const oldFileInfo = parse(filePath);
const newFileInfo = parse(filename);
const newPath = join(dirname(filePath), `${newFileInfo.name}${oldFileInfo.ext}`);
if (existsSync(newPath)) {
Notifications.warning(`The name "${filename}" already exists at the file location.`);
} else {
renameSync(filePath, newPath);
this.rename(filePath, newPath);
Dashboard.resetMedia();
}
} catch(err) {
Notifications.error(`Something went wrong updating "${name}" to "${filename}".`);
}
}
}
private parsePath(path: string) {
const wsFolder = Folders.getWorkspaceFolder();
const isWindows = process.platform === 'win32';
let absPath = path.replace(parseWinPath(wsFolder?.fsPath || ""), WORKSPACE_PLACEHOLDER);
absPath = isWindows ? absPath.split('\\').join('/') : absPath;
return absPath.toLowerCase();
}
}