Skip to content

Commit be539ff

Browse files
authored
Merge pull request #3542 from ilandikov/feat-link-isLinkTo
feature: Add `Link.isLinkTo()`, for easy 'filter by function'
2 parents 4ff93fc + a9dbf97 commit be539ff

File tree

2 files changed

+71
-5
lines changed

2 files changed

+71
-5
lines changed

src/Task/Link.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Reference } from 'obsidian';
2+
import type { TasksFile } from '../Scripting/TasksFile';
23

34
export class Link {
45
private readonly rawLink: Reference;
@@ -67,4 +68,26 @@ export class Link {
6768
public get displayText(): string | undefined {
6869
return this.rawLink.displayText;
6970
}
71+
72+
public isLinkTo(destination: string | TasksFile): boolean {
73+
if (typeof destination === 'string') {
74+
const removeMd = /\.md$/;
75+
const thisDestinationWithoutMd = this.destination.replace(removeMd, '');
76+
const destinationWithoutMd = destination.replace(removeMd, '');
77+
78+
// This is filenames match allowing extension to be present or absent
79+
if (destinationWithoutMd === thisDestinationWithoutMd) {
80+
return true;
81+
}
82+
83+
// The link can contain a folder that is not present in the parameter
84+
if (thisDestinationWithoutMd.endsWith(`/${destinationWithoutMd}`)) {
85+
return true;
86+
}
87+
88+
return false;
89+
}
90+
91+
return this.isLinkTo(destination.path);
92+
}
7093
}

tests/Task/Link.test.ts

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
import { TasksFile } from '../../src/Scripting/TasksFile';
12
import { Link } from '../../src/Task/Link';
2-
3-
import links_everywhere from '../Obsidian/__test_data__/links_everywhere.json';
43
import internal_heading_links from '../Obsidian/__test_data__/internal_heading_links.json';
5-
import link_in_task_wikilink from '../Obsidian/__test_data__/link_in_task_wikilink.json';
64
import link_in_task_markdown_link from '../Obsidian/__test_data__/link_in_task_markdown_link.json';
5+
import link_in_task_wikilink from '../Obsidian/__test_data__/link_in_task_wikilink.json';
6+
7+
import links_everywhere from '../Obsidian/__test_data__/links_everywhere.json';
78
import { allCacheSampleData } from '../Obsidian/AllCacheSampleData';
8-
import { getTasksFileFromMockData } from '../TestingTools/MockDataHelpers';
9+
import type { SimulatedFile } from '../Obsidian/SimulatedFile';
910
import { addBackticks, formatToRepresentType } from '../Scripting/ScriptingTestHelpers';
11+
import { getTasksFileFromMockData } from '../TestingTools/MockDataHelpers';
1012
import { verifyMarkdown } from '../TestingTools/VerifyMarkdown';
11-
import type { SimulatedFile } from '../Obsidian/SimulatedFile';
1213

1314
function getLink(data: any, index: number) {
1415
const rawLink = data.cachedMetadata.links[index];
@@ -24,6 +25,8 @@ describe('linkClass', () => {
2425
expect(link.destination).toEqual('link_in_file_body');
2526
expect(link.displayText).toEqual('link_in_file_body');
2627
expect(link.markdown).toEqual(link.originalMarkdown);
28+
expect(link.isLinkTo('link_in_file_body')).toEqual(true);
29+
expect(link.isLinkTo('link_in_file_body.md')).toEqual(true);
2730
});
2831

2932
describe('return markdown to navigate to a link', () => {
@@ -238,6 +241,46 @@ describe('linkClass', () => {
238241
// Empty Markdown Link Tests
239242
// []() and [alias]() are not detected by the obsidian parser as a link
240243
});
244+
245+
describe('isLinkTo() tests', () => {
246+
it('matches filenames', () => {
247+
const link = getLink(links_everywhere, 0);
248+
249+
expect(link.isLinkTo('link_in_file_body')).toEqual(true);
250+
expect(link.isLinkTo('link_in_file_body.md')).toEqual(true);
251+
252+
expect(link.isLinkTo('somewhere_else')).toEqual(false);
253+
254+
expect(link.isLinkTo('link_in_file_body_but_different')).toEqual(false);
255+
expect(link.isLinkTo('link_in_file_')).toEqual(false);
256+
});
257+
258+
it('matches without folders', () => {
259+
const linkToAFile = getLink(link_in_task_wikilink, 0);
260+
expect(linkToAFile.originalMarkdown).toMatchInlineSnapshot('"[[link_in_task_wikilink]]"');
261+
262+
expect(linkToAFile.isLinkTo('link_in_task_wikilink')).toEqual(true);
263+
});
264+
265+
it('matches with folders', () => {
266+
const linkToAFolder = getLink(link_in_task_wikilink, 2);
267+
expect(linkToAFolder.originalMarkdown).toMatchInlineSnapshot('"[[Test Data/link_in_task_wikilink]]"');
268+
269+
expect(linkToAFolder.isLinkTo('link_in_task_wikilink')).toEqual(true);
270+
expect(linkToAFolder.isLinkTo('Test Data/link_in_task_wikilink')).toEqual(true);
271+
expect(linkToAFolder.isLinkTo('Test Data/link_in_task_wikilink.md')).toEqual(true);
272+
});
273+
274+
it('matches TasksFile', () => {
275+
const linkToAFolder = getLink(link_in_task_wikilink, 2);
276+
expect(linkToAFolder.originalMarkdown).toMatchInlineSnapshot('"[[Test Data/link_in_task_wikilink]]"');
277+
278+
expect(linkToAFolder.isLinkTo(new TasksFile('Test Data/link_in_task_wikilink.md'))).toEqual(true);
279+
expect(linkToAFolder.isLinkTo(new TasksFile('link_in_task_wikilink.md'))).toEqual(true);
280+
expect(linkToAFolder.isLinkTo(new TasksFile('Wrong Test Data/link_in_task_wikilink.md'))).toEqual(false);
281+
expect(linkToAFolder.isLinkTo(new TasksFile('something_obviously_different.md'))).toEqual(false);
282+
});
283+
});
241284
});
242285

243286
describe('visualise links', () => {

0 commit comments

Comments
 (0)