From f0a4f2a0470c83c012112c59980cffb84ff31597 Mon Sep 17 00:00:00 2001 From: brawliscool <181055418+brawliscool@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:30:47 -0500 Subject: [PATCH 1/3] fix: ignore wiki-link matches spanning inline code --- src/vault/mod.rs | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/vault/mod.rs b/src/vault/mod.rs index 4bf93676..a913b71f 100644 --- a/src/vault/mod.rs +++ b/src/vault/mod.rs @@ -589,6 +589,7 @@ impl AsRef for Block<'_> { pub trait Rangeable { fn range(&self) -> &MyRange; + fn includes(&self, other: &impl Rangeable) -> bool { let self_range = self.range(); let other_range = other.range(); @@ -601,6 +602,13 @@ pub trait Rangeable { && self_range.end.character >= other_range.end.character)) } + fn overlaps(&self, other: &impl Rangeable) -> bool { + let self_range = self.range(); + let other_range = other.range(); + + self_range.start < other_range.end && other_range.start < self_range.end + } + fn includes_position(&self, position: Position) -> bool { let range = self.range(); (range.start.line < position.line @@ -672,7 +680,7 @@ impl MDFile { references_in_codeblocks: false, .. } => Reference::new(text, file_name) - .filter(|it| !code_blocks.iter().any(|codeblock| codeblock.includes(it))) + .filter(|it| !code_blocks.iter().any(|codeblock| codeblock.overlaps(it))) .collect_vec(), _ => Reference::new(text, file_name).collect_vec(), }; @@ -1793,17 +1801,39 @@ fn matches_path_or_file(file_ref_text: &str, refname: Option) -> bool { // tests #[cfg(test)] mod vault_tests { - use std::path::Path; + use std::path::{Path, PathBuf}; use itertools::Itertools; - use tower_lsp::lsp_types::{Position, Range}; + use tower_lsp::lsp_types::{ClientCapabilities, Position, Range}; - use crate::vault::{HeadingLevel, MyRange, ReferenceData}; + use crate::config::Settings; + use crate::vault::{HeadingLevel, ReferenceData}; use crate::vault::{MDLinkReferenceDefinition, Refname}; use super::Reference::*; use super::{MDFile, MDFootnote, MDHeading, MDIndexedBlock, MDTag, Reference, Referenceable}; + fn default_settings() -> Settings { + Settings::new(Path::new("."), &ClientCapabilities::default()).unwrap() + } + + #[test] + fn wiki_link_markers_in_separate_inline_code_spans_are_ignored() { + let text = "* DO NOT use the square bracket `[[` and `]]` markers"; + let parsed = MDFile::new(&default_settings(), text, PathBuf::from("test.md")); + + assert!(parsed.references.is_empty()); + } + + #[test] + fn wiki_link_adjacent_to_inline_code_is_preserved() { + let text = "`example`[[note]]"; + let parsed = MDFile::new(&default_settings(), text, PathBuf::from("test.md")); + + assert_eq!(parsed.references.len(), 1); + assert_eq!(parsed.references[0].reference_text, "note"); + } + #[test] fn wiki_link_parsing() { let text = "This is a [[link]] [[link 2]]\n[[link 3]]"; From 0195686d02bb12a357768946e4109e1ca3413be6 Mon Sep 17 00:00:00 2001 From: brawliscool <181055418+brawliscool@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:43:27 -0500 Subject: [PATCH 2/3] test: preserve references-in-codeblocks opt-in --- src/vault/mod.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/vault/mod.rs b/src/vault/mod.rs index a913b71f..2bf227be 100644 --- a/src/vault/mod.rs +++ b/src/vault/mod.rs @@ -1834,6 +1834,18 @@ mod vault_tests { assert_eq!(parsed.references[0].reference_text, "note"); } + #[test] + fn wiki_link_matches_spanning_inline_code_remain_when_enabled() { + let text = "* DO NOT use the square bracket `[[` and `]]` markers"; + let mut settings = default_settings(); + settings.references_in_codeblocks = true; + + let parsed = MDFile::new(&settings, text, PathBuf::from("test.md")); + + assert_eq!(parsed.references.len(), 1); + assert_eq!(parsed.references[0].reference_text, "` and `"); + } + #[test] fn wiki_link_parsing() { let text = "This is a [[link]] [[link 2]]\n[[link 3]]"; From e90f2e7e68d90f19bf0aed2127c4d216cd753adc Mon Sep 17 00:00:00 2001 From: brawliscool <181055418+brawliscool@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:44:18 -0500 Subject: [PATCH 3/3] test: cover wiki-links inside inline code --- src/vault/mod.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vault/mod.rs b/src/vault/mod.rs index 2bf227be..8db326e6 100644 --- a/src/vault/mod.rs +++ b/src/vault/mod.rs @@ -1825,6 +1825,14 @@ mod vault_tests { assert!(parsed.references.is_empty()); } + #[test] + fn wiki_link_inside_inline_code_is_ignored() { + let text = "Use `[[example]]` as literal syntax"; + let parsed = MDFile::new(&default_settings(), text, PathBuf::from("test.md")); + + assert!(parsed.references.is_empty()); + } + #[test] fn wiki_link_adjacent_to_inline_code_is_preserved() { let text = "`example`[[note]]";