Fix Windows internal note links

This commit is contained in:
Yuri Karamian
2026-08-11 02:41:39 +02:00
parent b0555fe648
commit 27609fb4f3
2 changed files with 45 additions and 3 deletions
+8 -3
View File
@@ -54,7 +54,7 @@
import { convertListNode, type MixedListName } from '$lib/editor/mixedLists';
import { clearFormatting } from '$lib/editor/clearFormatting';
import { serializeInlineMarkdown } from '$lib/editor/markdown';
import { relativePath } from '$lib/utils/paths';
import { relativePath, resolvePathFromFile } from '$lib/utils/paths';
import GraphView from './GraphView.svelte';
import TagSuggestInput from './TagSuggestInput.svelte';
import ImageViewer from './ImageViewer.svelte';
@@ -2891,6 +2891,12 @@
$activeNote = { ...content, content: content.content };
$activeNotePath = absPath;
} catch (e) {
// Explicit Markdown links do not have a wiki-link title to recreate from.
// Do not turn a failed read into an untitled note.
if (!noteTitle) {
console.error('Failed to navigate to note link:', e);
return;
}
// Note at path no longer exists (deleted/moved). Refresh cache and
// retry as unresolved so the user can recreate it from the link.
await refreshWikiLinkTitles();
@@ -5533,8 +5539,7 @@
if (!decoded.startsWith('/')) {
const notePath = $activeNotePath;
if (notePath) {
const noteDir = notePath.substring(0, notePath.lastIndexOf('/'));
absPath = normalizePath(`${noteDir}/${decoded}`);
absPath = resolvePathFromFile(notePath, decoded);
} else {
const vaultRoot = $appConfig?.active_vault;
if (vaultRoot) absPath = normalizePath(`${vaultRoot}/${decoded}`);
+37
View File
@@ -26,3 +26,40 @@ export function relativePath(fromDirectory: string, targetPath: string): string
const result = [...Array(from.length - common).fill('..'), ...target.slice(common)];
return result.join('/') || '.';
}
export function resolvePathFromFile(filePath: string, targetPath: string): string {
const normalizedFile = filePath.replace(/\\/g, '/');
const normalizedTarget = targetPath.replace(/\\/g, '/');
const lastSeparator = normalizedFile.lastIndexOf('/');
const fileDirectory = lastSeparator >= 0 ? normalizedFile.slice(0, lastSeparator) : '';
const combined = normalizedTarget.startsWith('/') || /^[A-Za-z]:\//.test(normalizedTarget)
? normalizedTarget
: `${fileDirectory}/${normalizedTarget}`;
const drive = combined.match(/^([A-Za-z]:)\//);
const unc = combined.startsWith('//');
const absolute = !unc && combined.startsWith('/');
let prefix = '';
let remainder = combined;
if (drive) {
prefix = `${drive[1]}/`;
remainder = combined.slice(drive[0].length);
} else if (unc) {
prefix = '//';
remainder = combined.slice(2);
} else if (absolute) {
prefix = '/';
remainder = combined.slice(1);
}
const resolved: string[] = [];
for (const segment of remainder.split('/')) {
if (!segment || segment === '.') continue;
if (segment === '..') {
resolved.pop();
} else {
resolved.push(segment);
}
}
return prefix + resolved.join('/');
}