use penmanship::categories;
use std::fs;
use std::io::Write;
fn generate_html_docs() -> String {
let mut output = String::new();
output.push_str("# HTML Entity Mappings\n\n");
output.push_str(
"This document lists all HTML named character reference patterns supported by penmanship.\n\n",
);
let mut patterns = Vec::new();
for (pattern, (character, _description)) in categories::html::PART1.entries() {
patterns.push((pattern.to_string(), character.to_string()));
}
for (pattern, (character, _description)) in categories::html::PART2.entries() {
patterns.push((pattern.to_string(), character.to_string()));
}
for (pattern, (character, _description)) in categories::html::PART3.entries() {
patterns.push((pattern.to_string(), character.to_string()));
}
patterns.sort_by(|a, b| a.1.cmp(&b.1).then_with(|| a.0.cmp(&b.0)));
output.push_str(&format!("Total HTML entities: {}\n\n", patterns.len()));
output.push_str("| Pattern | Character |\n");
output.push_str("|---------|--------|\n");
for (pattern, character) in &patterns {
let escaped_pattern = pattern.replace('|', "\\|");
let escaped_character = character
.replace('|', "\\|")
.replace('\t', "`tab`")
.replace('\n', "`newline`")
.replace('\r', "`return`");
output.push_str(&format!("| `{escaped_pattern}` | {escaped_character} |\n"));
}
output.push('\n');
output.push_str("---\n\n");
output.push_str("*Generated by `scripts/generate_mapping_html.rs`*\n");
output
}
fn main() -> std::io::Result<()> {
println!("Generating HTML entity mapping documentation...");
let output = generate_html_docs();
fs::create_dir_all("docs")?;
let mut file = fs::File::create("docs/html-entities.md")?;
file.write_all(output.as_bytes())?;
println!("✓ Generated docs/html-entities.md");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_html_docs() {
let output = generate_html_docs();
assert!(output.contains("# HTML Entity Mappings"));
assert!(output.contains("Total HTML entities:"));
assert!(output.contains("| Pattern | Character |"));
assert!(output.len() > 10000); }
}