Skip to content

Commit

Permalink
feat: Make most of the features disableable (#167)
Browse files Browse the repository at this point in the history
BREAKING CHANGE:
Rename config prop memo.linksOnHoverPreview.imageMaxHeight -> memo.links.preview.imageMaxHeight
  • Loading branch information
svsool committed Oct 31, 2020
1 parent 77abfd4 commit b8b486f
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 65 deletions.
63 changes: 53 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,32 +65,74 @@
"type": "object",
"title": "Memo",
"properties": {
"memo.linksOnHoverPreview.imageMaxHeight": {
"default": "200",
"scope": "resource",
"description": "The maximum height of the image.",
"type": "number"
},
"memo.backlinksPanel.collapseParentItems": {
"default": false,
"scope": "resource",
"description": "Collapse parent items by default.",
"type": "boolean"
},
"memo.backlinksPanel.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable backlinks panel. Reload required!",
"type": "boolean"
},
"memo.links.completion.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable links completion in the editor. Reload required!",
"type": "boolean"
},
"memo.links.following.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable links following in the editor. Reload required!",
"type": "boolean"
},
"memo.links.format": {
"enum": ["short", "absolute"],
"enumDescriptions": [
"Use short paths for unique filenames and absolute paths for duplicate filenames",
"Use absolute paths in workspace"
],
"default": "shortestPathWhenPossible",
"default": "short",
"description": "Link format to insert on autocomplete and rename.",
"scope": "resource"
},
"memo.enableSyntaxDecorations": {
"memo.links.preview.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable links preview on hover in the editor. Reload required!",
"type": "boolean"
},
"memo.links.preview.imageMaxHeight": {
"default": "200",
"scope": "resource",
"description": "The maximum height of the image.",
"type": "number"
},
"memo.links.references.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable references search for links in the editor. Reload required!",
"type": "boolean"
},
"memo.links.sync.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable automatic links synchronization and rename action in the editor. Reload required!",
"type": "boolean"
},
"memo.decorations.enabled": {
"default": true,
"scope": "resource",
"description": "Whether to enable syntax decorations for links in the editor. Reload required!",
"type": "boolean"
},
"memo.markdownPreview.enabled": {
"default": true,
"scope": "resource",
"description": "Enable syntax decorations for links in the editor.",
"description": "Whether to enhance built-in VSCode Markdown preview with links highlight, navigation and resource embedding. Reload required!",
"type": "boolean"
}
}
Expand Down Expand Up @@ -122,7 +164,8 @@
"explorer": [
{
"id": "memo.backlinksPanel",
"name": "Backlinks"
"name": "Backlinks",
"when": "memo:backlinksPanel.enabled"
}
]
},
Expand Down
66 changes: 49 additions & 17 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,43 +13,75 @@ import {
extendMarkdownIt,
newVersionNotifier,
} from './features';
import { cacheWorkspace } from './utils';
import commands from './commands';
import { cacheWorkspace, getMemoConfigProperty, MemoBoolConfigProp, isDefined } from './utils';

const mdLangSelector = { language: 'markdown', scheme: '*' };

export const activate = async (context: vscode.ExtensionContext) => {
const when = <R>(configKey: MemoBoolConfigProp, cb: () => R): undefined | R =>
getMemoConfigProperty(configKey, true) ? cb() : undefined;

export const activate = async (
context: vscode.ExtensionContext,
): Promise<void | { extendMarkdownIt: typeof extendMarkdownIt }> => {
newVersionNotifier.activate(context);
syntaxDecorations.activate(context);

when('decorations.enabled', () => syntaxDecorations.activate(context));

if (process.env.DISABLE_FS_WATCHER !== 'true') {
fsWatcher.activate(context);
}
completionProvider.activate(context);

when('links.completion.enabled', () => completionProvider.activate(context));

referenceContextWatcher.activate(context);

await cacheWorkspace();

const backlinksTreeDataProvider = new BacklinksTreeDataProvider();
vscode.window.onDidChangeActiveTextEditor(async () => await backlinksTreeDataProvider.refresh());

context.subscriptions.push(
...commands,
vscode.workspace.onDidChangeConfiguration(async (configChangeEvent) => {
if (configChangeEvent.affectsConfiguration('search.exclude')) {
await cacheWorkspace();
}
}),
vscode.window.createTreeView('memo.backlinksPanel', {
treeDataProvider: backlinksTreeDataProvider,
showCollapseAll: true,
}),
vscode.languages.registerDocumentLinkProvider(mdLangSelector, new DocumentLinkProvider()),
vscode.languages.registerHoverProvider(mdLangSelector, new ReferenceHoverProvider()),
vscode.languages.registerReferenceProvider(mdLangSelector, new ReferenceProvider()),
vscode.languages.registerRenameProvider(mdLangSelector, new ReferenceRenameProvider()),
...[
when('links.following.enabled', () =>
vscode.languages.registerDocumentLinkProvider(mdLangSelector, new DocumentLinkProvider()),
),
when('links.preview.enabled', () =>
vscode.languages.registerHoverProvider(mdLangSelector, new ReferenceHoverProvider()),
),
when('links.references.enabled', () =>
vscode.languages.registerReferenceProvider(mdLangSelector, new ReferenceProvider()),
),
when('links.sync.enabled', () =>
vscode.languages.registerRenameProvider(mdLangSelector, new ReferenceRenameProvider()),
),
].filter(isDefined),
);

vscode.commands.executeCommand(
'setContext',
'memo:backlinksPanel.enabled',
getMemoConfigProperty('backlinksPanel.enabled', true),
);

return {
when('backlinksPanel.enabled', () => {
const backlinksTreeDataProvider = new BacklinksTreeDataProvider();

vscode.window.onDidChangeActiveTextEditor(
async () => await backlinksTreeDataProvider.refresh(),
);
context.subscriptions.push(
vscode.window.createTreeView('memo.backlinksPanel', {
treeDataProvider: backlinksTreeDataProvider,
showCollapseAll: true,
}),
);
});

return when('markdownPreview.enabled', () => ({
extendMarkdownIt,
};
}));
};
2 changes: 1 addition & 1 deletion src/features/ReferenceHoverProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export default class ReferenceHoverProvider implements vscode.HoverProvider {

if (foundUri && fs.existsSync(foundUri.fsPath)) {
const imageMaxHeight = Math.max(
getMemoConfigProperty('linksOnHoverPreview.imageMaxHeight', 200),
getMemoConfigProperty('links.preview.imageMaxHeight', 200),
10,
);
const getContent = () => {
Expand Down
2 changes: 0 additions & 2 deletions src/features/completionProvider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,8 +236,6 @@ describe('provideCompletionItems()', () => {

const completionItems = provideCompletionItems(doc, new Position(0, 2));

console.log(JSON.stringify(completionItems, null, 2));

expect(completionItems).toEqual([
expect.objectContaining({ insertText: name0, label: name0 }),
expect.objectContaining({ insertText: `folder1/${name1}`, label: `folder1/${name1}` }),
Expand Down
4 changes: 4 additions & 0 deletions src/features/fsWatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ export const activate = (
const renameFilesDisposable = workspace.onDidRenameFiles(async ({ files }) => {
await cacheUris();

if (!getMemoConfigProperty('links.sync.enabled', true)) {
return;
}

if (files.some(({ newUri }) => fs.lstatSync(newUri.fsPath).isDirectory())) {
window.showWarningMessage(
'Recursive links update on directory rename is currently not supported.',
Expand Down
19 changes: 0 additions & 19 deletions src/features/syntaxDecorations.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
rndName,
openTextDocument,
closeEditorsAndCleanWorkspace,
updateMemoConfigProperty,
} from '../test/testUtils';

describe('getDecorations', () => {
Expand All @@ -31,24 +30,6 @@ describe('getDecorations', () => {
`);
});

it('should return no decorations when decorations are disabled', async () => {
const noteFilename = `${rndName()}.md`;

await updateMemoConfigProperty('enableSyntaxDecorations', false);
await createFile(noteFilename, '[[1234512345]]');

const doc = await openTextDocument(noteFilename);

const editor = await window.showTextDocument(doc);

expect(getDecorations(editor)).toMatchInlineSnapshot(`
Object {
"gray": Array [],
"lightBlue": Array [],
}
`);
});

it('should get ref decorations', async () => {
const noteFilename = `${rndName()}.md`;

Expand Down
5 changes: 0 additions & 5 deletions src/features/syntaxDecorations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import {
isMdEditor,
mathEnvCheck,
refPattern,
getMemoConfigProperty,
} from '../utils';

/*
Expand Down Expand Up @@ -47,10 +46,6 @@ export const getDecorations = (textEditor: TextEditor): { [decorTypeName: string
decors[decorTypeName] = [];
});

if (!getMemoConfigProperty('enableSyntaxDecorations', true)) {
return decors;
}

doc
.getText()
.split(/\r?\n/g)
Expand Down
2 changes: 1 addition & 1 deletion src/utils/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -828,7 +828,7 @@ describe('getWorkspaceFolder()', () => {

describe('getMemoConfigProperty()', () => {
it('should return config property', () => {
expect(getMemoConfigProperty('linksOnHoverPreview.imageMaxHeight', null)).toBe('200');
expect(getMemoConfigProperty('links.preview.imageMaxHeight', null)).toBe('200');
});

it('should return default property on getting unknown config property', () => {
Expand Down
24 changes: 14 additions & 10 deletions src/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,16 @@ export function getConfigProperty<T>(property: string, fallback: T): T {
return vscode.workspace.getConfiguration().get(property, fallback);
}

export type MemoBoolConfigProp =
| 'decorations.enabled'
| 'links.completion.enabled'
| 'links.following.enabled'
| 'links.preview.enabled'
| 'links.references.enabled'
| 'links.sync.enabled'
| 'backlinksPanel.enabled'
| 'markdownPreview.enabled';

export function getMemoConfigProperty(
property: 'links.format',
fallback: 'short',
Expand All @@ -245,19 +255,11 @@ export function getMemoConfigProperty(
): boolean;

export function getMemoConfigProperty(
property: 'backlinksPanel.collapseParentItems',
fallback: null | boolean,
): boolean;

export function getMemoConfigProperty(
property: 'linksOnHoverPreview.imageMaxHeight',
property: 'links.preview.imageMaxHeight',
fallback: null | number,
): number;

export function getMemoConfigProperty(
property: 'enableSyntaxDecorations',
fallback: boolean,
): boolean;
export function getMemoConfigProperty(property: MemoBoolConfigProp, fallback: boolean): boolean;

export function getMemoConfigProperty<T>(property: string, fallback: T): T {
return getConfigProperty(`memo.${property}`, fallback);
Expand Down Expand Up @@ -523,3 +525,5 @@ export const findNonIgnoredFiles = async (

return files;
};

export const isDefined = <T>(argument: T | undefined): argument is T => argument !== undefined;

0 comments on commit b8b486f

Please sign in to comment.