utils and markdown changes needed for crumb:// linking to work

This commit is contained in:
Arkaprava Gaine
2026-08-05 10:51:08 +02:00
committed by Fred Cabassut
parent e6d1f18311
commit f33a4037b1
3 changed files with 38 additions and 0 deletions
+6
View File
@@ -18,6 +18,12 @@ export interface Note {
isOwner?: boolean;
isShared?: boolean;
shareToken?: string;
backlinks?: NoteBacklink[];
}
export interface NoteBacklink {
id: string;
title: string;
}
export interface Collaborator {
+13
View File
@@ -85,3 +85,16 @@ describe('stripMarkdown', () => {
expect(stripMarkdown('')).toBe('');
});
});
describe('renderMarkdown note-link handling', () => {
it('should render a crumb-note:// link as plain text, not a clickable anchor', () => {
const html = renderMarkdown('See [Grocery List](crumb-note://abc-123) for details');
expect(html).not.toContain('<a');
expect(html).toContain('Grocery List');
});
it('should still render a normal external link as a real anchor', () => {
const html = renderMarkdown('See [Example](https://example.com) for details');
expect(html).toContain('<a href="https://example.com"');
});
});
+19
View File
@@ -39,6 +39,25 @@ md.core.ruler.after('inline', 'task-lists', (state) => {
}
});
md.core.ruler.after('task-lists', 'note-links', (state) => {
for (const token of state.tokens) {
if (token.type !== 'inline' || !token.children) continue;
const children = token.children;
for (let i = 0; i < children.length; i++) {
if (children[i].type !== 'link_open') continue;
const href = children[i].attrGet('href') ?? '';
if (!href.startsWith('crumb-note://')) continue;
let closeIndex = i + 1;
while (closeIndex < children.length && children[closeIndex].type !== 'link_close') closeIndex++;
children.splice(closeIndex, 1);
children.splice(i, 1);
i -= 1;
}
}
});
export function renderMarkdown(content: string): string {
return md.render(content);
}