diff --git a/src/documents/diagram.rs b/src/documents/diagram.rs index 62ea63b..8904066 100644 --- a/src/documents/diagram.rs +++ b/src/documents/diagram.rs @@ -104,21 +104,24 @@ pub fn diagram_svg(source: &str) -> Result { ink: "#000000".into(), scale: 100, }; - let drawn = svg(&chart)?; - // Markers and text become paths any reader draws. + flatten(&svg(&chart)?) +} + +/// `svg` with markers and text as paths any reader draws. +pub(crate) fn flatten(svg: &str) -> Result { let options = usvg::Options { fontdb: fonts(), ..usvg::Options::default() }; - let tree = usvg::Tree::from_data(drawn.as_bytes(), &options) + let tree = usvg::Tree::from_data(svg.as_bytes(), &options) .map_err(|error| SharedString::from(format!("{error}")))?; // A letter without a font vanishes: say so. let (mut kept, mut lost) = (0, 0); texts(tree.root(), &mut kept, &mut lost); - let written = labels(&drawn)?; + let written = labels(svg)?; if kept < written || lost > 0 { - log::error!("diagram: {kept} of {written} labels set, {lost} letters without a font"); - return Err("no installed font could set this diagram's labels".into()); + log::error!("svg: {kept} of {written} texts set, {lost} letters without a font"); + return Err("no installed font has every letter here".into()); } Ok(tree.to_string(&usvg::WriteOptions::default())) } diff --git a/src/documents/mod.rs b/src/documents/mod.rs index f0597c3..8f33f90 100644 --- a/src/documents/mod.rs +++ b/src/documents/mod.rs @@ -33,6 +33,7 @@ pub(crate) use blocks::source; pub use blocks::{Align, BlockData, BlockEditor, BlockEvent, BlockKind, Media}; pub use contents::outline; pub use counts::{ReadingTime, WordCount}; +pub(crate) use diagram::flatten; pub use diagram::{Diagram, diagram_svg}; pub use document::{ Attachment, DocumentEvent, DocumentHeading, DocumentLook, LARGEST_READ, MarkdownDocument, diff --git a/src/typography/math.rs b/src/typography/math.rs index 68bef20..f3db1e0 100644 --- a/src/typography/math.rs +++ b/src/typography/math.rs @@ -125,7 +125,9 @@ pub fn formula_svg(source: &str, display: bool) -> Result { font: 1600, scale: 100, }; - svg(&formula).map(|(svg, _)| svg) + // RaTeX writes text where it has no outline. + let (svg, _) = svg(&formula)?; + crate::documents::flatten(&svg).map_err(MathError::said) } /// The formula as outlined SVG holding all ink; its size. diff --git a/src/typography/math/tests.rs b/src/typography/math/tests.rs index 5ad86eb..e408244 100644 --- a/src/typography/math/tests.rs +++ b/src/typography/math/tests.rs @@ -182,6 +182,14 @@ fn a_shared_formula_stays_until_its_last_holder_leaves(cx: &mut gpui::TestAppCon fn an_exported_formula_is_black_outlines() { let svg = formula_svg(r"\sqrt{x}", true).expect("typesets"); assert!(svg.starts_with("