mirror of
https://gitlab.com/ArkHost/HelixNotes.git
synced 2026-09-19 09:27:29 +02:00
Fix Windows internal note links
This commit is contained in:
@@ -54,7 +54,7 @@
|
|||||||
import { convertListNode, type MixedListName } from '$lib/editor/mixedLists';
|
import { convertListNode, type MixedListName } from '$lib/editor/mixedLists';
|
||||||
import { clearFormatting } from '$lib/editor/clearFormatting';
|
import { clearFormatting } from '$lib/editor/clearFormatting';
|
||||||
import { serializeInlineMarkdown } from '$lib/editor/markdown';
|
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 GraphView from './GraphView.svelte';
|
||||||
import TagSuggestInput from './TagSuggestInput.svelte';
|
import TagSuggestInput from './TagSuggestInput.svelte';
|
||||||
import ImageViewer from './ImageViewer.svelte';
|
import ImageViewer from './ImageViewer.svelte';
|
||||||
@@ -2891,6 +2891,12 @@
|
|||||||
$activeNote = { ...content, content: content.content };
|
$activeNote = { ...content, content: content.content };
|
||||||
$activeNotePath = absPath;
|
$activeNotePath = absPath;
|
||||||
} catch (e) {
|
} 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
|
// Note at path no longer exists (deleted/moved). Refresh cache and
|
||||||
// retry as unresolved so the user can recreate it from the link.
|
// retry as unresolved so the user can recreate it from the link.
|
||||||
await refreshWikiLinkTitles();
|
await refreshWikiLinkTitles();
|
||||||
@@ -5533,8 +5539,7 @@
|
|||||||
if (!decoded.startsWith('/')) {
|
if (!decoded.startsWith('/')) {
|
||||||
const notePath = $activeNotePath;
|
const notePath = $activeNotePath;
|
||||||
if (notePath) {
|
if (notePath) {
|
||||||
const noteDir = notePath.substring(0, notePath.lastIndexOf('/'));
|
absPath = resolvePathFromFile(notePath, decoded);
|
||||||
absPath = normalizePath(`${noteDir}/${decoded}`);
|
|
||||||
} else {
|
} else {
|
||||||
const vaultRoot = $appConfig?.active_vault;
|
const vaultRoot = $appConfig?.active_vault;
|
||||||
if (vaultRoot) absPath = normalizePath(`${vaultRoot}/${decoded}`);
|
if (vaultRoot) absPath = normalizePath(`${vaultRoot}/${decoded}`);
|
||||||
|
|||||||
@@ -26,3 +26,40 @@ export function relativePath(fromDirectory: string, targetPath: string): string
|
|||||||
const result = [...Array(from.length - common).fill('..'), ...target.slice(common)];
|
const result = [...Array(from.length - common).fill('..'), ...target.slice(common)];
|
||||||
return result.join('/') || '.';
|
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('/');
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user