build.rs

Thu, 26 Feb 2026 11:36:22 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 26 Feb 2026 11:36:22 -0500
branch
dev
changeset 63
7a8a55fd41c0
parent 61
4f468d35fa29
permissions
-rw-r--r--

Subproblem solver and sliding adjustments/improvements

use regex::{Captures, Regex};
use std::env;

fn main() {
    process_readme();
    // Does not seem to be needed now.
    //discover_gsl();
}

/*
/// Discover how to link to gsl, as the gsl crate does not provide this information
fn discover_gsl() {
    pkg_config::Config::new().probe("gsl").unwrap();
}
*/

/// `\`-escape `_`, `*`, and ยด\\` in matches of `re` within `str`.
fn proc<A: AsRef<str>>(re: &str, str: A) -> String {
    let need_to_escape = Regex::new(r"([_*\\])").unwrap();
    Regex::new(re)
        .unwrap()
        .replace_all(str.as_ref(), |caps: &Captures| {
            format!(
                "{}{}{}",
                caps.get(1).unwrap().as_str(),
                need_to_escape.replace_all(caps.get(2).unwrap().as_str(), "\\$1"),
                caps.get(3).unwrap().as_str()
            )
        })
        .to_string()
}

/// Process the README for inclusion in documentation
fn process_readme() {
    let out_dir = env::var("OUT_DIR").unwrap();

    // Since rust is stuck in 80's 7-bit gringo ASCII world, so that rustdoc does not support
    // markdown KaTeX mathematics, we have to process the README to include horrible horrible
    // horrible escapes for the math, and then use an vomit-inducingly ugly javasccript
    // workaround to process the math on the fly.

    println!("cargo:rerun-if-changed=README.md");

    let readme = std::fs::read_to_string("README.md").expect("Error reading README");

    // Escape _, *, and \ in equations.
    let readme_uglified = proc(
        r"(?m)([^$]\$)([^$]+)(\$[^$])",
        proc(r"([^$]\$\$)([^$]+)(\$\$[^$])", readme),
    );
    // Remove the instructions for building the documentation
    let readme_cut = Regex::new("## Internals(.*|\n)*")
        .unwrap()
        .replace_all(&readme_uglified, "");

    std::fs::write(out_dir + "/README_uglified.md", readme_cut.as_bytes())
        .expect("Error saving uglified README");
}

mercurial