From ef2e0b092b417389d50c0973637a63b425061cb5 Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon <76854355+carloskiki@users.noreply.github.com> Date: Sun, 4 Aug 2024 15:29:25 -0400 Subject: [PATCH] Fix: Array line spacing (#4) * fix array rendering with custom line spacing * update changelog * add test for array fix * chore: rustfmt --- CHANGELOG.md | 1 + Cargo.toml | 5 ++ src/mathml.rs | 153 +++++++++++++++++++----------------- tests/environments.rs | 49 ++++++++++++ tests/out/environments.html | 19 +++++ tests/out/index.html | 3 +- tests/out/wikipedia.html | 86 +++----------------- 7 files changed, 165 insertions(+), 151 deletions(-) create mode 100644 tests/environments.rs create mode 100644 tests/out/environments.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c4c7ec..cffdc6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Fixed +- Array rendering with custom line spacing. - Expansion spans being to eagerly popped. - Benchmark errors and doc-tests not compiling. diff --git a/Cargo.toml b/Cargo.toml index 7195955..507e2cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,11 @@ name = "cross-browser" path = "tests/cross-browser.rs" harness = false +[[test]] +name = "environments" +path = "tests/environments.rs" +harness = false + [[bench]] name = "basic" harness = false diff --git a/src/mathml.rs b/src/mathml.rs index 7837915..29549b0 100644 --- a/src/mathml.rs +++ b/src/mathml.rs @@ -435,24 +435,7 @@ where if let Some(Environment::Group(EnvGrouping::Array { cols, cols_index })) = self.env_stack.last() { - self.writer.write_all(b"")?; - cols[*cols_index..] - .iter() - .map_while(|col| match col { - ArrayColumn::Separator(line) => Some(line), - _ => None, - }) - .try_for_each(|line| { - self.writer.write_all(match line { - Line::Solid => { - b"" - } - Line::Dashed => { - b"" - } - }) - })?; - self.writer.write_all(b"", tex_to_css_em(spacing) )?; + if let Some(Environment::Group(EnvGrouping::Array { cols, cols_index })) = + self.env_stack.last_mut() + { + let mut index = array_newline(&mut self.writer, cols)?; + while index < *cols_index { + array_align(&mut self.writer, cols, &mut index)?; + } + array_close_line(&mut self.writer, &cols[index..])?; + } else { + self.writer + .write_all(b"") } Some(Environment::Group(EnvGrouping::Array { cols, cols_index })) => { - self.writer.write_all(b" Some(line), - _ => None, - }) - .try_for_each(|line| { - *cols_index += 1; - self.writer.write_all(match line { - Line::Solid => { - b" class=\"menv-right-solid menv-border-only\"> { - b" class=\"menv-right-dashed menv-border-only\"> { - *cols_index += 2; - match (col, line) { - (ColumnAlignment::Left, Line::Solid) => { - b" class=\"cell-left menv-right-solid\">" - } - (ColumnAlignment::Left, Line::Dashed) => { - b" class=\"cell-left menv-right-dashed\">" - } - (ColumnAlignment::Center, Line::Solid) => { - b" class=\"menv-right-solid\">" - } - (ColumnAlignment::Center, Line::Dashed) => { - b" class=\"menv-right-dashed\">" - } - (ColumnAlignment::Right, Line::Solid) => { - b" class=\"cell-right menv-right-solid\">" - } - (ColumnAlignment::Right, Line::Dashed) => { - b" class=\"cell-right menv-right-dashed\">" - } - } - } - (ArrayColumn::Column(col), _) => { - *cols_index += 1; - match col { - ColumnAlignment::Left => b" class=\"cell-left\">", - ColumnAlignment::Center => b">", - ColumnAlignment::Right => b" class=\"cell-right\">", - } - } - (ArrayColumn::Separator(_), _) => unreachable!(), - }; - self.writer.write_all(to_append) + array_align(&mut self.writer, cols, cols_index) } _ => panic!("alignment not allowed in current environment"), } @@ -1021,6 +962,70 @@ fn array_newline(writer: &mut W, cols: &[ArrayColumn]) -> io::Result( + writer: &mut W, + cols: &[ArrayColumn], + cols_index: &mut usize, +) -> io::Result<()> { + writer.write_all(b" Some(line), + _ => None, + }) + .try_for_each(|line| { + *cols_index += 1; + writer.write_all(match line { + Line::Solid => b" class=\"menv-right-solid menv-border-only\"> b" class=\"menv-right-dashed menv-border-only\"> { + *cols_index += 2; + match (col, line) { + (ColumnAlignment::Left, Line::Solid) => b" class=\"cell-left menv-right-solid\">", + (ColumnAlignment::Left, Line::Dashed) => b" class=\"cell-left menv-right-dashed\">", + (ColumnAlignment::Center, Line::Solid) => b" class=\"menv-right-solid\">", + (ColumnAlignment::Center, Line::Dashed) => b" class=\"menv-right-dashed\">", + (ColumnAlignment::Right, Line::Solid) => b" class=\"cell-right menv-right-solid\">", + (ColumnAlignment::Right, Line::Dashed) => { + b" class=\"cell-right menv-right-dashed\">" + } + } + } + (ArrayColumn::Column(col), _) => { + *cols_index += 1; + match col { + ColumnAlignment::Left => b" class=\"cell-left\">", + ColumnAlignment::Center => b">", + ColumnAlignment::Right => b" class=\"cell-right\">", + } + } + (ArrayColumn::Separator(_), _) => unreachable!(), + }; + writer.write_all(to_append) +} + +fn array_close_line(writer: &mut W, rest_cols: &[ArrayColumn]) -> io::Result<()> { + writer.write_all(b"")?; + rest_cols + .iter() + .map_while(|col| match col { + ArrayColumn::Separator(line) => Some(line), + _ => None, + }) + .try_for_each(|line| { + writer.write_all(match line { + Line::Solid => b"", + Line::Dashed => b"", + }) + })?; + writer.write_all(b" { + $crate::round_trip!( + $name, + $($input),+, + display_mode = pulldown_latex::config::DisplayMode::Block + ); + }; + (should_panic, $name:ident, $($input:literal),+ $(,)?) => { + $crate::round_trip!( + should_panic, + $name, + $($input),+ + ); + } +} + +round_trip_display!( + arrays, + r#"\begin{array}{||c|r|l||} + a + b \\[2em] + a + b & c & d \\[2em] \hline + a + b + \end{array}"#, + r#"\begin{array}{c:c:c} + a & b & c \\ \hline + d & e & f \\ + \hdashline + g & h & i + \end{array}"#, +); diff --git a/tests/out/environments.html b/tests/out/environments.html new file mode 100644 index 0000000..f3a8ece --- /dev/null +++ b/tests/out/environments.html @@ -0,0 +1,19 @@ + + + +Mathematical Environments Tests + + + + +Arrays\begin{array}{||c|r|l||} + a + b \\[2em] + a + b & c & d \\[2em] \hline + a + b + \end{array}a+ba+bcda+b\begin{array}{c:c:c} + a & b & c \\ \hline + d & e & f \\ + \hdashline + g & h & i + \end{array}abcdefghi + \ No newline at end of file diff --git a/tests/out/index.html b/tests/out/index.html index 91f01bb..22b7223 100644 --- a/tests/out/index.html +++ b/tests/out/index.html @@ -6,6 +6,7 @@ Wikipedia tests Mozilla tests - Cross Browser tests + Cross-Browser tests + Environments tests