diff --git a/crates/aiken-project/Cargo.toml b/crates/aiken-project/Cargo.toml index 8f4311e7..a71e391b 100644 --- a/crates/aiken-project/Cargo.toml +++ b/crates/aiken-project/Cargo.toml @@ -53,6 +53,7 @@ uplc = { path = '../uplc', version = "1.1.7" } vec1 = "1.10.1" walkdir.workspace = true zip = "0.6.4" +katex = "0.4" [dev-dependencies] blst = "0.3.11" diff --git a/crates/aiken-project/src/docs.rs b/crates/aiken-project/src/docs.rs index 979e8718..ec4cbf50 100644 --- a/crates/aiken-project/src/docs.rs +++ b/crates/aiken-project/src/docs.rs @@ -13,7 +13,9 @@ use aiken_lang::{ }; use askama::Template; use itertools::Itertools; +use katex::{Opts, OutputType}; use pulldown_cmark as markdown; +use regex::Regex; use serde::Serialize; use serde_json as json; use std::{ @@ -269,9 +271,7 @@ fn generate_module( }; let rendered_content = convert_latex_markers( - inject_math_library( module.render().expect("Module documentation template rendering"), - ) ); ( @@ -285,21 +285,31 @@ fn generate_module( fn convert_latex_markers(input: String) -> String { - input.replace("#[", "\\(") - .replace("]#", "\\)") -} + let re_inline = Regex::new(r#"\s*(.+?)\s*"#).unwrap(); + let re_block = Regex::new(r#"\s*(.+?)\s*"#).unwrap(); -fn inject_math_library(html: String) -> String { - let mathjax_script = r#" - - - "#; + let opts_inline = Opts::builder() + .display_mode(false) // Inline math + .output_type(OutputType::Mathml) + .build() + .unwrap(); - html.replace("", &format!("{}\n", mathjax_script)) + let opts_block = katex::Opts::builder() + .display_mode(true) // Block math + .output_type(OutputType::Mathml) + .build() + .unwrap(); + + let input = re_inline.replace_all(&input, |caps: ®ex::Captures| { + let formula = &caps[1]; + katex::render_with_opts(formula, &opts_inline).unwrap_or_else(|_| formula.to_string()) + }); + + re_block.replace_all(&input, |caps: ®ex::Captures| { + let formula = &caps[1]; + katex::render_with_opts(formula, &opts_block).unwrap_or_else(|_| formula.to_string()) + }) + .to_string() } fn generate_static_assets(search_indexes: Vec) -> Vec {