mdzk/preprocess/
backlinks.rs

1use 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}