Merge branch 'master' of https://github.com/mProjectsCode/obsidian-media-db-plugin
This commit is contained in:
commit
ed78ffcd64
33 changed files with 468 additions and 364 deletions
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue