feat(config): configurable generated-section captions (P2)
TOC / links / tags section headings (and their levels) were hardcoded. Added per-wiki toc_header/toc_header_level, links_header/links_header_level, tags_header/tags_header_level — defaults Contents / Generated Links / Generated Tags at level 1, matching upstream (also fixes the tags index heading: Tags -> Generated Tags). A caption_line(name, level) helper emits the `=`-markers; the configured text + level thread through toc_edit / links_edit / tag_links_edit and the auto_toc save hook. find_section_range matches the configured text, so regeneration stays idempotent at any level. Tests: captions_honour_custom_header_and_level (link_health) + config round-trip + default assertions (index_and_config); existing tag/toc/links tests updated for the new arity and the Generated Tags default. fmt/clippy clean (8-arg ops get allow(too_many_arguments), matching the codebase precedent); 0 Rust test failures; config-parity green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -75,6 +75,18 @@ pub struct WikiConfig {
|
||||
pub links_space_char: String,
|
||||
/// Rebuild the page's TOC on save when set.
|
||||
pub auto_toc: bool,
|
||||
/// Heading text + level for the generated `:VimwikiTOC` section
|
||||
/// (vimwiki's `toc_header` / `toc_header_level`).
|
||||
pub toc_header: String,
|
||||
pub toc_header_level: u8,
|
||||
/// Heading text + level for `:VimwikiGenerateLinks` (`links_header` /
|
||||
/// `links_header_level`).
|
||||
pub links_header: String,
|
||||
pub links_header_level: u8,
|
||||
/// Heading text + level for the no-arg `:VimwikiGenerateTagLinks` index
|
||||
/// (`tags_header` / `tags_header_level`).
|
||||
pub tags_header: String,
|
||||
pub tags_header_level: u8,
|
||||
/// HTML export options.
|
||||
pub html: HtmlConfig,
|
||||
}
|
||||
@@ -196,6 +208,12 @@ impl WikiConfig {
|
||||
list_margin: d.list_margin,
|
||||
links_space_char: d.links_space_char,
|
||||
auto_toc: d.auto_toc,
|
||||
toc_header: d.toc_header,
|
||||
toc_header_level: d.toc_header_level,
|
||||
links_header: d.links_header,
|
||||
links_header_level: d.links_header_level,
|
||||
tags_header: d.tags_header,
|
||||
tags_header_level: d.tags_header_level,
|
||||
html: HtmlConfig::default(),
|
||||
}
|
||||
}
|
||||
@@ -226,6 +244,12 @@ impl WikiConfig {
|
||||
list_margin: d.list_margin,
|
||||
links_space_char: d.links_space_char,
|
||||
auto_toc: d.auto_toc,
|
||||
toc_header: d.toc_header,
|
||||
toc_header_level: d.toc_header_level,
|
||||
links_header: d.links_header,
|
||||
links_header_level: d.links_header_level,
|
||||
tags_header: d.tags_header,
|
||||
tags_header_level: d.tags_header_level,
|
||||
html,
|
||||
}
|
||||
}
|
||||
@@ -322,6 +346,18 @@ fn default_listsym_rejected() -> String {
|
||||
"-".to_string()
|
||||
}
|
||||
|
||||
fn default_toc_header() -> String {
|
||||
"Contents".to_string()
|
||||
}
|
||||
|
||||
fn default_links_header() -> String {
|
||||
"Generated Links".to_string()
|
||||
}
|
||||
|
||||
fn default_tags_header() -> String {
|
||||
"Generated Tags".to_string()
|
||||
}
|
||||
|
||||
fn default_links_space_char() -> String {
|
||||
" ".to_string()
|
||||
}
|
||||
@@ -348,6 +384,12 @@ fn wiki_defaults() -> WikiDefaults {
|
||||
list_margin: -1,
|
||||
links_space_char: default_links_space_char(),
|
||||
auto_toc: false,
|
||||
toc_header: default_toc_header(),
|
||||
toc_header_level: 1,
|
||||
links_header: default_links_header(),
|
||||
links_header_level: 1,
|
||||
tags_header: default_tags_header(),
|
||||
tags_header_level: 1,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,6 +409,12 @@ struct WikiDefaults {
|
||||
list_margin: i32,
|
||||
links_space_char: String,
|
||||
auto_toc: bool,
|
||||
toc_header: String,
|
||||
toc_header_level: u8,
|
||||
links_header: String,
|
||||
links_header_level: u8,
|
||||
tags_header: String,
|
||||
tags_header_level: u8,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
@@ -593,6 +641,18 @@ struct RawWiki {
|
||||
links_space_char: Option<String>,
|
||||
#[serde(default, deserialize_with = "opt_bool_or_int::deserialize")]
|
||||
auto_toc: Option<bool>,
|
||||
#[serde(default)]
|
||||
toc_header: Option<String>,
|
||||
#[serde(default)]
|
||||
toc_header_level: Option<u8>,
|
||||
#[serde(default)]
|
||||
links_header: Option<String>,
|
||||
#[serde(default)]
|
||||
links_header_level: Option<u8>,
|
||||
#[serde(default)]
|
||||
tags_header: Option<String>,
|
||||
#[serde(default)]
|
||||
tags_header_level: Option<u8>,
|
||||
}
|
||||
|
||||
impl From<RawWiki> for WikiConfig {
|
||||
@@ -654,6 +714,12 @@ impl From<RawWiki> for WikiConfig {
|
||||
list_margin: r.list_margin.unwrap_or(d.list_margin),
|
||||
links_space_char: r.links_space_char.unwrap_or(d.links_space_char),
|
||||
auto_toc: r.auto_toc.unwrap_or(d.auto_toc),
|
||||
toc_header: r.toc_header.unwrap_or(d.toc_header),
|
||||
toc_header_level: r.toc_header_level.unwrap_or(d.toc_header_level),
|
||||
links_header: r.links_header.unwrap_or(d.links_header),
|
||||
links_header_level: r.links_header_level.unwrap_or(d.links_header_level),
|
||||
tags_header: r.tags_header.unwrap_or(d.tags_header),
|
||||
tags_header_level: r.tags_header_level.unwrap_or(d.tags_header_level),
|
||||
html,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user