--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build.rs Thu Dec 01 23:37:14 2022 +0200 @@ -0,0 +1,38 @@ +use std::env; +use regex::{Regex, Captures}; + +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() +} + +fn main() { + 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"); +}