From e0f97a5caf29f34fd0b5b1db955c8743e27537ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Fr=C3=B3es=20Franco?= Date: Thu, 28 May 2026 21:43:11 -0300 Subject: [PATCH] fix(export): emit one CSS class per keyword for independent colouring All keywords previously shared `class="todo"`, so a stylesheet couldn't distinguish e.g. red TODO from green DONE. Emit a distinct class per keyword (todo/done/started/fixme/fixed/xxx); TODO keeps the vimwiki `todo` class so stock vimwiki CSS still styles it. Co-Authored-By: Claude Opus 4.7 --- crates/nuwiki-core/src/render/html.rs | 15 +++++++++------ crates/nuwiki-core/tests/html_renderer.rs | 16 ++++++++++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/crates/nuwiki-core/src/render/html.rs b/crates/nuwiki-core/src/render/html.rs index 8dafd35..e449a8a 100644 --- a/crates/nuwiki-core/src/render/html.rs +++ b/crates/nuwiki-core/src/render/html.rs @@ -492,13 +492,16 @@ impl HtmlRenderer { } fn render_keyword(&self, n: &KeywordNode, w: &mut dyn Write) -> io::Result<()> { + // One class per keyword so stylesheets can colour them independently + // (e.g. red TODO/FIXME/XXX vs green DONE/FIXED/STARTED). TODO keeps the + // vimwiki `todo` class so stock vimwiki CSS still styles it. let (label, class) = match n.keyword { - Keyword::Todo => ("TODO", "keyword keyword-todo"), - Keyword::Done => ("DONE", "keyword keyword-done"), - Keyword::Started => ("STARTED", "keyword keyword-started"), - Keyword::Fixme => ("FIXME", "keyword keyword-fixme"), - Keyword::Fixed => ("FIXED", "keyword keyword-fixed"), - Keyword::Xxx => ("XXX", "keyword keyword-xxx"), + Keyword::Todo => ("TODO", "todo"), + Keyword::Done => ("DONE", "done"), + Keyword::Started => ("STARTED", "started"), + Keyword::Fixme => ("FIXME", "fixme"), + Keyword::Fixed => ("FIXED", "fixed"), + Keyword::Xxx => ("XXX", "xxx"), }; write!(w, "{label}") } diff --git a/crates/nuwiki-core/tests/html_renderer.rs b/crates/nuwiki-core/tests/html_renderer.rs index 9f9110e..bf10fb7 100644 --- a/crates/nuwiki-core/tests/html_renderer.rs +++ b/crates/nuwiki-core/tests/html_renderer.rs @@ -196,8 +196,20 @@ fn inline_code_is_escaped() { #[test] fn keyword_spans() { - let out = render("TODO write tests\n"); - assert!(out.contains("TODO")); + // One class per keyword so a stylesheet can colour groups differently. + // TODO keeps the vimwiki `todo` class. + let cases = [ + ("TODO x\n", "TODO"), + ("DONE x\n", "DONE"), + ("STARTED x\n", "STARTED"), + ("FIXME x\n", "FIXME"), + ("FIXED x\n", "FIXED"), + ("XXX x\n", "XXX"), + ]; + for (src, expected) in cases { + let out = render(src); + assert!(out.contains(expected), "src {src:?} -> {out}"); + } } #[test]