This commit is contained in:
Moritz Jung 2023-05-29 19:46:28 +02:00
commit ed78ffcd64
33 changed files with 468 additions and 364 deletions

View file

@ -2,7 +2,7 @@ import { MediaDbPluginSettings } from '../settings/Settings';
import { MediaType } from './MediaType';
import { MediaTypeModel } from '../models/MediaTypeModel';
import { replaceTags } from './Utils';
import { App, TFile } from 'obsidian';
import { App, TAbstractFile, TFile, TFolder } from 'obsidian';
import { MovieModel } from '../models/MovieModel';
import { SeriesModel } from '../models/SeriesModel';
import { GameModel } from '../models/GameModel';
@ -15,10 +15,11 @@ export const MEDIA_TYPES: MediaType[] = [MediaType.Movie, MediaType.Series, Medi
export class MediaTypeManager {
mediaFileNameTemplateMap: Map<MediaType, string>;
mediaTemplateMap: Map<MediaType, string>;
mediaFolderMap: Map<MediaType, string>;
constructor() {}
updateTemplates(settings: MediaDbPluginSettings) {
updateTemplates(settings: MediaDbPluginSettings): void {
this.mediaFileNameTemplateMap = new Map<MediaType, string>();
this.mediaFileNameTemplateMap.set(MediaType.Movie, settings.movieFileNameTemplate);
this.mediaFileNameTemplateMap.set(MediaType.Series, settings.seriesFileNameTemplate);
@ -36,11 +37,21 @@ export class MediaTypeManager {
this.mediaTemplateMap.set(MediaType.BoardGame, settings.boardgameTemplate);
}
updateFolders(settings: MediaDbPluginSettings): void {
this.mediaFolderMap = new Map<MediaType, string>();
this.mediaFolderMap.set(MediaType.Movie, settings.movieFolder);
this.mediaFolderMap.set(MediaType.Series, settings.seriesFolder);
this.mediaFolderMap.set(MediaType.Game, settings.gameFolder);
this.mediaFolderMap.set(MediaType.Wiki, settings.wikiFolder);
this.mediaFolderMap.set(MediaType.MusicRelease, settings.musicReleaseFolder);
this.mediaFolderMap.set(MediaType.BoardGame, settings.boardgameFolder);
}
getFileName(mediaTypeModel: MediaTypeModel): string {
return replaceTags(this.mediaFileNameTemplateMap.get(mediaTypeModel.getMediaType()), mediaTypeModel);
}
async getTemplate(mediaTypeModel: MediaTypeModel, app: App) {
async getTemplate(mediaTypeModel: MediaTypeModel, app: App): Promise<string> {
const templateFileName = this.mediaTemplateMap.get(mediaTypeModel.getMediaType());
if (!templateFileName) {
@ -61,6 +72,26 @@ export class MediaTypeManager {
return replaceTags(template, mediaTypeModel);
}
async getFolder(mediaTypeModel: MediaTypeModel, app: App): Promise<TFolder> {
let folderPath = this.mediaFolderMap.get(mediaTypeModel.getMediaType());
if (!folderPath) {
folderPath = `/`;
}
console.log(folderPath);
if (!(await app.vault.adapter.exists(folderPath))) {
await app.vault.createFolder(folderPath);
}
const folder: TAbstractFile = app.vault.getAbstractFileByPath(folderPath);
if (!(folder instanceof TFolder)) {
throw Error(`Expected ${folder} to be instance of TFolder`);
}
return folder;
}
/**
* Takes an object and a MediaType and turns the object into an instance of a MediaTypeModel corresponding to the MediaType passed in.
*

View file

@ -7,6 +7,7 @@ import MediaDbPlugin from '../main';
import { MediaDbPreviewModal } from 'src/modals/MediaDbPreviewModal';
import { CreateNoteOptions } from './Utils';
import { MediaDbSearchModal } from '../modals/MediaDbSearchModal';
import { MediaType } from './MediaType';
export enum ModalResultCode {
SUCCESS,
@ -77,7 +78,7 @@ export interface PreviewModalResult {
*/
export interface SearchModalData {
query: string;
types: string[];
types: MediaType[];
}
/**
@ -124,7 +125,7 @@ export interface PreviewModalData {
*/
export interface SearchModalOptions {
modalTitle?: string;
preselectedTypes?: string[];
preselectedTypes?: MediaType[];
prefilledSearchString?: string;
}
@ -228,7 +229,7 @@ export class ModalHelper {
*/
async createSearchModal(searchModalOptions: SearchModalOptions): Promise<{ searchModalResult: SearchModalResult; searchModal: MediaDbSearchModal }> {
const modal = new MediaDbSearchModal(this.plugin, searchModalOptions);
const res: SearchModalResult = await new Promise((resolve, reject) => {
const res: SearchModalResult = await new Promise(resolve => {
modal.setSubmitCallback(res => resolve({ code: ModalResultCode.SUCCESS, data: res }));
modal.setCloseCallback(err => {
if (err) {
@ -268,8 +269,7 @@ export class ModalHelper {
}
try {
let callbackRes: MediaTypeModel[];
callbackRes = await submitCallback(searchModalResult.data);
const callbackRes: MediaTypeModel[] = await submitCallback(searchModalResult.data);
searchModal.close();
return callbackRes;
} catch (e) {
@ -292,7 +292,7 @@ export class ModalHelper {
advancedSearchModalOptions: AdvancedSearchModalOptions
): Promise<{ advancedSearchModalResult: AdvancedSearchModalResult; advancedSearchModal: MediaDbAdvancedSearchModal }> {
const modal = new MediaDbAdvancedSearchModal(this.plugin, advancedSearchModalOptions);
const res: AdvancedSearchModalResult = await new Promise((resolve, reject) => {
const res: AdvancedSearchModalResult = await new Promise(resolve => {
modal.setSubmitCallback(res => resolve({ code: ModalResultCode.SUCCESS, data: res }));
modal.setCloseCallback(err => {
if (err) {
@ -335,8 +335,7 @@ export class ModalHelper {
}
try {
let callbackRes: MediaTypeModel[];
callbackRes = await submitCallback(advancedSearchModalResult.data);
const callbackRes: MediaTypeModel[] = await submitCallback(advancedSearchModalResult.data);
advancedSearchModal.close();
return callbackRes;
} catch (e) {
@ -357,7 +356,7 @@ export class ModalHelper {
*/
async createIdSearchModal(idSearchModalOptions: IdSearchModalOptions): Promise<{ idSearchModalResult: IdSearchModalResult; idSearchModal: MediaDbIdSearchModal }> {
const modal = new MediaDbIdSearchModal(this.plugin, idSearchModalOptions);
const res: IdSearchModalResult = await new Promise((resolve, reject) => {
const res: IdSearchModalResult = await new Promise(resolve => {
modal.setSubmitCallback(res => resolve({ code: ModalResultCode.SUCCESS, data: res }));
modal.setCloseCallback(err => {
if (err) {
@ -400,8 +399,7 @@ export class ModalHelper {
}
try {
let callbackRes: MediaTypeModel;
callbackRes = await submitCallback(idSearchModalResult.data);
const callbackRes: MediaTypeModel = await submitCallback(idSearchModalResult.data);
idSearchModal.close();
return callbackRes;
} catch (e) {
@ -422,7 +420,7 @@ export class ModalHelper {
*/
async createSelectModal(selectModalOptions: SelectModalOptions): Promise<{ selectModalResult: SelectModalResult; selectModal: MediaDbSearchResultModal }> {
const modal = new MediaDbSearchResultModal(this.plugin, selectModalOptions);
const res: SelectModalResult = await new Promise((resolve, reject) => {
const res: SelectModalResult = await new Promise(resolve => {
modal.setSubmitCallback(res => resolve({ code: ModalResultCode.SUCCESS, data: res }));
modal.setSkipCallback(() => resolve({ code: ModalResultCode.SKIP }));
modal.setCloseCallback(err => {
@ -468,8 +466,7 @@ export class ModalHelper {
}
try {
let callbackRes: MediaTypeModel[];
callbackRes = await submitCallback(selectModalResult.data);
const callbackRes: MediaTypeModel[] = await submitCallback(selectModalResult.data);
selectModal.close();
return callbackRes;
} catch (e) {
@ -483,7 +480,7 @@ export class ModalHelper {
async createPreviewModal(previewModalOptions: PreviewModalOptions): Promise<{ previewModalResult: PreviewModalResult; previewModal: MediaDbPreviewModal }> {
//todo: handle attachFile for existing files
const modal = new MediaDbPreviewModal(this.plugin, previewModalOptions);
const res: PreviewModalResult = await new Promise((resolve, reject) => {
const res: PreviewModalResult = await new Promise(resolve => {
modal.setSubmitCallback(res => resolve({ code: ModalResultCode.SUCCESS, data: res }));
modal.setCloseCallback(err => {
if (err) {
@ -515,8 +512,7 @@ export class ModalHelper {
}
try {
let callbackRes: boolean;
callbackRes = await submitCallback(previewModalResult.data);
const callbackRes: boolean = await submitCallback(previewModalResult.data);
previewModal.close();
return callbackRes;
} catch (e) {

View file

@ -4,7 +4,7 @@ import { TFile, TFolder } from 'obsidian';
export const pluginName: string = 'obsidian-media-db-plugin';
export const contactEmail: string = 'm.projects.code@gmail.com';
export const mediaDbTag: string = 'mediaDB';
export const mediaDbVersion: string = '0.4.1';
export const mediaDbVersion: string = '0.5.0';
export const debug: boolean = true;
export function wrapAround(value: number, size: number): number {
@ -14,16 +14,6 @@ export function wrapAround(value: number, size: number): number {
return mod(value, size);
}
/**
* @deprecated use console.debug instead
* @param o
*/
export function debugLog(o: any): void {
if (debug) {
console.log(o);
}
}
export function containsOnlyLettersAndUnderscores(str: string): boolean {
return /^[a-zA-Z_]+$/.test(str);
}
@ -33,9 +23,7 @@ export function replaceIllegalFileNameCharactersInString(string: string): string
}
export function replaceTags(template: string, mediaTypeModel: MediaTypeModel): string {
const resolvedTemplate = template.replace(new RegExp('{{.*?}}', 'g'), (match: string) => replaceTag(match, mediaTypeModel));
return resolvedTemplate;
return template.replace(new RegExp('{{.*?}}', 'g'), (match: string) => replaceTag(match, mediaTypeModel));
}
function replaceTag(match: string, mediaTypeModel: MediaTypeModel): string {
@ -44,11 +32,11 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel): string {
tag = tag.substring(0, tag.length - 2);
tag = tag.trim();
let parts = tag.split(':');
const parts = tag.split(':');
if (parts.length === 1) {
let path = parts[0].split('.');
const path = parts[0].split('.');
let obj = traverseMetaData(path, mediaTypeModel);
const obj = traverseMetaData(path, mediaTypeModel);
if (obj === undefined) {
return '{{ INVALID TEMPLATE TAG - object undefined }}';
@ -56,11 +44,11 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel): string {
return obj;
} else if (parts.length === 2) {
let operator = parts[0];
const operator = parts[0];
let path = parts[1].split('.');
const path = parts[1].split('.');
let obj = traverseMetaData(path, mediaTypeModel);
const obj = traverseMetaData(path, mediaTypeModel);
if (obj === undefined) {
return '{{ INVALID TEMPLATE TAG - object undefined }}';
@ -87,7 +75,7 @@ function replaceTag(match: string, mediaTypeModel: MediaTypeModel): string {
function traverseMetaData(path: Array<string>, mediaTypeModel: MediaTypeModel): any {
let o: any = mediaTypeModel;
for (let part of path) {
for (const part of path) {
if (o !== undefined) {
o = o[part];
}
@ -97,12 +85,12 @@ function traverseMetaData(path: Array<string>, mediaTypeModel: MediaTypeModel):
}
export function markdownTable(content: string[][]): string {
let rows = content.length;
const rows = content.length;
if (rows === 0) {
return '';
}
let columns = content[0].length;
const columns = content[0].length;
if (columns === 0) {
return '';
}
@ -112,7 +100,7 @@ export function markdownTable(content: string[][]): string {
}
}
let longestStringInColumns: number[] = [];
const longestStringInColumns: number[] = [];
for (let i = 0; i < columns; i++) {
let longestStringInColumn = 0;
@ -147,36 +135,18 @@ export function markdownTable(content: string[][]): string {
return table;
}
export function dateToString(date: Date) {
export function dateToString(date: Date): string {
return `${date.getMonth() + 1}-${date.getDate()}-${date.getFullYear()}`;
}
export function timeToString(time: Date) {
export function timeToString(time: Date): string {
return `${time.getHours()}-${time.getMinutes()}-${time.getSeconds()}`;
}
export function dateTimeToString(dateTime: Date) {
export function dateTimeToString(dateTime: Date): string {
return `${dateToString(dateTime)} ${timeToString(dateTime)}`;
}
/**
* @deprecated
*/
export class UserCancelError extends Error {
constructor(message: string) {
super(message);
}
}
/**
* @deprecated
*/
export class UserSkipError extends Error {
constructor(message: string) {
super(message);
}
}
// js can't even implement modulo correctly...
export function mod(n: number, m: number): number {
return ((n % m) + m) % m;
@ -202,6 +172,7 @@ export class PropertyMappingNameConflictError extends Error {
* - attachTemplate: whether to attach the template (DEFAULT: false)
* - attachFie: a file to attach (DEFAULT: undefined)
* - openNote: whether to open the note after creation (DEFAULT: false)
* - folder: folder to put the note in
*/
export interface CreateNoteOptions {
attachTemplate?: boolean;