use std::borrow::Cow;
use std::ops::Range;
use super::span::MathSpan;
pub fn convert_for_dollar<'a>(source: &'a str, range: &Range<usize>, span: &MathSpan) -> Cow<'a, str> {
match span {
MathSpan::Environment { .. } => Cow::Borrowed(source.get(range.clone()).unwrap_or("")),
MathSpan::Display { body, .. } => {
let body = body.as_str(source);
Cow::Owned(format!("$$ {} $$", body.trim()))
}
MathSpan::Inline { body, .. } => {
let body = body.as_str(source);
Cow::Owned(format!("${}$", body.trim()))
}
}
}
#[cfg(test)]
#[allow(clippy::indexing_slicing, clippy::panic)]
mod tests {
use super::*;
use crate::env::{EnvKind, KnownEnv};
use crate::span::{DisplayDelim, InlineDelim, MathBody};
#[test]
fn dollar_rewrites_display_bracket() {
let source = r"\[ A = B \]";
let body = MathBody::new(2..9, Box::new([]));
let span = MathSpan::Display {
delim: DisplayDelim::Bracket,
body,
};
let out = convert_for_dollar(source, &(0..source.len()), &span);
assert_eq!(&*out, "$$ A = B $$");
}
#[test]
fn dollar_rewrites_inline_paren() {
let source = r"\(B\)";
let body = MathBody::new(2..3, Box::new([]));
let span = MathSpan::Inline {
delim: InlineDelim::Paren,
body,
};
let out = convert_for_dollar(source, &(0..source.len()), &span);
assert_eq!(&*out, "$B$");
}
#[test]
fn dollar_rewrites_inline_dollar_unchanged_shape() {
let source = "$x + y$";
let body = MathBody::new(1..6, Box::new([]));
let span = MathSpan::Inline {
delim: InlineDelim::Dollar,
body,
};
let out = convert_for_dollar(source, &(0..source.len()), &span);
assert_eq!(&*out, "$x + y$");
}
#[test]
fn dollar_passes_environment_through() {
let source = "\\begin{align*}\na &= b\n\\end{align*}";
let env = EnvKind::Known(KnownEnv::AlignStar);
let body = MathBody::new(14..22, Box::new([]));
let span = MathSpan::Environment { env, body };
let out = convert_for_dollar(source, &(0..source.len()), &span);
assert!(matches!(out, Cow::Borrowed(_)));
assert_eq!(&*out, source);
}
#[test]
fn dollar_blockquote_nested_strips_transparent_runs() {
let source = "> \\[ x \\]";
let body = MathBody::new(4..7, Box::new([]));
let span = MathSpan::Display {
delim: DisplayDelim::Bracket,
body,
};
let out = convert_for_dollar(source, &(2..9), &span);
assert_eq!(&*out, "$$ x $$");
}
}