summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Mohrin <dev@niklasmohrin.de>2024-04-17 17:25:16 +0200
committerGitHub <noreply@github.com>2024-04-17 15:25:16 +0000
commit0523f22d839df60dcb7a983caf5c82016c972ff9 (patch)
tree457537a4cdcb2a91590dc71891580860649daeef
parent21c78abd6eecd0f6b3208405c7513be3bbd8991c (diff)
Warn about unknown font families during parsing (#3854)
-rw-r--r--crates/typst/src/text/font/book.rs5
-rw-r--r--crates/typst/src/text/mod.rs19
-rw-r--r--tests/ref/text-unknown-font-family-warning.pngbin0 -> 499 bytes
-rw-r--r--tests/suite/math/interactions.typ1
-rw-r--r--tests/suite/text/edge.typ2
-rw-r--r--tests/suite/text/font.typ12
6 files changed, 38 insertions, 1 deletions
diff --git a/crates/typst/src/text/font/book.rs b/crates/typst/src/text/font/book.rs
index b84d05cb..131e666f 100644
--- a/crates/typst/src/text/font/book.rs
+++ b/crates/typst/src/text/font/book.rs
@@ -51,6 +51,11 @@ impl FontBook {
self.infos.get(index)
}
+ /// Returns true if the book contains a font family with the given name.
+ pub fn contains_family(&self, family: &str) -> bool {
+ self.families.contains_key(family)
+ }
+
/// An ordered iterator over all font families this book knows and details
/// about the fonts that are part of them.
pub fn families(
diff --git a/crates/typst/src/text/mod.rs b/crates/typst/src/text/mod.rs
index f7c19d8e..ef621ee5 100644
--- a/crates/typst/src/text/mod.rs
+++ b/crates/typst/src/text/mod.rs
@@ -35,7 +35,7 @@ use rustybuzz::{Feature, Tag};
use smallvec::SmallVec;
use ttf_parser::Rect;
-use crate::diag::{bail, SourceResult, StrResult};
+use crate::diag::{bail, warning, SourceResult, StrResult};
use crate::engine::Engine;
use crate::foundations::Packed;
use crate::foundations::{
@@ -47,6 +47,7 @@ use crate::layout::{Abs, Axis, Dir, Length, Rel};
use crate::model::ParElem;
use crate::syntax::Spanned;
use crate::visualize::{Color, Paint, RelativeTo, Stroke};
+use crate::World;
/// Text styling.
///
@@ -122,6 +123,22 @@ pub struct TextElem {
/// This is Latin. \
/// هذا عربي.
/// ```
+ #[parse({
+ let font_list: Option<Spanned<FontList>> = args.named("font")?;
+ if let Some(font_list) = &font_list {
+ let book = engine.world.book();
+ for family in &font_list.v {
+ if !book.contains_family(family.as_str()) {
+ engine.tracer.warn(warning!(
+ font_list.span,
+ "unknown font family: {}",
+ family.as_str(),
+ ));
+ }
+ }
+ }
+ font_list.map(|font_list| font_list.v)
+ })]
#[default(FontList(vec![FontFamily::new("Linux Libertine")]))]
#[borrowed]
#[ghost]
diff --git a/tests/ref/text-unknown-font-family-warning.png b/tests/ref/text-unknown-font-family-warning.png
new file mode 100644
index 00000000..a46632cf
--- /dev/null
+++ b/tests/ref/text-unknown-font-family-warning.png
Binary files differ
diff --git a/tests/suite/math/interactions.typ b/tests/suite/math/interactions.typ
index 37185962..03d5a6e7 100644
--- a/tests/suite/math/interactions.typ
+++ b/tests/suite/math/interactions.typ
@@ -17,6 +17,7 @@ $ x := #table(columns: 2)[x][y]/mat(1, 2, 3)
--- math-font-switch ---
// Test font switch.
+// Warning: 29-40 unknown font family: noto sans
#let here = text.with(font: "Noto Sans")
$#here[f] := #here[Hi there]$.
diff --git a/tests/suite/text/edge.typ b/tests/suite/text/edge.typ
index 57732156..9ee9bd2f 100644
--- a/tests/suite/text/edge.typ
+++ b/tests/suite/text/edge.typ
@@ -5,11 +5,13 @@
#set text(size: 8pt)
#let try(top, bottom) = rect(inset: 0pt, fill: conifer)[
+ // Warning: 19-34 unknown font family: ibm plex mono
#set text(font: "IBM Plex Mono", top-edge: top, bottom-edge: bottom)
From #top to #bottom
]
#let try-bounds(top, bottom) = rect(inset: 0pt, fill: conifer)[
+ // Warning: 19-34 unknown font family: ibm plex mono
#set text(font: "IBM Plex Mono", top-edge: top, bottom-edge: bottom)
#top to #bottom: "yay, Typst"
]
diff --git a/tests/suite/text/font.typ b/tests/suite/text/font.typ
index 47ec6419..ecc4c5c7 100644
--- a/tests/suite/text/font.typ
+++ b/tests/suite/text/font.typ
@@ -64,3 +64,15 @@ Emoji: 🐪, 🌋, 🏞
--- text-bad-named-argument ---
// Error: 11-31 unexpected argument: something
#set text(something: "invalid")
+
+--- text-unknown-font-family-warning ---
+#text(font: "linux libertine", "I exist, ")
+// Warning: 13-27 unknown font family: non-existing
+#text(font: "non-existing", "but")
+// Warning: 17-36 unknown font family: also-non-existing
+#set text(font: "also-non-existing")
+I
+// Warning: 23-56 unknown font family: list-of
+// Warning: 23-56 unknown font family: non-existing-fonts
+#let var = text(font: ("list-of", "non-existing-fonts"))[don't]
+#var