diff --git a/crates/typst/src/loading/mod.rs b/crates/typst/src/loading/mod.rs index dcfafb9e9..a02fb9a9d 100644 --- a/crates/typst/src/loading/mod.rs +++ b/crates/typst/src/loading/mod.rs @@ -60,6 +60,13 @@ impl Readable { Readable::Str(v) => v.as_bytes(), } } + + pub(crate) fn as_str(&self) -> Option<&str> { + match self { + Readable::Str(v) => Some(v.as_str()), + Readable::Bytes(v) => std::str::from_utf8(v).ok(), + } + } } cast! { diff --git a/crates/typst/src/visualize/image/mod.rs b/crates/typst/src/visualize/image/mod.rs index 5d952b1a3..b11cf5871 100644 --- a/crates/typst/src/visualize/image/mod.rs +++ b/crates/typst/src/visualize/image/mod.rs @@ -13,7 +13,7 @@ use std::sync::Arc; use comemo::Tracked; use ecow::EcoString; -use crate::diag::{bail, At, SourceResult, StrResult}; +use crate::diag::{bail, warning, At, SourceResult, StrResult}; use crate::engine::Engine; use crate::foundations::{ cast, elem, func, scope, Bytes, Cast, Content, NativeElement, Packed, Show, Smart, @@ -190,6 +190,22 @@ fn layout_image( Smart::Auto => determine_format(elem.path().as_str(), data).at(span)?, }; + // Warn the user if the image contains a foreign object. Not perfect + // because the svg could also be encoded, but that's an edge case. + if format == ImageFormat::Vector(VectorFormat::Svg) { + let has_foreign_object = + data.as_str().is_some_and(|s| s.contains("