diff --git a/main.ts b/main.ts index 97ebb63..ae1b7a5 100644 --- a/main.ts +++ b/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(); - - this.doubanStatusBar = this.addStatusBarItem(); + 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) + } } diff --git a/src/constant/DefaultSettings.ts b/src/constant/DefaultSettings.ts index 448adef..822e180 100644 --- a/src/constant/DefaultSettings.ts +++ b/src/constant/DefaultSettings.ts @@ -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, } diff --git a/src/constant/DefaultTemplateContent.ts b/src/constant/DefaultTemplateContent.ts index 4d17eb6..31f6291 100644 --- a/src/constant/DefaultTemplateContent.ts +++ b/src/constant/DefaultTemplateContent.ts @@ -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"]; +} diff --git a/src/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/douban/data/handler/DoubanAbstractLoadHandler.ts index 86526bd..416d7e2 100644 --- a/src/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -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 implements DoubanSubjectLoadHandler { @@ -50,12 +51,17 @@ export default abstract class DoubanAbstractLoadHandler } 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 */ 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 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 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 private async getTemplate(context: HandleContext):Promise { 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; } diff --git a/src/douban/data/handler/DoubanBookLoadHandler.ts b/src/douban/data/handler/DoubanBookLoadHandler.ts index 883e9f4..e32a531 100644 --- a/src/douban/data/handler/DoubanBookLoadHandler.ts +++ b/src/douban/data/handler/DoubanBookLoadHandler.ts @@ -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 { diff --git a/src/douban/setting/DoubanSettingTab.ts b/src/douban/setting/DoubanSettingTab.ts index de717ab..1941d72 100644 --- a/src/douban/setting/DoubanSettingTab.ts +++ b/src/douban/setting/DoubanSettingTab.ts @@ -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); } } diff --git a/src/douban/setting/SettingHelper.ts b/src/douban/setting/SettingHelper.ts index c2577e1..56c2b2f 100644 --- a/src/douban/setting/SettingHelper.ts +++ b/src/douban/setting/SettingHelper.ts @@ -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(); + setting.setName(i18nHelper.getMessage(name)); // @ts-ignore - templateDesc.createDiv().innerHTML = i18nHelper.getMessage(desc) + `
不存在文件夹 `; - 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) => { diff --git a/src/douban/setting/SettingsManager.ts b/src/douban/setting/SettingsManager.ts index c234d86..6e1a893 100644 --- a/src/douban/setting/SettingsManager.ts +++ b/src/douban/setting/SettingsManager.ts @@ -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')} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
${i18nHelper.getMessage('300101')}${i18nHelper.getMessage('300102')}${i18nHelper.getMessage('300103')}${i18nHelper.getMessage('300104')}${i18nHelper.getMessage('300105')}${i18nHelper.getMessage('300106')}${i18nHelper.getMessage('300107')}${i18nHelper.getMessage('300108')}
id${i18nHelper.getMessage('310101')}${i18nHelper.getMessage('310201')}${i18nHelper.getMessage('310301')}${i18nHelper.getMessage('310401')}${i18nHelper.getMessage('310501')}${i18nHelper.getMessage('310601')}${i18nHelper.getMessage('310701')}
title${i18nHelper.getMessage('310102')}${i18nHelper.getMessage('310202')}${i18nHelper.getMessage('310302')}${i18nHelper.getMessage('310402')}${i18nHelper.getMessage('310502')}${i18nHelper.getMessage('310602')}${i18nHelper.getMessage('310702')}
type${i18nHelper.getMessage('310103')}${i18nHelper.getMessage('310203')}${i18nHelper.getMessage('310303')}${i18nHelper.getMessage('310403')}${i18nHelper.getMessage('310503')}${i18nHelper.getMessage('310603')}${i18nHelper.getMessage('310703')}
score${i18nHelper.getMessage('310104')}${i18nHelper.getMessage('310204')}${i18nHelper.getMessage('310304')}${i18nHelper.getMessage('310404')}${i18nHelper.getMessage('310504')}${i18nHelper.getMessage('310604')}${i18nHelper.getMessage('310704')}
image${i18nHelper.getMessage('310105')}${i18nHelper.getMessage('310205')}${i18nHelper.getMessage('310305')}${i18nHelper.getMessage('310405')}${i18nHelper.getMessage('310505')}${i18nHelper.getMessage('310605')}${i18nHelper.getMessage('310705')}
url${i18nHelper.getMessage('310106')}${i18nHelper.getMessage('310206')}${i18nHelper.getMessage('310306')}${i18nHelper.getMessage('310406')}${i18nHelper.getMessage('310506')}${i18nHelper.getMessage('310606')}${i18nHelper.getMessage('310706')}
desc${i18nHelper.getMessage('310107')}${i18nHelper.getMessage('310207')}${i18nHelper.getMessage('310307')}${i18nHelper.getMessage('310407')}${i18nHelper.getMessage('310507')}${i18nHelper.getMessage('310607')}${i18nHelper.getMessage('310707')}
publisher${i18nHelper.getMessage('310108')}${i18nHelper.getMessage('310208')}${i18nHelper.getMessage('310308')}${i18nHelper.getMessage('310408')}${i18nHelper.getMessage('310508')}${i18nHelper.getMessage('310608')}${i18nHelper.getMessage('310708')}
datePublished${i18nHelper.getMessage('310109')}${i18nHelper.getMessage('310209')}${i18nHelper.getMessage('310309')}${i18nHelper.getMessage('310409')}${i18nHelper.getMessage('310509')}${i18nHelper.getMessage('310609')}${i18nHelper.getMessage('310709')}
genre${i18nHelper.getMessage('310110')}${i18nHelper.getMessage('310210')}${i18nHelper.getMessage('310310')}${i18nHelper.getMessage('310410')}${i18nHelper.getMessage('310510')}${i18nHelper.getMessage('310610')}${i18nHelper.getMessage('310710')}
`; + + new Setting(containerEl) + .setName(i18nHelper.getMessage('122001')) + .setDesc(basicVariablesTable) + ; + + + const extraVariablesTable = new DocumentFragment(); + extraVariablesTable.createDiv().innerHTML = ` +${i18nHelper.getMessage('122004')} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
${i18nHelper.getMessage('300101')}${i18nHelper.getMessage('300102')}${i18nHelper.getMessage('300103')}${i18nHelper.getMessage('300104')}${i18nHelper.getMessage('300105')}${i18nHelper.getMessage('300106')}${i18nHelper.getMessage('300107')}${i18nHelper.getMessage('300108')}
${i18nHelper.getMessage('320101')} + ${i18nHelper.getMessage('310111')} + ${i18nHelper.getMessage('310211')} + ${i18nHelper.getMessage('310311')} + ${i18nHelper.getMessage('310411')} + ${i18nHelper.getMessage('310511')} + ${i18nHelper.getMessage('310611')} + ${i18nHelper.getMessage('310711')} +
${i18nHelper.getMessage('320102')} + ${i18nHelper.getMessage('310112')} + ${i18nHelper.getMessage('310212')} + ${i18nHelper.getMessage('310312')} + ${i18nHelper.getMessage('310412')} + ${i18nHelper.getMessage('310512')} + ${i18nHelper.getMessage('310612')} + ${i18nHelper.getMessage('310712')} +
${i18nHelper.getMessage('320103')} + ${i18nHelper.getMessage('310113')} + ${i18nHelper.getMessage('310213')} + ${i18nHelper.getMessage('310313')} + ${i18nHelper.getMessage('310413')} + ${i18nHelper.getMessage('310513')} + ${i18nHelper.getMessage('310613')} + ${i18nHelper.getMessage('310713')} +
${i18nHelper.getMessage('320104')} + ${i18nHelper.getMessage('310114')} + ${i18nHelper.getMessage('310214')} + ${i18nHelper.getMessage('310314')} + ${i18nHelper.getMessage('310414')} + ${i18nHelper.getMessage('310514')} + ${i18nHelper.getMessage('310614')} + ${i18nHelper.getMessage('310714')} +
${i18nHelper.getMessage('320105')} + ${i18nHelper.getMessage('310115')} + ${i18nHelper.getMessage('310215')} + ${i18nHelper.getMessage('310315')} + ${i18nHelper.getMessage('310415')} + ${i18nHelper.getMessage('310515')} + ${i18nHelper.getMessage('310615')} + ${i18nHelper.getMessage('310715')} +
${i18nHelper.getMessage('320106')} + ${i18nHelper.getMessage('310116')} + ${i18nHelper.getMessage('310216')} + ${i18nHelper.getMessage('310316')} + ${i18nHelper.getMessage('310416')} + ${i18nHelper.getMessage('310516')} + ${i18nHelper.getMessage('310616')} + ${i18nHelper.getMessage('310716')} +
${i18nHelper.getMessage('320107')} + ${i18nHelper.getMessage('310117')} + ${i18nHelper.getMessage('310217')} + ${i18nHelper.getMessage('310317')} + ${i18nHelper.getMessage('310417')} + ${i18nHelper.getMessage('310517')} + ${i18nHelper.getMessage('310617')} + ${i18nHelper.getMessage('310717')} +
`; + + + 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) + }); + }) + } } diff --git a/src/douban/setting/model/DoubanPluginSetting.ts b/src/douban/setting/model/DoubanPluginSetting.ts index 9bce615..2a07f85 100644 --- a/src/douban/setting/model/DoubanPluginSetting.ts +++ b/src/douban/setting/model/DoubanPluginSetting.ts @@ -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, } diff --git a/src/file/FileHandler.ts b/src/file/FileHandler.ts index 1676dbe..f9344f6 100644 --- a/src/file/FileHandler.ts +++ b/src/file/FileHandler.ts @@ -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 ""; } } diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 529afd8..28dde72 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -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`, } diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 4b6458b..9f67ec1 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -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`, + + + + + + + + + } diff --git a/src/utils/FileUtil.ts b/src/utils/FileUtil.ts index 1e91333..4467817 100644 --- a/src/utils/FileUtil.ts +++ b/src/utils/FileUtil.ts @@ -38,7 +38,8 @@ export const FileUtil = { const regex = /(?([^/\\]+[/\\])*)(?[^/\\]*$)/; 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, '_'); + } }; diff --git a/src/utils/Logutil.ts b/src/utils/Logutil.ts index 3ad25e4..71f45f9 100644 --- a/src/utils/Logutil.ts +++ b/src/utils/Logutil.ts @@ -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; }