mdzk/preprocess/
backlinks.rs1use crate::utils::{diff_paths, escape_special_chars};
2use mdbook::book::Chapter;
3use std::collections::HashMap;
4use std::path::PathBuf;
5use toml::Value;
6
7pub fn insert_backlinks(
8 ch: &mut Chapter,
9 backlinks_map: &mut HashMap<PathBuf, Vec<(PathBuf, String)>>,
10 header: &str,
11) {
12 if let Some(path) = &ch.path {
13 if let Some(backlinks) = backlinks_map.get_mut(path) {
14 if !backlinks.is_empty() {
15 backlinks.sort_unstable();
16 backlinks.dedup();
17
18 ch.content.push_str("\n<div class=\"backlinks\">\n\n");
19 ch.content.push_str(header);
20
21 for (dest, name) in backlinks.iter() {
22 let link = diff_paths(dest, path.parent().unwrap()).unwrap();
23 ch.content.push_str(&format!(
24 "\n[{}]({})",
25 name,
26 escape_special_chars(&link.to_string_lossy()),
27 ));
28 }
29
30 ch.content.push_str("\n</div>");
31 };
32 }
33 }
34}
35
36pub fn backlinks_header(config: &mdbook::Config) -> String {
37 let mut header = String::new();
38 if let Some(Value::String(val)) = config.get("mdzk.backlinks-header") {
39 header.push_str("### ");
40 header.push_str(val);
41 header.push_str(" {.backlinks-header}");
42 }
43 header
44}