feat(config): P3 config batch — group 7 (user_htmls pruning)
allToHtml now prunes orphan HTML files (no corresponding wiki source) under html_path — export_ops::prune_orphan_html walks the output tree, maps each <rel>.html back to <root>/<rel>.<ext>, and deletes those with no source, skipping the CSS file and any basename in user_htmls. Gated on !html_filename_parameterization (slugified names can't be reverse-mapped), mirroring upstream; the pruned paths are reported in the command result. hl_headers / hl_cb_checked are NOT implemented as toggles: nuwiki already highlights headers per-level (@vimwikiHeading.level1..6) and checkboxes always-on via LSP semantic tokens, which supersedes the upstream opt-in toggles (default off) — same class as the maxhi divergence. Documented in the gap doc rather than degrading the existing highlighting. Test: prune_orphan_html_deletes_sourceless_keeps_protected. Full rust suite + clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -631,6 +631,32 @@ fn write_rss_uses_base_url_for_public_links() {
|
||||
assert!(!xml.contains("file:///tmp/diary"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn prune_orphan_html_deletes_sourceless_keeps_protected() {
|
||||
let root = temp_root("prune");
|
||||
let mut c = WikiConfig::from_root(root.clone());
|
||||
c.html = HtmlConfig::from_root(&root);
|
||||
c.html.user_htmls = vec!["keep.html".into()];
|
||||
let html = &c.html.html_path;
|
||||
std::fs::create_dir_all(html).unwrap();
|
||||
// A sourced page (Home.wiki exists) → kept.
|
||||
std::fs::write(root.join("Home.wiki"), "= Home =\n").unwrap();
|
||||
std::fs::write(html.join("Home.html"), "<h1>Home</h1>").unwrap();
|
||||
// An orphan (no source) → pruned.
|
||||
std::fs::write(html.join("Ghost.html"), "<h1>Ghost</h1>").unwrap();
|
||||
// A user_htmls-protected orphan → kept.
|
||||
std::fs::write(html.join("keep.html"), "<p>manual</p>").unwrap();
|
||||
// The CSS file → never pruned.
|
||||
std::fs::write(html.join(&c.html.css_name), "body{}").unwrap();
|
||||
|
||||
let pruned = nuwiki_lsp::commands::export_ops::prune_orphan_html(&c);
|
||||
assert_eq!(pruned.len(), 1, "only the orphan: {pruned:?}");
|
||||
assert!(!html.join("Ghost.html").exists(), "orphan deleted");
|
||||
assert!(html.join("Home.html").exists(), "sourced kept");
|
||||
assert!(html.join("keep.html").exists(), "user_htmls kept");
|
||||
assert!(html.join(&c.html.css_name).exists(), "css kept");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn write_rss_honours_rss_name_and_max_items() {
|
||||
use nuwiki_lsp::diary::DiaryEntry;
|
||||
|
||||
Reference in New Issue
Block a user