UNPKG

@sussudio/platform

Version:

Internal APIs for VS Code's service injection the base services.

59 lines (58 loc) 2.2 kB
/*--------------------------------------------------------------------------------------------- * 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 }; }