Skip to content

Commit f616bf5

Browse files
committed
Revert "refactor: Minor refactoring of links code and tests (#3494)"
Because I squashed it by mistake. This reverts commit 15be161.
1 parent 15be161 commit f616bf5

File tree

3 files changed

+60
-43
lines changed

3 files changed

+60
-43
lines changed

src/Scripting/TasksFile.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export class TasksFile {
5151
}
5252

5353
/**
54-
* Return an array of {@link Link} in the body of the file.
54+
* Return a array of Link in the body of the file.
5555
*/
5656
get outLinks(): Link[] {
5757
return this.cachedMetadata?.links?.map((link) => new Link(link, this.filenameWithoutExtension)) ?? [];

src/Task/Link.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,35 @@
11
import type { LinkCache } from 'obsidian';
22

33
export class Link {
4-
private readonly rawLink: LinkCache;
5-
private readonly filenameContainingLink: string;
4+
private rawLink: LinkCache;
5+
private filename: string;
66

77
/**
88
* @param {LinkCache} rawLink - The raw link from Obsidian cache.
9-
* @param {string} filenameContainingLink - The name of the file where this link is located.
9+
* @param {string} filename - The name of the file where this link is located.
1010
*/
11-
constructor(rawLink: LinkCache, filenameContainingLink: string) {
11+
constructor(rawLink: LinkCache, filename: string) {
1212
this.rawLink = rawLink;
13-
this.filenameContainingLink = filenameContainingLink;
13+
this.filename = filename;
1414
}
1515

16-
public get originalMarkdown(): string {
16+
public get originalMarkdown() {
1717
return this.rawLink.original;
1818
}
1919

20-
public get destination(): string {
20+
public get destination() {
2121
return this.rawLink.link;
2222
}
2323

2424
/**
2525
* Returns the filename of the link destination without the path or alias
2626
* Removes the .md extension if present leaves other extensions intact.
27-
* No accommodation for empty links.
27+
* No accomodation for empty links.
2828
* @returns {string}
2929
*/
30-
public get destinationFilename(): string {
30+
public get destinationFilename() {
3131
// Handle internal links (starting with '#')
32-
if (this.destination.startsWith('#')) {
33-
return this.filenameContainingLink;
34-
}
32+
if (this.destination[0] === '#') return this.filename;
3533

3634
// Extract filename from path (handles both path and optional hash fragment)
3735
const pathPart = this.destination.split('#', 1)[0];
@@ -41,7 +39,7 @@ export class Link {
4139
return destFilename.endsWith('.md') ? destFilename.slice(0, -3) : destFilename;
4240
}
4341

44-
public get displayText(): string | undefined {
42+
public get displayText() {
4543
return this.rawLink.displayText;
4644
}
4745
}

tests/Task/Link.test.ts

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@ import internal_heading_links from '../Obsidian/__test_data__/internal_heading_l
66
import link_in_task_wikilink from '../Obsidian/__test_data__/link_in_task_wikilink.json';
77
import link_in_task_markdown_link from '../Obsidian/__test_data__/link_in_task_markdown_link.json';
88

9-
function getLink(data: any, index: number) {
10-
const rawLink = data.cachedMetadata.links[index];
11-
return new Link(rawLink, new TasksFile(data.filePath).filenameWithoutExtension);
12-
}
13-
149
describe('linkClass', () => {
1510
it('should construct a Link object', () => {
16-
const link = getLink(links_everywhere, 0);
11+
const rawLink = links_everywhere.cachedMetadata.links[0];
12+
const link = new Link(rawLink, new TasksFile(links_everywhere.filePath).filenameWithoutExtension);
1713

1814
expect(link).toBeDefined();
1915
expect(link.originalMarkdown).toEqual('[[link_in_file_body]]');
@@ -29,73 +25,83 @@ describe('linkClass', () => {
2925

3026
// Tests checking against __internal_heading_links__
3127
it('should return the filename of the containing note if the link is internal [[#heading]]', () => {
32-
const link = getLink(internal_heading_links, 0);
28+
const rawLink = internal_heading_links.cachedMetadata.links[0];
29+
const link = new Link(rawLink, new TasksFile(internal_heading_links.filePath).filenameWithoutExtension);
3330

3431
expect(link.originalMarkdown).toEqual('[[#Basic Internal Links]]');
3532
expect(link.destinationFilename).toEqual('internal_heading_links');
3633
});
3734

3835
it('should return the filename of the containing note if the link is internal and has an alias [[#heading|display text]]', () => {
39-
const link = getLink(internal_heading_links, 6);
36+
const rawLink = internal_heading_links.cachedMetadata.links[6];
37+
const link = new Link(rawLink, new TasksFile(internal_heading_links.filePath).filenameWithoutExtension);
4038

4139
expect(link.originalMarkdown).toEqual('[[#Header Links With File Reference]]');
4240
expect(link.destinationFilename).toEqual('internal_heading_links');
4341
});
4442

4543
// Tests checking against __link_in_task_wikilink__
4644
it('should return the filename if simple [[filename]]', () => {
47-
const link = getLink(link_in_task_wikilink, 0);
45+
const rawLink = link_in_task_wikilink.cachedMetadata.links[0];
46+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
4847

4948
expect(link.originalMarkdown).toEqual('[[link_in_task_wikilink]]');
5049
expect(link.destinationFilename).toEqual('link_in_task_wikilink');
5150
});
5251

5352
it('should return the filename if link has a path [[path/filename]]', () => {
54-
const link = getLink(link_in_task_wikilink, 2);
53+
const rawLink = link_in_task_wikilink.cachedMetadata.links[2];
54+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
5555

5656
expect(link.originalMarkdown).toEqual('[[path/link_in_task_wikilink]]');
5757
expect(link.destinationFilename).toEqual('link_in_task_wikilink');
5858
});
5959

6060
it('should return the filename if link has a path and a heading link [[path/filename#heading]]', () => {
61-
const link = getLink(link_in_task_wikilink, 3);
61+
const rawLink = link_in_task_wikilink.cachedMetadata.links[3];
62+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
6263

6364
expect(link.originalMarkdown).toEqual('[[path/link_in_task_wikilink#heading_link]]');
6465
expect(link.destinationFilename).toEqual('link_in_task_wikilink');
6566
});
6667

6768
it('should return the filename if link has an alias [[filename|alias]]', () => {
68-
const link = getLink(link_in_task_wikilink, 4);
69+
const rawLink = link_in_task_wikilink.cachedMetadata.links[4];
70+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
6971

7072
expect(link.originalMarkdown).toEqual('[[link_in_task_wikilink|alias]]');
7173
expect(link.destinationFilename).toEqual('link_in_task_wikilink');
7274
});
7375

7476
it('should return the filename if link has a path and an alias [[path/path/filename|alias]]', () => {
75-
const link = getLink(link_in_task_wikilink, 5);
77+
const rawLink = link_in_task_wikilink.cachedMetadata.links[5];
78+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
7679

7780
expect(link.originalMarkdown).toEqual('[[path/path/link_in_task_wikilink|alias]]');
7881
expect(link.destinationFilename).toEqual('link_in_task_wikilink');
7982
});
8083

8184
// # is a valid character in a filename or a path but Obsidian does not support it in links
8285
it('should return the filename if path contains a # [[pa#th/path/filename]]', () => {
83-
const link = getLink(link_in_task_wikilink, 6);
86+
const rawLink = link_in_task_wikilink.cachedMetadata.links[6];
87+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
8488

8589
expect(link.originalMarkdown).toEqual('[[pa#th/path/link_in_task_wikilink]]');
8690
expect(link.destinationFilename).toEqual('pa');
8791
});
8892

8993
// When grouping a Wikilink link expect [[file.md]] to be grouped with [[file]].
9094
it('should return a filename with no file extension if suffixed with .md [[link_in_task_wikilink.md]]', () => {
91-
const link = getLink(link_in_task_wikilink, 7);
95+
const rawLink = link_in_task_wikilink.cachedMetadata.links[7];
96+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
9297

9398
expect(link.originalMarkdown).toEqual('[[link_in_task_wikilink.md]]');
9499
expect(link.destinationFilename).toEqual('link_in_task_wikilink');
95100
});
96101

97102
it('should return a filename with corresponding file extension if not markdown [[a_pdf_file.pdf]]', () => {
98-
const link = getLink(link_in_task_wikilink, 8);
103+
const rawLink = link_in_task_wikilink.cachedMetadata.links[8];
104+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
99105

100106
expect(link.originalMarkdown).toEqual('[[a_pdf_file.pdf]]');
101107
expect(link.destinationFilename).toEqual('a_pdf_file.pdf');
@@ -105,21 +111,24 @@ describe('linkClass', () => {
105111
// [[]] is not detected by the obsidian parser as a link
106112

107113
it('should provide no special functionality for [[|]]; returns "|")', () => {
108-
const link = getLink(link_in_task_wikilink, 9);
114+
const rawLink = link_in_task_wikilink.cachedMetadata.links[9];
115+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
109116

110117
expect(link.originalMarkdown).toEqual('[[|]]');
111118
expect(link.destinationFilename).toEqual('|');
112119
});
113120

114121
it('should provide no special functionality for [[|alias]]; returns "|alias".)', () => {
115-
const link = getLink(link_in_task_wikilink, 10);
122+
const rawLink = link_in_task_wikilink.cachedMetadata.links[10];
123+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
116124

117125
expect(link.originalMarkdown).toEqual('[[|alias]]');
118126
expect(link.destinationFilename).toEqual('|alias');
119127
});
120128

121129
it('should provide no special functionality for [[|#alias]]; returns "|".)', () => {
122-
const link = getLink(link_in_task_wikilink, 11);
130+
const rawLink = link_in_task_wikilink.cachedMetadata.links[11];
131+
const link = new Link(rawLink, new TasksFile(link_in_task_wikilink.filePath).filenameWithoutExtension);
123132

124133
expect(link.originalMarkdown).toEqual('[[|#alias]]');
125134
expect(link.destinationFilename).toEqual('|');
@@ -132,50 +141,57 @@ describe('linkClass', () => {
132141
// Tests checking against __link_in_task_markdown_link__
133142

134143
it('should return the filename if the link is internal [display name](#heading)', () => {
135-
const link = getLink(link_in_task_markdown_link, 8);
144+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[8];
145+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
136146

137147
expect(link.originalMarkdown).toEqual('[heading](#heading)');
138148
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
139149
});
140150

141151
it('should return the filename when a simple markdown link [display name](filename)', () => {
142-
const link = getLink(link_in_task_markdown_link, 2);
152+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[2];
153+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
143154

144155
expect(link.originalMarkdown).toEqual('[link_in_task_markdown_link](link_in_task_markdown_link.md)');
145156
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
146157
});
147158

148159
it('should return the filename if link has a path [link_in_task_markdown_link](path/filename.md)', () => {
149-
const link = getLink(link_in_task_markdown_link, 3);
160+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[3];
161+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
150162

151163
expect(link.originalMarkdown).toEqual('[link_in_task_markdown_link](path/link_in_task_markdown_link.md)');
152164
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
153165
});
154166

155167
it('should return the filename if link has a path and a heading link [heading_link](path/filename.md#heading)', () => {
156-
const link = getLink(link_in_task_markdown_link, 4);
168+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[4];
169+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
157170

158171
expect(link.originalMarkdown).toEqual('[heading_link](path/link_in_task_markdown_link.md#heading_link)');
159172
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
160173
});
161174

162175
it('should return the filename if link has an alias [alias](filename.md)', () => {
163-
const link = getLink(link_in_task_markdown_link, 5);
176+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[5];
177+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
164178

165179
expect(link.originalMarkdown).toEqual('[alias](link_in_task_markdown_link.md)');
166180
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
167181
});
168182

169183
it('should return the filename if link has a path and an alias [alias](path/path/filename.md)', () => {
170-
const link = getLink(link_in_task_markdown_link, 6);
184+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[6];
185+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
171186

172187
expect(link.originalMarkdown).toEqual('[alias](path/path/link_in_task_markdown_link.md)');
173188
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
174189
});
175190

176191
// # is a valid character in a filename or a path but Obsidian does not support it in links
177192
it('should return the string before the # [link_in_task_markdown_link](pa#th/path/filename.md)', () => {
178-
const link = getLink(link_in_task_markdown_link, 7);
193+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[7];
194+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
179195

180196
expect(link.originalMarkdown).toEqual(
181197
'[link_in_task_markdown_link](pa#th/path/link_in_task_markdown_link.md)',
@@ -185,21 +201,24 @@ describe('linkClass', () => {
185201

186202
// When grouping a Wikilink link expect [[file.md]] to be grouped with [[file]].
187203
it('should return a filename when no .md extension if the .md exists in markdown link [alias](filename)', () => {
188-
const link = getLink(link_in_task_markdown_link, 9);
204+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[9];
205+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
189206

190207
expect(link.originalMarkdown).toEqual('[link_in_task_markdown_link](link_in_task_markdown_link)');
191208
expect(link.destinationFilename).toEqual('link_in_task_markdown_link');
192209
});
193210

194211
it('should return a filename with corresponding file extension if not markdown [a_pdf_file](a_pdf_file.pdf)', () => {
195-
const link = getLink(link_in_task_markdown_link, 10);
212+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[10];
213+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
196214

197215
expect(link.originalMarkdown).toEqual('[a_pdf_file](a_pdf_file.pdf)');
198216
expect(link.destinationFilename).toEqual('a_pdf_file.pdf');
199217
});
200218

201219
it('should handle spaces in the path, filename, and heading link [heading link](path/filename with spaces.md#heading link)', () => {
202-
const link = getLink(link_in_task_markdown_link, 11);
220+
const rawLink = link_in_task_markdown_link.cachedMetadata.links[11];
221+
const link = new Link(rawLink, new TasksFile(link_in_task_markdown_link.filePath).filenameWithoutExtension);
203222

204223
expect(link.originalMarkdown).toEqual(
205224
'[spaces everywhere](Test%20Data/spaced%20filename%20link.md#spaced%20heading)',

0 commit comments

Comments
 (0)