Skip to content

Commit

Permalink
fix: Make links working better with dot files and explicit md extensi…
Browse files Browse the repository at this point in the history
…on in the link
  • Loading branch information
svsool committed Aug 8, 2020
1 parent 1e3d380 commit 51d65f5
Show file tree
Hide file tree
Showing 11 changed files with 328 additions and 77 deletions.
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
"vscode:prepublish": "webpack --mode production",
"deploy": "vsce publish --yarn",
"package": "vsce package --yarn",
"clean": "rimraf dist out",
"clean": "del dist out",
"lint": "eslint src --ext ts",
"compile": "webpack --mode development",
"compile:tests": "tsc -p ./ && yarn run webpack --mode development",
Expand All @@ -147,6 +147,7 @@
"devDependencies": {
"@commitlint/cli": "^9.1.1",
"@commitlint/config-conventional": "^9.1.1",
"@types/del": "^4.0.0",
"@types/glob": "^7.1.1",
"@types/jest": "^26.0.9",
"@types/lodash.debounce": "^4.0.6",
Expand All @@ -156,11 +157,12 @@
"@types/moment": "^2.13.0",
"@types/node": "^14.0.27",
"@types/open": "^6.2.1",
"@types/rimraf": "^3.0.0",
"@types/vscode": "^1.47.0",
"@typescript-eslint/eslint-plugin": "^3.8.0",
"@typescript-eslint/parser": "^3.8.0",
"cross-env": "^7.0.2",
"del": "^5.1.0",
"del-cli": "^3.0.1",
"eslint": "^7.6.0",
"eslint-config-prettier": "^6.11.0",
"eslint-plugin-import": "^2.22.0",
Expand All @@ -172,7 +174,6 @@
"jest-extended": "^0.11.5",
"lint-staged": "^10.2.9",
"prettier": "^2.0.5",
"rimraf": "^3.0.2",
"standard-version": "^8.0.2",
"ts-jest": "^26.1.4",
"ts-loader": "^8.0.2",
Expand Down
4 changes: 1 addition & 3 deletions src/commands/openDailyNote.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ describe('openDailyNote command', () => {
afterEach(closeEditorsAndCleanWorkspace);

it('should not fail on direct call', async () => {
expect(() => {
openDailyNote();
}).not.toThrow();
expect(() => openDailyNote()).not.toThrow();

await commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem');
});
Expand Down
46 changes: 45 additions & 1 deletion src/features/ReferenceHoverProvider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ describe('ReferenceHoverProvider', () => {

const referenceHoverProvider = new ReferenceHoverProvider();

const imagePath = `${path.join(getWorkspaceFolder()!, name1)}.png`;
const imagePath = path.join(getWorkspaceFolder()!, `${name1}.png`);

expect(
toPlainObject(referenceHoverProvider.provideHover(doc, new vscode.Position(0, 4))),
Expand Down Expand Up @@ -193,4 +193,48 @@ describe('ReferenceHoverProvider', () => {

expect(referenceHoverProvider.provideHover(doc, new vscode.Position(0, 4))).toBeNull();
});

it('should provide hover for a link to dot file note', async () => {
const name0 = rndName();
const name1 = rndName();

await createFile(`${name0}.md`, `[[.${name1}]]`);
await createFile(`.${name1}.md`, '# Hello world');

const doc = await openTextDocument(`${name0}.md`);

const referenceHoverProvider = new ReferenceHoverProvider();

expect(
toPlainObject(referenceHoverProvider.provideHover(doc, new vscode.Position(0, 4))),
).toEqual({
contents: ['# Hello world'],
range: [
{ character: expect.any(Number), line: 0 },
{ character: expect.any(Number), line: 0 },
],
});
});

it('should provide hover for a link with explicit markdown extension in the ref', async () => {
const name0 = rndName();
const name1 = rndName();

await createFile(`${name0}.md`, `[[${name1}.md]]`);
await createFile(`${name1}.md.md`, '# Hello world');

const doc = await openTextDocument(`${name0}.md`);

const referenceHoverProvider = new ReferenceHoverProvider();

expect(
toPlainObject(referenceHoverProvider.provideHover(doc, new vscode.Position(0, 4))),
).toEqual({
contents: ['# Hello world'],
range: [
{ character: expect.any(Number), line: 0 },
{ character: expect.any(Number), line: 0 },
],
});
});
});
11 changes: 5 additions & 6 deletions src/features/ReferenceHoverProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ export default class ReferenceHoverProvider implements vscode.HoverProvider {
new vscode.Position(range.end.line, range.end.character - 2),
);

if (containsUnknownExt(ref)) {
const uris = getWorkspaceCache().allUris;
const foundUri = findUriByRef(uris, ref);

if (!foundUri && containsUnknownExt(ref)) {
return new vscode.Hover(
`Link contains unknown extension: ${
path.parse(ref).ext
Expand All @@ -34,12 +37,8 @@ export default class ReferenceHoverProvider implements vscode.HoverProvider {
);
}

const uris = getWorkspaceCache().allUris;
const imagePreviewMaxHeight = Math.max(getConfigProperty('imagePreviewMaxHeight', 200), 10);

const foundUri = findUriByRef(uris, ref);

if (foundUri && fs.existsSync(foundUri.fsPath)) {
const imagePreviewMaxHeight = Math.max(getConfigProperty('imagePreviewMaxHeight', 200), 10);
const getContent = () => {
if (containsImageExt(foundUri.fsPath)) {
return `![${
Expand Down
90 changes: 62 additions & 28 deletions src/features/extendMarkdownIt.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
createFile,
rndName,
getWorkspaceFolder,
cacheWorkspace,
closeEditorsAndCleanWorkspace,
getImgUrlForMarkdownPreview,
getFileUrlForMarkdownPreview,
Expand All @@ -27,8 +26,6 @@ describe('extendMarkdownIt feature', () => {
it('should render html link with tooltip about broken reference to note', async () => {
const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

expect(md.render('[[invalid-link]]')).toMatchInlineSnapshot(`
"<p><a class=\\"memo-invalid-link\\" title=\\"Link does not exist yet. Please use cmd / ctrl + click in text editor to create a new one.\\" href=\\"javascript:void(0)\\">invalid-link</a></p>
"
Expand All @@ -42,8 +39,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const notePath = `${path.join(getWorkspaceFolder()!, name)}.md`;

const url = getFileUrlForMarkdownPreview(notePath);
Expand All @@ -58,8 +53,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const notePath = `${path.join(getWorkspaceFolder()!, `${name}.md`)}`;

const url = getFileUrlForMarkdownPreview(notePath);
Expand All @@ -69,15 +62,58 @@ describe('extendMarkdownIt feature', () => {
);
});

it('should render html link to the existing note with preceding dot', async () => {
const name = rndName();

await createFile(`${name}.any.md`);

const md = extendMarkdownIt(MarkdownIt());

const notePath = `${path.join(getWorkspaceFolder()!, `${name}.any.md`)}`;

const url = getFileUrlForMarkdownPreview(notePath);

expect(md.render(`[[${name}.any|Test Label]]`)).toBe(
`<p><a title="${url}" href="${url}">Test Label</a></p>\n`,
);
});

it('should render html link to the existing dot note', async () => {
const name = rndName();

await createFile(`.${name}.md`);

const md = extendMarkdownIt(MarkdownIt());

const notePath = `${path.join(getWorkspaceFolder()!, `.${name}.md`)}`;

const url = getFileUrlForMarkdownPreview(notePath);

expect(md.render(`[[.${name}|Test Label]]`)).toBe(
`<p><a title="${url}" href="${url}">Test Label</a></p>\n`,
);
});

it('should not render html link to dot file', async () => {
const name = rndName();

await createFile(`.${name}`);

const md = extendMarkdownIt(MarkdownIt());

expect(md.render(`[[.${name}|Test Label]]`)).toMatchInlineSnapshot(`
"<p><a class=\\"memo-invalid-link\\" title=\\"Link does not exist yet. Please use cmd / ctrl + click in text editor to create a new one.\\" href=\\"javascript:void(0)\\">Test Label</a></p>
"
`);
});

it('should render html link to the existing image without a label', async () => {
const name = rndName();

await createFile(`${name}.png`);

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const imagePath = `${path.join(getWorkspaceFolder()!, name)}.png`;

const url = getFileUrlForMarkdownPreview(imagePath);
Expand All @@ -87,16 +123,30 @@ describe('extendMarkdownIt feature', () => {
);
});

it('should render html link to the existing dot image', async () => {
const name = rndName();

await createFile(`.${name}.png`);

const md = extendMarkdownIt(MarkdownIt());

const imagePath = path.join(getWorkspaceFolder()!, `.${name}.png`);

const url = getFileUrlForMarkdownPreview(imagePath);

expect(md.render(`[[.${name}.png]]`)).toBe(
`<p><a title="${url}" href="${url}">.${name}.png</a></p>\n`,
);
});

it('should render html link to the existing image with a label', async () => {
const name = rndName();

await createFile(`${name}.png`);

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const imagePath = `${path.join(getWorkspaceFolder()!, name)}.png`;
const imagePath = path.join(getWorkspaceFolder()!, `${name}.png`);

const url = getFileUrlForMarkdownPreview(imagePath);

Expand All @@ -108,8 +158,6 @@ describe('extendMarkdownIt feature', () => {
it('should render html link with tooltip about broken reference to an image', async () => {
const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

expect(md.render('[[invalid-link.png]]')).toMatchInlineSnapshot(`
"<p><a class=\\"memo-invalid-link\\" title=\\"Link does not exist yet. Please use cmd / ctrl + click in text editor to create a new one.\\" href=\\"javascript:void(0)\\">invalid-link.png</a></p>
"
Expand All @@ -123,8 +171,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

expect(md.render(`![[${name}.png]]`)).toBe(
`<p><div><img src="${getImgUrlForMarkdownPreview(
path.join(getWorkspaceFolder()!, `${name}.png`),
Expand All @@ -135,8 +181,6 @@ describe('extendMarkdownIt feature', () => {
it('should not identify broken link', async () => {
const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

expect(md.render('[[]]')).toBe('<p>[[]]</p>\n');
});

Expand All @@ -147,8 +191,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const notePath = `${path.join(getWorkspaceFolder()!, name)}.md`;

const url = getFileUrlForMarkdownPreview(notePath);
Expand All @@ -165,8 +207,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

expect(md.render(`[[![[${name}.png]]]]]]`)).toBe(
`<p>[[<div><img src="${getImgUrlForMarkdownPreview(
path.join(getWorkspaceFolder()!, `${name}.png`),
Expand All @@ -182,8 +222,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const notePath = `${path.join(getWorkspaceFolder()!, 'b', name)}.md`;

const url = getFileUrlForMarkdownPreview(notePath);
Expand All @@ -201,8 +239,6 @@ describe('extendMarkdownIt feature', () => {

const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

const notePath = `${path.join(getWorkspaceFolder()!, name)}.md`;

const url = getFileUrlForMarkdownPreview(notePath);
Expand Down Expand Up @@ -367,8 +403,6 @@ describe('extendMarkdownIt feature', () => {
it('should render html link with tooltip about unknown extension', async () => {
const md = extendMarkdownIt(MarkdownIt());

await cacheWorkspace();

expect(md.render('[[link.unknown]]')).toMatchInlineSnapshot(`
"<p><a class=\\"memo-invalid-link\\" title=\\"Link contains unknown extension: .unknown. Please use common file extensions .md,.png,.jpg,.jpeg,.svg,.gif,.doc,.docx,.rtf,.txt,.odt,.xls,.xlsx,.ppt,.pptm,.pptx,.pdf to enable full support.\\" href=\\"javascript:void(0)\\">link.unknown</a></p>
"
Expand Down
12 changes: 6 additions & 6 deletions src/features/extendMarkdownIt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@ const extendMarkdownIt = (md: MarkdownIt) => {
}
}

if (containsUnknownExt(ref)) {
const fsPath = findUriByRef(getWorkspaceCache().markdownUris, ref)?.fsPath;

if (!fsPath && containsUnknownExt(ref)) {
return getUnknownExtRefAnchor(label || ref, ref);
}

const fsPath = findUriByRef(getWorkspaceCache().markdownUris, ref)?.fsPath;

if (!fsPath || !fs.existsSync(fsPath)) {
return getInvalidRefAnchor(label || ref);
}
Expand Down Expand Up @@ -98,12 +98,12 @@ const extendMarkdownIt = (md: MarkdownIt) => {
replace: (rawRef: string) => {
const { ref, label } = parseRef(rawRef);

if (containsUnknownExt(ref)) {
const fsPath = findUriByRef(getWorkspaceCache().allUris, ref)?.fsPath;

if (!fsPath && containsUnknownExt(ref)) {
return getUnknownExtRefAnchor(label || ref, ref);
}

const fsPath = findUriByRef(getWorkspaceCache().allUris, ref)?.fsPath;

if (!fsPath) {
return getInvalidRefAnchor(label || ref);
}
Expand Down
6 changes: 3 additions & 3 deletions src/features/fsWatcher.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,11 +300,11 @@ describe('fsWatcher feature', () => {
await createFile(`${noteName}.md`, '', false);

await waitForExpect(async () => {
const workspaceCache0 = await utils.getWorkspaceCache();
const workspaceCache = await utils.getWorkspaceCache();

expect([...workspaceCache0.markdownUris, ...workspaceCache0.imageUris]).toHaveLength(1);
expect([...workspaceCache.markdownUris, ...workspaceCache.imageUris]).toHaveLength(1);
expect(
[...workspaceCache0.markdownUris, ...workspaceCache0.imageUris].map(({ fsPath }) =>
[...workspaceCache.markdownUris, ...workspaceCache.imageUris].map(({ fsPath }) =>
path.basename(fsPath),
),
).toContain(`${noteName}.md`);
Expand Down
Loading

0 comments on commit 51d65f5

Please sign in to comment.