Skip to content

Commit

Permalink
#7: Allow opening common extensions in the default app on click
Browse files Browse the repository at this point in the history
  • Loading branch information
svsool committed Jul 13, 2020
1 parent 068d95b commit 1e64e33
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 10 deletions.
10 changes: 8 additions & 2 deletions src/commands/openDocumentByReference.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import vscode from 'vscode';
import fs from 'fs';
import path from 'path';
import open from 'open';

import {
containsImageExt,
containsOtherKnownExts,
getWorkspaceCache,
sortPaths,
findUriByRef,
Expand All @@ -13,15 +15,19 @@ import {
const openDocumentByReference = async ({ reference }: { reference: string }) => {
const [ref] = reference.split('|');

const uris = sortPaths([...getWorkspaceCache().markdownUris, ...getWorkspaceCache().imageUris], {
const uris = sortPaths(getWorkspaceCache().allUris, {
pathKey: 'fsPath',
shallowFirst: true,
});

const uri = findUriByRef(uris, ref);

if (uri) {
await vscode.commands.executeCommand('vscode.open', uri);
if (containsOtherKnownExts(uri.fsPath)) {
open(uri.fsPath);
} else {
await vscode.commands.executeCommand('vscode.open', uri);
}
} else if (!containsImageExt(reference)) {
// Create missing file if does not exist yet (there is no way to edit image in VSCode so don't do anything in this case)
const workspaceFolder =
Expand Down
7 changes: 6 additions & 1 deletion src/extensions/ReferenceHoverProvider.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import vscode from 'vscode';
import fs from 'fs';
import path from 'path';

import {
containsImageExt,
containsOtherKnownExts,
getWorkspaceCache,
getConfigProperty,
getReferenceAtPosition,
Expand All @@ -27,7 +29,7 @@ export default class ReferenceHoverProvider implements vscode.HoverProvider {

if (refResult) {
const { ref, range } = refResult;
const uris = [...getWorkspaceCache().imageUris, ...getWorkspaceCache().markdownUris];
const uris = getWorkspaceCache().allUris;

const foundUri = findUriByRef(uris, ref);

Expand All @@ -44,6 +46,9 @@ export default class ReferenceHoverProvider implements vscode.HoverProvider {
? 'UNC paths are not supported for images preview due to VSCode Content Security Policy. Use markdown preview or open image via cmd (ctrl) + click instead.'
: ''
}](${vscode.Uri.file(foundUri.fsPath).toString()}|height=${imagePreviewMaxHeight})`;
} else if (containsOtherKnownExts(foundUri.fsPath)) {
const ext = path.parse(foundUri.fsPath).ext;
return `Preview is not supported for "${ext}" file type. Click to open in the default app.`;
}

return fs.readFileSync(foundUri.fsPath).toString();
Expand Down
14 changes: 11 additions & 3 deletions src/extensions/completionProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
extractLongRef,
extractShortRef,
containsImageExt,
containsOtherKnownExts,
getConfigProperty,
} from '../utils';

Expand All @@ -38,7 +39,11 @@ export const provideCompletionItems = (document: TextDocument, position: Positio
? [...getWorkspaceCache().imageUris, ...getWorkspaceCache().markdownUris]
: []),
...(!isResourceAutocomplete
? [...getWorkspaceCache().markdownUris, ...getWorkspaceCache().imageUris]
? [
...getWorkspaceCache().markdownUris,
...getWorkspaceCache().imageUris,
...getWorkspaceCache().otherUris,
]
: []),
];

Expand All @@ -54,10 +59,13 @@ export const provideCompletionItems = (document: TextDocument, position: Positio
const longRef = extractLongRef(
workspaceFolder.uri.fsPath,
uri.fsPath,
containsImageExt(uri.fsPath),
containsImageExt(uri.fsPath) || containsOtherKnownExts(uri.fsPath),
);

const shortRef = extractShortRef(uri.fsPath, containsImageExt(uri.fsPath));
const shortRef = extractShortRef(
uri.fsPath,
containsImageExt(uri.fsPath) || containsOtherKnownExts(uri.fsPath),
);

const urisGroup = urisByPathBasename[path.basename(uri.fsPath).toLowerCase()] || [];

Expand Down
7 changes: 6 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { Uri, Location } from 'vscode';

export type WorkspaceCache = { imageUris: Uri[]; markdownUris: Uri[]; allUris: Uri[] };
export type WorkspaceCache = {
imageUris: Uri[];
markdownUris: Uri[];
otherUris: Uri[];
allUris: Uri[];
};

export type RefT = {
label: string;
Expand Down
14 changes: 11 additions & 3 deletions src/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,22 @@ import { WorkspaceCache, RefT, FoundRefT } from '../types';

export { sortPaths };

const allExtsRegex = /\.(md|png|jpg|jpeg|svg|gif)/i;
const allExtsRegex = /\.(md|png|jpg|jpeg|svg|gif|doc|docx|odt|pdf|rtf|tex|txt|wpd)/i;

const markdownExtRegex = /\.md$/i;

const imageExtsRegex = /\.(png|jpg|jpeg|svg|gif)/i;

const otherExtsRegex = /\.(doc|docx|odt|pdf|rtf|tex|txt|wpd)$/i;

export const refPattern = '(\\[\\[)([^\\[\\]]+?)(\\]\\])';

export const containsImageExt = (path: string): boolean => !!imageExtsRegex.exec(path);

export const containsMarkdownExt = (path: string): boolean => !!markdownExtRegex.exec(path);

export const containsOtherKnownExts = (path: string): boolean => !!otherExtsRegex.exec(path);

export const trimLeadingSlash = (value: string) => value.replace(/^\/+|^\\+/g, '');
export const trimTrailingSlash = (value: string) => value.replace(/\/+|^\\+$/g, '');
export const trimSlashes = (value: string) => trimLeadingSlash(trimTrailingSlash(value));
Expand Down Expand Up @@ -87,6 +91,7 @@ export const extractShortRef = (pathParam: string, preserveExtension?: boolean):
const workspaceCache: WorkspaceCache = {
imageUris: [],
markdownUris: [],
otherUris: [],
allUris: [],
};

Expand All @@ -95,10 +100,12 @@ export const getWorkspaceCache = (): WorkspaceCache => workspaceCache;
export const cacheWorkspace = async () => {
const imageUris = await workspace.findFiles('**/*.{png,jpg,jpeg,svg,gif}');
const markdownUris = await workspace.findFiles('**/*.md');
const otherUris = await workspace.findFiles('**/*.{doc,docx,odt,pdf,rtf,tex,txt,wpd}');

workspaceCache.imageUris = sortPaths(imageUris, { pathKey: 'path', shallowFirst: true });
workspaceCache.markdownUris = sortPaths(markdownUris, { pathKey: 'path', shallowFirst: true });
workspaceCache.allUris = sortPaths([...markdownUris, ...imageUris], {
workspaceCache.otherUris = sortPaths(otherUris, { pathKey: 'path', shallowFirst: true });
workspaceCache.allUris = sortPaths([...markdownUris, ...imageUris, ...otherUris], {
pathKey: 'path',
shallowFirst: true,
});
Expand All @@ -107,6 +114,7 @@ export const cacheWorkspace = async () => {
export const cleanWorkspaceCache = () => {
workspaceCache.imageUris = [];
workspaceCache.markdownUris = [];
workspaceCache.otherUris = [];
workspaceCache.allUris = [];
};

Expand Down Expand Up @@ -225,7 +233,7 @@ export const isUncPath = (path: string): boolean => uncPathRegex.test(path);

export const findUriByRef = (uris: vscode.Uri[], ref: string): vscode.Uri | undefined =>
uris.find((uri) => {
if (containsImageExt(ref)) {
if (containsImageExt(ref) || containsOtherKnownExts(ref)) {
if (isLongRef(ref)) {
return uri.fsPath.toLowerCase().endsWith(ref.toLowerCase());
}
Expand Down

0 comments on commit 1e64e33

Please sign in to comment.