add custom variable

This commit is contained in:
wanxp 2022-11-06 20:30:54 +08:00
parent 9507f7fdf2
commit f8d453abb2
27 changed files with 802 additions and 529 deletions

@ -139,3 +139,9 @@ If you want some features or have any questions about this plugin, create issues
`npm run dev` `npm run dev`
6. 进入Obsidian插件中心重新加载当前插件 6. 进入Obsidian插件中心重新加载当前插件
7. 享受开发吧 7. 享受开发吧
## 免责声明
本程序没有爬取任何书影音等内容,只供技术研究使用。没有侵犯书影音作者版权和豆瓣官方利益。如有任何侵权行为,请联系我删除。
## Thanks

@ -52,6 +52,16 @@ export enum TemplateKey {
teleplayTemplateFile = 'teleplayTemplateFile', teleplayTemplateFile = 'teleplayTemplateFile',
} }
export enum SupportType {
ALL = "ALL",
MOVIE = 'MOVIE',
BOOK = 'BOOK',
MUSIC = 'MUSIC',
NOTE = 'NOTE',
GAME = 'GAME',
TELEPLAY = 'TELEPLAY',
}
/** /**
* *
*/ */

@ -1,5 +1,5 @@
import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting"; import {DoubanPluginSetting} from "@App/setting/model/DoubanPluginSetting";
import {PersonNameMode} from "./Constsant"; import {PersonNameMode, SupportType} from "./Constsant";
import {doubanHeaders} from "./Douban"; import {doubanHeaders} from "./Douban";
export const DEFAULT_SETTINGS: DoubanPluginSetting = { export const DEFAULT_SETTINGS: DoubanPluginSetting = {
@ -19,4 +19,12 @@ export const DEFAULT_SETTINGS: DoubanPluginSetting = {
dataFilePath: "", dataFilePath: "",
dataFileNamePath: "/{{type}}/{{title}}", dataFileNamePath: "/{{type}}/{{title}}",
statusBar: true, statusBar: true,
customProperties: [
{name: 'myType', value: 'movie', field: SupportType.MOVIE},
{name: 'myType', value: 'book', field: SupportType.BOOK},
{name: 'myType', value: 'music', field: SupportType.MUSIC},
{name: 'myType', value: 'note', field: SupportType.NOTE},
{name: 'myType', value: 'game', field: SupportType.GAME},
{name: 'myType', value: 'teleplay', field: SupportType.TELEPLAY},
],
} }

@ -5,7 +5,7 @@ import DoubanPageBroadcastSubject from '../model/DoubanPageBroadcastSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import DoubanSubject from 'src/douban/data/model/DoubanSubject'; import DoubanSubject from 'src/douban/data/model/DoubanSubject';
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
//TODO will support in future version //TODO will support in future version
class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler<DoubanPageBroadcastSubject> { class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler<DoubanPageBroadcastSubject> {
@ -14,7 +14,7 @@ class DoubanPageBroadcatLoadHandler extends DoubanAbstractLoadHandler<DoubanPage
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return null; return null;
} }

@ -1,4 +1,3 @@
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject'; import DoubanSubject, {DoubanParameter} from '../model/DoubanSubject';
import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler";
@ -7,11 +6,17 @@ import {i18nHelper} from 'src/lang/helper';
import {log} from "src/utils/Logutil"; import {log} from "src/utils/Logutil";
import {CheerioAPI, load} from "cheerio"; import {CheerioAPI, load} from "cheerio";
import YamlUtil from "../../../utils/YamlUtil"; import YamlUtil from "../../../utils/YamlUtil";
import {BasicConst, PersonNameMode, SearchHandleMode, TemplateKey, TemplateTextMode} from "../../../constant/Constsant"; import {
BasicConst,
PersonNameMode,
SearchHandleMode,
SupportType,
TemplateKey,
TemplateTextMode
} from "../../../constant/Constsant";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import HandleResult from "@App/data/model/HandleResult"; import HandleResult from "@App/data/model/HandleResult";
import {DEFAULT_TEMPLATE_CONTENT, getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent"; import {getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent";
import FileHandler from "../../../file/FileHandler";
import StringUtil from "../../../utils/StringUtil"; import StringUtil from "../../../utils/StringUtil";
import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings";
@ -31,7 +36,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
let frontMatter: string = ''; let frontMatter: string = '';
let frontMatterBefore: string = ''; let frontMatterBefore: string = '';
let frontMatterAfter: string = ''; let frontMatterAfter: string = '';
let result:string = ''; let result: string = '';
if (frontMatterStart > -1 && frontMatterEnd > -1) { if (frontMatterStart > -1 && frontMatterEnd > -1) {
frontMatterBefore = template.substring(0, frontMatterStart); frontMatterBefore = template.substring(0, frontMatterStart);
frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3); frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3);
@ -49,7 +54,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
} else { } else {
result = this.parsePartText(template, extract, context); result = this.parsePartText(template, extract, context);
} }
let fileName:string = ''; let fileName: string = '';
if (SearchHandleMode.FOR_CREATE == context.mode) { if (SearchHandleMode.FOR_CREATE == context.mode) {
fileName = this.parsePartText(this.getFileName(context), extract, context); fileName = this.parsePartText(this.getFileName(context), extract, context);
} }
@ -57,7 +62,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
return {content: result, fileName: fileName}; return {content: result, fileName: fileName};
} }
private getFileName(context:HandleContext): string { private getFileName(context: HandleContext): string {
const {dataFileNamePath} = context.settings; const {dataFileNamePath} = context.settings;
return dataFileNamePath ? dataFileNamePath : DEFAULT_SETTINGS.dataFileNamePath; return dataFileNamePath ? dataFileNamePath : DEFAULT_SETTINGS.dataFileNamePath;
} }
@ -116,7 +121,7 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
return result; return result;
} }
abstract getTemplateKey(context: HandleContext): TemplateKey; abstract getSupportType(): SupportType;
abstract parseText(beforeContent: string, extract: T, context: HandleContext, textMode: TemplateTextMode): string; abstract parseText(beforeContent: string, extract: T, context: HandleContext, textMode: TemplateTextMode): string;
@ -198,8 +203,8 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
} }
private parsePartText(template: string, extract: T, context: HandleContext, textMode: TemplateTextMode = TemplateTextMode.NORMAL): string { private parsePartText(template: string, extract: T, context: HandleContext, textMode: TemplateTextMode = TemplateTextMode.NORMAL): string {
const resultContent = template let resultContent = this.handleCustomVariable(template, context);
.replaceAll(DoubanParameter.ID, extract.id) resultContent = resultContent.replaceAll(DoubanParameter.ID, extract.id)
.replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(this.getPersonName(extract.title, context), textMode)) .replaceAll(DoubanParameter.TITLE, this.handleSpecialContent(this.getPersonName(extract.title, context), textMode))
.replaceAll(DoubanParameter.TYPE, extract.type) .replaceAll(DoubanParameter.TYPE, extract.type)
.replaceAll(DoubanParameter.SCORE, this.handleSpecialContent(extract.score)) .replaceAll(DoubanParameter.SCORE, this.handleSpecialContent(extract.score))
@ -216,21 +221,70 @@ export default abstract class DoubanAbstractLoadHandler<T extends DoubanSubject>
return this.parseText(resultContent, extract, context, textMode); return this.parseText(resultContent, extract, context, textMode);
} }
private async getTemplate(context: HandleContext):Promise<string> { /**
const tempKey:TemplateKey = this.getTemplateKey(context); *
const templatePath:string = context.settings[tempKey]; * @param template
* @param context
* @private
*/
private handleCustomVariable(template: string, context: HandleContext): string {
let customProperties = context.settings.customProperties;
let resultContent = template;
if (!customProperties) {
return resultContent;
}
customProperties.filter(customProperty => customProperty.name &&
customProperty.field
&& (customProperty.field == SupportType.ALL ||
customProperty.field == this.getSupportType())).forEach(customProperty => {
resultContent = resultContent.replaceAll(`{{${customProperty.name}}}`, customProperty.value);
});
return resultContent;
}
private getTemplateKey():TemplateKey {
let templateKey: TemplateKey;
switch (this.getSupportType()) {
case SupportType.MOVIE:
templateKey = TemplateKey.movieTemplateFile;
break;
case SupportType.BOOK:
templateKey = TemplateKey.bookTemplateFile;
break;
case SupportType.MUSIC:
templateKey = TemplateKey.musicTemplateFile;
break;
case SupportType.TELEPLAY:
templateKey = TemplateKey.teleplayTemplateFile;
break;
case SupportType.GAME:
templateKey = TemplateKey.gameTemplateFile;
break;
case SupportType.NOTE:
templateKey = TemplateKey.noteTemplateFile;
break;
default:
templateKey = null;
}
return templateKey;
}
private async getTemplate(context: HandleContext): Promise<string> {
const tempKey: TemplateKey = this.getTemplateKey();
const templatePath: string = context.settings[tempKey];
// @ts-ignore // @ts-ignore
if (!templatePath || StringUtil.isBlank(templatePath)) { if (!templatePath || StringUtil.isBlank(templatePath)) {
return getDefaultTemplateContent(tempKey); return getDefaultTemplateContent(tempKey);
} }
const defaultContent = getDefaultTemplateContent(tempKey); const defaultContent = getDefaultTemplateContent(tempKey);
let firstLinkpathDest:TFile = this.doubanPlugin.app.metadataCache.getFirstLinkpathDest(templatePath, ''); let firstLinkpathDest: TFile = this.doubanPlugin.app.metadataCache.getFirstLinkpathDest(templatePath, '');
if (!firstLinkpathDest) { if (!firstLinkpathDest) {
return defaultContent; return defaultContent;
}else { } else {
const val = await this.doubanPlugin.fileHandler.getFileContent(firstLinkpathDest.path); const val = await this.doubanPlugin.fileHandler.getFileContent(firstLinkpathDest.path);
return val?val:defaultContent; return val ? val : defaultContent;
} }
} }
} }

@ -3,10 +3,8 @@ import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler";
import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject"; import DoubanBookSubject, {DoubanBookParameter} from "../model/DoubanBookSubject";
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import DoubanSubject from "../model/DoubanSubject"; import DoubanSubject from "../model/DoubanSubject";
import {TemplateKey, TemplateTextMode} from "../../../constant/Constsant"; import {SupportType, TemplateTextMode} from "../../../constant/Constsant";
import StringUtil from "../../../utils/StringUtil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {i18nHelper} from "../../../lang/helper";
export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> { export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<DoubanBookSubject> {
@ -14,8 +12,8 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return TemplateKey.bookTemplateFile; return SupportType.BOOK;
} }
parseText(beforeContent: string, extract: DoubanBookSubject, context: HandleContext, textMode: TemplateTextMode): string { parseText(beforeContent: string, extract: DoubanBookSubject, context: HandleContext, textMode: TemplateTextMode): string {
@ -31,7 +29,9 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
.replaceAll(DoubanBookParameter.menu, extract.menu.join('\n')) .replaceAll(DoubanBookParameter.menu, extract.menu.join('\n'))
.replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode)) .replaceAll(DoubanBookParameter.price, super.handleSpecialContent(extract.price, textMode))
.replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode)) .replaceAll(DoubanBookParameter.series, super.handleSpecialContent(extract.series, textMode))
.replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode)); .replaceAll(DoubanBookParameter.binding, super.handleSpecialContent(extract.binding, textMode))
.replaceAll(DoubanBookParameter.producer, super.handleSpecialContent(extract.producer, textMode))
;
} }
support(extract: DoubanSubject): boolean { support(extract: DoubanSubject): boolean {
@ -69,7 +69,7 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
html(info.parent).find("a").map((index, a) => { html(info.parent).find("a").map((index, a) => {
value.push(html(a).text().trim()); value.push(html(a).text().trim());
}); });
} else if (key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0) { } else if (key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('出版社') >= 0 || key.indexOf('出品方') >= 0) {
value = html(info.next.next).text().trim(); value = html(info.next.next).text().trim();
} else { } else {
value = html(info.next).text().trim(); value = html(info.next).text().trim();
@ -104,6 +104,7 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler<Dou
url: url, url: url,
genre: [], genre: [],
binding: valueMap.has('binding') ? valueMap.get('binding') : "", binding: valueMap.has('binding') ? valueMap.get('binding') : "",
producer: valueMap.has('producer') ? valueMap.get('producer') : "",
}; };
return result; return result;
} }
@ -124,5 +125,6 @@ const BookKeyValueMap: Map<string, string> = new Map(
['ISBN:', 'isbn'], ['ISBN:', 'isbn'],
['译者', 'translator'], ['译者', 'translator'],
['副标题:', 'subTitle'], ['副标题:', 'subTitle'],
['出品方:', 'producer'],
] ]
); );

@ -5,7 +5,7 @@ import DoubanSubject from '../model/DoubanSubject';
import DoubanGameSubject from '../model/DoubanGameSubject'; import DoubanGameSubject from '../model/DoubanGameSubject';
import StringUtil from "../../../utils/StringUtil"; import StringUtil from "../../../utils/StringUtil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> { export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<DoubanGameSubject> {
@ -13,8 +13,8 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler<Dou
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return TemplateKey.gameTemplateFile; return SupportType.GAME;
} }
parseText(beforeContent: string, extract: DoubanGameSubject, context: HandleContext): string { parseText(beforeContent: string, extract: DoubanGameSubject, context: HandleContext): string {

@ -6,7 +6,7 @@ import DoubanSubject from '../model/DoubanSubject';
import DoubanMovieSubject from '../model/DoubanMovieSubject'; import DoubanMovieSubject from '../model/DoubanMovieSubject';
import StringUtil from "../../../utils/StringUtil"; import StringUtil from "../../../utils/StringUtil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {PersonNameMode, TemplateKey} from "../../../constant/Constsant"; import {PersonNameMode, SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> { export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<DoubanMovieSubject> {
@ -14,8 +14,8 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler<Do
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return TemplateKey.movieTemplateFile; return SupportType.MOVIE;
} }
parseText(beforeContent: string, extract: DoubanMovieSubject, context: HandleContext): string { parseText(beforeContent: string, extract: DoubanMovieSubject, context: HandleContext): string {

@ -4,7 +4,7 @@ import DoubanMusicSubject from '../model/DoubanMusicSubject';
import DoubanPlugin from "main"; import DoubanPlugin from "main";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> { export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<DoubanMusicSubject> {
@ -12,8 +12,8 @@ export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler<Do
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return TemplateKey.musicTemplateFile; return SupportType.MUSIC;
} }
parseText(beforeContent: string, extract: DoubanMusicSubject, context: HandleContext): string { parseText(beforeContent: string, extract: DoubanMusicSubject, context: HandleContext): string {

@ -5,7 +5,7 @@ import DoubanPlugin from "main";
import DoubanSubject from '../model/DoubanSubject'; import DoubanSubject from '../model/DoubanSubject';
import html2markdown from '@notable/html2markdown'; import html2markdown from '@notable/html2markdown';
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> { export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<DoubanNoteSubject> {
@ -13,8 +13,8 @@ export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler<Dou
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return TemplateKey.noteTemplateFile; return SupportType.NOTE;
} }
parseText(beforeContent: string, extract: DoubanNoteSubject, context: HandleContext): string { parseText(beforeContent: string, extract: DoubanNoteSubject, context: HandleContext): string {

@ -4,14 +4,14 @@ import DoubanSubject from "../model/DoubanSubject";
import {i18nHelper} from "src/lang/helper"; import {i18nHelper} from "src/lang/helper";
import {log} from "src/utils/Logutil"; import {log} from "src/utils/Logutil";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
/** /**
* *
*/ */
export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler<DoubanSubject> { export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler<DoubanSubject> {
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType.ALL {
return TemplateKey.bookTemplateFile return SupportType.ALL;
} }
parseText(beforeContent: string, extract: DoubanSubject, context: HandleContext): string { parseText(beforeContent: string, extract: DoubanSubject, context: HandleContext): string {

@ -5,7 +5,7 @@ import DoubanSubject from "../model/DoubanSubject";
import DoubanTeleplaySubject from "../model/DoubanTeleplaySubject"; import DoubanTeleplaySubject from "../model/DoubanTeleplaySubject";
import SchemaOrg from "src/utils/SchemaOrg"; import SchemaOrg from "src/utils/SchemaOrg";
import HandleContext from "@App/data/model/HandleContext"; import HandleContext from "@App/data/model/HandleContext";
import {TemplateKey} from "../../../constant/Constsant"; import {SupportType, TemplateKey} from "../../../constant/Constsant";
/** /**
* teleplay * teleplay
@ -16,8 +16,8 @@ export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler<DoubanT
super(doubanPlugin); super(doubanPlugin);
} }
getTemplateKey(context: HandleContext): TemplateKey { getSupportType(): SupportType {
return TemplateKey.teleplayTemplateFile; return SupportType.TELEPLAY;
} }
parseText(beforeContent: string, extract: DoubanTeleplaySubject, context: HandleContext): string { parseText(beforeContent: string, extract: DoubanTeleplaySubject, context: HandleContext): string {

@ -11,6 +11,7 @@ export default class DoubanBookSubject extends DoubanSubject {
menu: string[]; menu: string[];
price: number; price: number;
binding: string; binding: string;
producer: string;
} }
export const DoubanBookParameter = { export const DoubanBookParameter = {
@ -24,4 +25,5 @@ export const DoubanBookParameter = {
menu: '{{menu}}', menu: '{{menu}}',
price: '{{price}}', price: '{{price}}',
binding: '{{binding}}', binding: '{{binding}}',
producer: '{{producer}}',
} }

@ -0,0 +1,129 @@
import {i18nHelper} from "../../lang/helper";
import {Setting} from "obsidian";
import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings";
import SettingsManager from "@App/setting/SettingsManager";
export function constructBasicUI(containerEl: HTMLElement, manager: SettingsManager) {
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(manager.plugin.settings.searchUrl)
.onChange(async (value) => {
manager.plugin.settings.searchUrl = value;
await manager.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(manager.plugin.settings.dateFormat)
mf.onChange(async (value) => {
manager.plugin.settings.dateFormat = value;
await manager.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(manager.plugin.settings.timeFormat)
mf.onChange(async (value) => {
manager.plugin.settings.timeFormat = value;
await manager.plugin.saveSettings();
});
});
});
new Setting(containerEl)
.setName(i18nHelper.getMessage('121401'))
.setDesc(i18nHelper.getMessage('121402'))
.addToggle((toggleComponent) => {
toggleComponent
// .setTooltip(i18nHelper.getMessage('121403'))
.setValue(manager.plugin.settings.statusBar)
.onChange(async (value) => {
manager.plugin.settings.statusBar = value;
await manager.plugin.saveSettings();
});
});
}

@ -0,0 +1,95 @@
import {i18nHelper} from "../../lang/helper";
import SettingsManager from "@App/setting/SettingsManager";
import {CustomProperty} from "@App/setting/model/CustomProperty";
import {ButtonComponent, DropdownComponent, ExtraButtonComponent, Setting, TextComponent} from "obsidian";
import {SupportType} from "../../constant/Constsant";
export function constructCustomPropertySettingsUI(containerEl: HTMLElement, manager: SettingsManager) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1240') });
containerEl.createEl('p', { text: i18nHelper.getMessage('1242') });
const customProperties = manager.plugin.settings.customProperties;
new Setting(containerEl)
.setDesc(i18nHelper.getMessage('1241'))
.addButton((button) => {
button.setButtonText(i18nHelper.getMessage('124101'));
button.setTooltip(i18nHelper.getMessage('124101'));
button.setIcon('plus');
button.onClick(async () => {
customProperties.push({name: '', value: '', field: SupportType.ALL});
constructCustomPropertyUI(list, customProperties, manager);
});
});
const list = containerEl.createDiv('custom-property-list');
constructCustomPropertyUI(list, customProperties, manager);
}
export function constructCustomPropertyUI(containerEl: HTMLElement, customProperties: CustomProperty[], manager: SettingsManager) {
containerEl.empty();
for(let i: number = 0; i < customProperties.length; i++) {
addFilterInput(customProperties[i], containerEl, customProperties, manager, i);
}
}
function addFilterInput(data: CustomProperty, el: HTMLElement, customProperties: CustomProperty[] , manager: SettingsManager, idx: number) {
const item = el.createEl('li')
item.createEl('span', { text: i18nHelper.getMessage('124102') })
const nameField = new TextComponent(el);
nameField.setPlaceholder(i18nHelper.getMessage('124103'))
.setValue(data.name)
.onChange(async (value) => {
if (!value) {
return;
}
customProperties[idx].name = value;
await manager.plugin.saveSettings();
});
let nameEl = nameField.inputEl;
nameEl.addClass('obsidian_douban_settings_input')
item.appendChild(nameEl);
item.createEl('span', { text: i18nHelper.getMessage('124104') })
const valueField = new TextComponent(el);
valueField.setPlaceholder(i18nHelper.getMessage('124105'))
.setValue(data.value)
.onChange(async (value) => {
if (!value) {
return;
}
customProperties[idx].value = value;
await manager.plugin.saveSettings();
});
const valueEl = valueField.inputEl;
valueEl.addClass('obsidian_douban_settings_input')
item.appendChild(valueEl);
const fieldsDropdown = new DropdownComponent(el);
for (const fieldSelect in SupportType) {
// @ts-ignore
fieldsDropdown.addOption(fieldSelect, i18nHelper.getMessage(fieldSelect));
}
item.createEl('span', { text: i18nHelper.getMessage('124106') });
fieldsDropdown.setValue(data.field)
.onChange(async (value: SupportType) => {
customProperties[idx].field = value;
await manager.plugin.saveSettings();
});
const fieldSelectEl = fieldsDropdown.selectEl;
fieldSelectEl.addClass('obsidian_douban_settings_input')
item.appendChild(fieldSelectEl);
const extractButton = new ButtonComponent(el);
extractButton.setIcon('minus-with-circle');
extractButton.setTooltip(i18nHelper.getMessage('124107'));
extractButton.onClick(async () => {
customProperties.splice(idx, 1);
constructCustomPropertyUI(el, customProperties, manager);
await manager.plugin.saveSettings();
});
const extractButtonEl = extractButton.buttonEl;
extractButtonEl.addClass('obsidian_douban_settings_button')
item.appendChild(extractButtonEl);
// item.appendChild(extractButton.extraSettingsEl);
}

@ -6,6 +6,11 @@ import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant";
import SettingsManager from "@App/setting/SettingsManager"; import SettingsManager from "@App/setting/SettingsManager";
import {FolderSuggest} from "@App/setting/model/FolderSuggest"; import {FolderSuggest} from "@App/setting/model/FolderSuggest";
import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings";
import { constructOutUI } from "./OutputSettingsHelper";
import { constructTemplateUI } from "./TemplateSettingHelper";
import { constructBasicUI } from "./BasicSettingsHelper";
import { constructTemplateVariablesUI } from "./TemplateVariableSettingsHelper";
import {constructCustomPropertySettingsUI, constructCustomPropertyUI} from "@App/setting/CustomPropertySettingsHelper";
/** /**
* *
@ -25,11 +30,10 @@ export class DoubanSettingTab extends PluginSettingTab {
containerEl.empty(); containerEl.empty();
containerEl.createEl("h2", {text: 'Obsidian Douban'}); containerEl.createEl("h2", {text: 'Obsidian Douban'});
new Setting(containerEl); new Setting(containerEl);
this.settingsManager.constructBasicUI(containerEl); constructBasicUI(containerEl, this.settingsManager);
this.settingsManager.constructTemplateUI(containerEl); constructTemplateUI(containerEl, this.settingsManager);
this.settingsManager.constructOutUI(containerEl); constructOutUI(containerEl, this.settingsManager);
constructCustomPropertySettingsUI(containerEl, this.settingsManager);
this.settingsManager.constructTemplateVariablesUI(containerEl); constructTemplateVariablesUI(containerEl, this.settingsManager);
} }
} }

@ -0,0 +1,78 @@
import {i18nHelper} from "../../lang/helper";
import {Setting} from "obsidian";
import {createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper";
import {DEFAULT_SETTINGS} from "../../constant/DefaultSettings";
import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant";
import SettingsManager from "@App/setting/SettingsManager";
export function constructOutUI(containerEl: HTMLElement, manager: SettingsManager) {
containerEl.createEl('h3', { text: i18nHelper.getMessage('1220') });
new Setting(containerEl).then(createFolderSelectionSetting({name: '121501', desc: '121502', placeholder: '121503', key: 'dataFilePath', manager: manager}));
let outfolder = containerEl.createDiv({ cls: 'settings-item' });
constructOutFolderUI(outfolder, manager);
new Setting(containerEl)
.setName(i18nHelper.getMessage('120601'))
.setDesc(i18nHelper.getMessage('120602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt)
.setValue(manager.plugin.settings.arraySpilt)
.onChange(async (value) => {
manager.plugin.settings.arraySpilt = value;
await manager.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(manager.plugin.settings.personNameMode)
.onChange(async (value: string) => {
manager.plugin.settings.personNameMode = value as PersonNameMode;
await manager.plugin.saveSettings();
});
});
});
}
export function constructOutFolderUI(containerEl: HTMLElement, manager: SettingsManager) {
containerEl.empty();
const dataFilePathSetting = new Setting(containerEl)
.setName(i18nHelper.getMessage('121601'))
.setDesc(i18nHelper.getMessage('121602'))
.addText((textField) => {
textField.setPlaceholder(DEFAULT_SETTINGS.dataFileNamePath)
.setValue(manager.plugin.settings.dataFileNamePath)
.onChange(async (value) => {
manager.plugin.settings.dataFileNamePath = value;
await manager.plugin.saveSettings();
});
});
dataFilePathSetting.addExtraButton((button) => {
button
.setIcon('reset')
.setTooltip(i18nHelper.getMessage('121902'))
.onClick(async () => {
manager.plugin.settings.dataFileNamePath = DEFAULT_SETTINGS.dataFileNamePath;
await manager.plugin.saveSettings();
constructOutFolderUI(containerEl, manager)
});
})
}

@ -2,9 +2,10 @@ import {App, Setting} from "obsidian";
import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings"; import { DEFAULT_SETTINGS } from "src/constant/DefaultSettings";
import DoubanPlugin from "../../../main"; import DoubanPlugin from "../../../main";
import { DoubanPluginSetting } from "./model/DoubanPluginSetting"; import { DoubanPluginSetting } from "./model/DoubanPluginSetting";
import {createFileSelectionSetting, createFolderSelectionSetting} from "@App/setting/SettingHelper"; import {createFileSelectionSetting, createFolderSelectionSetting} from "@App/setting/TemplateSettingHelper";
import {i18nHelper} from "../../lang/helper"; import {i18nHelper} from "../../lang/helper";
import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant"; import {PersonNameMode, PersonNameModeRecords} from "../../constant/Constsant";
import {constructBasicUI} from "@App/setting/BasicSettingsHelper";
export default class SettingsManager { export default class SettingsManager {
app: App; app: App;
@ -31,454 +32,4 @@ export default class SettingsManager {
await this.plugin.saveSettings(); await this.plugin.saveSettings();
} }
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>
<tr>
<td>currentDate</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
</tr>
<tr>
<td>currentTime</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</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)
});
})
}
} }

@ -5,8 +5,22 @@ import {SearchComponent, Setting} from "obsidian";
import { log } from "src/utils/Logutil"; import { log } from "src/utils/Logutil";
import {getDefaultTemplateContent} from "../../constant/DefaultTemplateContent"; import {getDefaultTemplateContent} from "../../constant/DefaultTemplateContent";
import {FolderSuggest} from "@App/setting/model/FolderSuggest"; import {FolderSuggest} from "@App/setting/model/FolderSuggest";
import SettingsManager from "@App/setting/SettingsManager";
export function constructTemplateUI(containerEl: HTMLElement, manager: SettingsManager) {
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: manager}));
new Setting(containerEl).then(createFileSelectionSetting({name: '120201', desc: '120202', placeholder: '121701', key: 'bookTemplateFile', manager: manager}));
new Setting(containerEl).then(createFileSelectionSetting({name: '120301', desc: '120302', placeholder: '121701', key: 'musicTemplateFile', manager: manager}));
new Setting(containerEl).then(createFileSelectionSetting({name: '120401', desc: '120402', placeholder: '121701', key: 'noteTemplateFile', manager: manager}));
new Setting(containerEl).then(createFileSelectionSetting({name: '121301', desc: '121302', placeholder: '121701', key: 'gameTemplateFile', manager: manager}));
new Setting(containerEl).then(createFileSelectionSetting({name: '121801', desc: '121802', placeholder: '121701', key: 'teleplayTemplateFile', manager: manager}));
}
export function createFileSelectionSetting({name, desc, placeholder, key, manager export function createFileSelectionSetting({name, desc, placeholder, key, manager
}: CreateTemplateSelectParams) { }: CreateTemplateSelectParams) {
return (setting: Setting) => { return (setting: Setting) => {

@ -0,0 +1,245 @@
import SettingsManager from "@App/setting/SettingsManager";
import {i18nHelper} from "../../lang/helper";
import {Setting} from "obsidian";
export function constructTemplateVariablesUI(containerEl: HTMLElement, manager: SettingsManager) {
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>
<tr>
<td>currentDate</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
<td>${i18nHelper.getMessage('330101')}</td>
</tr>
<tr>
<td>currentTime</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</td>
<td>${i18nHelper.getMessage('330102')}</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);
}

@ -0,0 +1,7 @@
import {SupportType} from "../../../constant/Constsant";
export interface CustomProperty {
name: string;
value: string;
field: SupportType;
}

@ -1,3 +1,4 @@
import {CustomProperty} from "@App/setting/model/CustomProperty";
export interface DoubanPluginSetting { export interface DoubanPluginSetting {
movieTemplateFile: string, movieTemplateFile: string,
@ -15,5 +16,6 @@ export interface DoubanPluginSetting {
dataFilePath: string, dataFilePath: string,
dataFileNamePath: string, dataFileNamePath: string,
statusBar: boolean, statusBar: boolean,
customProperties: CustomProperty[],
} }

@ -1,6 +1,6 @@
import { App, ISuggestOwner, Scope } from "obsidian"; import { App, ISuggestOwner, Scope } from "obsidian";
import { createPopper, Instance as PopperInstance } from "@popperjs/core";
// Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes
const wrapAround = (value: number, size: number): number => { const wrapAround = (value: number, size: number): number => {
return ((value % size) + size) % size; return ((value % size) + size) % size;

@ -28,7 +28,17 @@ export default {
'1230': `Usable Variables`, '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.👇`, '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. `, '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. `,
'1240': `Custom Variable`,
'1241': `To use the custom variables, you need to wrap them in double curly brackets. For example, {{myType}} will be replaced with the your custom type value. `,
'1242': `Add custom variable, so that you can use it in the template file or file name. `,
'124101': `Add`,
'124108': `Add a new variable`,
'124102': `Name:`,
'124103': `Input custom variable name`,
'124104': `Value:`,
'124105': `Input custom variable value`,
'124106': `Active type`,
'124107': `Delete custom variable`,
'120101': `Movie Template File`, '120101': `Movie Template File`,
'120102': `This template will be used when creating new notes for Movie from Obsidian-Douban.`, '120102': `This template will be used when creating new notes for Movie from Obsidian-Douban.`,
@ -119,6 +129,7 @@ export default {
'121902': `Reset to default value`, '121902': `Reset to default value`,
//error //error
'130101': `Fetch Data Error, You can go to Github add Issues`, '130101': `Fetch Data Error, You can go to Github add Issues`,
'140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`, '140101': `Not support for current type. You can add Issues at Github:Wanxp/obsidian-douban`,
@ -132,6 +143,10 @@ export default {
'150101': `Choose an item...`, '150101': `Choose an item...`,
//content //content
'200101': `. `, '200101': `. `,
@ -143,6 +158,10 @@ export default {
'122003': `Basic Variables must has value, Extra Variables can be empty`, '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.`, '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`, '410101': `Unknown`,
//参数 //参数
@ -173,6 +192,7 @@ export default {
'310115': `subTitle:副标题`, '310115': `subTitle:副标题`,
'310116': `totalPage:页数`, '310116': `totalPage:页数`,
'310117': `binding:装帧`, '310117': `binding:装帧`,
'310118': `producer:出品方`,
//电影 //电影
'310201': `豆瓣ID`, '310201': `豆瓣ID`,
@ -305,4 +325,12 @@ export default {
'330101': `今日日期`, '330101': `今日日期`,
'330102': `当前时间`, '330102': `当前时间`,
'ALL': `all`,
'MOVIE': `movie`,
'BOOK': `book`,
'MUSIC': `music`,
'NOTE': `note`,
'GAME': `game`,
'TELEPLAY': `teleplay`,
} }

@ -30,6 +30,17 @@ export default {
'1204': `配置对应类型的模板文件, 如果为空则使用默认的文件模板. 模板可使用的参数列举在最下面.👇 `, '1204': `配置对应类型的模板文件, 如果为空则使用默认的文件模板. 模板可使用的参数列举在最下面.👇 `,
'1205': `🧡提示: 建议点击右侧'复制'默认模板按钮, 然后在新建的文件中粘贴修改模板, 最后回到此处选择对应模板. `, '1205': `🧡提示: 建议点击右侧'复制'默认模板按钮, 然后在新建的文件中粘贴修改模板, 最后回到此处选择对应模板. `,
'1240': `自定义属性`,
'1241': `自定义参数使用时请用'{{}}'包裹, 举例: 参数myType, 则使用时为{{myType}}. `,
'1242': `添加自定义参数, 参数可用于模板中或者文件名中. `,
'124101': `新增`,
'124108': `新增一个自定义参数`,
'124102': `参数名称:`,
'124103': `自定义参数名称`,
'124104': `参数值:`,
'124105': `自定义参值`,
'124106': `生效类型`,
'124107': `删除自定义参数`,
'120101': `电影模板文件`, '120101': `电影模板文件`,
@ -114,6 +125,9 @@ export default {
'121601': `笔记名称`, '121601': `笔记名称`,
'121602': `创建的笔记将会使用此名称作为模板, 支持所有'通用'的参数作为名称(如:{{type}}/{{title}}), 且支持路径, 比如: 'MyData/{{title}}'. 如果为空, 笔记将会使用默认名称. `, '121602': `创建的笔记将会使用此名称作为模板, 支持所有'通用'的参数作为名称(如:{{type}}/{{title}}), 且支持路径, 比如: 'MyData/{{title}}'. 如果为空, 笔记将会使用默认名称. `,
'121701': `选择模板文件`,
'121901': `复制'默认'模板内容`, '121901': `复制'默认'模板内容`,
'130101': `获取数据失败,您如有需要请至Github提交Issues`, '130101': `获取数据失败,您如有需要请至Github提交Issues`,
@ -135,28 +149,28 @@ export default {
'200101': ``, '200101': ``,
//book example //book example
'book': { // 'book': {
id: {desc: `豆瓣ID`, example: `25982198`}, // id: {desc: `豆瓣ID`, example: `25982198`},
title: {desc: `书名`, example: `社会心理学第11版精装彩印`}, // title: {desc: `书名`, example: `社会心理学第11版精装彩印`},
type: {desc: `类型`, example: `Book`}, // type: {desc: `类型`, example: `Book`},
score: {desc: `评分`, example: `9.4`}, // score: {desc: `评分`, example: `9.4`},
image: {desc: `图片URL`, example: `https://img1.doubanio.com/view/subject/l/public/s28261247.jpg`}, // image: {desc: `图片URL`, example: `https://img1.doubanio.com/view/subject/l/public/s28261247.jpg`},
url: {desc: `豆瓣URL`, example: `https://book.douban.com/subject/25982198/`}, // url: {desc: `豆瓣URL`, example: `https://book.douban.com/subject/25982198/`},
desc: { // desc: {
desc: `简述`, // desc: `简述`,
example: `戴维·迈尔斯的《社会心理学》是美国700 多所大专院校社会心理学教学所采用的教材自出版以来深受广大师生和社会心理学爱好者的喜爱并被翻译成多种语言有着广泛的影响力。本书译自第11 版。全书共分四...` // example: `戴维·迈尔斯的《社会心理学》是美国700 多所大专院校社会心理学教学所采用的教材自出版以来深受广大师生和社会心理学爱好者的喜爱并被翻译成多种语言有着广泛的影响力。本书译自第11 版。全书共分四...`
}, // },
publisher: {desc: `出版社`, example: `人民邮电出版社`}, // publisher: {desc: `出版社`, example: `人民邮电出版社`},
datePublished: {desc: `出版时间`, example: `2014-10-1`}, // datePublished: {desc: `出版时间`, example: `2014-10-1`},
genre: {desc: `类型`, example: `社会科学`}, // genre: {desc: `类型`, example: `社会科学`},
author: {desc: `作者`, example: `戴维·迈尔斯`}, // author: {desc: `作者`, example: `戴维·迈尔斯`},
translator: {desc: `译者`, example: `侯玉波 / 乐国安 / 张志勇`}, // translator: {desc: `译者`, example: `侯玉波 / 乐国安 / 张志勇`},
isbn: {desc: `ISBN`, example: `9787115369840`}, // isbn: {desc: `ISBN`, example: `9787115369840`},
originTitle: {desc: `原作名`, example: `Social Psychology (11th)`}, // originTitle: {desc: `原作名`, example: `Social Psychology (11th)`},
subTitle: {desc: `副标题`, example: `社会心理学`}, // subTitle: {desc: `副标题`, example: `社会心理学`},
binding: {desc: `装帧`, example: `精装`}, // binding: {desc: `装帧`, example: `精装`},
totalPages: {desc: `页数`, example: `707`}, // totalPages: {desc: `页数`, example: `707`},
}, // },
'122001': `通用参数`, '122001': `通用参数`,
'122002': `扩展参数`, '122002': `扩展参数`,
@ -333,7 +347,13 @@ export default {
'ALL': `全部类型`,
'MOVIE': `电影`,
'BOOK': `书籍`,
'MUSIC': `音乐`,
'NOTE': `笔记`,
'GAME': `游戏`,
'TELEPLAY': `电视剧`,
} }

@ -5,11 +5,13 @@ class Logger {
public error(e: any): any { public error(e: any): any {
new Notice(e); new Notice(e);
console.log(`Douban Plugin error: ${e}`);
return e; return e;
} }
public warn(e: any): any { public warn(e: any): any {
new Notice(e); new Notice(e);
console.log(`Douban Plugin error: ${e}`);
return e; return e;
} }

@ -10,6 +10,22 @@
width: 100%; width: 100%;
} }
.obsidian_douban_settings_text {
margin-left: 5px;
margin-right: 5px;
}
.obsidian_douban_settings_input {
margin-left: 5px;
margin-right: 5px;
}
.obsidian_douban_settings_button {
margin: auto;
vertical-align: bottom;
}
.obsidian_douban_search_input { .obsidian_douban_search_input {
margin-left: 5px; margin-left: 5px;
margin-right: 5px; margin-right: 5px;