From caaafd3cf30e6fd5ed4768a880a3fafb5d6b0131 Mon Sep 17 00:00:00 2001 From: gffranco Date: Wed, 24 Jun 2026 09:15:09 +0000 Subject: [PATCH] sync: bring Rust crates in line with nuwiki main (v0.4.2) --- Cargo.lock | 6 ++--- Cargo.toml | 2 +- .../nuwiki-core/src/syntax/vimwiki/lexer.rs | 7 +++-- crates/nuwiki-core/tests/html_renderer.rs | 21 +++++++++++++++ crates/nuwiki-core/tests/lexer.rs | 26 +++++++++++++++++++ crates/nuwiki-ls/Cargo.toml | 2 +- crates/nuwiki-lsp/Cargo.toml | 2 +- 7 files changed, 56 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 908616d..f9f4dd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -376,11 +376,11 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "nuwiki-core" -version = "0.4.1" +version = "0.4.2" [[package]] name = "nuwiki-ls" -version = "0.4.1" +version = "0.4.2" dependencies = [ "nuwiki-lsp", "tokio", @@ -388,7 +388,7 @@ dependencies = [ [[package]] name = "nuwiki-lsp" -version = "0.4.1" +version = "0.4.2" dependencies = [ "async-trait", "dashmap 6.1.0", diff --git a/Cargo.toml b/Cargo.toml index c50c4e0..5404298 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/*"] [workspace.package] -version = "0.4.1" +version = "0.4.2" edition = "2021" rust-version = "1.83" authors = ["Gabriel Fróes Franco "] diff --git a/crates/nuwiki-core/src/syntax/vimwiki/lexer.rs b/crates/nuwiki-core/src/syntax/vimwiki/lexer.rs index 12ba237..2d4b1af 100644 --- a/crates/nuwiki-core/src/syntax/vimwiki/lexer.rs +++ b/crates/nuwiki-core/src/syntax/vimwiki/lexer.rs @@ -526,10 +526,9 @@ impl<'src> LexState<'src> { if level == 0 { return false; } - // Must be followed by at least one space. - if leading_ws + level >= bytes.len() || bytes[leading_ws + level] != b' ' { - return false; - } + // vimwiki accepts both spaced (`== H ==`) and spaceless (`==H==`) + // headings, so we don't require a space after the opening `=`s. The + // title is still trimmed of one optional space per side below. // Trailing `=`s of the same level. let trimmed_end = line.trim_end_matches([' ', '\t']); diff --git a/crates/nuwiki-core/tests/html_renderer.rs b/crates/nuwiki-core/tests/html_renderer.rs index 7ab0598..713728e 100644 --- a/crates/nuwiki-core/tests/html_renderer.rs +++ b/crates/nuwiki-core/tests/html_renderer.rs @@ -77,6 +77,27 @@ fn centered_heading_gets_centered_class() { assert!(out.contains("

T

")); } +#[test] +fn spaceless_heading_renders_as_heading() { + // `==Heading==` (no surrounding spaces) is a heading, like vimwiki — not a + // literal `

==Heading==

`. + let out = render("==Plain==\n"); + assert!( + out.contains( + "

\ + Plain

" + ), + "got: {out}" + ); + // The spaceless + keyword combo from the report: a header, not a badge. + let out2 = render("==TODO==\n"); + assert!( + out2.contains("

"), + "got: {out2}" + ); + assert!(!out2.contains("

"), "not a paragraph: {out2}"); +} + #[test] fn heading_keyword_renders_as_plain_text_not_badge() { // `== TODO ==` is a section title, not an inline keyword: it must render as diff --git a/crates/nuwiki-core/tests/lexer.rs b/crates/nuwiki-core/tests/lexer.rs index 53a3fcb..b3aab42 100644 --- a/crates/nuwiki-core/tests/lexer.rs +++ b/crates/nuwiki-core/tests/lexer.rs @@ -85,6 +85,32 @@ fn centered_heading_is_marked_centered() { assert!(matches!(lexed[2], HeadingClose)); } +#[test] +fn spaceless_heading_is_a_heading() { + // vimwiki accepts `==Heading==` with no spaces around the text. + let lexed = lex("==Plain==\n"); + assert_eq!( + lexed, + vec![ + HeadingOpen { + level: 2, + centered: false + }, + text("Plain"), + HeadingClose, + Newline, + ] + ); +} + +#[test] +fn marker_only_or_unbalanced_lines_are_not_headings() { + // No title between markers, and trailing `=` not at line end → plain text. + assert!(!matches!(lex("======\n")[0], HeadingOpen { .. })); + assert!(!matches!(lex("==> arrow\n")[0], HeadingOpen { .. })); + assert!(!matches!(lex("==a==b\n")[0], HeadingOpen { .. })); +} + #[test] fn heading_with_inline_bold() { let lexed = lex("== Hello *world* ==\n"); diff --git a/crates/nuwiki-ls/Cargo.toml b/crates/nuwiki-ls/Cargo.toml index 2e3725f..9ee85a7 100644 --- a/crates/nuwiki-ls/Cargo.toml +++ b/crates/nuwiki-ls/Cargo.toml @@ -17,5 +17,5 @@ name = "nuwiki-ls" path = "src/main.rs" [dependencies] -nuwiki-lsp = { path = "../nuwiki-lsp", version = "0.4.1" } +nuwiki-lsp = { path = "../nuwiki-lsp", version = "0.4.2" } tokio = { version = "1", features = ["macros", "rt-multi-thread", "io-std"] } diff --git a/crates/nuwiki-lsp/Cargo.toml b/crates/nuwiki-lsp/Cargo.toml index cddea7c..fc35afa 100644 --- a/crates/nuwiki-lsp/Cargo.toml +++ b/crates/nuwiki-lsp/Cargo.toml @@ -13,7 +13,7 @@ homepage.workspace = true workspace = true [dependencies] -nuwiki-core = { path = "../nuwiki-core", version = "0.4.1" } +nuwiki-core = { path = "../nuwiki-core", version = "0.4.2" } tower-lsp = "0.20" tokio = { version = "1", features = ["macros", "rt-multi-thread", "io-std", "sync", "fs"] } dashmap = "6"