add function: support search and create file

This commit is contained in:
wanxp 2022-11-04 23:57:10 +08:00
parent cd9c300cb7
commit 9e633823e4
14 changed files with 931 additions and 252 deletions

38
main.ts

@ -25,31 +25,32 @@ export default class DoubanPlugin extends Plugin {
async putToObsidian(context: HandleContext, extract: DoubanSubject) {
try {
if (!extract) {
log.warn(i18nHelper.getMessage('140101'));
return;
}
this.showStatus('140204', extract.title);
const content = await this.doubanExtractHandler.parseText(extract, context)
if (content) {
this.putContentToObsidian(context, content);
const result = await this.doubanExtractHandler.parseText(extract, context)
if (result) {
this.putContentToObsidian(context, result);
}
this.showStatus('140205', extract.title);
} catch (e) {
this.showStatus('140206', e.message);
} finally {
setTimeout(() => this.doubanStatusBar.empty(), BasicConst.CLEAN_STATUS_BAR_DELAY)
this.clearStatusBarDelay();
}
}
async putContentToObsidian(context: HandleContext, content: HandleResult) {
async putContentToObsidian(context: HandleContext, result: HandleResult) {
const {mode} = context;
switch (mode) {
case SearchHandleMode.FOR_CREATE:
this.createFile(context, content);
this.createFile(context, result);
break;
case SearchHandleMode.FOR_REPLACE:
this.putToEditor(context.editor, content.content);
this.putToEditor(context.editor, result.content);
break;
}
}
@ -58,8 +59,11 @@ export default class DoubanPlugin extends Plugin {
editor.replaceSelection(content);
}
async createFile(context: HandleContext, content: HandleResult) {
this.fileHandler.createNewNoteWithData(content.fileName,content.content);
async createFile(context: HandleContext, result: HandleResult) {
let filePath = this.settings.dataFilePath;
filePath = filePath?filePath:DEFAULT_SETTINGS.dataFilePath;
filePath = FileUtil.join(filePath, result.fileName);
this.fileHandler.createNewNoteWithData(filePath, result.content);
}
async search(searchTerm: string, context: HandleContext) {
@ -71,7 +75,7 @@ export default class DoubanPlugin extends Plugin {
} catch (e) {
this.showStatus('140206', e.message);
} finally {
setTimeout(() => this.doubanStatusBar.empty(), BasicConst.CLEAN_STATUS_BAR_DELAY)
this.clearStatusBarDelay();
}
}
@ -95,8 +99,9 @@ export default class DoubanPlugin extends Plugin {
async onload() {
await this.loadSettings();
if (this.settings.statusBar) {
this.doubanStatusBar = this.addStatusBarItem();
}
this.addCommand({
id: "search-douban-import-and-create-file",
@ -138,10 +143,19 @@ export default class DoubanPlugin extends Plugin {
showStatus(origin: string, message: string) {
if (!this.settings.statusBar || !this.doubanStatusBar) {
return;
}
this.doubanStatusBar.empty();
// @ts-ignore
this.doubanStatusBar.setText(i18nHelper.getMessage(origin).replace('{0}', message));
}
clearStatusBarDelay() {
if (!this.settings.statusBar || !this.doubanStatusBar) {
return;
}
setTimeout(() => this.doubanStatusBar.empty(), BasicConst.CLEAN_STATUS_BAR_DELAY)
}
}

@ -4,8 +4,6 @@ import {doubanHeaders} from "./Douban";
export const DEFAULT_SETTINGS: DoubanPluginSetting = {
//以后会被移除
bookTemplate: "", gameTemplate: "", movieTemplate: "", musicTemplate: "", noteTemplate: "", teleplayTemplate: "",
movieTemplateFile: ``,
bookTemplateFile: ``,
musicTemplateFile: ``,
@ -19,5 +17,6 @@ export const DEFAULT_SETTINGS: DoubanPluginSetting = {
arraySpilt: ", ",
personNameMode: PersonNameMode.CH_NAME,
dataFilePath: "",
dataFileNamePath: "/{{type}}/{{title}}"
dataFileNamePath: "/{{type}}/{{title}}",
statusBar: true,
}

@ -1,3 +1,5 @@
import {TemplateKey} from "./Constsant";
export const DEFAULT_TEMPLATE_CONTENT = {
movieTemplateFileContent: `---
doubanId: {{id}}
@ -118,3 +120,12 @@ desc: {{desc}}
![image]({{image}})
`,
}
/**
*
* @param key
*/
export function getDefaultTemplateContent(key: TemplateKey): string {
// @ts-ignore
return DEFAULT_TEMPLATE_CONTENT[key + "Content"];
}

@ -10,9 +10,10 @@ import YamlUtil from "../../../utils/YamlUtil";
import {BasicConst, PersonNameMode, SearchHandleMode, TemplateKey, TemplateTextMode} from "../../../constant/Constsant";
import HandleContext from "@App/data/model/HandleContext";
import HandleResult from "@App/data/model/HandleResult";
import {DEFAULT_TEMPLATE_CONTENT} from "../../../constant/DefaultTemplateContent";
import {DEFAULT_TEMPLATE_CONTENT, getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent";
import FileHandler from "../../../file/FileHandler";
import StringUtil from "../../../utils/StringUtil";
import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings";
export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject> implements DoubanSubjectLoadHandler<T> {
@ -50,12 +51,17 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
}
let fileName:string = '';
if (SearchHandleMode.FOR_CREATE == context.mode) {
fileName = this.parsePartText(template, extract, context);
fileName = this.parsePartText(this.getFileName(context), extract, context);
}
return {content: result, fileName: fileName};
}
private getFileName(context:HandleContext): string {
const {dataFileNamePath} = context.settings;
return dataFileNamePath ? dataFileNamePath : DEFAULT_SETTINGS.dataFileNamePath;
}
/**
*
* @param text
@ -97,10 +103,13 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
*/
handleSpecialContent(value: any, textMode: TemplateTextMode = TemplateTextMode.NORMAL, context: HandleContext = null): string {
let result;
if (!value) {
return i18nHelper.getMessage('410101');
}
if (value instanceof Array) {
result = this.handleContentArray(value, context, textMode);
} else if (value instanceof Number) {
result = value ? value.toString() : '';
result = value.toString();
} else {
result = this.handleSpecialText(value, textMode);
}
@ -146,11 +155,11 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
let regValue: RegExpExecArray;
switch (settings.personNameMode) {
case PersonNameMode.CH_NAME:
regValue = /[\u4e00-\u9fa5]{2,20}/g.exec(name);
regValue = /[\u4e00-\u9fa50-9.]{2,20}/g.exec(name);
resultName = regValue ? regValue[0] : name;
break;
case PersonNameMode.EN_NAME:
regValue = /[a-zA-Z.\s-]{2,50}/g.exec(name);
regValue = /[0-9a-zA-Z.\s-]{2,50}/g.exec(name);
resultName = regValue ? regValue[0] : name;
break;
default:
@ -188,7 +197,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
private parsePartText(template: string, extract: T, context: HandleContext, textMode: TemplateTextMode = TemplateTextMode.NORMAL): string {
const resultContent = template
.replaceAll(DoubanParameter.ID, extract.id)
.replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(extract.title, textMode))
.replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(this.getPersonName(extract.title, context), textMode))
.replaceAll(DoubanParameter.TYPE, extract.type)
.replaceAll(DoubanParameter.SCORE, this.handleSpecialContent(extract.score))
.replaceAll(DoubanParameter.IMAGE, extract.image)
@ -206,25 +215,17 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
private async getTemplate(context: HandleContext):Promise<string> {
const tempKey:TemplateKey = this.getTemplateKey(context);
// @ts-ignore
const oldTemplate:string = context.settings[tempKey.replace('File', '')]
if (oldTemplate && oldTemplate.length > 0) {
return oldTemplate;
}
const templatePath:string = context.settings[tempKey];
// @ts-ignore
const defaultContent = DEFAULT_TEMPLATE_CONTENT[tempKey + 'Content'];
if (!templatePath || StringUtil.isBlank(templatePath)) {
return defaultContent;
return getDefaultTemplateContent(tempKey);
}
const defaultContent = getDefaultTemplateContent(tempKey);
let firstLinkpathDest:TFile = this.doubanPlugin.app.metadataCache.getFirstLinkpathDest(templatePath, '');
if (!firstLinkpathDest) {
return defaultContent;
}else {
// return firstLinkpathDest.
const val = await this.doubanPlugin.fileHandler.getFileContent(firstLinkpathDest.path);
return val?val:defaultContent;
}

@ -6,6 +6,7 @@ import DoubanSubject from "../model/DoubanSubject";
import {TemplateKey, TemplateTextMode} from "../../../constant/Constsant";
import StringUtil from "../../../utils/StringUtil";
import HandleContext from "@App/data/model/HandleContext";
import {i18nHelper} from "../../../lang/helper";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {

@ -22,165 +22,14 @@ export class DoubanSettingTab extends PluginSettingTab {
display(): void {
const {containerEl} = this;
containerEl.empty();
containerEl.createEl("h2", {text: 'Obsidian Douban'});
new Setting(containerEl);
this.settingsManager.constructBasicUI(containerEl);
this.settingsManager.constructTemplateUI(containerEl);
this.settingsManager.constructOutUI(containerEl);
new Setting(containerEl).setName(i18nHelper.getMessage('120001'))
.then((setting) => {
setting.addText((textField) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120002'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120003'));
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120901'),
href: 'https://www.douban.com',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120004'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120005'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120006'));
frag.createEl('br');
})
);
textField.inputEl.addClass("obsidian_douban_settings_textField");
textField
.setPlaceholder(DEFAULT_SETTINGS.searchUrl)
.setValue(this.plugin.settings.searchUrl)
.onChange(async (value) => {
this.plugin.settings.searchUrl = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120501')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120503')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', {cls: 'u-pop'}));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.dateFormat);
mf.setValue(this.plugin.settings.dateFormat)
mf.onChange(async (value) => {
this.plugin.settings.dateFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120502')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120504')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', {cls: 'u-pop'}));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.timeFormat);
mf.setValue(this.plugin.settings.timeFormat)
mf.onChange(async (value) => {
this.plugin.settings.timeFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl)
.setName(i18nHelper.getMessage('120601'))
.setDesc(i18nHelper.getMessage('120602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt)
.setValue(this.plugin.settings.arraySpilt)
.onChange(async (value) => {
this.plugin.settings.arraySpilt = value;
await this.plugin.saveSettings();
});
});
this.settingsManager.constructUI(containerEl);
new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => {
setting.addDropdown((dropdwon) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('121202'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121203'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121204'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121205'));
frag.createEl('br');
})
);
// dropdwon.inputEl.addClass("settings_area");
// dropdwon.inputEl.setAttr("rows", 10);
dropdwon.addOption(PersonNameMode.CH_NAME, PersonNameModeRecords.CH)
dropdwon.addOption(PersonNameMode.EN_NAME, PersonNameModeRecords.EN)
dropdwon.addOption(PersonNameMode.CH_EN_NAME, PersonNameModeRecords.CH_EN)
dropdwon.setValue(this.plugin.settings.personNameMode)
.onChange(async (value: string) => {
this.plugin.settings.personNameMode = value as PersonNameMode;
await this.plugin.saveSettings();
});
});
});
this.settingsManager.constructTemplateVariablesUI(containerEl);
}
}

@ -3,34 +3,41 @@ import {CreateTemplateSelectParams} from "@App/setting/model/CreateTemplateSelec
import { FileSuggest } from "./model/FileSuggest";
import {SearchComponent, Setting} from "obsidian";
import { log } from "src/utils/Logutil";
import {getDefaultTemplateContent} from "../../constant/DefaultTemplateContent";
import {FolderSuggest} from "@App/setting/model/FolderSuggest";
export function createFileSelectionSetting({
name, desc, placeholder, key, manager,
export function createFileSelectionSetting({name, desc, placeholder, key, manager
}: CreateTemplateSelectParams) {
return (setting: Setting) => {
// @ts-ignore
setting.setName(i18nHelper.getMessage(name));
const templateDesc = new DocumentFragment();
// @ts-ignore
templateDesc.createDiv().innerHTML = i18nHelper.getMessage(desc) + `<br> <text class="obsidian_douban_settings_desc has_error" >不存在文件夹</> `;
setting.setDesc(templateDesc);
setting.setDesc(i18nHelper.getMessage(desc));
setting.addSearch(async (search: SearchComponent) => {
const [oldValue, defaultVal] = manager.getSetting(key);
let v = defaultVal;
if (oldValue) {
v = oldValue;
}
const fs = new FileSuggest(manager.app, search.inputEl);
new FileSuggest(manager.app, search.inputEl);
// @ts-ignore
search.setValue(v);
// @ts-ignore
search.setPlaceholder(i18nHelper.getMessage(placeholder));
search.onChange(async (value: string) => {
log.trace(`hange to : ${value} `)
manager.updateSetting(key, value);
});
});
setting.addExtraButton((button) => {
button
.setIcon('copy')
.setTooltip(i18nHelper.getMessage('121901'))
.onClick(async () => {
// @ts-ignore
navigator.clipboard.writeText(getDefaultTemplateContent(key))
});
});
};
}
@ -49,9 +56,9 @@ export function createFolderSelectionSetting({
if (oldValue) {
v = oldValue;
}
new FileSuggest(manager.app, search.inputEl);
search
.setValue(v)
new FolderSuggest(manager.app, search.inputEl);
// @ts-ignore
search.setValue(v)
// @ts-ignore
.setPlaceholder(i18nHelper.getMessage(placeholder))
.onChange(async (value: string) => {

@ -3,6 +3,8 @@ import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings";
import DoubanPlugin from "../../../main";
import { DoubanPluginSetting } from "./model/DoubanPluginSetting";
import {createFileSelectionSetting, createFolderSelectionSetting} from "@App/setting/SettingHelper";
import {i18nHelper} from "../../lang/helper";
import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant";
export default class SettingsManager {
app: App;
@ -17,24 +19,446 @@ export default class SettingsManager {
}
getSetting(key: keyof DoubanPluginSetting) {
return [this.settings[key], DEFAULT_SETTINGS[key]];
}
async updateSetting(key: keyof DoubanPluginSetting, value:any) {
// @ts-ignore
this.settings[key] = value;
await this.plugin.saveSettings();
}
constructUI(contenterEl: HTMLElement) {
new Setting(contenterEl).then(createFileSelectionSetting({name: '120101', desc: '120102', placeholder: '121701', key: 'movieTemplateFile', manager: this}));
new Setting(contenterEl).then(createFileSelectionSetting({name: '120201', desc: '120202', placeholder: '121701', key: 'bookTemplateFile', manager: this}));
new Setting(contenterEl).then(createFileSelectionSetting({name: '120301', desc: '120302', placeholder: '121701', key: 'musicTemplateFile', manager: this}));
new Setting(contenterEl).then(createFileSelectionSetting({name: '120401', desc: '120402', placeholder: '121701', key: 'noteTemplateFile', manager: this}));
new Setting(contenterEl).then(createFileSelectionSetting({name: '121301', desc: '121302', placeholder: '121701', key: 'gameTemplateFile', manager: this}));
new Setting(contenterEl).then(createFileSelectionSetting({name: '121301', desc: '121302', placeholder: '121701', key: 'teleplayTemplateFile', manager: this}));
new Setting(contenterEl).then(createFolderSelectionSetting({name: '121301', desc: '121302', placeholder: '121701', key: 'dataFilePath', manager: this}));
constructBasicUI(containerEl: HTMLElement){
containerEl.createEl('h3', { text: i18nHelper.getMessage('1210') });
new Setting(containerEl).setName(i18nHelper.getMessage('120001'))
.then((setting) => {
setting.addText((textField) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('120002'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120003'));
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120901'),
href: 'https://www.douban.com',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120004'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120005'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120006'));
frag.createEl('br');
})
);
textField.inputEl.addClass("obsidian_douban_settings_textField");
textField
.setPlaceholder(DEFAULT_SETTINGS.searchUrl)
.setValue(this.plugin.settings.searchUrl)
.onChange(async (value) => {
this.plugin.settings.searchUrl = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120501')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120503')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', {cls: 'u-pop'}));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.dateFormat);
mf.setValue(this.plugin.settings.dateFormat)
mf.onChange(async (value) => {
this.plugin.settings.dateFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('120502')).then((setting) => {
setting.addMomentFormat((mf) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(
i18nHelper.getMessage('120504')
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120506') + ' ');
frag.createEl(
'a',
{
text: i18nHelper.getMessage('120508'),
href: 'https://momentjs.com/docs/#/displaying/format/',
},
(a) => {
a.setAttr('target', '_blank');
}
);
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('120507') + ': ');
mf.setSampleEl(frag.createEl('b', {cls: 'u-pop'}));
frag.createEl('br');
})
);
mf.setPlaceholder(DEFAULT_SETTINGS.timeFormat);
mf.setValue(this.plugin.settings.timeFormat)
mf.onChange(async (value) => {
this.plugin.settings.timeFormat = value;
await this.plugin.saveSettings();
});
});
});
new Setting(containerEl)
.setName(i18nHelper.getMessage('121401'))
.setDesc(i18nHelper.getMessage('121402'))
.addToggle((toggleComponent) => {
toggleComponent
// .setTooltip(i18nHelper.getMessage('121403'))
.setValue(this.plugin.settings.statusBar)
.onChange(async (value) => {
this.plugin.settings.statusBar = value;
await this.plugin.saveSettings();
});
});
}
constructTemplateUI(containerEl: HTMLElement) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1203') });
containerEl.createEl('p', { text: i18nHelper.getMessage('1204') });
new Setting(containerEl).setDesc(i18nHelper.getMessage('1205'))
new Setting(containerEl).then(createFileSelectionSetting({name: '120101', desc: '120102', placeholder: '121701', key: 'movieTemplateFile', manager: this}));
new Setting(containerEl).then(createFileSelectionSetting({name: '120201', desc: '120202', placeholder: '121701', key: 'bookTemplateFile', manager: this}));
new Setting(containerEl).then(createFileSelectionSetting({name: '120301', desc: '120302', placeholder: '121701', key: 'musicTemplateFile', manager: this}));
new Setting(containerEl).then(createFileSelectionSetting({name: '120401', desc: '120402', placeholder: '121701', key: 'noteTemplateFile', manager: this}));
new Setting(containerEl).then(createFileSelectionSetting({name: '121301', desc: '121302', placeholder: '121701', key: 'gameTemplateFile', manager: this}));
new Setting(containerEl).then(createFileSelectionSetting({name: '121801', desc: '121802', placeholder: '121701', key: 'teleplayTemplateFile', manager: this}));
}
constructOutUI(containerEl: HTMLElement) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1220') });
new Setting(containerEl).then(createFolderSelectionSetting({name: '121501', desc: '121502', placeholder: '121503', key: 'dataFilePath', manager: this}));
let outfolder = containerEl.createDiv({ cls: 'settings-item' });
this.constructOutFolderUI(outfolder);
new Setting(containerEl)
.setName(i18nHelper.getMessage('120601'))
.setDesc(i18nHelper.getMessage('120602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt)
.setValue(this.plugin.settings.arraySpilt)
.onChange(async (value) => {
this.plugin.settings.arraySpilt = value;
await this.plugin.saveSettings();
});
});
new Setting(containerEl).setName(i18nHelper.getMessage('121201')).then((setting) => {
setting.addDropdown((dropdwon) => {
setting.descEl.appendChild(
createFragment((frag) => {
frag.appendText(i18nHelper.getMessage('121202'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121203'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121204'));
frag.createEl('br');
frag.appendText(i18nHelper.getMessage('121205'));
frag.createEl('br');
})
);
// dropdwon.inputEl.addClass("settings_area");
// dropdwon.inputEl.setAttr("rows", 10);
dropdwon.addOption(PersonNameMode.CH_NAME, PersonNameModeRecords.CH)
dropdwon.addOption(PersonNameMode.EN_NAME, PersonNameModeRecords.EN)
dropdwon.addOption(PersonNameMode.CH_EN_NAME, PersonNameModeRecords.CH_EN)
dropdwon.setValue(this.plugin.settings.personNameMode)
.onChange(async (value: string) => {
this.plugin.settings.personNameMode = value as PersonNameMode;
await this.plugin.saveSettings();
});
});
});
}
constructTemplateVariablesUI(containerEl: HTMLElement) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1230') });
containerEl.createEl('p', { text: i18nHelper.getMessage('122003') });
const basicVariablesTable = new DocumentFragment();
basicVariablesTable.createDiv().innerHTML = `
${i18nHelper.getMessage('122004')}
<br>
<br>
<table border="1">
<tr>
<th>${i18nHelper.getMessage('300101')}</th>
<th>${i18nHelper.getMessage('300102')}</th>
<th>${i18nHelper.getMessage('300103')}</th>
<th>${i18nHelper.getMessage('300104')}</th>
<th>${i18nHelper.getMessage('300105')}</th>
<th>${i18nHelper.getMessage('300106')}</th>
<th>${i18nHelper.getMessage('300107')}</th>
<th>${i18nHelper.getMessage('300108')}</th>
</tr>
<tr>
<td>id</td>
<td>${i18nHelper.getMessage('310101')}</td>
<td>${i18nHelper.getMessage('310201')}</td>
<td>${i18nHelper.getMessage('310301')}</td>
<td>${i18nHelper.getMessage('310401')}</td>
<td>${i18nHelper.getMessage('310501')}</td>
<td>${i18nHelper.getMessage('310601')}</td>
<td>${i18nHelper.getMessage('310701')}</td>
</tr>
<tr>
<td>title</td>
<td>${i18nHelper.getMessage('310102')}</td>
<td>${i18nHelper.getMessage('310202')}</td>
<td>${i18nHelper.getMessage('310302')}</td>
<td>${i18nHelper.getMessage('310402')}</td>
<td>${i18nHelper.getMessage('310502')}</td>
<td>${i18nHelper.getMessage('310602')}</td>
<td>${i18nHelper.getMessage('310702')}</td>
</tr>
<tr>
<td>type</td>
<td>${i18nHelper.getMessage('310103')}</td>
<td>${i18nHelper.getMessage('310203')}</td>
<td>${i18nHelper.getMessage('310303')}</td>
<td>${i18nHelper.getMessage('310403')}</td>
<td>${i18nHelper.getMessage('310503')}</td>
<td>${i18nHelper.getMessage('310603')}</td>
<td>${i18nHelper.getMessage('310703')}</td>
</tr>
<tr>
<td>score</td>
<td>${i18nHelper.getMessage('310104')}</td>
<td>${i18nHelper.getMessage('310204')}</td>
<td>${i18nHelper.getMessage('310304')}</td>
<td>${i18nHelper.getMessage('310404')}</td>
<td>${i18nHelper.getMessage('310504')}</td>
<td>${i18nHelper.getMessage('310604')}</td>
<td>${i18nHelper.getMessage('310704')}</td>
</tr>
<tr>
<td>image</td>
<td>${i18nHelper.getMessage('310105')}</td>
<td>${i18nHelper.getMessage('310205')}</td>
<td>${i18nHelper.getMessage('310305')}</td>
<td>${i18nHelper.getMessage('310405')}</td>
<td>${i18nHelper.getMessage('310505')}</td>
<td>${i18nHelper.getMessage('310605')}</td>
<td>${i18nHelper.getMessage('310705')}</td>
</tr>
<tr>
<td>url</td>
<td>${i18nHelper.getMessage('310106')}</td>
<td>${i18nHelper.getMessage('310206')}</td>
<td>${i18nHelper.getMessage('310306')}</td>
<td>${i18nHelper.getMessage('310406')}</td>
<td>${i18nHelper.getMessage('310506')}</td>
<td>${i18nHelper.getMessage('310606')}</td>
<td>${i18nHelper.getMessage('310706')}</td>
</tr>
<tr>
<td>desc</td>
<td>${i18nHelper.getMessage('310107')}</td>
<td>${i18nHelper.getMessage('310207')}</td>
<td>${i18nHelper.getMessage('310307')}</td>
<td>${i18nHelper.getMessage('310407')}</td>
<td>${i18nHelper.getMessage('310507')}</td>
<td>${i18nHelper.getMessage('310607')}</td>
<td>${i18nHelper.getMessage('310707')}</td>
</tr>
<tr>
<td>publisher</td>
<td>${i18nHelper.getMessage('310108')}</td>
<td>${i18nHelper.getMessage('310208')}</td>
<td>${i18nHelper.getMessage('310308')}</td>
<td>${i18nHelper.getMessage('310408')}</td>
<td>${i18nHelper.getMessage('310508')}</td>
<td>${i18nHelper.getMessage('310608')}</td>
<td>${i18nHelper.getMessage('310708')}</td>
</tr>
<tr>
<td>datePublished</td>
<td>${i18nHelper.getMessage('310109')}</td>
<td>${i18nHelper.getMessage('310209')}</td>
<td>${i18nHelper.getMessage('310309')}</td>
<td>${i18nHelper.getMessage('310409')}</td>
<td>${i18nHelper.getMessage('310509')}</td>
<td>${i18nHelper.getMessage('310609')}</td>
<td>${i18nHelper.getMessage('310709')}</td>
</tr>
<tr>
<td>genre</td>
<td>${i18nHelper.getMessage('310110')}</td>
<td>${i18nHelper.getMessage('310210')}</td>
<td>${i18nHelper.getMessage('310310')}</td>
<td>${i18nHelper.getMessage('310410')}</td>
<td>${i18nHelper.getMessage('310510')}</td>
<td>${i18nHelper.getMessage('310610')}</td>
<td>${i18nHelper.getMessage('310710')}</td>
</tr>
</table>`;
new Setting(containerEl)
.setName(i18nHelper.getMessage('122001'))
.setDesc(basicVariablesTable)
;
const extraVariablesTable = new DocumentFragment();
extraVariablesTable.createDiv().innerHTML = `
${i18nHelper.getMessage('122004')}
<br>
<br>
<table border="1">
<tr>
<th>${i18nHelper.getMessage('300101')}</th>
<th>${i18nHelper.getMessage('300102')}</th>
<th>${i18nHelper.getMessage('300103')}</th>
<th>${i18nHelper.getMessage('300104')}</th>
<th>${i18nHelper.getMessage('300105')}</th>
<th>${i18nHelper.getMessage('300106')}</th>
<th>${i18nHelper.getMessage('300107')}</th>
<th>${i18nHelper.getMessage('300108')}</th>
</tr>
<tr>
<td>${i18nHelper.getMessage('320101')}</th>
<td>${i18nHelper.getMessage('310111')}</th>
<td>${i18nHelper.getMessage('310211')}</th>
<td>${i18nHelper.getMessage('310311')}</th>
<td>${i18nHelper.getMessage('310411')}</th>
<td>${i18nHelper.getMessage('310511')}</th>
<td>${i18nHelper.getMessage('310611')}</th>
<td>${i18nHelper.getMessage('310711')}</th>
</tr>
<td>${i18nHelper.getMessage('320102')}</th>
<td>${i18nHelper.getMessage('310112')}</th>
<td>${i18nHelper.getMessage('310212')}</th>
<td>${i18nHelper.getMessage('310312')}</th>
<td>${i18nHelper.getMessage('310412')}</th>
<td>${i18nHelper.getMessage('310512')}</th>
<td>${i18nHelper.getMessage('310612')}</th>
<td>${i18nHelper.getMessage('310712')}</th>
</tr>
<tr>
<td>${i18nHelper.getMessage('320103')}</th>
<td>${i18nHelper.getMessage('310113')}</th>
<td>${i18nHelper.getMessage('310213')}</th>
<td>${i18nHelper.getMessage('310313')}</th>
<td>${i18nHelper.getMessage('310413')}</th>
<td>${i18nHelper.getMessage('310513')}</th>
<td>${i18nHelper.getMessage('310613')}</th>
<td>${i18nHelper.getMessage('310713')}</th>
</tr>
<tr>
<td>${i18nHelper.getMessage('320104')}</th>
<td>${i18nHelper.getMessage('310114')}</th>
<td>${i18nHelper.getMessage('310214')}</th>
<td>${i18nHelper.getMessage('310314')}</th>
<td>${i18nHelper.getMessage('310414')}</th>
<td>${i18nHelper.getMessage('310514')}</th>
<td>${i18nHelper.getMessage('310614')}</th>
<td>${i18nHelper.getMessage('310714')}</th>
</tr>
<tr>
<td>${i18nHelper.getMessage('320105')}</th>
<td>${i18nHelper.getMessage('310115')}</th>
<td>${i18nHelper.getMessage('310215')}</th>
<td>${i18nHelper.getMessage('310315')}</th>
<td>${i18nHelper.getMessage('310415')}</th>
<td>${i18nHelper.getMessage('310515')}</th>
<td>${i18nHelper.getMessage('310615')}</th>
<td>${i18nHelper.getMessage('310715')}</th>
</tr>
<tr>
<td>${i18nHelper.getMessage('320106')}</th>
<td>${i18nHelper.getMessage('310116')}</th>
<td>${i18nHelper.getMessage('310216')}</th>
<td>${i18nHelper.getMessage('310316')}</th>
<td>${i18nHelper.getMessage('310416')}</th>
<td>${i18nHelper.getMessage('310516')}</th>
<td>${i18nHelper.getMessage('310616')}</th>
<td>${i18nHelper.getMessage('310716')}</th>
</tr>
<tr>
<td>${i18nHelper.getMessage('320107')}</th>
<td>${i18nHelper.getMessage('310117')}</th>
<td>${i18nHelper.getMessage('310217')}</th>
<td>${i18nHelper.getMessage('310317')}</th>
<td>${i18nHelper.getMessage('310417')}</th>
<td>${i18nHelper.getMessage('310517')}</th>
<td>${i18nHelper.getMessage('310617')}</th>
<td>${i18nHelper.getMessage('310717')}</th>
</tr>
</table>`;
new Setting(containerEl)
.setName(i18nHelper.getMessage('122002'))
.setDesc(extraVariablesTable);
}
constructOutFolderUI(containerEl: HTMLElement) {
containerEl.empty();
const dataFilePathSetting = new Setting(containerEl)
.setName(i18nHelper.getMessage('121601'))
.setDesc(i18nHelper.getMessage('121602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.dataFileNamePath)
.setValue(this.plugin.settings.dataFileNamePath)
.onChange(async (value) => {
this.plugin.settings.dataFileNamePath = value;
await this.plugin.saveSettings();
});
});
dataFilePathSetting.addExtraButton((button) => {
button
.setIcon('reset')
.setTooltip(i18nHelper.getMessage('121902'))
.onClick(async () => {
this.plugin.settings.dataFileNamePath = DEFAULT_SETTINGS.dataFileNamePath;
await this.plugin.saveSettings();
this.constructOutFolderUI(containerEl)
});
})
}
}

@ -1,13 +1,5 @@
export interface DoubanPluginSetting {
//==兼容之前的配置
movieTemplate: string,
bookTemplate: string,
musicTemplate: string,
noteTemplate: string,
gameTemplate: string,
teleplayTemplate: string,
//一段时间后会被删除,以上
movieTemplateFile: string,
bookTemplateFile: string,
musicTemplateFile: string,
@ -22,5 +14,6 @@ export interface DoubanPluginSetting {
personNameMode: string,
dataFilePath: string,
dataFileNamePath: string,
statusBar: boolean,
}

@ -3,6 +3,7 @@ import {App, normalizePath, Platform} from "obsidian";
import { log } from "src/utils/Logutil";
import DoubanPlugin from "../../main";
import {FileUtil} from "../utils/FileUtil";
import {i18nHelper} from "../lang/helper";
/**
*
@ -92,7 +93,7 @@ export default class FileHandler {
const fileExists = await adapter.exists(filePath);
if (fileExists) {
// If the file already exists, respond with error
throw new Error(`${filePath} already exists`);
throw new Error(i18nHelper.getMessage('110201').replace('{0}', filePath??''));
}
if (dir !== '') {
// If `input` includes a directory part, create it
@ -123,7 +124,7 @@ export default class FileHandler {
err
);
//TODO i18n
log.error('Failed to read the template')
log.error(i18nHelper.getMessage('110202').replace('{0}', normalizedTemplatePath ?? ''));
return "";
}
}

@ -8,6 +8,8 @@ export default {
'110005': `Cancel`,
'110006': `sync douban broadcast ot Obsidian`,
'110101': 'search douban and create file',
'110201': `{0} already exists`,
'110202': `{0} template can not read`,
@ -20,20 +22,27 @@ export default {
'120005': `The redirected web page address is the search address,`,
'120006': `Just copy the web address to the current input box.`,
'120101': `Movie Content Template`,
'120102': `Set markdown Movie template for extract to be inserted.`,
'1210': `Basic Setting`,
'1203': `Template Setting`,
'1220': `Output Setting`,
'1230': `Usable Variables`,
'1204': `Set template file path. If keep empty, it will use the default template file to create file. All the usable variables at the end.👇`,
'1205': `🧡Tip: You can click the 'Copy' button to copy default template content, then create and paste to your own template file. After that, back to select the file. `,
'120101': `Movie Template File`,
'120102': `This template will be used when creating new notes for Movie from Obsidian-Douban.`,
'120103': `Available template variables are :`,
'120104': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120105': `{{url}}, {{desc}}, {{datePublished}}, {{genre}}, `,
'120106': `{{originalTitle}},{{director}}, {{author}},`,
'120107': ` {{actor}}`,
'120110': `Movie Template File`,
'120130': `Create New File Path`,
'120131': `Create New File Name`,
'120201': `Book Template File`,
'120202': `Set markdown Book template for extract to be inserted.`,
'120202': `This template will be used when creating new notes for Movie from Obsidian-Douban. `,
'120203': `Available Book template variables are :`,
'120204': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120205': `{{url}}, {{desc}}, {{datePublished}}, {{publisher}}`,
@ -42,7 +51,7 @@ export default {
'120208': `{{series}}, {{binding}}, {{menu}}`,
'120301': `Music Template File`,
'120302': `Set markdown Music template for extract to be inserted.`,
'120302': `This template will be used when creating new notes for Music from Obsidian-Douban.`,
'120303': `Available Music template variables are :`,
'120304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120305': `{{url}}, {{desc}}, {{datePublished}}, {{genre}},`,
@ -50,7 +59,7 @@ export default {
'120307': `{{barcode}}, {{records}}`,
'120401': `Article Template File`,
'120402': `Set markdown Article template for extract to be inserted.`,
'120402': `This template will be used when creating new notes for Article from Obsidian-Douban.`,
'120403': `Available Article template variables are :`,
'120404': `{{id}}, {{title}}, {{type}}, {{image}},`,
'120405': `{{url}}, {{desc}}, {{datePublished}}`,
@ -58,12 +67,15 @@ export default {
'120407': `{{timePublished}}`,
'121301': `Game Template File`,
'121302': `Set markdown Game template for extract to be inserted.`,
'121302': `This template will be used when creating new notes for Game from Obsidian-Douban.`,
'121303': `Available Game template variables are :`,
'121304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'121305': `{{url}}, {{desc}}, {{publisher}}, {{datePublished}}`,
'121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`,
'121801': `Teleplay Template File`,
'121802': `This template will be used when creating new notes for Teleplay from Obsidian-Douban.`,
'120501': `Date Format`,
'120502': `Time Format`,
'120503': `This format will be used when available template variables contain date.`,
@ -95,19 +107,20 @@ export default {
'121502': `Nodes created from Obsidian-Douban will be placed in this folder, If blank, they will be placed in the default location for this vault. `,
'121503': `Default Folder`,
'121601': `Note Name`,
'121602': `Nodes created from Obsidian-Douban will use this fileName(also support filePath), If blank, they will be created by default name. `,
'121602': `Nodes created from Obsidian-Douban will use this fileName as template(also support filePath),
If blank, they will be created by default name. support all basic template variables. example: {{type}}/{{title}}`,
'121701': `Input And Search Template`,
'121702': `Movie created from Obsidian-Douban will be placed in this folder, If blank, they will be placed in the default location for this vault. `,
'121701': `Search Template File`,
// '121702': `Movie created from Obsidian-Douban will be placed in this folder, If blank, they will be placed in the default location for this vault. `,
'121703': `Default`,
'121901': `Copy default template content to clipboard`,
'121902': `Reset to default value`,
//error
'130101': `Fetch Data Error, You can go to Github add Issues`,
'130201': `Obsidian Douban Plugin Error: `,
'130301': `Obsidian Douban Plugin Warn: `,
'140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`,
'140201': `[Obsidian Douban]: searching '{0}'...`,
@ -123,7 +136,170 @@ export default {
'200101': `. `,
'210101': `Default`,
'210201': `Search...`
'210201': `Search...`,
'122001': `Basic Variables`,
'122002': `Extra Variables`,
'122003': `Basic Variables must has value, Extra Variables can be empty`,
'122004': `To use the template variables, you need to wrap them in double curly brackets. For example, {{title}} will be replaced with the title of the note.`,
'410101': `Unknown`,
//参数
'300101': `参数`,
'300102': `书籍`,
'300103': `电影`,
'300104': `电视剧`,
'300105': `音乐`,
'300106': `日记`,
'300107': `游戏`,
'300108': `广播`,
//书籍
'310101': `豆瓣ID`,
'310102': `书名`,
'310103': `类型`,
'310104': `评分`,
'310105': `封面URL`,
'310106': `豆瓣网址`,
'310107': `内容简介`,
'310108': `出版社`,
'310109': `出版时间`,
'310110': `其他`,
'310111': `author:原作者`,
'310112': `translator:译者`,
'310113': `isbn:isbn`,
'310114': `originalTitle:原作名`,
'310115': `subTitle:副标题`,
'310116': `totalPage:页数`,
'310117': `binding:装帧`,
//电影
'310201': `豆瓣ID`,
'310202': `电影名称`,
'310203': `类型`,
'310204': `评分`,
'310205': `封面`,
'310206': `豆瓣网址`,
'310207': `简介`,
'310208': `(未知)`,
'310209': `上映日期`,
'310210': `类型`,
'310211': `director:导演`,
'310212': `author:编剧`,
'310213': `actor:主演`,
'310214': `originalTitle:原作名`,
'310215': `-`,
'310216': `-`,
'310217': `-`,
//电视剧
'310301': `豆瓣ID`,
'310302': `电视剧名称`,
'310303': `类型`,
'310304': `评分`,
'310305': `封面`,
'310306': `豆瓣网址`,
'310307': `简介`,
'310308': `(未知)`,
'310309': `上映日期`,
'310310': `类型`,
'310311': `director:导演`,
'310312': `author:编剧`,
'310313': `actor:主演`,
'310314': `originalTitle:原作名`,
'310315': `-`,
'310316': `-`,
'310317': `-`,
//音乐
'310401': `豆瓣ID`,
'310402': `音乐名`,
'310403': `类型`,
'310404': `评分`,
'310405': `封面`,
'310406': `豆瓣网址`,
'310407': `简介`,
'310408': `出版者`,
'310409': `发行时间`,
'310410': `流派`,
'310411': `actor: 表演者`,
'310412': `albumType:专辑类型`,
'310413': `medium:介质`,
'310414': `records:唱片数`,
'310415': `barcode:条形码`,
'310416': `-`,
'310417': `-`,
//日记
'310501': `豆瓣ID`,
'310502': `日记标题`,
'310503': `类型`,
'310504': `评分`,
'310505': `图片`,
'310506': `豆瓣网址`,
'310507': `简介`,
'310508': `发布者`,
'310509': `发布时间`,
'310510': `(其它)`,
'310511': `author:作者`,
'310512': `(其它)`,
'310513': `authorUrl:作者网址`,
'310514': `content:日记内容`,
'310515': `-`,
'310516': `-`,
'310517': `-`,
//游戏
'310601': `豆瓣ID`,
'310602': `游戏名称`,
'310603': `类型`,
'310604': `评分`,
'310605': `封面`,
'310606': `豆瓣网址`,
'310607': `简介`,
'310608': `发行商`,
'310609': `发行日期`,
'310610': `类型`,
'310611': `aliases:别名`,
'310612': `developer:开发商`,
'310613': `platform:平台`,
'310614': `-`,
'310615': `-`,
'310616': `-`,
'310617': `-`,
//广播
'310701': `待开发`,
'310702': `待开发`,
'310703': `待开发`,
'310704': `待开发`,
'310705': `待开发`,
'310706': `待开发`,
'310707': `待开发`,
'310708': `待开发`,
'310709': `待开发`,
'310710': `待开发`,
'310711': `-`,
'310712': `-`,
'310713': `-`,
'310714': `-`,
'310715': `-`,
'310716': `-`,
'310717': `-`,
'320101': `扩展1`,
'320102': `扩展2`,
'320103': `扩展3`,
'320104': `扩展4`,
'320105': `扩展5`,
'320106': `扩展6`,
'320107': `扩展7`,
'320108': `扩展8`,
'320109': `扩展9`,
'320110': `扩展10`,
}

@ -10,6 +10,9 @@ export default {
'110006': `同步豆瓣广播至Obsidian`,
'110101': '搜索豆瓣并创建文档',
'110201': `{0} 文件已经存在.`,
'110202': `{0} 模板文件无法读取`,
//DoubanSettingTab
'1201': `Obsidian-豆瓣`,
@ -20,16 +23,25 @@ export default {
'120005': `所跳转的网页地址即是搜索地址,`,
'120006': `将网页地址复制到当前输入框即可,`,
'120101': `电影文本模板`,
'120102': `设置选择电影后导入的文本内容模板,`,
'1210': `基础配置`,
'1203': `模板配置`,
'1220': `输出配置`,
'1230': `可用参数`,
'1204': `配置对应类型的模板文件, 如果为空则使用默认的文件模板. 模板可使用的参数列举在最下面.👇 `,
'1205': `🧡提示: 建议点击右侧'复制'默认模板按钮, 然后在新建的文件中粘贴修改模板, 最后回到此处选择对应模板. `,
'120101': `电影模板文件`,
'120102': `设置选择电影后导入的文本内容模板文件. `,
'120103': `支持以下参数名称 :`,
'120104': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120105': `{{url}}, {{desc}}, {{datePublished}}, {{genre}}, `,
'120106': `{{originalTitle}},{{director}}, {{author}},`,
'120107': ` {{actor}}`,
'120201': `书籍文本模板`,
'120202': `设置选择书籍后导入的文本内容模板,`,
'120201': `书籍模板文件`,
'120202': `选择书籍后导入内容的模板文件. `,
'120203': `支持以下参数名称 :`,
'120204': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'120205': `{{url}}, {{desc}}, {{datePublished}}, {{publisher}}`,
@ -37,35 +49,38 @@ export default {
'120207': `{{translator}}, {{isbn}}, {{price}}, {{totalPage}}`,
'120208': `{{series}}, {{binding}}, {{menu}}`,
'120301': `音乐文本模板`,
'120302': `设置选择音乐后导入的文本内容模板,`,
'120301': `音乐模板文件`,
'120302': `选择音乐后导入内容的模板文件. `,
'120303': `支持以下参数名称 :`,
'120304': `{{id}}, {{title}}, {{type}}, {{image}},`,
'120305': `{{url}}, {{desc}}, {{datePublished}}`,
'120306': `{{genre}}, {{actor}}, {{medium}}, {{albumType}},`,
'120307': `{{barcode}}, {{records}}`,
'120401': `日记文本模板`,
'120402': `设置选择日记后导入的文本内容模板,`,
'120401': `日记模板文件`,
'120402': `设置选择电影后导入内容的模板文件. `,
'120403': `支持以下参数名称 :`,
'120404': `{{id}}, {{title}}, {{type}}, {{image}},`,
'120405': `{{url}}, {{desc}}, {{datePublished}}`,
'120406': `{{author}}, {{authorUrl}}, {{content}}`,
'120407': `{{timePublished}}`,
'121301': `游戏文本模板`,
'121302': `设置选择游戏后导入的文本内容模板,`,
'121301': `游戏模板文件`,
'121302': `选择电影后导入内容的模板文件. `,
'121303': `支持以下参数名称 :`,
'121304': `{{id}}, {{title}}, {{type}}, {{score}}, {{image}},`,
'121305': `{{url}}, {{desc}}, {{publisher}}, {{datePublished}}`,
'121306': `{{genre}}, {{aliases}}, {{developer}}, {{platform}}`,
'121801': `电视剧模板文件`,
'121802': `选择电视剧后导入内容的模板文件. `,
'120501': `日期格式`,
'120503': `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`,
'120503': `这个格式是给面获取到的参数进行格式化日期时显示的内容 .`,
'120502': `时间格式`,
'120504': `这个格式是给上面获取到的参数进行格式化时间时显示的内容 .`,
'120504': `这个格式是给面获取到的参数进行格式化时间时显示的内容 .`,
'120506': `详细介绍请参考`,
'120507': `时间参数时间格式预览`,
'120508': `格式参考`,
@ -94,10 +109,12 @@ export default {
'121402': `当在导入数据时, 是否需要在状态栏显示处理状态? `,
'121501': `笔记存放位置`,
'121502': `从Obsidian-Douban创建的笔记将会存放导该文件夹中. 如果为空,笔记将会存放到Obsidian的默认文件存放位置`,
'121502': `创建的笔记将会存放导该文件夹中. 如果为空, 笔记将会存放到Obsidian的默认位置`,
'121601': `笔记名称`,
'121602': `从Obsidian-Douban创建的笔记将会使用次名称,支持所有通用的参数作为名称(如:{{type}},{{title}}等等). 如果为空, 笔记将会使用默认名称`,
'121602': `创建的笔记将会使用此名称作为模板, 支持所有'通用'的参数作为名称(如:{{type}}/{{title}}), 且支持路径, 比如: 'MyData/{{title}}'. 如果为空, 笔记将会使用默认名称. `,
'121901': `复制'默认'模板内容`,
'130101': `获取数据失败,您如有需要请至Github提交Issues`,
'130102': `Obsidian Douban插件错误提示:`,
@ -139,5 +156,182 @@ export default {
subTitle: {desc: `副标题`, example: `社会心理学`},
binding: {desc: `装帧`, example: `精装`},
totalPages: {desc: `页数`, example: `707`},
}
},
'122001': `通用参数`,
'122002': `扩展参数`,
'122003': `通用参数一定有值不为空, 扩展参数可能为空`,
'122004': `以下参数使用时请用'{{}}'包裹, 举例: 参数title, 则使用时为{{title}}. `,
'410101': `其他`,
'410102': `未知`,
//参数
'300101': `参数`,
'300102': `书籍`,
'300103': `电影`,
'300104': `电视剧`,
'300105': `音乐`,
'300106': `日记`,
'300107': `游戏`,
'300108': `广播`,
//书籍
'310101': `豆瓣ID`,
'310102': `书名`,
'310103': `类型`,
'310104': `评分`,
'310105': `封面URL`,
'310106': `豆瓣网址`,
'310107': `内容简介`,
'310108': `出版社`,
'310109': `出版时间`,
'310110': `(固定值:其他)`,
'310111': `author:原作者`,
'310112': `translator:译者`,
'310113': `isbn:isbn`,
'310114': `originalTitle:原作名`,
'310115': `subTitle:副标题`,
'310116': `totalPage:页数`,
'310117': `binding:装帧`,
//电影
'310201': `豆瓣ID`,
'310202': `电影名称`,
'310203': `类型`,
'310204': `评分`,
'310205': `封面`,
'310206': `豆瓣网址`,
'310207': `简介`,
'310208': `(固定值:未知)`,
'310209': `上映日期`,
'310210': `类型`,
'310211': `director:导演`,
'310212': `author:编剧`,
'310213': `actor:主演`,
'310214': `originalTitle:原作名`,
'310215': `-`,
'310216': `-`,
'310217': `-`,
//电视剧
'310301': `豆瓣ID`,
'310302': `电视剧名称`,
'310303': `类型`,
'310304': `评分`,
'310305': `封面`,
'310306': `豆瓣网址`,
'310307': `简介`,
'310308': `(固定值:未知)`,
'310309': `上映日期`,
'310310': `类型`,
'310311': `director:导演`,
'310312': `author:编剧`,
'310313': `actor:主演`,
'310314': `originalTitle:原作名`,
'310315': `-`,
'310316': `-`,
'310317': `-`,
//音乐
'310401': `豆瓣ID`,
'310402': `音乐名`,
'310403': `类型`,
'310404': `评分`,
'310405': `封面`,
'310406': `豆瓣网址`,
'310407': `简介`,
'310408': `出版者`,
'310409': `发行时间`,
'310410': `流派`,
'310411': `actor: 表演者`,
'310412': `albumType:专辑类型`,
'310413': `medium:介质`,
'310414': `records:唱片数`,
'310415': `barcode:条形码`,
'310416': `-`,
'310417': `-`,
//日记
'310501': `豆瓣ID`,
'310502': `日记标题`,
'310503': `类型`,
'310504': `评分`,
'310505': `图片`,
'310506': `豆瓣网址`,
'310507': `简介`,
'310508': `发布者`,
'310509': `发布时间`,
'310510': `(固定值:其它)`,
'310511': `author:作者`,
'310512': `authorUrl:作者网址`,
'310513': `content:日记内容`,
'310514': `-`,
'310515': `-`,
'310516': `-`,
'310517': `-`,
//游戏
'310601': `豆瓣ID`,
'310602': `游戏名称`,
'310603': `类型`,
'310604': `评分`,
'310605': `封面`,
'310606': `豆瓣网址`,
'310607': `简介`,
'310608': `发行商`,
'310609': `发行日期`,
'310610': `类型`,
'310611': `aliases:别名`,
'310612': `developer:开发商`,
'310613': `platform:平台`,
'310614': `-`,
'310615': `-`,
'310616': `-`,
'310617': `-`,
//广播
'310701': `待开发`,
'310702': `待开发`,
'310703': `待开发`,
'310704': `待开发`,
'310705': `待开发`,
'310706': `待开发`,
'310707': `待开发`,
'310708': `待开发`,
'310709': `待开发`,
'310710': `待开发`,
'310711': `-`,
'310712': `-`,
'310713': `-`,
'310714': `-`,
'310715': `-`,
'310716': `-`,
'310717': `-`,
'320101': `扩展1`,
'320102': `扩展2`,
'320103': `扩展3`,
'320104': `扩展4`,
'320105': `扩展5`,
'320106': `扩展6`,
'320107': `扩展7`,
'320108': `扩展8`,
'320109': `扩展9`,
'320110': `扩展10`,
}

@ -38,7 +38,8 @@ export const FileUtil = {
const regex = /(?<dir>([^/\\]+[/\\])*)(?<name>[^/\\]*$)/;
const match = String(pathString).match(regex);
const { dir, name } = match && match.groups;
return { dir, name: name || 'Untitled', extension: 'md'};
const nameWithoutSpChar = this.replaceSpecialCharactersForFileName(name);
return { dir, name: nameWithoutSpChar || 'Untitled_' + new Date().getTime(), extension: 'md'};
},
/**
@ -52,4 +53,12 @@ export const FileUtil = {
const parts = strings.map((s) => String(s).trim()).filter((s) => s != null);
return normalizePath(parts.join('/'));
},
/**
* replace special characters for filename
*/
replaceSpecialCharactersForFileName(fileName: string): string {
return fileName.replaceAll(/[\\/:*?"<>|]/g, '_');
}
};

@ -4,12 +4,12 @@ import {i18nHelper} from "src/lang/helper";
class Logger {
public error(e: any): any {
new Notice(i18nHelper.getMessage('130201') + e);
new Notice(e);
return e;
}
public warn(e: any): any {
new Notice(i18nHelper.getMessage('130301') + e);
new Notice(e);
return e;
}