From d41e4ea34a50dc47ee9e696a74b282c45fe851a5 Mon Sep 17 00:00:00 2001 From: Test Date: Thu, 5 Mar 2026 11:30:43 +0100 Subject: [PATCH] fix: strip wikilink brackets from note list preview snippets [[target]] now shows as "target" and [[target|alias]] shows as "alias" in note list previews, instead of raw bracket syntax. Co-Authored-By: Claude Opus 4.6 --- src-tauri/src/vault/parsing.rs | 48 +++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/vault/parsing.rs b/src-tauri/src/vault/parsing.rs index 97dd4ae7..a0924541 100644 --- a/src-tauri/src/vault/parsing.rs +++ b/src-tauri/src/vault/parsing.rs @@ -116,6 +116,14 @@ fn strip_markdown_chars(s: &str) -> String { let mut chars = s.chars().peekable(); while let Some(ch) = chars.next() { match ch { + '[' if chars.peek() == Some(&'[') => { + chars.next(); // consume second '[' + let inner = collect_wikilink_inner(&mut chars); + match inner.find('|') { + Some(idx) => result.push_str(&inner[idx + 1..]), + None => result.push_str(&inner), + } + } '[' => { let inner = collect_until(&mut chars, ']'); if chars.peek() == Some(&'(') { @@ -131,6 +139,21 @@ fn strip_markdown_chars(s: &str) -> String { result } +/// Collect chars inside a wikilink until `]]`, consuming both closing brackets. +fn collect_wikilink_inner( + chars: &mut std::iter::Peekable>, +) -> String { + let mut buf = String::new(); + while let Some(c) = chars.next() { + if c == ']' && chars.peek() == Some(&']') { + chars.next(); + break; + } + buf.push(c); + } + buf +} + /// Check if a string contains a wikilink pattern `[[...]]`. pub(super) fn contains_wikilink(s: &str) -> bool { s.contains("[[") && s.contains("]]") @@ -250,6 +273,16 @@ mod tests { let snippet = extract_snippet(content); assert!(snippet.contains("this link")); assert!(!snippet.contains("https://example.com")); + assert!(snippet.contains("wiki link")); + assert!(!snippet.contains("[[")); + assert!(!snippet.contains("]]")); + } + + #[test] + fn test_extract_snippet_wikilink_alias() { + let content = "# Title\n\nDiscussed in [[meetings/standup|standup]] today."; + let snippet = extract_snippet(content); + assert_eq!(snippet, "Discussed in standup today."); } #[test] @@ -378,7 +411,20 @@ mod tests { #[test] fn test_strip_markdown_chars_wikilink() { - assert_eq!(strip_markdown_chars("see [[my note]]"), "see [my note]"); + assert_eq!(strip_markdown_chars("see [[my note]]"), "see my note"); + } + + #[test] + fn test_strip_markdown_chars_wikilink_alias() { + assert_eq!( + strip_markdown_chars("visit [[project/alpha|Alpha Project]]"), + "visit Alpha Project" + ); + } + + #[test] + fn test_strip_markdown_chars_wikilink_unclosed() { + assert_eq!(strip_markdown_chars("see [[broken link"), "see broken link"); } #[test]