From 08749116f3a994fb921207e30abfc5c0df09f85c Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Sun, 9 Nov 2025 22:43:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=99=84=E4=BB=B6(=E5=9B=BE=E7=89=87)?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BF=9D=E5=AD=98=E6=9C=AC=E5=9C=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=20fix:=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9C=89=E4=BA=9B=E5=9B=BE=E7=89=87=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=B8=8B=E9=97=AE=E9=A2=98=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=B1=87=E6=80=BB=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E5=92=8C=E7=9C=9F=E5=AE=9E=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98=20feat:?= =?UTF-8?q?=20=E8=B0=83=E6=95=B4=E5=88=AB=E5=90=8D=E7=9A=84=E8=BD=AC?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/wanxp/constant/DefaultSettings.ts | 1 + .../ai/handler/DoubanTheaterAiLoadHandler.ts | 8 +-- .../wanxp/douban/component/DoubanSyncModal.ts | 17 ++++- .../data/handler/DoubanAbstractLoadHandler.ts | 68 +++++++++++++++---- .../data/handler/DoubanBookLoadHandler.ts | 2 +- .../data/handler/DoubanGameLoadHandler.ts | 3 +- .../data/handler/DoubanMovieLoadHandler.ts | 8 +-- .../data/handler/DoubanTeleplayLoadHandler.ts | 8 +-- .../data/handler/DoubanTheaterLoadHandler.ts | 10 ++- .../search/DoubanSearchFuzzySuggestModal.ts | 2 +- .../douban/setting/OutputSettingsHelper.ts | 3 +- .../setting/model/DoubanPluginSetting.ts | 1 + .../wanxp/douban/sync/handler/SyncHandler.ts | 5 +- src/org/wanxp/douban/sync/model/SyncConfig.ts | 1 + src/org/wanxp/lang/locale/en.ts | 10 ++- src/org/wanxp/lang/locale/zh-cn.ts | 6 +- src/org/wanxp/main.ts | 2 +- src/org/wanxp/net/NetFileHandler.ts | 14 +++- src/org/wanxp/utils/VariableUtil.ts | 20 +++--- src/org/wanxp/utils/YamlUtil.ts | 21 ++++-- 20 files changed, 144 insertions(+), 66 deletions(-) diff --git a/src/org/wanxp/constant/DefaultSettings.ts b/src/org/wanxp/constant/DefaultSettings.ts index 9746b0c..ff0db9b 100644 --- a/src/org/wanxp/constant/DefaultSettings.ts +++ b/src/org/wanxp/constant/DefaultSettings.ts @@ -51,6 +51,7 @@ export const DEFAULT_SETTINGS: DoubanPluginSetting = { cacheImage: true, cacheHighQuantityImage: true, attachmentPath: 'assets', + attachmentFileName: "{{title}}", syncHandledDataArray: [], // syncLastUpdateTime: new Map(), scoreSetting: { diff --git a/src/org/wanxp/douban/ai/handler/DoubanTheaterAiLoadHandler.ts b/src/org/wanxp/douban/ai/handler/DoubanTheaterAiLoadHandler.ts index 231b490..f2ab8b4 100644 --- a/src/org/wanxp/douban/ai/handler/DoubanTheaterAiLoadHandler.ts +++ b/src/org/wanxp/douban/ai/handler/DoubanTheaterAiLoadHandler.ts @@ -49,13 +49,7 @@ export default class DoubanTheaterAiLoadHandler extends DoubanAbstractLoadHandle extract.author, extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, context)).filter(c => c) )); - - variableMap.set("aliases", new DataField( - "aliases", - DataValueType.array, - extract.aliases, - extract.aliases.map(a => a.replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_')) - )); + super.parseAliases(beforeContent, variableMap, extract, context); } support(extract: DoubanSubject): boolean { diff --git a/src/org/wanxp/douban/component/DoubanSyncModal.ts b/src/org/wanxp/douban/component/DoubanSyncModal.ts index 5c9de39..16f00a7 100644 --- a/src/org/wanxp/douban/component/DoubanSyncModal.ts +++ b/src/org/wanxp/douban/component/DoubanSyncModal.ts @@ -150,6 +150,7 @@ ${syncStatus.getHandle() == 0? '...' : i18nHelper.getMessage('110042') + ':' + T cacheImage: ( settings.cacheImage == null) ? DEFAULT_SETTINGS.cacheImage : settings.cacheImage, cacheHighQuantityImage: ( settings.cacheHighQuantityImage == null) ? DEFAULT_SETTINGS.cacheHighQuantityImage : settings.cacheHighQuantityImage, attachmentPath: (settings.attachmentPath == '' || settings.attachmentPath == null) ? DEFAULT_SETTINGS.attachmentPath : settings.attachmentPath, + attachmentFileName: (settings.attachmentFileName == '' || settings.attachmentFileName == null) ? DEFAULT_SETTINGS.attachmentFileName : settings.attachmentFileName, templateFile: (settings.movieTemplateFile == '' || settings.movieTemplateFile == null) ? DEFAULT_SETTINGS.movieTemplateFile : settings.movieTemplateFile, incrementalUpdate: true, syncConditionType: SyncConditionType.ALL, @@ -427,6 +428,20 @@ ${syncStatus.getHandle() == 0? '...' : i18nHelper.getMessage('110042') + ':' + T }); }) .setDisabled(disable); + new Setting(containerEl) + .setName( i18nHelper.getMessage('121452')) + .setDesc( i18nHelper.getMessage('121453')) + .addSearch(async (search: SearchComponent) => { + new FolderSuggest(this.plugin.app, search.inputEl); + // @ts-ignore + search.setValue(config.attachmentFileName) + // @ts-ignore + .setPlaceholder(i18nHelper.getMessage('121454')) + .onChange(async (value: string) => { + config.attachmentFileName = value; + }); + }) + .setDisabled(disable); new Setting(containerEl) .setName(i18nHelper.getMessage('121435')) @@ -580,4 +595,4 @@ function showCustomInputTime(containerEl: HTMLElement, config: SyncConfig, disab containerEl.appendChild(toDateEl); new ButtonComponent(containerEl).setIcon('help').setTooltip(i18nHelper.getMessage('110095')) -} \ No newline at end of file +} diff --git a/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts index 78bdbe0..dac2450 100644 --- a/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanAbstractLoadHandler.ts @@ -5,7 +5,7 @@ import {moment, Platform, TFile} from "obsidian"; import {i18nHelper} from 'src/org/wanxp/lang/helper'; import {log} from "src/org/wanxp/utils/Logutil"; import {CheerioAPI, load} from "cheerio"; -import YamlUtil from "../../../utils/YamlUtil"; +import YamlUtil, {TITLE_ALIASES_SPECIAL_CHAR_REG_G} from "../../../utils/YamlUtil"; import { BasicConst, DataValueType, @@ -47,7 +47,11 @@ export default abstract class DoubanAbstractLoadHandler async parse(extract: T, context: HandleContext): Promise { const template: string = await this.getTemplate(extract, context); - await this.saveImage(extract, context); + const variableMap = this.buildVariableMap(extract, context); + this.parseUserInfo(template, variableMap, extract, context); + this.parseVariable(template, variableMap, extract, context); + await this.saveImage(extract, context, variableMap); + const frontMatterStart: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, 0); const frontMatterEnd: number = template.indexOf(BasicConst.YAML_FRONT_MATTER_SYMBOL, frontMatterStart + 1); let frontMatter = ''; @@ -55,10 +59,6 @@ export default abstract class DoubanAbstractLoadHandler let frontMatterAfter = ''; let result = ''; - const variableMap = this.buildVariableMap(extract, context); - this.parseUserInfo(template, variableMap, extract, context); - this.parseVariable(template, variableMap, extract, context); - if (frontMatterStart > -1 && frontMatterEnd > -1) { frontMatterBefore = template.substring(0, frontMatterStart); frontMatter = template.substring(frontMatterStart, frontMatterEnd + 3); @@ -111,7 +111,19 @@ export default abstract class DoubanAbstractLoadHandler abstract getSupportType(): SupportType; - abstract parseVariable(beforeContent: string, variableMap:Map, extract: T, context: HandleContext): void; + parseVariable(beforeContent: string, variableMap:Map, extract: T, context: HandleContext): void; + + parseAliases(beforeContent: string, variableMap:Map, extract: T, context: HandleContext): string[] { + // variableMap.set("aliases", new DataField("aliases", DataValueType.array, extract.aliases, + // extract.aliases.map(a=>a + // .trim() + // .replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_') + // //replase multiple _ to single _ + // .replace(/_+/g, '_') + // .replace(/^_/, '') + // .replace(/_$/, '') + // ))); + } abstract support(extract: DoubanSubject): boolean; @@ -522,43 +534,69 @@ export default abstract class DoubanAbstractLoadHandler } } - private async saveImage(extract: T, context: HandleContext) { + private async saveImage(extract: T, context: HandleContext, variableMap : Map) { const {syncConfig} = context; if (!extract.image || (syncConfig && !syncConfig.cacheImage) || !context.settings.cacheImage) { return; } const image = extract.image; - const filename = image.split('/').pop(); let folder = syncConfig? syncConfig.attachmentPath : context.settings.attachmentPath; if (!folder) { folder = DEFAULT_SETTINGS.attachmentPath; } - folder = this.parsePartText(folder, extract, context) - - const referHeaders = {'referer': image}; + folder = this.parsePartPath(folder, extract, context, variableMap) + let fileName = syncConfig? syncConfig.attachmentFileName : context.settings.attachmentFileName; + if (!fileName) { + fileName = DEFAULT_SETTINGS.attachmentFileName; + } + let fileNameSuffix = image ? image.substring(image.lastIndexOf('.')) : '.jpg'; + if (fileNameSuffix && fileNameSuffix.length > 10) { + fileNameSuffix = '.jpg'; + } + fileName = this.parsePartPath(fileName, extract, context, variableMap) + fileName = fileName + fileNameSuffix; + // const referHeaders = {'referer': image}; + const referHeaders = context.settings.loginHeadersContent ? JSON.parse(context.settings.loginHeadersContent) : {}; if ((syncConfig ? syncConfig.cacheHighQuantityImage : context.settings.cacheHighQuantityImage) && context.userComponent.isLogin()) { try { - const fileNameSpilt = filename.split('.'); + const fileNameSpilt = fileName.split('.'); const highFilename = fileNameSpilt.first() + '.jpg'; const highImage = this.getHighQuantityImageUrl(highFilename); const resultValue = await this.handleImage(highImage, folder, highFilename, context, false, referHeaders); if (resultValue && resultValue.success) { extract.image = resultValue.filepath; + this.initImageVariableMap(extract, context, variableMap); return; } - }catch (e) { console.error(e); console.error('下载高清封面失败,将会使用普通封面') } } - const resultValue = await this.handleImage(image, folder, filename, context, true, referHeaders); + const resultValue = await this.handleImage(image, folder, fileName, context, true, referHeaders); if (resultValue && resultValue.success) { extract.image = resultValue.filepath; + this.initImageVariableMap(extract, context, variableMap); } } + private initImageVariableMap(extract: T, context: HandleContext, variableMap : Map) { + variableMap.set(DoubanParameterName.IMAGE_URL, new DataField( + DoubanParameterName.IMAGE_URL, + DataValueType.url, + extract.imageUrl, + extract.imageUrl + )); + variableMap.set(DoubanParameterName.IMAGE, new DataField( + DoubanParameterName.IMAGE, + DataValueType.path, + extract.image, + extract.image + )); + + } + private async handleImage(image: string, folder: string, filename: string, context: HandleContext, showError: boolean, headers?: any) { //只有在桌面版且开启了图片上传才会使用PicGo,并且开启图床功能 if (context.settings.pictureBedFlag && Platform.isDesktopApp) { diff --git a/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts index 2c376aa..899ba04 100644 --- a/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanBookLoadHandler.ts @@ -28,7 +28,7 @@ export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler, extract: DoubanBookSubject, context: HandleContext, textMode: TemplateTextMode): void { + parseVariable(beforeContent: string, variableMap:Map, extract: DoubanBookSubject, context: HandleContext): void { variableMap.set(DoubanBookParameter.author, new DataField(DoubanBookParameter.author, DataValueType.array, extract.author, extract.author.map(this.handleSpecialAuthorName))); variableMap.set(DoubanBookParameter.translator, new DataField(DoubanBookParameter.translator, diff --git a/src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts index e724929..c8e925d 100644 --- a/src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanGameLoadHandler.ts @@ -9,6 +9,7 @@ import {UserStateSubject} from "../model/UserStateSubject"; import {moment} from "obsidian"; import {TITLE_ALIASES_SPECIAL_CHAR_REG_G} from "../../../utils/YamlUtil"; import {DataField} from "../../../utils/model/DataField"; +import {b} from "@shikijs/engine-javascript/dist/shared/engine-javascript.BnuFKbIS"; export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler { @@ -28,7 +29,7 @@ export default class DoubanGameLoadHandler extends DoubanAbstractLoadHandler, extract: DoubanGameSubject, context: HandleContext): void { - variableMap.set("aliases", new DataField("aliases", DataValueType.array, extract.aliases, extract.aliases.map(a=>a.replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_')))); + super.parseAliases(beforeContent, variableMap, extract, context); } support(extract: DoubanSubject): boolean { diff --git a/src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts index 6f33fe8..d9362a6 100644 --- a/src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanMovieLoadHandler.ts @@ -51,13 +51,7 @@ export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler super.getPersonName(name, context)).filter(c => c) )); - - variableMap.set("aliases", new DataField( - "aliases", - DataValueType.array, - extract.aliases, - extract.aliases.map(a => a.replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_')) - )); + super.parseAliases(beforeContent, variableMap, extract, context); } support(extract: DoubanSubject): boolean { diff --git a/src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts index 32227f7..b7f234a 100644 --- a/src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanTeleplayLoadHandler.ts @@ -39,13 +39,7 @@ export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler super.getPersonName(name, context)).filter(c => c) )); - - variableMap.set("aliases", new DataField( - "aliases", - DataValueType.array, - extract.aliases, - extract.aliases.map(a => a.replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_')) - )); + super.parseAliases(beforeContent, variableMap, extract, context); } support(extract: DoubanSubject): boolean { diff --git a/src/org/wanxp/douban/data/handler/DoubanTheaterLoadHandler.ts b/src/org/wanxp/douban/data/handler/DoubanTheaterLoadHandler.ts index d88fa71..a27f8bb 100644 --- a/src/org/wanxp/douban/data/handler/DoubanTheaterLoadHandler.ts +++ b/src/org/wanxp/douban/data/handler/DoubanTheaterLoadHandler.ts @@ -54,7 +54,15 @@ export default class DoubanTheaterLoadHandler extends DoubanAbstractLoadHandler< "aliases", DataValueType.array, extract.aliases, - extract.aliases.map(a => a.replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_')) + extract.aliases.map(a => a + .trim() + .replace(TITLE_ALIASES_SPECIAL_CHAR_REG_G, '_') + //replace multiple _ to single _ + .replace(/_+/g, '_') + .replace(/^_/, '') + .replace(/_$/, '') + + ) )); } diff --git a/src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts b/src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts index 0b8626e..bd7bbe8 100644 --- a/src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts +++ b/src/org/wanxp/douban/data/search/DoubanSearchFuzzySuggestModal.ts @@ -31,7 +31,7 @@ class DoubanFuzzySuggester extends FuzzySuggestModal private searchItem:string; constructor(plugin: DoubanPlugin, context: HandleContext, searchItem:string) { - super(app); + super(plugin.app); this.plugin = plugin; this.context = context; this.searchItem = searchItem; diff --git a/src/org/wanxp/douban/setting/OutputSettingsHelper.ts b/src/org/wanxp/douban/setting/OutputSettingsHelper.ts index b5c21ab..f91f19e 100644 --- a/src/org/wanxp/douban/setting/OutputSettingsHelper.ts +++ b/src/org/wanxp/douban/setting/OutputSettingsHelper.ts @@ -223,7 +223,8 @@ export function constructAttachmentFileSettingsUI(containerEl: HTMLElement, mana }else { new Setting(containerEl).then(createFolderSelectionSetting({containerEl: containerEl, name: '121432', desc: '121433', placeholder: null, key: null, manager: manager})); new Setting(containerEl).then(createFolderSelectionSettingInput({containerEl: containerEl, name: null, desc: null, placeholder: '121434', key: 'attachmentPath', manager: manager})); - + new Setting(containerEl).then(createFolderSelectionSetting({containerEl: containerEl, name: '121452', desc: '121453', placeholder: null, key: null, manager: manager})); + new Setting(containerEl).then(createFolderSelectionSettingInput({containerEl: containerEl, name: null, desc: null, placeholder: '121454', key: 'attachmentFileName', manager: manager})); ; } diff --git a/src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts b/src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts index 142a96b..39e1deb 100644 --- a/src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts +++ b/src/org/wanxp/douban/setting/model/DoubanPluginSetting.ts @@ -33,6 +33,7 @@ export interface DoubanPluginSetting { cacheImage: boolean, cacheHighQuantityImage: boolean, attachmentPath: string, + attachmentFileName: string, pictureBedFlag: boolean pictureBedType: string; pictureBedSetting: PictureBedSetting; diff --git a/src/org/wanxp/douban/sync/handler/SyncHandler.ts b/src/org/wanxp/douban/sync/handler/SyncHandler.ts index bc226e3..5c0c042 100644 --- a/src/org/wanxp/douban/sync/handler/SyncHandler.ts +++ b/src/org/wanxp/douban/sync/handler/SyncHandler.ts @@ -11,6 +11,9 @@ import {i18nHelper} from "../../../lang/helper"; import {DoubanTeleplaySyncHandler} from "./DoubanTeleplaySyncHandler"; import {SyncConditionType} from "../../../constant/Constsant"; import {DoubanGameSyncHandler} from "./DoubanGameSyncHandler"; +import {DataField} from "../../../utils/model/DataField"; +import {VariableUtil} from "../../../utils/VariableUtil"; +import {FileUtil} from "../../../utils/FileUtil"; export default class SyncHandler { private app: App; @@ -101,7 +104,7 @@ export default class SyncHandler { `; }else { // @ts-ignore - details+= `${value.id}-[[${value.title}]]: ${i18nHelper.getMessage(value.status)} + details+= `${value.id}-[[${FileUtil.replaceSpecialCharactersForFileName(value.title)}]]: ${i18nHelper.getMessage(value.status)} `; } diff --git a/src/org/wanxp/douban/sync/model/SyncConfig.ts b/src/org/wanxp/douban/sync/model/SyncConfig.ts index 22c7fe6..b0c3cef 100644 --- a/src/org/wanxp/douban/sync/model/SyncConfig.ts +++ b/src/org/wanxp/douban/sync/model/SyncConfig.ts @@ -13,6 +13,7 @@ export interface SyncConfig { cacheHighQuantityImage:boolean; attachmentPath: string; + attachmentFileName: string; templateFile: string; incrementalUpdate: boolean; } diff --git a/src/org/wanxp/lang/locale/en.ts b/src/org/wanxp/lang/locale/en.ts index 3540eb3..4781c11 100644 --- a/src/org/wanxp/lang/locale/en.ts +++ b/src/org/wanxp/lang/locale/en.ts @@ -248,12 +248,16 @@ PS: This file could be delete if you want to. '121410': `Search Default Type`, '121411': `Search defuault type when open command palette 'search douban and create file'`, - '121430': `Save Attachment File`, + '121430': `Save Attachment(Picture) File`, '121431': `Save attachment file to local disk, such as image ? If you do not enable this feature, it will not show cover image in note`, - '121432': `Attachment folder`, + '121432': `Attachment(Picture) folder`, '121433': `Attachment file created from Obsidian-Douban will be placed in this folder, If blank, they will be created by default name. support all basic template variables. example: {{type}}/assets`, '121434': `assets`, + '121452': `Attachment(Picture) File Name`, + '121453': `Attachment file name, If blank, they will be created by default name '{{title}}'. support all basic template variables. example: {{type}}-{{title}}`, + + '121454': `{{title}}`, '121435': `Save High Definition Cover`, '121436': `High Definition Cover looks better but it will take more space, and you must login douban in this plugin`, '121437': `Please login first, Then this function could be enable`, @@ -330,6 +334,8 @@ PS: This file could be delete if you want to. '140102': `subject type is different, will not sync this, chosen sync type is {0} but this {1} subject type is {2}`, '130105': `Can not use Douban this time, Please try again after 12 hour or 24 hour. Or you can reset your connection `, '130106': `Can not use Douban this time, Please try Login In Douban Plugin. If not working please again after 12 hour or 24 hour. Or you can reset your connection `, + '130404': `404 Url Not Found`, + '130107': `Can not find array setting for {1} in {0} , Please add it in array settings`, '130108': `Redirect times too much, please check your network or proxy`, diff --git a/src/org/wanxp/lang/locale/zh-cn.ts b/src/org/wanxp/lang/locale/zh-cn.ts index 64a390e..6045132 100644 --- a/src/org/wanxp/lang/locale/zh-cn.ts +++ b/src/org/wanxp/lang/locale/zh-cn.ts @@ -1,4 +1,5 @@ //简体中文 +//简体中文 import {SyncItemStatus} from "../../constant/Constsant"; @@ -302,9 +303,12 @@ export default { '121430': `保存图片附件`, '121431': `导入数据会同步保存图片附件到本地文件夹, 如电影封面,书籍封面。如果需要显示封面,请保持开启该功能。`, - '121432': `附件存放位置`, + '121432': `附件(图片)存放位置`, '121433': `保存的附件将会存放至该文件夹中. 如果为空, 笔记将会存放到默认位置(assets), 且支持所有'通用'的参数。如:{{myType}}/attachments`, + '121452': `附件(图片)文件名`, + '121453': `附件的文件名模板, 支持所有'通用'的参数作为名称(如:{{type}}-{{title}}),且支持路径, 比如: '{{myType}}/附件-{{title}}'。如果为空, 则使用默认名称{{title}}`, '121434': `assets`, + '121454': `{{title}}`, '121435': `保存高清封面`, '121436': `高清封面图片质量更高清晰度更好, 需要您在此插件 登录豆瓣 才能生效, 若未登录则默认使用低精度版本封面`, '121437': `登录后此功能才会生效`, diff --git a/src/org/wanxp/main.ts b/src/org/wanxp/main.ts index 5690ea1..3f8e9bf 100644 --- a/src/org/wanxp/main.ts +++ b/src/org/wanxp/main.ts @@ -282,7 +282,7 @@ export default class DoubanPlugin extends Plugin { - this.settingsManager = new SettingsManager(app, this); + this.settingsManager = new SettingsManager(this.app, this); // this.fetchOnlineData(this.settingsManager); this.userComponent = new UserComponent(this.settingsManager); this.netFileHandler = new NetFileHandler(this.fileHandler); diff --git a/src/org/wanxp/net/NetFileHandler.ts b/src/org/wanxp/net/NetFileHandler.ts index 8997e8b..fafb3b8 100644 --- a/src/org/wanxp/net/NetFileHandler.ts +++ b/src/org/wanxp/net/NetFileHandler.ts @@ -19,15 +19,25 @@ export default class NetFileHandler { const filePath:string = FileUtil.join(folder, filename); return HttpUtil.httpRequestBuffer(url, headers, context.plugin.settingsManager) .then((response) => { + if (response.status == 404) { + throw new Error(i18nHelper.getMessage('130404')); + } if (response.status == 403) { throw new Error(i18nHelper.getMessage('130106')); } return response.textArrayBuffer; }) .then((buffer) => { + if (!buffer || buffer.byteLength == 0) { + return 0; + } this.fileHandler.creatAttachmentWithData(filePath, buffer); - }).then(() => { - return {success: true, error: '', filepath: filePath}; + return buffer.byteLength; + }).then((size) => { + if (size == 0) { + return {success: false, size: size, error: '文件唯恐', filepath: null}; + } + return {success: true, size: size, error: '', filepath: filePath}; }) .catch(e => { if (showError) { diff --git a/src/org/wanxp/utils/VariableUtil.ts b/src/org/wanxp/utils/VariableUtil.ts index 4c1ef94..d7b350a 100644 --- a/src/org/wanxp/utils/VariableUtil.ts +++ b/src/org/wanxp/utils/VariableUtil.ts @@ -96,7 +96,7 @@ export class VariableUtil { } else if(value instanceof DataField) { content = this.replaceDataField(variable, value, content, settingManager, targetType); } else { - content = this.replaceString(variable, value, content, settingManager, targetType); + content = this.replaceString(variable, value, value, content, settingManager, targetType); } return content; } @@ -135,12 +135,12 @@ export class VariableUtil { return `{{${key}}}`; } - static replaceString(variable: FieldVariable, value: any, content: string, settingManager:SettingsManager, targetType: TargetType): string { + static replaceString(variable: FieldVariable, valueField: DataField, value: any, content: string, settingManager:SettingsManager, targetType: TargetType): string { if (!content) { return content; } let strValue = value? value.toString() : ""; - return content.replaceAll(variable.variable, this.handleText(strValue, targetType)); + return content.replaceAll(variable.variable, this.handleText(strValue, targetType, valueField)); } /** @@ -186,7 +186,7 @@ export class VariableUtil { private static replaceMap(obj: Map, allVariables:FieldVariable[], content: string, settingManager: SettingsManager, targetType: TargetType) { allVariables.forEach(variable => { const value = obj.get(variable.key); - content = this.replaceVariable(variable, value,content, settingManager, targetType); + content = this.replaceVariable(variable, value, content, settingManager, targetType); }); return content; } @@ -220,19 +220,19 @@ export class VariableUtil { } switch (value.type) { case DataValueType.string: - content = this.replaceString(variable, value.value, content, settingManager, targetType); + content = this.replaceString(variable, value, value.value, content, settingManager, targetType); break; case DataValueType.number: - content = content.replaceAll(variableStr, this.handleText(value.value.toString(), targetType)); + content = content.replaceAll(variableStr, this.handleText(value.value.toString(), targetType, value)); break; case DataValueType.date: - content = content.replaceAll(variableStr, this.handleText(value.value, targetType)); + content = content.replaceAll(variableStr, this.handleText(value.value, targetType, value)); break; case DataValueType.array: content = this.replaceArray(variable, value.value, content, settingManager, targetType); break; default: - content = content.replaceAll(variableStr, this.handleText(value.value, targetType)); + content = content.replaceAll(variableStr, this.handleText(value.value, targetType, value)); break; } @@ -277,9 +277,9 @@ export class VariableUtil { return map; } - private static handleText(v: string, targetType: TargetType) { + private static handleText(v: string, targetType: TargetType, dataField: DataField = null): string { if (targetType === 'yml_text') { - return YamlUtil.handleText(v); + return YamlUtil.handleText(v, dataField); } if (targetType === 'text') { return v; diff --git a/src/org/wanxp/utils/YamlUtil.ts b/src/org/wanxp/utils/YamlUtil.ts index 53651bf..7e8d82c 100644 --- a/src/org/wanxp/utils/YamlUtil.ts +++ b/src/org/wanxp/utils/YamlUtil.ts @@ -1,5 +1,7 @@ -export default class YamlUtil { +import {DataField} from "./model/DataField"; +import {DataValueType} from "../constant/Constsant"; +export default class YamlUtil { public static hasSpecialChar(str: string): boolean { return SPECIAL_CHAR_REG.test(str); @@ -14,21 +16,26 @@ export default class YamlUtil { return '"' + text + '"'; } - public static handleText(text: string) { - return YamlUtil.hasSpecialChar(text) - ? YamlUtil.handleSpecialChar(text.replaceAll('"', '\\"')) - .replaceAll(/\s+/g,' ') + public static handleText(text: string, dataField: DataField = null): string { + if (YamlUtil.hasSpecialChar(text)) { + text = text.replaceAll('"', '\\"') + .replaceAll(/\s+/g, ' ') .replaceAll('\n', '。') .replaceAll('。。', '。') .replace(/^" /, '"') // Remove leading " .replace(/ "$/, '"') // Remove trailing " - : text; + if (dataField && dataField.type === DataValueType.date) { + return text; + } + YamlUtil.handleSpecialChar(text); + } + return text; } } export const SPECIAL_CHAR_REG = /[{}\[\]&*#?|\-<>=!%@:"`,\n]/; -export const TITLE_ALIASES_SPECIAL_CHAR_REG_G = /[{}\[\]&*#?|\-<>=!%@:"`,, \n]/g; +export const TITLE_ALIASES_SPECIAL_CHAR_REG_G = /[{}\[\]&*#?|\-<>=!%@:"`,,\n]/g; const SPECIAL_CHAR_REG_REPLACE: Map = new Map([ ['{', '\\{'],