From 556788ee75851b43cb0fa77037800ecaff69738a Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Thu, 10 Nov 2022 22:16:53 +0800 Subject: [PATCH] add subject user rate info --- main.ts | 10 +- src/constant/Constsant.ts | 9 +- src/constant/DefaultTemplateContent.ts | 157 +++++++++++++++++- src/constant/DoubanUserState.ts | 78 +++++++++ .../data/handler/DoubanAbstractLoadHandler.ts | 63 +++++-- src/douban/data/model/HandleContext.ts | 2 + src/douban/data/model/UserStateSubject.ts | 10 +- .../search/DoubanSearchFuzzySuggestModal.ts | 2 +- src/douban/data/search/Search.ts | 2 +- src/douban/setting/BasicSettingsHelper.ts | 32 ++-- src/douban/setting/TemplateSettingHelper.ts | 11 +- .../setting/TemplateVariableSettingsHelper.ts | 18 ++ src/douban/user/UserComponent.ts | 2 +- src/file/FileHandler.ts | 4 +- src/lang/locale/en.ts | 57 +++++++ src/lang/locale/zh-cn.ts | 65 +++++++- src/utils/Logutil.ts | 13 +- 17 files changed, 488 insertions(+), 47 deletions(-) create mode 100644 src/constant/DoubanUserState.ts diff --git a/main.ts b/main.ts index d01cad7..f3c366d 100644 --- a/main.ts +++ b/main.ts @@ -41,7 +41,7 @@ export default class DoubanPlugin extends Plugin { } this.showStatus('140205', extract.title); } catch (e) { - this.showStatus('140206', e.message); + log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e); } finally { this.clearStatusBarDelay(); } @@ -77,7 +77,7 @@ export default class DoubanPlugin extends Plugin { this.showStatus('140202', resultList.length.toString()); new DoubanFuzzySuggester(this, context).showSearchList(resultList); } catch (e) { - this.showStatus('140206', e.message); + log.error(i18nHelper.getMessage('140206').replace('{0}', e.message), e); } finally { this.clearStatusBarDelay(); } @@ -111,14 +111,14 @@ export default class DoubanPlugin extends Plugin { id: "search-douban-import-and-create-file", name: i18nHelper.getMessage("110101"), callback: () => - this.getDoubanTextForCreateNewNote({mode: SearchHandleMode.FOR_CREATE, settings: this.settings}), + this.getDoubanTextForCreateNewNote({mode: SearchHandleMode.FOR_CREATE, settings: this.settings, userComponent: this.userComponent}), }); this.addCommand({ id: "search-douban-by-current-file-name", name: i18nHelper.getMessage("110001"), editorCallback: (editor: Editor) => - this.getDoubanTextForActiveFile({mode: SearchHandleMode.FOR_REPLACE, settings: this.settings, editor: editor}), + this.getDoubanTextForActiveFile({mode: SearchHandleMode.FOR_REPLACE, settings: this.settings, editor: editor, userComponent: this.userComponent}), }); @@ -126,7 +126,7 @@ export default class DoubanPlugin extends Plugin { id: "search-douban-and-input-current-file", name: i18nHelper.getMessage("110002"), editorCallback: (editor: Editor) => - this.getDoubanTextForSearchTerm({mode: SearchHandleMode.FOR_REPLACE, settings: this.settings, editor: editor}), + this.getDoubanTextForSearchTerm({mode: SearchHandleMode.FOR_REPLACE, settings: this.settings, editor: editor, userComponent: this.userComponent}), }); this.settingsManager = new SettingsManager(app, this); this.userComponent = new UserComponent(this.settingsManager); diff --git a/src/constant/Constsant.ts b/src/constant/Constsant.ts index 6dc7ff5..06dd3a4 100644 --- a/src/constant/Constsant.ts +++ b/src/constant/Constsant.ts @@ -71,11 +71,6 @@ export const PersonNameModeRecords: { [key in PersonNameMode]: string } = { [PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage('121208'), } -export enum DoubanSubjectState { - NOT = 'have_not_watched', - WANTED = 'wanted', - DOING = 'watching', - HAS = 'watched', - UNKNOWN = 'unknown', -} + + diff --git a/src/constant/DefaultTemplateContent.ts b/src/constant/DefaultTemplateContent.ts index ffba33f..717c7f0 100644 --- a/src/constant/DefaultTemplateContent.ts +++ b/src/constant/DefaultTemplateContent.ts @@ -122,11 +122,164 @@ desc: {{desc}} `, } +export const DEFAULT_TEMPLATE_CONTENT_WITH_STATE = { + movieTemplateFileContent: `--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +score: {{score}} +myRate: {{myRate}} +originalTitle: {{originalTitle}} +genre: {{genre}} +datePublished: {{datePublished}} +director: {{director}} +actor: {{actor}} +author: {{author}} +tags: {{type}}, {{myTags}} +state: {{myState}} +url: {{url}} +createTime: {{currentDate}} {{currentTime}} +collectionDate: {{myCollectionDate}} +desc: {{desc}} +--- + +![image]({{image}}) + +Comment: +--- +{{myComment}} +`, + bookTemplateFileContent: `--- +doubanId: {{id}} +title: {{title}} +subTitle: {{subTitle}} +originalTitle: {{originalTitle}} +series: {{series}} +type: {{type}} +author: {{author}} +score: {{score}} +myRate: {{myRate}} +datePublished: {{datePublished}} +translator: {{translator}} +publisher: {{publisher}} +producer: {{producer}} +isbn: {{isbn}} +url: {{url}} +totalPage: {{totalPage}} +price: {{price}} +tags: Book, {{myTags}} +state: {{myState}} +binding: {{binding}} +createTime: {{currentDate}} {{currentTime}} +collectionDate: {{myCollectionDate}} +desc: {{desc}} +--- + +![image|150]({{image}}) + +Comment: +--- +{{myComment}} + +{{menu}} +`, + musicTemplateFileContent: `--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +actor: {{actor}} +score: {{score}} +myRate: {{myRate}} +genre: {{genre}} +medium: {{medium}} +albumType: {{albumType}} +datePublished: {{datePublished}} +publisher: {{publisher}} +barcode: {{barcode}} +url: {{url}} +records: {{records}} +tags: Music, {{myTags}} +state: {{myState}} +createTime: {{currentDate}} {{currentTime}} +collectionDate: {{myCollectionDate}} +desc: {{desc}} +--- + +![image|150]({{image}}) +`, + noteTemplateFileContent: `--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +author: {{author}} +authorUrl: {{authorUrl}} +dateTimePublished: {{datePublished}} {{timePublished}} +url: {{url}} +tags: Article +createTime: {{currentDate}} {{currentTime}} +desc: {{desc}} +--- + +{{content}} +`, + gameTemplateFileContent: `--- +doubanId: {{id}} +title: {{title}} +aliases: {{aliases}} +type: {{type}} +score: {{score}} +myRate: {{myRate}} +dateTimePublished: {{datePublished}} +publisher: {{publisher}} +genre: {{genre}} +developer: {{developer}} +platform: {{platform}} +url: {{url}} +tags: Game, {{myTags}} +state: {{myState}} +createTime: {{currentDate}} {{currentTime}} +collectionDate: {{myCollectionDate}} +desc: {{desc}} +--- + +![image]({{image}}) + +Comment: +--- +{{myComment}} +`,teleplayTemplateFileContent: `--- +doubanId: {{id}} +title: {{title}} +type: {{type}} +score: {{score}} +myRate: {{myRate}} +originalTitle: {{originalTitle}} +genre: {{genre}} +datePublished: {{datePublished}} +director: {{director}} +actor: {{actor}} +author: {{author}} +tags: {{type}}, {{myTags}} +state: {{myState}} +url: {{url}} +createTime: {{currentDate}} {{currentTime}} +collectionDate: {{myCollectionDate}} +desc: {{desc}} +--- + +![image]({{image}}) + +Comment: +--- +{{myComment}} +`, +} + /** * 获取默认的文档内容 * @param key */ -export function getDefaultTemplateContent(key: TemplateKey): string { +export function getDefaultTemplateContent(key: TemplateKey, useStateTemplate: boolean = true): string { // @ts-ignore - return DEFAULT_TEMPLATE_CONTENT[key + "Content"]; + return useStateTemplate ? DEFAULT_TEMPLATE_CONTENT_WITH_STATE[key + "Content"] : DEFAULT_TEMPLATE_CONTENT[key + "Content"]; } diff --git a/src/constant/DoubanUserState.ts b/src/constant/DoubanUserState.ts new file mode 100644 index 0000000..e78dd3d --- /dev/null +++ b/src/constant/DoubanUserState.ts @@ -0,0 +1,78 @@ +import {i18nHelper} from "../lang/helper"; +import {SupportType} from "./Constsant"; + +export enum DoubanSubjectState { + HAVE_NOT = 'HAVE_NOT', + WANTED = 'WANTED', + DOING = 'DOING', + DONE = 'DONE', + UNKNOWN = 'UNKNOWN', +} + +export const DoubanSubjectStateRecords_ALL: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500101'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500102'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500103'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500104'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + +export const DoubanSubjectStateRecords_MOVIE: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500201'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500202'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500203'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500204'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + +export const DoubanSubjectStateRecords_BOOK: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500301'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500302'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500303'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500304'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + + +export const DoubanSubjectStateRecords_MUSIC: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500401'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500402'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500403'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500404'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + +export const DoubanSubjectStateRecords_NOTE: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500501'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500502'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500503'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500504'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + +export const DoubanSubjectStateRecords_GAME: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500601'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500602'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500603'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500604'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + +export const DoubanSubjectStateRecords_TELEPLAY: { [key in DoubanSubjectState]: string } = { + [DoubanSubjectState.HAVE_NOT]: i18nHelper.getMessage('500701'), + [DoubanSubjectState.WANTED]: i18nHelper.getMessage('500702'), + [DoubanSubjectState.DOING]: i18nHelper.getMessage('500703'), + [DoubanSubjectState.DONE]: i18nHelper.getMessage('500704'), + [DoubanSubjectState.UNKNOWN]: i18nHelper.getMessage('500000'), +} + +export const DoubanSubjectStateRecords: { [key in SupportType]: Record } = { + [SupportType.ALL]:DoubanSubjectStateRecords_ALL, + [SupportType.MOVIE]:DoubanSubjectStateRecords_MOVIE, + [SupportType.BOOK]:DoubanSubjectStateRecords_BOOK, + [SupportType.MUSIC]:DoubanSubjectStateRecords_MUSIC, + [SupportType.NOTE]:DoubanSubjectStateRecords_NOTE, + [SupportType.GAME]:DoubanSubjectStateRecords_GAME, + [SupportType.TELEPLAY]:DoubanSubjectStateRecords_TELEPLAY, + +} diff --git a/src/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/douban/data/handler/DoubanAbstractLoadHandler.ts index f5264de..ebf759c 100644 --- a/src/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -8,7 +8,6 @@ import {CheerioAPI, load} from "cheerio"; import YamlUtil from "../../../utils/YamlUtil"; import { BasicConst, - DoubanSubjectState, PersonNameMode, SearchHandleMode, SupportType, @@ -20,7 +19,8 @@ import HandleResult from "@App/data/model/HandleResult"; import {getDefaultTemplateContent} from "../../../constant/DefaultTemplateContent"; import StringUtil from "../../../utils/StringUtil"; import {DEFAULT_SETTINGS} from "../../../constant/DefaultSettings"; -import {UserStateSubject} from "@App/data/model/UserStateSubject"; +import {DoubanUserParameter, UserStateSubject} from "@App/data/model/UserStateSubject"; +import {DoubanSubjectState, DoubanSubjectStateRecords} from "../../../constant/DoubanUserState"; export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { @@ -32,7 +32,7 @@ export default abstract class DoubanAbstractLoadHandler } async parse(extract: T, context: HandleContext): Promise { - let template: string = await this.getTemplate(context); + let template: string = await this.getTemplate(extract, context); let frontMatterStart: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0); let frontMatterEnd: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1); let frontMatter: string = ''; @@ -154,7 +154,7 @@ export default abstract class DoubanAbstractLoadHandler .error( i18nHelper.getMessage('130101') .replace('{0}', e.toString()) - )); + , e)); ; } @@ -234,9 +234,30 @@ export default abstract class DoubanAbstractLoadHandler .replaceAll(DoubanParameter.CURRENT_TIME, moment(new Date()).format(context.settings.timeFormat)) .replaceAll(DoubanParameter.GENRE, this.handleSpecialContent(extract.genre, textMode, context)) ; + resultContent = this.parseUserInfo(resultContent, extract, context, textMode); return this.parseText(resultContent, extract, context, textMode); } + private parseUserInfo(resultContent: string, extract: T, context: HandleContext, textMode: TemplateTextMode) { + const userState = extract.userState; + if ((resultContent.indexOf(DoubanUserParameter.MY_TAGS) >= 0 || + resultContent.indexOf(DoubanUserParameter.MY_RATE) >= 0 || + resultContent.indexOf(DoubanUserParameter.MY_STATE) >= 0 || + resultContent.indexOf(DoubanUserParameter.MY_COMMENT) >= 0 || + resultContent.indexOf(DoubanUserParameter.MY_COLLECTION_DATE) >= 0 ) && !this.doubanPlugin.userComponent.isLogin()) { + log.warn(i18nHelper.getMessage('100113')); + return resultContent; + } + if (!userState || !userState.collectionDate) { + return resultContent; + } + return resultContent.replaceAll(DoubanUserParameter.MY_TAGS, this.handleSpecialContent(userState.tags, textMode, context)) + .replaceAll(DoubanUserParameter.MY_RATE, this.handleSpecialContent(userState.rate, textMode)) + .replaceAll(DoubanUserParameter.MY_STATE, this.getUserStateName(userState.state)) + .replaceAll(DoubanUserParameter.MY_COMMENT, this.handleSpecialContent(userState.comment, textMode)) + .replaceAll(DoubanUserParameter.MY_COLLECTION_DATE, moment(new Date()).format(context.settings.dateFormat)) + } + /** * 处理自定义参数 * @param template @@ -286,15 +307,18 @@ export default abstract class DoubanAbstractLoadHandler return templateKey; } - private async getTemplate(context: HandleContext): Promise { + private async getTemplate(extract: T, context: HandleContext): Promise { const tempKey: TemplateKey = this.getTemplateKey(); const templatePath: string = context.settings[tempKey]; - + const useUserState:boolean = context.userComponent.isLogin() && + extract.userState && + extract.userState.collectionDate != null && + extract.userState.collectionDate != undefined; // @ts-ignore if (!templatePath || StringUtil.isBlank(templatePath)) { - return getDefaultTemplateContent(tempKey); + return getDefaultTemplateContent(tempKey, useUserState); } - const defaultContent = getDefaultTemplateContent(tempKey); + const defaultContent = getDefaultTemplateContent(tempKey, useUserState); let firstLinkpathDest: TFile = this.doubanPlugin.app.metadataCache.getFirstLinkpathDest(templatePath, ''); if (!firstLinkpathDest) { return defaultContent; @@ -338,11 +362,30 @@ export default abstract class DoubanAbstractLoadHandler }else if(stateWord.indexOf('在')>=0) { state = DoubanSubjectState.DOING; }else if(stateWord.indexOf('过')>=0) { - state = DoubanSubjectState.HAS; + state = DoubanSubjectState.DONE; }else { - state = DoubanSubjectState.NOT; + state = DoubanSubjectState.HAVE_NOT; } return state; } + + private getUserStateName(state: DoubanSubjectState): string { + if (!state) { + return DoubanSubjectStateRecords.ALL.UNKNOWN; + } + let v = DoubanSubjectStateRecords[this.getSupportType()]; + switch (state) { + case DoubanSubjectState.WANTED: + return v.WANTED; + case DoubanSubjectState.DOING: + return v.DOING; + case DoubanSubjectState.DONE: + return v.DONE; + case DoubanSubjectState.HAVE_NOT: + return v.HAVE_NOT; + default: + return v.UNKNOWN; + } + } } diff --git a/src/douban/data/model/HandleContext.ts b/src/douban/data/model/HandleContext.ts index 5654526..673368c 100644 --- a/src/douban/data/model/HandleContext.ts +++ b/src/douban/data/model/HandleContext.ts @@ -1,9 +1,11 @@ import {SearchHandleMode} from "../../../constant/Constsant"; import {Editor} from "obsidian"; import { DoubanPluginSetting } from "@App/setting/model/DoubanPluginSetting"; +import UserComponent from "@App/user/UserComponent"; export default interface HandleContext { mode:SearchHandleMode; settings: DoubanPluginSetting; editor?:Editor; + userComponent: UserComponent; } diff --git a/src/douban/data/model/UserStateSubject.ts b/src/douban/data/model/UserStateSubject.ts index b00707d..6f83c91 100644 --- a/src/douban/data/model/UserStateSubject.ts +++ b/src/douban/data/model/UserStateSubject.ts @@ -1,4 +1,4 @@ -import {DoubanSubjectState} from "../../../constant/Constsant"; +import { DoubanSubjectState } from "src/constant/DoubanUserState"; export interface UserStateSubject { tags: string[]; @@ -7,3 +7,11 @@ export interface UserStateSubject { comment: string; collectionDate: Date; } + +export const DoubanUserParameter = { + MY_TAGS: '{{myTags}}', + MY_RATE: '{{myRate}}', + MY_STATE: '{{myState}}', + MY_COMMENT: '{{myComment}}', + MY_COLLECTION_DATE: '{{myCollectionDate}}', +} diff --git a/src/douban/data/search/DoubanSearchFuzzySuggestModal.ts b/src/douban/data/search/DoubanSearchFuzzySuggestModal.ts index aa9e7ce..b433bb4 100644 --- a/src/douban/data/search/DoubanSearchFuzzySuggestModal.ts +++ b/src/douban/data/search/DoubanSearchFuzzySuggestModal.ts @@ -46,7 +46,7 @@ class DoubanFuzzySuggester extends FuzzySuggestModal try { this.open(); } catch (e) { - log.error(e); + log.error(e.toString(), e); } } diff --git a/src/douban/data/search/Search.ts b/src/douban/data/search/Search.ts index 13b4aac..619d75c 100644 --- a/src/douban/data/search/Search.ts +++ b/src/douban/data/search/Search.ts @@ -19,7 +19,7 @@ export default class Searcher { return request(requestUrlParam) .then(load) .then(SearchParserHandler.parseSearch) - .catch(e => log.error(i18nHelper.getMessage('130101').replace('{0}', e.toString()))); + .catch(e => log.error(i18nHelper.getMessage('130101').replace('{0}', e.toString()), e)); ; }; diff --git a/src/douban/setting/BasicSettingsHelper.ts b/src/douban/setting/BasicSettingsHelper.ts index 403693e..e6560be 100644 --- a/src/douban/setting/BasicSettingsHelper.ts +++ b/src/douban/setting/BasicSettingsHelper.ts @@ -118,9 +118,9 @@ export function constructDoubanTokenSettingsUI(containerEl: HTMLElement, manager export function constructLoginSettingsUI(containerEl: HTMLElement, manager: SettingsManager) { - new Setting(containerEl).setName('登录豆瓣').addButton((button) => { + new Setting(containerEl).setName(i18nHelper.getMessage('100131')).addButton((button) => { return button - .setButtonText('登录') + .setButtonText(i18nHelper.getMessage('100130')) .setCta() .onClick(async () => { button.setDisabled(true); @@ -134,16 +134,17 @@ export function constructHasLoginSettingsUI(containerEl: HTMLElement, manager: S const user: User = manager.plugin.userComponent.getUser(); let userDom = new DocumentFragment(); userDom.createDiv().innerHTML = - `已登录
-豆瓣ID: ${user.id}
- 昵称: ${user.name}`; + `${i18nHelper.getMessage('100120')}
+${i18nHelper.getMessage('100123')}: ${user.id}
+ ${i18nHelper.getMessage('100124')}: ${user.name}
+${i18nHelper.getMessage('100125')}`; new Setting(containerEl) - .setName('豆瓣用户信息') + .setName(i18nHelper.getMessage('100126')) .setDesc(userDom) .addButton((button) => { return button - .setButtonText('登出') + .setButtonText(i18nHelper.getMessage('100128')) .setCta() .onClick(async () => { button.setDisabled(true); @@ -156,17 +157,24 @@ export function constructHasLoginSettingsUI(containerEl: HTMLElement, manager: S function showMobileLogin(containerEl: HTMLElement, manager: SettingsManager) { new Setting(containerEl) - .setName('豆瓣用户信息') - .setDesc('豆瓣未登录,请先在电脑端登录!') + .setName(i18nHelper.getMessage('100126')) + .setDesc(i18nHelper.getMessage('100129')) } function showMobileLogout(containerEl: HTMLElement, manager: SettingsManager) { + const user: User = manager.plugin.userComponent.getUser(); + let userDom = new DocumentFragment(); + userDom.createDiv().innerHTML = + `已登录
+豆瓣ID: ${user.id}
+ 昵称: ${user.name}
+登录后导入参数可使用你的评分以及阅读状态等,具体可用参数见最后.`; new Setting(containerEl) - .setName('豆瓣用户信息') - .setDesc('已登录') + .setName(i18nHelper.getMessage('100126')) + .setDesc(userDom) .addButton((button) => { return button - .setButtonText('登出') + .setButtonText(i18nHelper.getMessage('100128')) .setCta() .onClick(async () => { manager.updateSetting('loginCookiesContent', ''); diff --git a/src/douban/setting/TemplateSettingHelper.ts b/src/douban/setting/TemplateSettingHelper.ts index 5492c6e..a025017 100644 --- a/src/douban/setting/TemplateSettingHelper.ts +++ b/src/douban/setting/TemplateSettingHelper.ts @@ -43,13 +43,22 @@ export function createFileSelectionSetting({name, desc, placeholder, key, manage manager.updateSetting(key, value); }); }); + setting.addExtraButton((button) => { + button + .setIcon('document') + .setTooltip(i18nHelper.getMessage('121903')) + .onClick(async () => { + // @ts-ignore + navigator.clipboard.writeText(getDefaultTemplateContent(key)) + }); + }); setting.addExtraButton((button) => { button .setIcon('copy') .setTooltip(i18nHelper.getMessage('121901')) .onClick(async () => { // @ts-ignore - navigator.clipboard.writeText(getDefaultTemplateContent(key)) + navigator.clipboard.writeText(getDefaultTemplateContent(key, false)) }); }); diff --git a/src/douban/setting/TemplateVariableSettingsHelper.ts b/src/douban/setting/TemplateVariableSettingsHelper.ts index bf5922e..b67d2d1 100644 --- a/src/douban/setting/TemplateVariableSettingsHelper.ts +++ b/src/douban/setting/TemplateVariableSettingsHelper.ts @@ -253,4 +253,22 @@ ${i18nHelper.getMessage('122004')} new Setting(containerEl) .setName(i18nHelper.getMessage('122002')) .setDesc(extraVariablesTable); + + + const userInfoVariables = new DocumentFragment(); + userInfoVariables.createDiv().innerHTML = ` +${i18nHelper.getMessage('160225')} +
+myTags → ${i18nHelper.getMessage('160226')}
+myRate → ${i18nHelper.getMessage('160227')}
+myState → ${i18nHelper.getMessage('160228')}
+myComment → ${i18nHelper.getMessage('160229')}
+myCollectionDate → ${i18nHelper.getMessage('160230')}
+ + +` + ; + new Setting(containerEl) + .setName(i18nHelper.getMessage('122002')) + .setDesc(userInfoVariables); } diff --git a/src/douban/user/UserComponent.ts b/src/douban/user/UserComponent.ts index 8dbbc27..48d633b 100644 --- a/src/douban/user/UserComponent.ts +++ b/src/douban/user/UserComponent.ts @@ -78,7 +78,7 @@ export default class UserComponent { return request(requestUrlParam) .then(load) .then(this.getUserInfo) - .catch(e => log.error(i18nHelper.getMessage('130101').replace('{0}', e.toString()))); + .catch(e => log.error(i18nHelper.getMessage('130101').replace('{0}', e.toString()), e)); ; }; diff --git a/src/file/FileHandler.ts b/src/file/FileHandler.ts index f9344f6..402d55f 100644 --- a/src/file/FileHandler.ts +++ b/src/file/FileHandler.ts @@ -104,7 +104,7 @@ export default class FileHandler { const leaf = this._app.workspace.splitLeafOrActive(); await leaf.openFile(File); } catch (error) { - log.error(error.toString()); + log.error(error.toString(), error); } } @@ -124,7 +124,7 @@ export default class FileHandler { err ); //TODO i18n - log.error(i18nHelper.getMessage('110202').replace('{0}', normalizedTemplatePath ?? '')); + log.error(i18nHelper.getMessage('110202').replace('{0}', normalizedTemplatePath ?? ''), err); return ""; } } diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 6c5ba84..905378a 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -24,6 +24,19 @@ export default { '100101': `Login Douban`, '100111': `Douban login info Expired, please login again`, + '100113': `Could not replace user info, please login again`, + '100120': `Login Success`, + '100121': `Please login`, + '100122': `Nickname`, + '100123': `DoubanID`, + '100124': `Nickname`, + '100125': `You can use your rating and reading status after logging in, see the last for specific variables.`, + + '100126': `User Info`, + '100128': `Logout`, + '100129': `You have not login Douban, please login in computer first! After login, you can use your rating and reading status, see the last for specific variables.`, + '100130': `Login`, + '100131': `Login Douban`, '1210': `Basic Setting`, @@ -131,6 +144,7 @@ export default { '121901': `Copy default template content to clipboard`, '121902': `Reset to default value`, + '121903': `Copy default template content (that your state in object) to clipboard`, @@ -337,6 +351,49 @@ export default { '330102': `当前时间`, + '500000': `UNKNOWN`, + '500101': `NOT`, + '500102': `WANTED`, + '500103': `DOING`, + '500104': `DONE`, + + '500201': `NOT`, + '500202': `WANTED`, + '500203': `DOING`, + '500204': `DONE`, + + '500301': `NOT`, + '500302': `WANTED`, + '500303': `DOING`, + '500304': `DONE`, + + '500401': `NOT`, + '500402': `WANTED`, + '500403': `DOING`, + '500404': `DONE`, + + '500501': `NOT`, + '500502': `WANTED`, + '500503': `DOING`, + '500504': `DONE`, + + '500601': `NOT`, + '500602': `WANTED`, + '500603': `DOING`, + '500604': `DONE`, + + '500701': `NOT`, + '500702': `WANTED`, + '500703': `DOING`, + '500704': `DONE`, + + '160225': `You can use those variables in your template after login. `, + '160226': `The tags that I tag for subject`, + '160227': `The rate that I rate to subject. (1-5)`, + '160228': `My state at book-reading/video-watching.`, + '160229': `Comment`, + '160230': `Rate Date`, + 'ALL': `all`, 'MOVIE': `movie`, 'BOOK': `book`, diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 28d2f85..f808d63 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -15,6 +15,22 @@ export default { '100101': `登录豆瓣`, '100111': `豆瓣登录信息过期,请至Douban插件重新登录`, + '100113': `无法替换用户信息变量, 登录信息过期, 请重新登录Douban`, + '100120': `已登录`, + '100121': `请登录`, + '100122': `昵称`, + '100123': `豆瓣ID`, + '100124': `昵称`, + '100125': `登录后, 可使用你的评分/阅读状态等作为导入参数,具体可用参数见最后.`, + + '100126': `豆瓣用户信息`, + '100128': `登出`, + '100129': `豆瓣未登录,请先在电脑端登录!登录后导入参数可使用你的评分以及阅读状态等,具体可用参数见最后.`, + '100130': `登录`, + '100131': `登录豆瓣`, + + + //DoubanSettingTab @@ -131,7 +147,9 @@ export default { '121701': `选择模板文件`, - '121901': `复制'默认'模板内容`, + '121901': `复制'基础'模板内容`, + '121903': `复制'有状态信息'的模板内容. 有状态信息指:模板中有登录后可以用的参数,如myRate(我的评分)等`, + '130101': `获取数据失败,{0}`, '130102': `Obsidian Douban插件错误提示:`, @@ -357,6 +375,51 @@ export default { '330102': `当前时间`, + '500000': `未知`, + '500101': `未做`, + '500102': `想做`, + '500103': `正在做`, + '500104': `做完`, + + '500201': `未看`, + '500202': `想看`, + '500203': `在看`, + '500204': `看过`, + + '500301': `未看`, + '500302': `想看`, + '500303': `在看`, + '500304': `看过`, + + '500401': `未听`, + '500402': `想听`, + '500403': `在听`, + '500404': `听过`, + + '500501': `未看`, + '500502': `想看`, + '500503': `在看`, + '500504': `看过`, + + '500601': `未玩`, + '500602': `想玩`, + '500603': `在玩`, + '500604': `玩过`, + + '500701': `未看`, + '500702': `想看`, + '500703': `在看`, + '500704': `看过`, + + + '160225': `以下参数登录后方可在模板中使用, 使用时请用'{{}}'包裹, 举例: 参数myTags, 则使用时为{{myTags}}`, + '160226': `我标记的标签`, + '160227': `我的评分(1-5)`, + '160228': `我的阅读/欣赏/听/玩的状态`, + '160229': `我的评论`, + '160230': `我的评论/标记的日期`, + + 'ALL': `全部类型`, 'MOVIE': `电影`, diff --git a/src/utils/Logutil.ts b/src/utils/Logutil.ts index 7713aac..1bb941c 100644 --- a/src/utils/Logutil.ts +++ b/src/utils/Logutil.ts @@ -3,15 +3,22 @@ import {i18nHelper} from "src/lang/helper"; class Logger { - public error(e: any): any { + public error(msg: any, e:any): any { + new Notice(msg); + console.log(`Douban Plugin error: ${msg}`); + console.error(e); + return e; + } + + public notice(e: any): any { new Notice(e); - console.log(`Douban Plugin error: ${e}`); + console.error(`Douban Plugin notice: ${e}`); return e; } public warn(e: any): any { new Notice(e); - console.log(`Douban Plugin error: ${e}`); + console.warn(`Douban Plugin error: ${e}`); return e; }