fix(noter): følg note-links i en delt note, og lad </> være kode

To ting meldt af en, der havde en note delt med sig.

Note-linkene i den delte note gjorde ingenting. Opslaget faldt tilbage på det
første søgeresultat, når ingen titel passede — og i en delt note er det første
resultat næsten altid noten selv, fordi den nævner den titel, den peger på. Så
åbnede linket den note, man allerede stod i. Kun en titel, der passer helt,
tæller nu; og rammer den forbi, siger beskeden den rigtige grund: en note, der
deles, deler ikke de noter, den peger på, så modtageren kan se linket uden at
kunne åbne det.

Og `</>` sad på kildevisningen med teksten "Vis som kode" på. Tegnet betyder
inline kode i ethvert andet program, så et markeret ord plus et tryk gav hele
noten som Markdown. Nu gør `</>` det, det siger — ⌘E, en kontakt, og ordet under
markøren når der ikke er markeret noget — og kilden har fået Markdown-mærket og
sin egen tekst.

Kode indsættes som en node frem for med execCommand: Chromium renser den HTML
gennem indsætningsvejen og gav et <span> med skrifttypen skrevet ind i sig, som
htmlToMarkdown ikke kan skrive ned som kode.

To e2e-prøver, som begge fejler på koden før den her.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_013r4DxpUZcSShxfCZZaeMGZ
This commit is contained in:
kristianwind
2026-09-07 21:50:12 +02:00
co-authored by Claude Opus 5
parent d4784fd174
commit 08d703e3af
6 changed files with 326 additions and 11 deletions
+24 -3
View File
@@ -665,17 +665,38 @@
* to their own pages. Until now these were text and nothing else: the note said
* it pointed somewhere and there was no way to go.
*/
/**
* Følger et link — og siger det, når det ikke kan følges.
*
* Et `[[link]]` peger på en note ved dens *titel*, så det skal slås op. Først i
* listen, der allerede er hentet, og ellers med en søgning, fordi listen kan
* være snævret ind af et søgeord.
*
* Kun en titel, der passer helt. Der stod `?? found[0]` her, så et link, der
* ikke kunne findes, åbnede den første note, søgningen tilfældigvis gav — og i
* en *delt* note er det næsten altid den note, man allerede står i: den nævner
* jo titlen, den linker til. Så linket så ud til ikke at gøre noget som helst,
* hvilket er præcis sådan det blev meldt. Et link, der rammer forbi, skal sige
* det, ikke ramme et andet sted.
*
* Beskeden nævner delingen, fordi det er den almindelige årsag: en note, der
* deles, deler ikke de noter, den peger på, og modtageren kan derfor se linket
* uden at kunne åbne det. Herfra kan de to tilfælde ikke skelnes — svaret er
* det samme, hvad enten noten ikke findes eller bare ikke er ens egen — og
* sætningen siger dem begge frem for at gætte på den ene.
*/
async function openLink(link) {
if (link.kind === 'note') {
const wanted = link.target_id.toLowerCase();
const here = notes.find((n) => (n.title ?? '').toLowerCase() === wanted);
const wanted = link.target_id.trim().toLowerCase();
const titled = (n) => (n.title ?? '').trim().toLowerCase();
const here = notes.find((n) => titled(n) === wanted);
if (here) {
open(here);
return;
}
try {
const found = (await api.notes({ q: link.target_id })).notes ?? [];
const hit = found.find((n) => (n.title ?? '').toLowerCase() === wanted) ?? found[0];
const hit = found.find((n) => titled(n) === wanted);
if (hit) open(hit);
else app.toast(t('notes.linkMissing'));
} catch (e) {