obsidian-sample-plugin/src/utils/utils.ts

89 lines
2.3 KiB
TypeScript

import { TemplaterError } from "./error";
import {
App,
normalizePath,
TAbstractFile,
TFile,
TFolder,
Vault,
} from "obsidian";
export function delay(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
export function escape_RegExp(str: string): string {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}
export function generate_command_regex(): RegExp {
return /<%(?:-|_)?\s*[*~]{0,1}((?:.|\s)*?)(?:-|_)?%>/g;
}
export function generate_dynamic_command_regex(): RegExp {
return /(<%(?:-|_)?\s*[*~]{0,1})\+((?:.|\s)*?%>)/g;
}
export function resolve_tfolder(folder_str: string): TFolder {
folder_str = normalizePath(folder_str);
const folder = app.vault.getAbstractFileByPath(folder_str);
if (!folder) {
throw new TemplaterError(`Folder "${folder_str}" doesn't exist`);
}
if (!(folder instanceof TFolder)) {
throw new TemplaterError(`${folder_str} is a file, not a folder`);
}
return folder;
}
export function resolve_tfile(file_str: string): TFile {
file_str = normalizePath(file_str);
const file = app.vault.getAbstractFileByPath(file_str);
if (!file) {
throw new TemplaterError(`File "${file_str}" doesn't exist`);
}
if (!(file instanceof TFile)) {
throw new TemplaterError(`${file_str} is a folder, not a file`);
}
return file;
}
export function get_tfiles_from_folder(folder_str: string, extension?: string): Array<TFile> {
const folder = resolve_tfolder(folder_str);
const files: Array<TFile> = [];
Vault.recurseChildren(folder, (file: TAbstractFile) => {
if (file instanceof TFile && (extension && file.extension === extension)) {
files.push(file);
}
});
files.sort((a, b) => {
return a.basename.localeCompare(b.basename);
});
return files;
}
export function arraymove<T>(
arr: T[],
fromIndex: number,
toIndex: number
): void {
if (toIndex < 0 || toIndex === arr.length) {
return;
}
const element = arr[fromIndex];
arr[fromIndex] = arr[toIndex];
arr[toIndex] = element;
}
export function get_active_file(app: App) {
return app.workspace.activeEditor?.file ?? app.workspace.getActiveFile();
}