import { fileBasename, formatFilePathPosition, splitFilePathPosition, stripSlashPrefixedWindowsDrive,} from "@t3tools/client-runtime/markdown-links";import { isWindowsAbsolutePath } from "@t3tools/shared/path"; function normalizePathSeparators(path: string): string { return path.replaceAll("\\", "/");} function trimTrailingPathSeparators(path: string): string { return path.replace(/[\\/]+$/, "");} function stripRelativePrefixes(path: string): string { return path.replace(/^\.\/+/, "").replace(/^\/+/, "");} export function formatWorkspaceRelativePath( pathWithPosition: string, workspaceRoot: string | undefined,): string { const position = splitFilePathPosition(pathWithPosition); const normalizedPath = stripSlashPrefixedWindowsDrive(normalizePathSeparators(position.path)); let displayPath = normalizedPath; if (workspaceRoot) { const normalizedWorkspaceRoot = stripSlashPrefixedWindowsDrive( normalizePathSeparators(trimTrailingPathSeparators(workspaceRoot)), ); const workspaceLabel = fileBasename(normalizedWorkspaceRoot); const caseInsensitive = isWindowsAbsolutePath(stripSlashPrefixedWindowsDrive(workspaceRoot)); const pathForCompare = caseInsensitive ? normalizedPath.toLowerCase() : normalizedPath; const workspaceForCompare = caseInsensitive ? normalizedWorkspaceRoot.toLowerCase() : normalizedWorkspaceRoot; const workspaceWithSeparator = `${workspaceForCompare}/`; const workspaceLabelWithSeparator = `${caseInsensitive ? workspaceLabel.toLowerCase() : workspaceLabel}/`; if (pathForCompare === workspaceForCompare) { displayPath = workspaceLabel; } else if (pathForCompare.startsWith(workspaceWithSeparator)) { const relativeSuffix = normalizedPath.slice(normalizedWorkspaceRoot.length + 1); displayPath = `${workspaceLabel}/${relativeSuffix}`; } else if (!normalizedPath.startsWith("/")) { const relativePath = stripRelativePrefixes(normalizedPath); displayPath = pathForCompare.startsWith(workspaceLabelWithSeparator) ? normalizedPath : `${workspaceLabel}/${relativePath}`; } } return formatFilePathPosition({ ...position, path: displayPath });}
import {
fileBasename,
formatFilePathPosition,
splitFilePathPosition,
stripSlashPrefixedWindowsDrive,
} from "@t3tools/client-runtime/markdown-links";
import { isWindowsAbsolutePath } from "@t3tools/shared/path";
function normalizePathSeparators(path: string): string {
return path.replaceAll("\\", "/");
}
function trimTrailingPathSeparators(path: string): string {
return path.replace(/[\\/]+$/, "");
}
function stripRelativePrefixes(path: string): string {
return path.replace(/^\.\/+/, "").replace(/^\/+/, "");
}
export function formatWorkspaceRelativePath(
pathWithPosition: string,
workspaceRoot: string | undefined,
): string {
const position = splitFilePathPosition(pathWithPosition);
const normalizedPath = stripSlashPrefixedWindowsDrive(normalizePathSeparators(position.path));
let displayPath = normalizedPath;
if (workspaceRoot) {
const normalizedWorkspaceRoot = stripSlashPrefixedWindowsDrive(
normalizePathSeparators(trimTrailingPathSeparators(workspaceRoot)),
);
const workspaceLabel = fileBasename(normalizedWorkspaceRoot);
const caseInsensitive = isWindowsAbsolutePath(stripSlashPrefixedWindowsDrive(workspaceRoot));
const pathForCompare = caseInsensitive ? normalizedPath.toLowerCase() : normalizedPath;
const workspaceForCompare = caseInsensitive
? normalizedWorkspaceRoot.toLowerCase()
: normalizedWorkspaceRoot;
const workspaceWithSeparator = `${workspaceForCompare}/`;
const workspaceLabelWithSeparator = `${caseInsensitive ? workspaceLabel.toLowerCase() : workspaceLabel}/`;
if (pathForCompare === workspaceForCompare) {
displayPath = workspaceLabel;
} else if (pathForCompare.startsWith(workspaceWithSeparator)) {
const relativeSuffix = normalizedPath.slice(normalizedWorkspaceRoot.length + 1);
displayPath = `${workspaceLabel}/${relativeSuffix}`;
} else if (!normalizedPath.startsWith("/")) {
const relativePath = stripRelativePrefixes(normalizedPath);
displayPath = pathForCompare.startsWith(workspaceLabelWithSeparator)
? normalizedPath
: `${workspaceLabel}/${relativePath}`;
}
}
return formatFilePathPosition({ ...position, path: displayPath });
}