extern crate std;
use std::format;
use std::prelude::v1::*;
pub(crate) fn markdown_debug(value: &str) -> String {
let debug = format!("{value:?}");
let mut escaped = String::with_capacity(debug.len());
for character in debug.chars() {
match character {
'&' => escaped.push_str("&"),
'<' => escaped.push_str("<"),
'>' => escaped.push_str(">"),
'`' | '*' | '_' | '{' | '}' | '[' | ']' => {
escaped.push('\\');
escaped.push(character);
}
_ => escaped.push(character),
}
}
escaped
}
pub(crate) fn rustdoc_debug(value: &str) -> String {
if value.contains("://") || value.contains('`') {
let debug = format!("{value:?}");
let mut longest_run = 0;
let mut current_run = 0;
for character in debug.chars() {
if character == '`' {
current_run += 1;
longest_run = longest_run.max(current_run);
} else {
current_run = 0;
}
}
let fence = "`".repeat(longest_run + 1);
format!("{fence}{debug}{fence}")
} else {
markdown_debug(value)
}
}
#[cfg(test)]
mod tests {
use super::{markdown_debug, rustdoc_debug};
#[test]
fn angle_brackets_use_html_entities() {
assert_eq!(
markdown_debug("<kPa> & <tag>"),
r#""<kPa> & <tag>""#
);
assert_eq!(rustdoc_debug("<kPa>"), r#""<kPa>""#);
}
}