feat(timeline): Improve file link functionality

- Enhance the timeline generation from file links to automatically use the currently active file
This commit is contained in:
Jiya Hai 2025-11-26 20:48:19 +08:00
parent 274f95dbce
commit 843b14f48b
7 changed files with 76 additions and 51 deletions

View file

@ -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",

2
package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "obsidian-timeline-plugin",
"version": "1.2.4",
"version": "1.2.6",
"lockfileVersion": 3,
"requires": true,
"packages": {

View file

@ -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",

View file

@ -8,13 +8,20 @@ export class FileSuggestModal extends FuzzySuggestModal<TFile> {
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<TFile | null> {
return new Promise<TFile | null>((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<TFile> {
this.resolve(file);
this.close();
}
async openAndGetValue(): Promise<TFile | null> {
return new Promise<TFile | null>((resolve) => {
this.resolve = resolve;
this.open();
});
}
}

View file

@ -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'
},

View file

@ -180,8 +180,20 @@ export default class TimelinePlugin extends Plugin {
name: this.i18n.commands.generateFromFileLinks,
callback: async () => {
try {
const file = await this.selectFile();
if (file) {
// 获取当前活动文件
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) {
@ -191,9 +203,9 @@ export default class TimelinePlugin extends Plugin {
view.currentTitle = `🔗 ${file.basename} `;
await view.render();
}
}
} catch (error) {
console.error('从文件链接生成时间轴视图时出错:', error);
new Notice(this.i18n.errors.generateFileFailed);
}
}
});
@ -204,8 +216,20 @@ export default class TimelinePlugin extends Plugin {
name: this.i18n.commands.generateFileFromFileLinks,
callback: async () => {
try {
const file = await this.selectFile();
if (file) {
// 获取当前活动文件
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(
@ -225,9 +249,9 @@ export default class TimelinePlugin extends Plugin {
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);
}
}
});

View file

@ -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"
}