typography: an exported formula's text becomes outlines, or its missing letter is an error
This commit is contained in:
4 files changed
+22
-8
No files matched your search
@@ -104,21 +104,24 @@ pub fn diagram_svg(source: &str) -> Result<String, SharedString> {
|
|||||||
ink: "#000000".into(),
|
ink: "#000000".into(),
|
||||||
scale: 100,
|
scale: 100,
|
||||||
};
|
};
|
||||||
let drawn = svg(&chart)?;
|
flatten(&svg(&chart)?)
|
||||||
// Markers and text become paths any reader draws.
|
}
|
||||||
|
|
||||||
|
/// `svg` with markers and text as paths any reader draws.
|
||||||
|
pub(crate) fn flatten(svg: &str) -> Result<String, SharedString> {
|
||||||
let options = usvg::Options {
|
let options = usvg::Options {
|
||||||
fontdb: fonts(),
|
fontdb: fonts(),
|
||||||
..usvg::Options::default()
|
..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}")))?;
|
.map_err(|error| SharedString::from(format!("{error}")))?;
|
||||||
// A letter without a font vanishes: say so.
|
// A letter without a font vanishes: say so.
|
||||||
let (mut kept, mut lost) = (0, 0);
|
let (mut kept, mut lost) = (0, 0);
|
||||||
texts(tree.root(), &mut kept, &mut lost);
|
texts(tree.root(), &mut kept, &mut lost);
|
||||||
let written = labels(&drawn)?;
|
let written = labels(svg)?;
|
||||||
if kept < written || lost > 0 {
|
if kept < written || lost > 0 {
|
||||||
log::error!("diagram: {kept} of {written} labels set, {lost} letters without a font");
|
log::error!("svg: {kept} of {written} texts set, {lost} letters without a font");
|
||||||
return Err("no installed font could set this diagram's labels".into());
|
return Err("no installed font has every letter here".into());
|
||||||
}
|
}
|
||||||
Ok(tree.to_string(&usvg::WriteOptions::default()))
|
Ok(tree.to_string(&usvg::WriteOptions::default()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ pub(crate) use blocks::source;
|
|||||||
pub use blocks::{Align, BlockData, BlockEditor, BlockEvent, BlockKind, Media};
|
pub use blocks::{Align, BlockData, BlockEditor, BlockEvent, BlockKind, Media};
|
||||||
pub use contents::outline;
|
pub use contents::outline;
|
||||||
pub use counts::{ReadingTime, WordCount};
|
pub use counts::{ReadingTime, WordCount};
|
||||||
|
pub(crate) use diagram::flatten;
|
||||||
pub use diagram::{Diagram, diagram_svg};
|
pub use diagram::{Diagram, diagram_svg};
|
||||||
pub use document::{
|
pub use document::{
|
||||||
Attachment, DocumentEvent, DocumentHeading, DocumentLook, LARGEST_READ, MarkdownDocument,
|
Attachment, DocumentEvent, DocumentHeading, DocumentLook, LARGEST_READ, MarkdownDocument,
|
||||||
|
|||||||
@@ -125,7 +125,9 @@ pub fn formula_svg(source: &str, display: bool) -> Result<String, MathError> {
|
|||||||
font: 1600,
|
font: 1600,
|
||||||
scale: 100,
|
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.
|
/// The formula as outlined SVG holding all ink; its size.
|
||||||
|
|||||||
@@ -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() {
|
fn an_exported_formula_is_black_outlines() {
|
||||||
let svg = formula_svg(r"\sqrt{x}", true).expect("typesets");
|
let svg = formula_svg(r"\sqrt{x}", true).expect("typesets");
|
||||||
assert!(svg.starts_with("<svg") && !svg.contains("<text"), "{svg}");
|
assert!(svg.starts_with("<svg") && !svg.contains("<text"), "{svg}");
|
||||||
assert!(svg.contains("0,0,0"), "black: {svg}");
|
assert!(svg.contains("#000000"), "black: {svg}");
|
||||||
assert!(formula_svg(r"\frac{", false).is_err());
|
assert!(formula_svg(r"\frac{", false).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn an_exported_formula_outlines_its_text_or_says_why() {
|
||||||
|
let svg = formula_svg(r"\text{中文} + x", false).expect("a system font sets it");
|
||||||
|
assert!(!svg.contains("<text"), "{svg}");
|
||||||
|
let why = formula_svg("\\text{\u{F0000}}", false).expect_err("no font");
|
||||||
|
assert!(why.to_string().contains("font"), "{why}");
|
||||||
|
}
|
||||||
Reference in new issue
Block a user