diff --git a/src/commands/openDocumentByReference.ts b/src/commands/openDocumentByReference.ts index ae579e37..8bc73794 100644 --- a/src/commands/openDocumentByReference.ts +++ b/src/commands/openDocumentByReference.ts @@ -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, @@ -13,7 +15,7 @@ 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, }); @@ -21,7 +23,11 @@ const openDocumentByReference = async ({ reference }: { reference: string }) => 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 = diff --git a/src/extensions/ReferenceHoverProvider.ts b/src/extensions/ReferenceHoverProvider.ts index f4f40152..4de0a25a 100644 --- a/src/extensions/ReferenceHoverProvider.ts +++ b/src/extensions/ReferenceHoverProvider.ts @@ -1,8 +1,10 @@ import vscode from 'vscode'; import fs from 'fs'; +import path from 'path'; import { containsImageExt, + containsOtherKnownExts, getWorkspaceCache, getConfigProperty, getReferenceAtPosition, @@ -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); @@ -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(); diff --git a/src/extensions/completionProvider.ts b/src/extensions/completionProvider.ts index dba8b6c5..3f072660 100644 --- a/src/extensions/completionProvider.ts +++ b/src/extensions/completionProvider.ts @@ -16,6 +16,7 @@ import { extractLongRef, extractShortRef, containsImageExt, + containsOtherKnownExts, getConfigProperty, } from '../utils'; @@ -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, + ] : []), ]; @@ -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()] || []; diff --git a/src/types.ts b/src/types.ts index 37d2629f..4b8be100 100644 --- a/src/types.ts +++ b/src/types.ts @@ -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; diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 4c0d8a37..ac11c9e2 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -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)); @@ -87,6 +91,7 @@ export const extractShortRef = (pathParam: string, preserveExtension?: boolean): const workspaceCache: WorkspaceCache = { imageUris: [], markdownUris: [], + otherUris: [], allUris: [], }; @@ -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, }); @@ -107,6 +114,7 @@ export const cacheWorkspace = async () => { export const cleanWorkspaceCache = () => { workspaceCache.imageUris = []; workspaceCache.markdownUris = []; + workspaceCache.otherUris = []; workspaceCache.allUris = []; }; @@ -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()); }