@sussudio/platform
Version:
Internal APIs for VS Code's service injection the base services.
59 lines (58 loc) • 2.2 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { equalsIgnoreCase, startsWithIgnoreCase } from '@sussudio/base/common/strings.mjs';
import { URI } from '@sussudio/base/common/uri.mjs';
import { createDecorator } from '../../instantiation/common/instantiation.mjs';
export const IOpenerService = createDecorator('openerService');
export function matchesScheme(target, scheme) {
if (URI.isUri(target)) {
return equalsIgnoreCase(target.scheme, scheme);
} else {
return startsWithIgnoreCase(target, scheme + ':');
}
}
export function matchesSomeScheme(target, ...schemes) {
return schemes.some((scheme) => matchesScheme(target, scheme));
}
/**
* Encodes selection into the `URI`.
*
* IMPORTANT: you MUST use `extractSelection` to separate the selection
* again from the original `URI` before passing the `URI` into any
* component that is not aware of selections.
*/
export function withSelection(uri, selection) {
return uri.with({
fragment: `${selection.startLineNumber},${selection.startColumn}${
selection.endLineNumber
? `-${selection.endLineNumber}${selection.endColumn ? `,${selection.endColumn}` : ''}`
: ''
}`,
});
}
/**
* file:///some/file.js#73
* file:///some/file.js#L73
* file:///some/file.js#73,84
* file:///some/file.js#L73,84
* file:///some/file.js#73-83
* file:///some/file.js#L73-L83
* file:///some/file.js#73,84-83,52
* file:///some/file.js#L73,84-L83,52
*/
export function extractSelection(uri) {
let selection = undefined;
const match = /^L?(\d+)(?:,(\d+))?(-L?(\d+)(?:,(\d+))?)?/.exec(uri.fragment);
if (match) {
selection = {
startLineNumber: parseInt(match[1]),
startColumn: match[2] ? parseInt(match[2]) : 1,
endLineNumber: match[4] ? parseInt(match[4]) : undefined,
endColumn: match[4] ? (match[5] ? parseInt(match[5]) : 1) : undefined,
};
uri = uri.with({ fragment: '' });
}
return { selection, uri };
}