diff --git a/crates/typst-cli/src/args.rs b/crates/typst-cli/src/args.rs index 7459be0f2..f31d26a2e 100644 --- a/crates/typst-cli/src/args.rs +++ b/crates/typst-cli/src/args.rs @@ -155,6 +155,10 @@ pub struct QueryCommand { #[clap(long)] pub pretty: bool, + /// The target to compile for. + #[clap(long, default_value_t)] + pub target: Target, + /// World arguments. #[clap(flatten)] pub world: WorldArgs, @@ -457,6 +461,18 @@ pub enum OutputFormat { display_possible_values!(OutputFormat); +/// The target to compile for. +#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, ValueEnum)] +pub enum Target { + /// PDF and image formats. + #[default] + Paged, + /// HTML. + Html, +} + +display_possible_values!(Target); + /// Which format to use for diagnostics. #[derive(Debug, Default, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, ValueEnum)] pub enum DiagnosticFormat { diff --git a/crates/typst-cli/src/query.rs b/crates/typst-cli/src/query.rs index b1a446203..57d796719 100644 --- a/crates/typst-cli/src/query.rs +++ b/crates/typst-cli/src/query.rs @@ -6,10 +6,11 @@ use typst::engine::Sink; use typst::foundations::{Content, IntoValue, LocatableSelector, Scope}; use typst::layout::PagedDocument; use typst::syntax::{Span, SyntaxMode}; -use typst::World; +use typst::{Document, World}; use typst_eval::eval_string; +use typst_html::HtmlDocument; -use crate::args::{QueryCommand, SerializationFormat}; +use crate::args::{QueryCommand, SerializationFormat, Target}; use crate::compile::print_diagnostics; use crate::set_failed; use crate::world::SystemWorld; @@ -22,12 +23,17 @@ pub fn query(command: &QueryCommand) -> HintedStrResult<()> { world.reset(); world.source(world.main()).map_err(|err| err.to_string())?; - let Warned { output, warnings } = typst::compile(&world); + let Warned { output, warnings } = match command.target { + Target::Paged => typst::compile::(&world) + .map(|output| output.map(|document| retrieve(&world, command, &document))), + Target::Html => typst::compile::(&world) + .map(|output| output.map(|document| retrieve(&world, command, &document))), + }; match output { // Retrieve and print query results. - Ok(document) => { - let data = retrieve(&world, command, &document)?; + Ok(data) => { + let data = data?; let serialized = format(data, command)?; println!("{serialized}"); print_diagnostics(&world, &[], &warnings, command.process.diagnostic_format) @@ -51,10 +57,10 @@ pub fn query(command: &QueryCommand) -> HintedStrResult<()> { } /// Retrieve the matches for the selector. -fn retrieve( +fn retrieve( world: &dyn World, command: &QueryCommand, - document: &PagedDocument, + document: &D, ) -> HintedStrResult> { let selector = eval_string( &typst::ROUTINES, @@ -77,7 +83,7 @@ fn retrieve( .cast::()?; Ok(document - .introspector + .introspector() .query(&selector.0) .into_iter() .collect::>()) diff --git a/crates/typst-library/src/diag.rs b/crates/typst-library/src/diag.rs index 41b92ed65..37886fb81 100644 --- a/crates/typst-library/src/diag.rs +++ b/crates/typst-library/src/diag.rs @@ -151,6 +151,13 @@ pub struct Warned { pub warnings: EcoVec, } +impl Warned { + /// Maps the output, keeping the same warnings. + pub fn map R>(self, f: F) -> Warned { + Warned { output: f(self.output), warnings: self.warnings } + } +} + /// An error or warning in a source or text file. /// /// The contained spans will only be detached if any of the input source files diff --git a/crates/typst-library/src/introspection/query.rs b/crates/typst-library/src/introspection/query.rs index b742ac010..083c30f96 100644 --- a/crates/typst-library/src/introspection/query.rs +++ b/crates/typst-library/src/introspection/query.rs @@ -117,6 +117,8 @@ use crate::foundations::{func, Array, Context, LocatableSelector, Value}; /// ] /// ``` /// +/// ## Retrieving a specific field +/// /// Frequently, you're interested in only one specific field of the resulting /// elements. In the case of the `metadata` element, the `value` field is the /// interesting one. You can extract just this field with the `--field` @@ -134,6 +136,12 @@ use crate::foundations::{func, Array, Context, LocatableSelector, Value}; /// $ typst query example.typ "" --field value --one /// "This is a note" /// ``` +/// +/// ## Querying for a specific export target +/// +/// In case you need to query a document when exporting for a specific target, +/// you can use the `--target` argument. Valid values are `paged`, and `html` +/// (if the [`html`]($html) feature is enabled). #[func(contextual)] pub fn query( engine: &mut Engine,