templates \o/

This commit is contained in:
mProjectsCode 2022-05-13 10:09:07 +02:00
parent a70e576822
commit 1b31436e58
4 changed files with 62 additions and 19 deletions

View file

@ -9,6 +9,12 @@ Search a movie, series, anime or game by its name across multiple APIs.
#### Search by ID
Allows you to search by an ID that varies from API to API. Concrete info can be found in the description of the individual APIs.
#### Templates
The plugin allows you to set a template note that gets added to the end of any note created by this plugin.
The plugin also offers simple "template tgs". E.g. if the template includes `{{ title }}`, it will be replaced by the title of the movie, show or game.
Note that "template tags" are surrounded with two curly braces and that the spaces inside the curly braces are important.
I also published my own templates [here](https://github.com/mProjectsCode/obsidian-media-db-templates).
### Currently supported media types
- movies (including specials)
- series (including OVAs)

View file

@ -3,7 +3,7 @@ import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './sett
import {APIManager} from './api/APIManager';
import {TestAPI} from './api/apis/TestAPI';
import {MediaTypeModel} from './models/MediaTypeModel';
import {replaceIllegalFileNameCharactersInString} from './utils/Utils';
import {replaceIllegalFileNameCharactersInString, replaceTags} from './utils/Utils';
import {OMDbAPI} from './api/apis/OMDbAPI';
import {MediaDbAdvancedSearchModal} from './modals/MediaDbAdvancedSearchModal';
import {MediaDbSearchResultModal} from './modals/MediaDbSearchResultModal';
@ -60,27 +60,23 @@ export default class MediaDbPlugin extends Plugin {
let fileContent = `---\n${data.toMetaData()}---\n`;
let templateFile: TFile = null;
if (data.type === 'movie' && this.settings.movieTemplate) {
const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.movieTemplate).first();
if (templateFile) {
let template = await this.app.vault.read(templateFile);
// console.log(template);
fileContent += template;
}
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.movieTemplate).first();
} else if (data.type === 'series' && this.settings.seriesTemplate) {
const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.seriesTemplate).first();
if (templateFile) {
let template = await this.app.vault.read(templateFile);
// console.log(template);
fileContent += template;
}
} else if (data.type === 'game' && this.settings.seriesTemplate) {
const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first();
if (templateFile) {
let template = await this.app.vault.read(templateFile);
// console.log(template);
fileContent += template;
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.seriesTemplate).first();
} else if (data.type === 'game' && this.settings.gameTemplate) {
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first();
}
if (templateFile) {
let template = await this.app.vault.read(templateFile);
// console.log(template);
if (this.settings.templates) {
template = replaceTags(template, data);
}
fileContent += template;
}
const fileName = replaceIllegalFileNameCharactersInString(data.getFileName());

View file

@ -12,6 +12,7 @@ export interface MediaDbPluginSettings {
movieTemplate: string,
seriesTemplate: string,
gameTemplate: string,
templates: boolean,
}
export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
@ -21,6 +22,7 @@ export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
movieTemplate: '',
seriesTemplate: '',
gameTemplate: '',
templates: true,
};
export class MediaDbSettingTab extends PluginSettingTab {
@ -51,6 +53,17 @@ export class MediaDbSettingTab extends PluginSettingTab {
});
});
new Setting(containerEl)
.setName('Resolve {{ tags }} in templates')
.setDesc('Whether to resolve {{ tags }} in templates. The spaces inside the curly braces are important.')
.addToggle(cb => {
cb.setValue(this.plugin.settings.templates)
.onChange(data => {
this.plugin.settings.templates = data;
this.plugin.saveSettings();
});
});
new Setting(containerEl)
.setName('Movie template')
.setDesc('Template file to be used when creating a new note for a movie.')

View file

@ -15,3 +15,31 @@ export function getFileName(item: MediaTypeModel) {
export function replaceIllegalFileNameCharactersInString(string: string) {
return string.replace(/[\\,#%&{}/*<>$"@.]*/g, '').replace(/:+/g, ' -');
}
export function replaceTags(template: string, mediaTypeModel: MediaTypeModel): string {
const resolvedTemplate = template.replace(new RegExp('{{ .*? }}', 'g'), (match: string) => replaceTag(match, mediaTypeModel));
return resolvedTemplate;
}
function replaceTag(match: string, mediaTypeModel: MediaTypeModel): string {
let tag = match;
tag = tag.substring(3);
tag = tag.substring(0, tag.length - 3);
let parts = tag.split('.');
let o: any = mediaTypeModel;
for (let part of parts) {
if (o !== undefined) {
o = o[part];
}
}
if (o === undefined) {
o = '{{ INVALID TEMPLATE TAG }}';
}
return o;
}