From 843b14f48b82c9e6df438b34830e86176bd62dfc Mon Sep 17 00:00:00 2001 From: Jiya Hai <1316317715@qq.com> Date: Wed, 26 Nov 2025 20:48:19 +0800 Subject: [PATCH] feat(timeline): Improve file link functionality - Enhance the timeline generation from file links to automatically use the currently active file --- manifest.json | 2 +- package-lock.json | 2 +- package.json | 2 +- src/FileSuggest.ts | 22 ++++++------ src/i18n.ts | 8 ++--- src/main.ts | 88 +++++++++++++++++++++++++++++----------------- versions.json | 3 +- 7 files changed, 76 insertions(+), 51 deletions(-) diff --git a/manifest.json b/manifest.json index fa984d4..4d8e0d9 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "generate-timeline", "name": "Generate Timeline", - "version": "1.2.5", + "version": "1.2.6", "minAppVersion": "0.15.0", "description": "Generate timelines from tag folder file or metadata automatically by any time properties.", "author": "Shanshuimei", diff --git a/package-lock.json b/package-lock.json index 425e910..5fef5d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "obsidian-timeline-plugin", - "version": "1.2.4", + "version": "1.2.6", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 980d69f..49a2b02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "generate-timeline", - "version": "1.2.5", + "version": "1.2.6", "description": "Generate timelines from tag, folder, file or metadata automatically by any time properties.", "main": "main.js", "type": "module", diff --git a/src/FileSuggest.ts b/src/FileSuggest.ts index 0605179..6af1bd4 100644 --- a/src/FileSuggest.ts +++ b/src/FileSuggest.ts @@ -8,13 +8,20 @@ export class FileSuggestModal extends FuzzySuggestModal { this.setPlaceholder(this.settings.language === 'zh-CN' ? "选择一个Markdown文件" : "Select a Markdown file"); } - getItems(): TFile[] { - // 过滤掉timelines文件夹中的Markdown文件 - return this.app.vault.getMarkdownFiles().filter(file => { - return !file.path.startsWith('timelines/') && file.path !== 'timelines'; + async openAndGetValue(): Promise { + return new Promise((resolve) => { + this.resolve = resolve; + this.open(); }); } + getItems(): TFile[] { + // 返回所有Markdown文件,但过滤掉timelines文件夹中的文件 + return this.app.vault.getMarkdownFiles().filter(file => + !file.path.startsWith('timelines/') && file.path !== 'timelines' + ); + } + getItemText(file: TFile): string { return file.path; } @@ -23,11 +30,4 @@ export class FileSuggestModal extends FuzzySuggestModal { this.resolve(file); this.close(); } - - async openAndGetValue(): Promise { - return new Promise((resolve) => { - this.resolve = resolve; - this.open(); - }); - } } \ No newline at end of file diff --git a/src/i18n.ts b/src/i18n.ts index 98eee23..5f5c29d 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -123,8 +123,8 @@ export const zhCN: I18nStrings = { generateFileFromFolder: '从文件夹生成时间轴文件', generateFromTag: '从标签生成时间轴视图', generateFileFromTag: '从标签生成时间轴文件', - generateFromFileLinks: '从文件链接生成时间轴视图', - generateFileFromFileLinks: '从文件链接生成时间轴文件', + generateFromFileLinks: '从当前文件链接生成时间轴视图', + generateFileFromFileLinks: '从当前文件链接生成时间轴文件', generateFromMetadata: '从元数据生成时间轴视图', generateFileFromMetadata: '从元数据生成时间轴文件' }, @@ -199,8 +199,8 @@ export const enUS: I18nStrings = { generateFileFromFolder: 'Generate Timeline File from any Folder', generateFromTag: 'Generate Timeline View from any Tag', generateFileFromTag: 'Generate Timeline File from any Tag', - generateFromFileLinks: 'Generate Timeline View from File Links', - generateFileFromFileLinks: 'Generate Timeline File from File Links', + generateFromFileLinks: 'Generate Timeline View from Current File Links', + generateFileFromFileLinks: 'Generate Timeline File from Current File Links', generateFromMetadata: 'Generate Timeline View from any Metadata', generateFileFromMetadata: 'Generate Timeline File from any Metadata' }, diff --git a/src/main.ts b/src/main.ts index d7f61bb..f0a17ea 100644 --- a/src/main.ts +++ b/src/main.ts @@ -180,20 +180,32 @@ export default class TimelinePlugin extends Plugin { name: this.i18n.commands.generateFromFileLinks, callback: async () => { try { - const file = await this.selectFile(); - if (file) { - await this.activateView(this.settings.defaultPosition); - const view = this.getTimelineView(); - if (view) { - const timeline = new Timeline(this.app, this.settings); - const items = await timeline.generateFromFileLinks(file); - view.items = items; - view.currentTitle = `🔗 ${file.basename} `; - await view.render(); - } + // 获取当前活动文件 + const file = this.app.workspace.getActiveFile(); + if (!file || !(file instanceof TFile) || file.extension !== 'md') { + new Notice(this.i18n.errors.generateFileFailed); + return; + } + + // 检查文件是否包含链接 + const cache = this.app.metadataCache.getFileCache(file); + if (!cache || !cache.links || cache.links.length === 0) { + new Notice(this.i18n.errors.noFileLinks.replace('{filename}', file.basename)); + return; + } + + await this.activateView(this.settings.defaultPosition); + const view = this.getTimelineView(); + if (view) { + const timeline = new Timeline(this.app, this.settings); + const items = await timeline.generateFromFileLinks(file); + view.items = items; + view.currentTitle = `🔗 ${file.basename} `; + await view.render(); } } catch (error) { console.error('从文件链接生成时间轴视图时出错:', error); + new Notice(this.i18n.errors.generateFileFailed); } } }); @@ -204,30 +216,42 @@ export default class TimelinePlugin extends Plugin { name: this.i18n.commands.generateFileFromFileLinks, callback: async () => { try { - const file = await this.selectFile(); - if (file) { - const timeline = new Timeline(this.app, this.settings); - const items = await timeline.generateFromFileLinks(file); - const content = await timeline.generateTimelineMarkdown( - items, - `Timeline - Links in ${file.basename}`, - { type: 'file', value: file.path } - ); - - const { folderPath } = await this.createNestedFolders('linked-files'); - const finalFileName = this.generateFileName(file.basename); - const filePath = `${folderPath}/${finalFileName}.md`; - - const existingFile = this.app.vault.getAbstractFileByPath(filePath); - if (existingFile) { - await this.app.vault.delete(existingFile); - } - - const newFile = await this.app.vault.create(filePath, content); - await this.app.workspace.getLeaf().openFile(newFile); + // 获取当前活动文件 + const file = this.app.workspace.getActiveFile(); + if (!file || !(file instanceof TFile) || file.extension !== 'md') { + new Notice(this.i18n.errors.generateFileFailed); + return; } + + // 检查文件是否包含链接 + const cache = this.app.metadataCache.getFileCache(file); + if (!cache || !cache.links || cache.links.length === 0) { + new Notice(this.i18n.errors.noFileLinks.replace('{filename}', file.basename)); + return; + } + + const timeline = new Timeline(this.app, this.settings); + const items = await timeline.generateFromFileLinks(file); + const content = await timeline.generateTimelineMarkdown( + items, + `Timeline - Links in ${file.basename}`, + { type: 'file', value: file.path } + ); + + const { folderPath } = await this.createNestedFolders('linked-files'); + const finalFileName = this.generateFileName(file.basename); + const filePath = `${folderPath}/${finalFileName}.md`; + + const existingFile = this.app.vault.getAbstractFileByPath(filePath); + if (existingFile) { + await this.app.vault.delete(existingFile); + } + + const newFile = await this.app.vault.create(filePath, content); + await this.app.workspace.getLeaf().openFile(newFile); } catch (error) { console.error('从文件链接生成时间轴文件时出错:', error); + new Notice(this.i18n.errors.generateFileFailed); } } }); diff --git a/versions.json b/versions.json index 712f0e1..191145e 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,5 @@ { "1.2.4": "0.15.0", - "1.2.5": "0.15.0" + "1.2.5": "0.15.0", + "1.2.6": "0.15.0" } \ No newline at end of file