mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Remove deprecated things and compatibility behaviours (#5591)
This commit is contained in:
parent
51020fcf3c
commit
ed67220e4b
@ -119,7 +119,6 @@ pub(super) fn define(global: &mut Scope, inputs: Dict, features: &Features) {
|
|||||||
global.define_func::<panic>();
|
global.define_func::<panic>();
|
||||||
global.define_func::<assert>();
|
global.define_func::<assert>();
|
||||||
global.define_func::<eval>();
|
global.define_func::<eval>();
|
||||||
global.define_func::<style>();
|
|
||||||
if features.is_enabled(Feature::Html) {
|
if features.is_enabled(Feature::Html) {
|
||||||
global.define_func::<target>();
|
global.define_func::<target>();
|
||||||
}
|
}
|
||||||
|
@ -36,11 +36,6 @@ pub fn join(lhs: Value, rhs: Value) -> StrResult<Value> {
|
|||||||
(Symbol(a), Content(b)) => Content(TextElem::packed(a.get()) + b),
|
(Symbol(a), Content(b)) => Content(TextElem::packed(a.get()) + b),
|
||||||
(Array(a), Array(b)) => Array(a + b),
|
(Array(a), Array(b)) => Array(a + b),
|
||||||
(Dict(a), Dict(b)) => Dict(a + b),
|
(Dict(a), Dict(b)) => Dict(a + b),
|
||||||
|
|
||||||
// Type compatibility.
|
|
||||||
(Type(a), Str(b)) => Str(format_str!("{a}{b}")),
|
|
||||||
(Str(a), Type(b)) => Str(format_str!("{a}{b}")),
|
|
||||||
|
|
||||||
(a, b) => mismatch!("cannot join {} with {}", a, b),
|
(a, b) => mismatch!("cannot join {} with {}", a, b),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -157,10 +152,6 @@ pub fn add(lhs: Value, rhs: Value) -> HintedStrResult<Value> {
|
|||||||
(Datetime(a), Duration(b)) => Datetime(a + b),
|
(Datetime(a), Duration(b)) => Datetime(a + b),
|
||||||
(Duration(a), Datetime(b)) => Datetime(b + a),
|
(Duration(a), Datetime(b)) => Datetime(b + a),
|
||||||
|
|
||||||
// Type compatibility.
|
|
||||||
(Type(a), Str(b)) => Str(format_str!("{a}{b}")),
|
|
||||||
(Str(a), Type(b)) => Str(format_str!("{a}{b}")),
|
|
||||||
|
|
||||||
(Dyn(a), Dyn(b)) => {
|
(Dyn(a), Dyn(b)) => {
|
||||||
// Alignments can be summed.
|
// Alignments can be summed.
|
||||||
if let (Some(&a), Some(&b)) =
|
if let (Some(&a), Some(&b)) =
|
||||||
@ -469,9 +460,6 @@ pub fn equal(lhs: &Value, rhs: &Value) -> bool {
|
|||||||
rat == rel.rel && rel.abs.is_zero()
|
rat == rel.rel && rel.abs.is_zero()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type compatibility.
|
|
||||||
(Type(ty), Str(str)) | (Str(str), Type(ty)) => ty.compat_name() == str.as_str(),
|
|
||||||
|
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -569,10 +557,6 @@ pub fn contains(lhs: &Value, rhs: &Value) -> Option<bool> {
|
|||||||
(Str(a), Dict(b)) => Some(b.contains(a)),
|
(Str(a), Dict(b)) => Some(b.contains(a)),
|
||||||
(a, Array(b)) => Some(b.contains(a.clone())),
|
(a, Array(b)) => Some(b.contains(a.clone())),
|
||||||
|
|
||||||
// Type compatibility.
|
|
||||||
(Type(a), Str(b)) => Some(b.as_str().contains(a.compat_name())),
|
|
||||||
(Type(a), Dict(b)) => Some(b.contains(a.compat_name())),
|
|
||||||
|
|
||||||
_ => Option::None,
|
_ => Option::None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,75 +3,19 @@ use std::fmt::{self, Debug, Formatter};
|
|||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::{mem, ptr};
|
use std::{mem, ptr};
|
||||||
|
|
||||||
use comemo::{Track, Tracked};
|
use comemo::Tracked;
|
||||||
use ecow::{eco_vec, EcoString, EcoVec};
|
use ecow::{eco_vec, EcoString, EcoVec};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use typst_syntax::Span;
|
use typst_syntax::Span;
|
||||||
use typst_utils::LazyHash;
|
use typst_utils::LazyHash;
|
||||||
|
|
||||||
use crate::diag::{warning, SourceResult, Trace, Tracepoint};
|
use crate::diag::{SourceResult, Trace, Tracepoint};
|
||||||
use crate::engine::Engine;
|
use crate::engine::Engine;
|
||||||
use crate::foundations::{
|
use crate::foundations::{
|
||||||
cast, elem, func, ty, Content, Context, Element, Func, NativeElement, Packed, Repr,
|
cast, ty, Content, Context, Element, Func, NativeElement, Repr, Selector,
|
||||||
Selector, Show,
|
|
||||||
};
|
};
|
||||||
use crate::introspection::Locatable;
|
|
||||||
use crate::text::{FontFamily, FontList, TextElem};
|
use crate::text::{FontFamily, FontList, TextElem};
|
||||||
|
|
||||||
/// Provides access to active styles.
|
|
||||||
///
|
|
||||||
/// **Deprecation planned.** Use [context] instead.
|
|
||||||
///
|
|
||||||
/// ```example
|
|
||||||
/// #let thing(body) = style(styles => {
|
|
||||||
/// let size = measure(body, styles)
|
|
||||||
/// [Width of "#body" is #size.width]
|
|
||||||
/// })
|
|
||||||
///
|
|
||||||
/// #thing[Hey] \
|
|
||||||
/// #thing[Welcome]
|
|
||||||
/// ```
|
|
||||||
#[func]
|
|
||||||
pub fn style(
|
|
||||||
/// The engine.
|
|
||||||
engine: &mut Engine,
|
|
||||||
/// The call site span.
|
|
||||||
span: Span,
|
|
||||||
/// A function to call with the styles. Its return value is displayed
|
|
||||||
/// in the document.
|
|
||||||
///
|
|
||||||
/// This function is called once for each time the content returned by
|
|
||||||
/// `style` appears in the document. That makes it possible to generate
|
|
||||||
/// content that depends on the style context it appears in.
|
|
||||||
func: Func,
|
|
||||||
) -> Content {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "`style` is deprecated";
|
|
||||||
hint: "use a `context` expression instead"
|
|
||||||
));
|
|
||||||
|
|
||||||
StyleElem::new(func).pack().spanned(span)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Executes a style access.
|
|
||||||
#[elem(Locatable, Show)]
|
|
||||||
struct StyleElem {
|
|
||||||
/// The function to call with the styles.
|
|
||||||
#[required]
|
|
||||||
func: Func,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Show for Packed<StyleElem> {
|
|
||||||
#[typst_macros::time(name = "style", span = self.span())]
|
|
||||||
fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> {
|
|
||||||
let context = Context::new(self.location(), Some(styles));
|
|
||||||
Ok(self
|
|
||||||
.func()
|
|
||||||
.call(engine, context.track(), [styles.to_map()])?
|
|
||||||
.display())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A list of style properties.
|
/// A list of style properties.
|
||||||
#[ty(cast)]
|
#[ty(cast)]
|
||||||
#[derive(Default, PartialEq, Clone, Hash)]
|
#[derive(Default, PartialEq, Clone, Hash)]
|
||||||
|
@ -44,16 +44,6 @@ use crate::foundations::{
|
|||||||
/// #type(int) \
|
/// #type(int) \
|
||||||
/// #type(type)
|
/// #type(type)
|
||||||
/// ```
|
/// ```
|
||||||
///
|
|
||||||
/// # Compatibility
|
|
||||||
/// In Typst 0.7 and lower, the `type` function returned a string instead of a
|
|
||||||
/// type. Compatibility with the old way will remain for a while to give package
|
|
||||||
/// authors time to upgrade, but it will be removed at some point.
|
|
||||||
///
|
|
||||||
/// - Checks like `{int == "integer"}` evaluate to `{true}`
|
|
||||||
/// - Adding/joining a type and string will yield a string
|
|
||||||
/// - The `{in}` operator on a type and a dictionary will evaluate to `{true}`
|
|
||||||
/// if the dictionary has a string key matching the type's name
|
|
||||||
#[ty(scope, cast)]
|
#[ty(scope, cast)]
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
||||||
pub struct Type(Static<NativeTypeData>);
|
pub struct Type(Static<NativeTypeData>);
|
||||||
@ -111,14 +101,6 @@ impl Type {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type compatibility.
|
|
||||||
impl Type {
|
|
||||||
/// The type's backward-compatible name.
|
|
||||||
pub fn compat_name(&self) -> &str {
|
|
||||||
self.long_name()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[scope]
|
#[scope]
|
||||||
impl Type {
|
impl Type {
|
||||||
/// Determines a value's type.
|
/// Determines a value's type.
|
||||||
|
@ -7,7 +7,7 @@ use smallvec::{smallvec, SmallVec};
|
|||||||
use typst_syntax::Span;
|
use typst_syntax::Span;
|
||||||
use typst_utils::NonZeroExt;
|
use typst_utils::NonZeroExt;
|
||||||
|
|
||||||
use crate::diag::{bail, warning, At, HintedStrResult, SourceResult};
|
use crate::diag::{bail, At, HintedStrResult, SourceResult};
|
||||||
use crate::engine::{Engine, Route, Sink, Traced};
|
use crate::engine::{Engine, Route, Sink, Traced};
|
||||||
use crate::foundations::{
|
use crate::foundations::{
|
||||||
cast, elem, func, scope, select_where, ty, Args, Array, Construct, Content, Context,
|
cast, elem, func, scope, select_where, ty, Args, Array, Construct, Content, Context,
|
||||||
@ -353,7 +353,7 @@ impl Counter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Shared implementation of displaying between `counter.display` and
|
/// Shared implementation of displaying between `counter.display` and
|
||||||
/// `DisplayElem`, which will be deprecated.
|
/// `CounterDisplayElem`.
|
||||||
fn display_impl(
|
fn display_impl(
|
||||||
&self,
|
&self,
|
||||||
engine: &mut Engine,
|
engine: &mut Engine,
|
||||||
@ -441,11 +441,6 @@ impl Counter {
|
|||||||
|
|
||||||
/// Displays the current value of the counter with a numbering and returns
|
/// Displays the current value of the counter with a numbering and returns
|
||||||
/// the formatted output.
|
/// the formatted output.
|
||||||
///
|
|
||||||
/// _Compatibility:_ For compatibility with Typst 0.10 and lower, this
|
|
||||||
/// function also works without an established context. Then, it will create
|
|
||||||
/// opaque contextual content rather than directly returning the output of
|
|
||||||
/// the numbering. This behaviour will be removed in a future release.
|
|
||||||
#[func(contextual)]
|
#[func(contextual)]
|
||||||
pub fn display(
|
pub fn display(
|
||||||
self,
|
self,
|
||||||
@ -474,19 +469,8 @@ impl Counter {
|
|||||||
#[default(false)]
|
#[default(false)]
|
||||||
both: bool,
|
both: bool,
|
||||||
) -> SourceResult<Value> {
|
) -> SourceResult<Value> {
|
||||||
if let Ok(loc) = context.location() {
|
let loc = context.location().at(span)?;
|
||||||
self.display_impl(engine, loc, numbering, both, context.styles().ok())
|
self.display_impl(engine, loc, numbering, both, context.styles().ok())
|
||||||
} else {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "`counter.display` without context is deprecated";
|
|
||||||
hint: "use it in a `context` expression instead"
|
|
||||||
));
|
|
||||||
|
|
||||||
Ok(CounterDisplayElem::new(self, numbering, both)
|
|
||||||
.pack()
|
|
||||||
.spanned(span)
|
|
||||||
.into_value())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retrieves the value of the counter at the given location. Always returns
|
/// Retrieves the value of the counter at the given location. Always returns
|
||||||
@ -495,10 +479,6 @@ impl Counter {
|
|||||||
/// The `selector` must match exactly one element in the document. The most
|
/// The `selector` must match exactly one element in the document. The most
|
||||||
/// useful kinds of selectors for this are [labels]($label) and
|
/// useful kinds of selectors for this are [labels]($label) and
|
||||||
/// [locations]($location).
|
/// [locations]($location).
|
||||||
///
|
|
||||||
/// _Compatibility:_ For compatibility with Typst 0.10 and lower, this
|
|
||||||
/// function also works without a known context if the `selector` is a
|
|
||||||
/// location. This behaviour will be removed in a future release.
|
|
||||||
#[func(contextual)]
|
#[func(contextual)]
|
||||||
pub fn at(
|
pub fn at(
|
||||||
&self,
|
&self,
|
||||||
@ -526,21 +506,8 @@ impl Counter {
|
|||||||
context: Tracked<Context>,
|
context: Tracked<Context>,
|
||||||
/// The callsite span.
|
/// The callsite span.
|
||||||
span: Span,
|
span: Span,
|
||||||
/// _Compatibility:_ This argument is deprecated. It only exists for
|
|
||||||
/// compatibility with Typst 0.10 and lower and shouldn't be used
|
|
||||||
/// anymore.
|
|
||||||
#[default]
|
|
||||||
location: Option<Location>,
|
|
||||||
) -> SourceResult<CounterState> {
|
) -> SourceResult<CounterState> {
|
||||||
if location.is_none() {
|
context.introspect().at(span)?;
|
||||||
context.location().at(span)?;
|
|
||||||
} else {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "calling `counter.final` with a location is deprecated";
|
|
||||||
hint: "try removing the location argument"
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let sequence = self.sequence(engine)?;
|
let sequence = self.sequence(engine)?;
|
||||||
let (mut state, page) = sequence.last().unwrap().clone();
|
let (mut state, page) = sequence.last().unwrap().clone();
|
||||||
if self.is_page() {
|
if self.is_page() {
|
||||||
@ -761,8 +728,6 @@ impl Count for Packed<CounterUpdateElem> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Executes a display of a counter.
|
/// Executes a display of a counter.
|
||||||
///
|
|
||||||
/// **Deprecation planned.**
|
|
||||||
#[elem(Construct, Locatable, Show)]
|
#[elem(Construct, Locatable, Show)]
|
||||||
pub struct CounterDisplayElem {
|
pub struct CounterDisplayElem {
|
||||||
/// The counter.
|
/// The counter.
|
||||||
@ -788,7 +753,6 @@ impl Construct for CounterDisplayElem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Show for Packed<CounterDisplayElem> {
|
impl Show for Packed<CounterDisplayElem> {
|
||||||
#[typst_macros::time(name = "counter.display", span = self.span())]
|
|
||||||
fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> {
|
fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> {
|
||||||
Ok(self
|
Ok(self
|
||||||
.counter
|
.counter
|
||||||
|
@ -1,13 +1,9 @@
|
|||||||
use comemo::{Track, Tracked};
|
use comemo::Tracked;
|
||||||
use typst_syntax::Span;
|
|
||||||
|
|
||||||
use crate::diag::{warning, HintedStrResult, SourceResult};
|
use crate::diag::HintedStrResult;
|
||||||
use crate::engine::Engine;
|
use crate::engine::Engine;
|
||||||
use crate::foundations::{
|
use crate::foundations::{func, Context, LocatableSelector};
|
||||||
cast, elem, func, Content, Context, Func, LocatableSelector, NativeElement, Packed,
|
use crate::introspection::Location;
|
||||||
Show, StyleChain, Value,
|
|
||||||
};
|
|
||||||
use crate::introspection::{Locatable, Location};
|
|
||||||
|
|
||||||
/// Determines the location of an element in the document.
|
/// Determines the location of an element in the document.
|
||||||
///
|
///
|
||||||
@ -26,23 +22,12 @@ use crate::introspection::{Locatable, Location};
|
|||||||
///
|
///
|
||||||
/// = Introduction <intro>
|
/// = Introduction <intro>
|
||||||
/// ```
|
/// ```
|
||||||
///
|
|
||||||
/// # Compatibility
|
|
||||||
/// In Typst 0.10 and lower, the `locate` function took a closure that made the
|
|
||||||
/// current location in the document available (like [`here`] does now). This
|
|
||||||
/// usage pattern is deprecated. Compatibility with the old way will remain for
|
|
||||||
/// a while to give package authors time to upgrade. To that effect, `locate`
|
|
||||||
/// detects whether it received a selector or a user-defined function and
|
|
||||||
/// adjusts its semantics accordingly. This behaviour will be removed in the
|
|
||||||
/// future.
|
|
||||||
#[func(contextual)]
|
#[func(contextual)]
|
||||||
pub fn locate(
|
pub fn locate(
|
||||||
/// The engine.
|
/// The engine.
|
||||||
engine: &mut Engine,
|
engine: &mut Engine,
|
||||||
/// The callsite context.
|
/// The callsite context.
|
||||||
context: Tracked<Context>,
|
context: Tracked<Context>,
|
||||||
/// The span of the `locate` call.
|
|
||||||
span: Span,
|
|
||||||
/// A selector that should match exactly one element. This element will be
|
/// A selector that should match exactly one element. This element will be
|
||||||
/// located.
|
/// located.
|
||||||
///
|
///
|
||||||
@ -50,70 +35,7 @@ pub fn locate(
|
|||||||
/// - [`here`] to locate the current context,
|
/// - [`here`] to locate the current context,
|
||||||
/// - a [`location`] retrieved from some queried element via the
|
/// - a [`location`] retrieved from some queried element via the
|
||||||
/// [`location()`]($content.location) method on content.
|
/// [`location()`]($content.location) method on content.
|
||||||
selector: LocateInput,
|
selector: LocatableSelector,
|
||||||
) -> HintedStrResult<LocateOutput> {
|
) -> HintedStrResult<Location> {
|
||||||
Ok(match selector {
|
selector.resolve_unique(engine.introspector, context)
|
||||||
LocateInput::Selector(selector) => {
|
|
||||||
LocateOutput::Location(selector.resolve_unique(engine.introspector, context)?)
|
|
||||||
}
|
|
||||||
LocateInput::Func(func) => {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "`locate` with callback function is deprecated";
|
|
||||||
hint: "use a `context` expression instead"
|
|
||||||
));
|
|
||||||
|
|
||||||
LocateOutput::Content(LocateElem::new(func).pack().spanned(span))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Compatible input type.
|
|
||||||
pub enum LocateInput {
|
|
||||||
Selector(LocatableSelector),
|
|
||||||
Func(Func),
|
|
||||||
}
|
|
||||||
|
|
||||||
cast! {
|
|
||||||
LocateInput,
|
|
||||||
v: Func => {
|
|
||||||
if v.element().is_some() {
|
|
||||||
Self::Selector(Value::Func(v).cast()?)
|
|
||||||
} else {
|
|
||||||
Self::Func(v)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
v: LocatableSelector => Self::Selector(v),
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Compatible output type.
|
|
||||||
pub enum LocateOutput {
|
|
||||||
Location(Location),
|
|
||||||
Content(Content),
|
|
||||||
}
|
|
||||||
|
|
||||||
cast! {
|
|
||||||
LocateOutput,
|
|
||||||
self => match self {
|
|
||||||
Self::Location(v) => v.into_value(),
|
|
||||||
Self::Content(v) => v.into_value(),
|
|
||||||
},
|
|
||||||
v: Location => Self::Location(v),
|
|
||||||
v: Content => Self::Content(v),
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Executes a `locate` call.
|
|
||||||
#[elem(Locatable, Show)]
|
|
||||||
struct LocateElem {
|
|
||||||
/// The function to call with the location.
|
|
||||||
#[required]
|
|
||||||
func: Func,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Show for Packed<LocateElem> {
|
|
||||||
#[typst_macros::time(name = "locate", span = self.span())]
|
|
||||||
fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> {
|
|
||||||
let location = self.location().unwrap();
|
|
||||||
let context = Context::new(Some(location), Some(styles));
|
|
||||||
Ok(self.func().call(engine, context.track(), [location])?.display())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
use comemo::Tracked;
|
use comemo::Tracked;
|
||||||
use typst_syntax::Span;
|
|
||||||
|
|
||||||
use crate::diag::{warning, HintedStrResult};
|
use crate::diag::HintedStrResult;
|
||||||
use crate::engine::Engine;
|
use crate::engine::Engine;
|
||||||
use crate::foundations::{func, Array, Context, LocatableSelector, Value};
|
use crate::foundations::{func, Array, Context, LocatableSelector, Value};
|
||||||
use crate::introspection::Location;
|
|
||||||
|
|
||||||
/// Finds elements in the document.
|
/// Finds elements in the document.
|
||||||
///
|
///
|
||||||
@ -142,8 +140,6 @@ pub fn query(
|
|||||||
engine: &mut Engine,
|
engine: &mut Engine,
|
||||||
/// The callsite context.
|
/// The callsite context.
|
||||||
context: Tracked<Context>,
|
context: Tracked<Context>,
|
||||||
/// The span of the `query` call.
|
|
||||||
span: Span,
|
|
||||||
/// Can be
|
/// Can be
|
||||||
/// - an element function like a `heading` or `figure`,
|
/// - an element function like a `heading` or `figure`,
|
||||||
/// - a `{<label>}`,
|
/// - a `{<label>}`,
|
||||||
@ -152,20 +148,8 @@ pub fn query(
|
|||||||
///
|
///
|
||||||
/// Only [locatable]($location/#locatable) element functions are supported.
|
/// Only [locatable]($location/#locatable) element functions are supported.
|
||||||
target: LocatableSelector,
|
target: LocatableSelector,
|
||||||
/// _Compatibility:_ This argument is deprecated. It only exists for
|
|
||||||
/// compatibility with Typst 0.10 and lower and shouldn't be used anymore.
|
|
||||||
#[default]
|
|
||||||
location: Option<Location>,
|
|
||||||
) -> HintedStrResult<Array> {
|
) -> HintedStrResult<Array> {
|
||||||
if location.is_none() {
|
|
||||||
context.introspect()?;
|
context.introspect()?;
|
||||||
} else {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "calling `query` with a location is deprecated";
|
|
||||||
hint: "try removing the location argument"
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let vec = engine.introspector.query(&target.0);
|
let vec = engine.introspector.query(&target.0);
|
||||||
Ok(vec.into_iter().map(Value::Content).collect())
|
Ok(vec.into_iter().map(Value::Content).collect())
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ use comemo::{Track, Tracked, TrackedMut};
|
|||||||
use ecow::{eco_format, eco_vec, EcoString, EcoVec};
|
use ecow::{eco_format, eco_vec, EcoString, EcoVec};
|
||||||
use typst_syntax::Span;
|
use typst_syntax::Span;
|
||||||
|
|
||||||
use crate::diag::{bail, warning, At, SourceResult};
|
use crate::diag::{bail, At, SourceResult};
|
||||||
use crate::engine::{Engine, Route, Sink, Traced};
|
use crate::engine::{Engine, Route, Sink, Traced};
|
||||||
use crate::foundations::{
|
use crate::foundations::{
|
||||||
cast, elem, func, scope, select_where, ty, Args, Construct, Content, Context, Func,
|
cast, elem, func, scope, select_where, ty, Args, Construct, Content, Context, Func,
|
||||||
@ -305,10 +305,6 @@ impl State {
|
|||||||
/// The `selector` must match exactly one element in the document. The most
|
/// The `selector` must match exactly one element in the document. The most
|
||||||
/// useful kinds of selectors for this are [labels]($label) and
|
/// useful kinds of selectors for this are [labels]($label) and
|
||||||
/// [locations]($location).
|
/// [locations]($location).
|
||||||
///
|
|
||||||
/// _Compatibility:_ For compatibility with Typst 0.10 and lower, this
|
|
||||||
/// function also works without a known context if the `selector` is a
|
|
||||||
/// location. This behaviour will be removed in a future release.
|
|
||||||
#[typst_macros::time(name = "state.at", span = span)]
|
#[typst_macros::time(name = "state.at", span = span)]
|
||||||
#[func(contextual)]
|
#[func(contextual)]
|
||||||
pub fn at(
|
pub fn at(
|
||||||
@ -336,21 +332,8 @@ impl State {
|
|||||||
context: Tracked<Context>,
|
context: Tracked<Context>,
|
||||||
/// The callsite span.
|
/// The callsite span.
|
||||||
span: Span,
|
span: Span,
|
||||||
/// _Compatibility:_ This argument is deprecated. It only exists for
|
|
||||||
/// compatibility with Typst 0.10 and lower and shouldn't be used
|
|
||||||
/// anymore.
|
|
||||||
#[default]
|
|
||||||
location: Option<Location>,
|
|
||||||
) -> SourceResult<Value> {
|
) -> SourceResult<Value> {
|
||||||
if location.is_none() {
|
context.introspect().at(span)?;
|
||||||
context.location().at(span)?;
|
|
||||||
} else {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "calling `state.final` with a location is deprecated";
|
|
||||||
hint: "try removing the location argument"
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let sequence = self.sequence(engine)?;
|
let sequence = self.sequence(engine)?;
|
||||||
Ok(sequence.last().unwrap().clone())
|
Ok(sequence.last().unwrap().clone())
|
||||||
}
|
}
|
||||||
@ -375,30 +358,6 @@ impl State {
|
|||||||
) -> Content {
|
) -> Content {
|
||||||
StateUpdateElem::new(self.key, update).pack().spanned(span)
|
StateUpdateElem::new(self.key, update).pack().spanned(span)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Displays the current value of the state.
|
|
||||||
///
|
|
||||||
/// **Deprecation planned:** Use [`get`]($state.get) instead.
|
|
||||||
#[func]
|
|
||||||
pub fn display(
|
|
||||||
self,
|
|
||||||
/// The engine.
|
|
||||||
engine: &mut Engine,
|
|
||||||
/// The span of the `display` call.
|
|
||||||
span: Span,
|
|
||||||
/// A function which receives the value of the state and can return
|
|
||||||
/// arbitrary content which is then displayed. If this is omitted, the
|
|
||||||
/// value is directly displayed.
|
|
||||||
#[default]
|
|
||||||
func: Option<Func>,
|
|
||||||
) -> Content {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "`state.display` is deprecated";
|
|
||||||
hint: "use `state.get` in a `context` expression instead"
|
|
||||||
));
|
|
||||||
|
|
||||||
StateDisplayElem::new(self, func).pack().spanned(span)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Repr for State {
|
impl Repr for State {
|
||||||
@ -446,38 +405,3 @@ impl Show for Packed<StateUpdateElem> {
|
|||||||
Ok(Content::empty())
|
Ok(Content::empty())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Executes a display of a state.
|
|
||||||
///
|
|
||||||
/// **Deprecation planned.**
|
|
||||||
#[elem(Construct, Locatable, Show)]
|
|
||||||
struct StateDisplayElem {
|
|
||||||
/// The state.
|
|
||||||
#[required]
|
|
||||||
#[internal]
|
|
||||||
state: State,
|
|
||||||
|
|
||||||
/// The function to display the state with.
|
|
||||||
#[required]
|
|
||||||
#[internal]
|
|
||||||
func: Option<Func>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Show for Packed<StateDisplayElem> {
|
|
||||||
#[typst_macros::time(name = "state.display", span = self.span())]
|
|
||||||
fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> {
|
|
||||||
let location = self.location().unwrap();
|
|
||||||
let context = Context::new(Some(location), Some(styles));
|
|
||||||
let value = self.state().at_loc(engine, location)?;
|
|
||||||
Ok(match self.func() {
|
|
||||||
Some(func) => func.call(engine, context.track(), [value])?.display(),
|
|
||||||
None => value.display(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Construct for StateDisplayElem {
|
|
||||||
fn construct(_: &mut Engine, args: &mut Args) -> SourceResult<Content> {
|
|
||||||
bail!(args.span, "cannot be constructed manually");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
use comemo::Tracked;
|
use comemo::Tracked;
|
||||||
use typst_syntax::Span;
|
use typst_syntax::Span;
|
||||||
|
|
||||||
use crate::diag::{warning, At, SourceResult};
|
use crate::diag::{At, SourceResult};
|
||||||
use crate::engine::Engine;
|
use crate::engine::Engine;
|
||||||
use crate::foundations::{
|
use crate::foundations::{dict, func, Content, Context, Dict, Resolve, Smart};
|
||||||
dict, func, Content, Context, Dict, Resolve, Smart, StyleChain, Styles,
|
|
||||||
};
|
|
||||||
use crate::introspection::{Locator, LocatorLink};
|
use crate::introspection::{Locator, LocatorLink};
|
||||||
use crate::layout::{Abs, Axes, Length, Region, Size};
|
use crate::layout::{Abs, Axes, Length, Region, Size};
|
||||||
|
|
||||||
@ -76,23 +74,9 @@ pub fn measure(
|
|||||||
height: Smart<Length>,
|
height: Smart<Length>,
|
||||||
/// The content whose size to measure.
|
/// The content whose size to measure.
|
||||||
content: Content,
|
content: Content,
|
||||||
/// _Compatibility:_ This argument is deprecated. It only exists for
|
|
||||||
/// compatibility with Typst 0.10 and lower and shouldn't be used anymore.
|
|
||||||
#[default]
|
|
||||||
styles: Option<Styles>,
|
|
||||||
) -> SourceResult<Dict> {
|
) -> SourceResult<Dict> {
|
||||||
let styles = match &styles {
|
|
||||||
Some(styles) => {
|
|
||||||
engine.sink.warn(warning!(
|
|
||||||
span, "calling `measure` with a styles argument is deprecated";
|
|
||||||
hint: "try removing the styles argument"
|
|
||||||
));
|
|
||||||
StyleChain::new(styles)
|
|
||||||
}
|
|
||||||
None => context.styles().at(span)?,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a pod region with the available space.
|
// Create a pod region with the available space.
|
||||||
|
let styles = context.styles().at(span)?;
|
||||||
let pod = Region::new(
|
let pod = Region::new(
|
||||||
Axes::new(
|
Axes::new(
|
||||||
width.resolve(styles).unwrap_or(Abs::inf()),
|
width.resolve(styles).unwrap_or(Abs::inf()),
|
||||||
|
@ -137,10 +137,6 @@ pub struct OutlineElem {
|
|||||||
/// `{n => n * 2em}` would be equivalent to just specifying `{2em}`, while
|
/// `{n => n * 2em}` would be equivalent to just specifying `{2em}`, while
|
||||||
/// `{n => [→ ] * n}` would indent with one arrow per nesting level.
|
/// `{n => [→ ] * n}` would indent with one arrow per nesting level.
|
||||||
///
|
///
|
||||||
/// *Migration hints:* Specifying `{true}` (equivalent to `{auto}`) or
|
|
||||||
/// `{false}` (equivalent to `{none}`) for this option is deprecated and
|
|
||||||
/// will be removed in a future release.
|
|
||||||
///
|
|
||||||
/// ```example
|
/// ```example
|
||||||
/// #set heading(numbering: "1.a.")
|
/// #set heading(numbering: "1.a.")
|
||||||
///
|
///
|
||||||
@ -294,7 +290,6 @@ pub trait Outlinable: Refable {
|
|||||||
/// Defines how an outline is indented.
|
/// Defines how an outline is indented.
|
||||||
#[derive(Debug, Clone, PartialEq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Hash)]
|
||||||
pub enum OutlineIndent {
|
pub enum OutlineIndent {
|
||||||
Bool(bool),
|
|
||||||
Rel(Rel<Length>),
|
Rel(Rel<Length>),
|
||||||
Func(Func),
|
Func(Func),
|
||||||
}
|
}
|
||||||
@ -310,10 +305,10 @@ impl OutlineIndent {
|
|||||||
) -> SourceResult<()> {
|
) -> SourceResult<()> {
|
||||||
match indent {
|
match indent {
|
||||||
// 'none' | 'false' => no indenting
|
// 'none' | 'false' => no indenting
|
||||||
None | Some(Smart::Custom(OutlineIndent::Bool(false))) => {}
|
None => {}
|
||||||
|
|
||||||
// 'auto' | 'true' => use numbering alignment for indenting
|
// 'auto' | 'true' => use numbering alignment for indenting
|
||||||
Some(Smart::Auto | Smart::Custom(OutlineIndent::Bool(true))) => {
|
Some(Smart::Auto) => {
|
||||||
// Add hidden ancestors numberings to realize the indent.
|
// Add hidden ancestors numberings to realize the indent.
|
||||||
let mut hidden = Content::empty();
|
let mut hidden = Content::empty();
|
||||||
for ancestor in ancestors {
|
for ancestor in ancestors {
|
||||||
@ -368,11 +363,9 @@ impl OutlineIndent {
|
|||||||
cast! {
|
cast! {
|
||||||
OutlineIndent,
|
OutlineIndent,
|
||||||
self => match self {
|
self => match self {
|
||||||
Self::Bool(v) => v.into_value(),
|
|
||||||
Self::Rel(v) => v.into_value(),
|
Self::Rel(v) => v.into_value(),
|
||||||
Self::Func(v) => v.into_value()
|
Self::Func(v) => v.into_value()
|
||||||
},
|
},
|
||||||
v: bool => OutlineIndent::Bool(v),
|
|
||||||
v: Rel<Length> => OutlineIndent::Rel(v),
|
v: Rel<Length> => OutlineIndent::Rel(v),
|
||||||
v: Func => OutlineIndent::Func(v),
|
v: Func => OutlineIndent::Func(v),
|
||||||
}
|
}
|
||||||
|
@ -59,13 +59,13 @@ _Thanks to [@PgBiel](https://github.com/PgBiel) for his work on tables!_
|
|||||||
- When context is available, [`counter.display`] now directly returns the result
|
- When context is available, [`counter.display`] now directly returns the result
|
||||||
of applying the numbering instead of yielding opaque content. It should not be
|
of applying the numbering instead of yielding opaque content. It should not be
|
||||||
used anymore without context. (Deprecation planned)
|
used anymore without context. (Deprecation planned)
|
||||||
- The [`state.display`] function should not be used anymore, use [`state.get`]
|
- The `state.display` function should not be used anymore, use [`state.get`]
|
||||||
instead (Deprecation planned)
|
instead (Deprecation planned)
|
||||||
- The `location` argument of [`query`], [`counter.final`], and [`state.final`]
|
- The `location` argument of [`query`], [`counter.final`], and [`state.final`]
|
||||||
should not be used anymore (Deprecation planned)
|
should not be used anymore (Deprecation planned)
|
||||||
- The [`styles`]($measure.styles) argument of the `measure` function should not
|
- The `styles` argument of the `measure` function should not be used anymore
|
||||||
be used anymore (Deprecation planned)
|
(Deprecation planned)
|
||||||
- The [`style`] function should not be used anymore, use context instead
|
- The `style` function should not be used anymore, use context instead
|
||||||
(Deprecation planned)
|
(Deprecation planned)
|
||||||
- The correct context is now also provided in various other places where it is
|
- The correct context is now also provided in various other places where it is
|
||||||
available, e.g. in show rules, layout callbacks, and numbering functions in
|
available, e.g. in show rules, layout callbacks, and numbering functions in
|
||||||
|
@ -380,11 +380,11 @@ description: Changes in Typst 0.12.0
|
|||||||
- [`counter.display`] without an established context
|
- [`counter.display`] without an established context
|
||||||
- [`counter.final`] with a location
|
- [`counter.final`] with a location
|
||||||
- [`state.final`] with a location
|
- [`state.final`] with a location
|
||||||
- [`state.display`]
|
- `state.display`
|
||||||
- [`query`] with a location as the second argument
|
- [`query`] with a location as the second argument
|
||||||
- [`locate`] with a callback function
|
- [`locate`] with a callback function
|
||||||
- [`measure`] with styles
|
- [`measure`] with styles
|
||||||
- [`style`]
|
- `style`
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
- Added `typst-kit` crate which provides useful APIs for `World` implementors
|
- Added `typst-kit` crate which provides useful APIs for `World` implementors
|
||||||
|
@ -83,7 +83,7 @@ description: Changes in early, unversioned Typst
|
|||||||
|
|
||||||
- New [`measure`] function
|
- New [`measure`] function
|
||||||
- Measure the layouted size of elements
|
- Measure the layouted size of elements
|
||||||
- To be used in combination with the new [`style`] function that lets you
|
- To be used in combination with the new `style` function that lets you
|
||||||
generate different content based on the style context something is inserted
|
generate different content based on the style context something is inserted
|
||||||
into (because that affects the measured size of content)
|
into (because that affects the measured size of content)
|
||||||
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 380 B |
Binary file not shown.
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 6.9 KiB |
@ -37,46 +37,6 @@
|
|||||||
// Error: 11-12 variables from outside the context expression are read-only and cannot be modified
|
// Error: 11-12 variables from outside the context expression are read-only and cannot be modified
|
||||||
#context (i = 1)
|
#context (i = 1)
|
||||||
|
|
||||||
--- context-compatibility-locate ---
|
|
||||||
#let s = state("x", 0)
|
|
||||||
#let compute(expr) = [
|
|
||||||
#s.update(x =>
|
|
||||||
eval(expr.replace("x", str(x)))
|
|
||||||
)
|
|
||||||
// Warning: 17-28 `state.display` is deprecated
|
|
||||||
// Hint: 17-28 use `state.get` in a `context` expression instead
|
|
||||||
New value is #s.display().
|
|
||||||
]
|
|
||||||
|
|
||||||
// Warning: 1:2-6:3 `locate` with callback function is deprecated
|
|
||||||
// Hint: 1:2-6:3 use a `context` expression instead
|
|
||||||
#locate(loc => {
|
|
||||||
// Warning: 14-32 calling `query` with a location is deprecated
|
|
||||||
// Hint: 14-32 try removing the location argument
|
|
||||||
let elem = query(<here>, loc).first()
|
|
||||||
test(s.at(elem.location()), 13)
|
|
||||||
})
|
|
||||||
|
|
||||||
#compute("10") \
|
|
||||||
#compute("x + 3") \
|
|
||||||
*Here.* <here> \
|
|
||||||
#compute("x * 2") \
|
|
||||||
#compute("x - 5")
|
|
||||||
|
|
||||||
--- context-compatibility-styling ---
|
|
||||||
// Warning: 2-53 `style` is deprecated
|
|
||||||
// Hint: 2-53 use a `context` expression instead
|
|
||||||
// Warning: 18-39 calling `measure` with a styles argument is deprecated
|
|
||||||
// Hint: 18-39 try removing the styles argument
|
|
||||||
#style(styles => measure([it], styles).width < 20pt)
|
|
||||||
|
|
||||||
--- context-compatibility-counter-display ---
|
|
||||||
#counter(heading).update(10)
|
|
||||||
|
|
||||||
// Warning: 2-44 `counter.display` without context is deprecated
|
|
||||||
// Hint: 2-44 use it in a `context` expression instead
|
|
||||||
#counter(heading).display(n => test(n, 10))
|
|
||||||
|
|
||||||
--- context-delayed-warning ---
|
--- context-delayed-warning ---
|
||||||
// Ensure that the warning that triggers in the first layout iteration is not
|
// Ensure that the warning that triggers in the first layout iteration is not
|
||||||
// surfaced since it goes away in the second one. Just like errors in show
|
// surfaced since it goes away in the second one. Just like errors in show
|
||||||
|
@ -3,14 +3,6 @@
|
|||||||
#test(type(ltr), direction)
|
#test(type(ltr), direction)
|
||||||
#test(type(10 / 3), float)
|
#test(type(10 / 3), float)
|
||||||
|
|
||||||
--- type-string-compatibility ---
|
|
||||||
#test(type(10), int)
|
|
||||||
#test(type(10), "integer")
|
|
||||||
#test("is " + type(10), "is integer")
|
|
||||||
#test(int in ("integer", "string"), true)
|
|
||||||
#test(int in "integers or strings", true)
|
|
||||||
#test(str in "integers or strings", true)
|
|
||||||
|
|
||||||
--- issue-3110-type-constructor ---
|
--- issue-3110-type-constructor ---
|
||||||
// Let the error message report the type name.
|
// Let the error message report the type name.
|
||||||
// Error: 2-9 type content does not have a constructor
|
// Error: 2-9 type content does not have a constructor
|
||||||
|
@ -43,8 +43,6 @@ A
|
|||||||
#set outline(fill: none)
|
#set outline(fill: none)
|
||||||
|
|
||||||
#context test(outline.indent, none)
|
#context test(outline.indent, none)
|
||||||
#outline(indent: false)
|
|
||||||
#outline(indent: true)
|
|
||||||
#outline(indent: none)
|
#outline(indent: none)
|
||||||
#outline(indent: auto)
|
#outline(indent: auto)
|
||||||
#outline(indent: 2em)
|
#outline(indent: 2em)
|
||||||
@ -62,8 +60,6 @@ A
|
|||||||
#show heading: none
|
#show heading: none
|
||||||
#set outline(fill: none)
|
#set outline(fill: none)
|
||||||
|
|
||||||
#outline(indent: false)
|
|
||||||
#outline(indent: true)
|
|
||||||
#outline(indent: none)
|
#outline(indent: none)
|
||||||
#outline(indent: auto)
|
#outline(indent: auto)
|
||||||
#outline(indent: n => 2em * n)
|
#outline(indent: n => 2em * n)
|
||||||
|
@ -13,12 +13,8 @@ fi
|
|||||||
#let c = counter("mycounter")
|
#let c = counter("mycounter")
|
||||||
#c.update(1)
|
#c.update(1)
|
||||||
|
|
||||||
// Warning: 1:2-7:3 `locate` with callback function is deprecated
|
#context [
|
||||||
// Hint: 1:2-7:3 use a `context` expression instead
|
|
||||||
#locate(loc => [
|
|
||||||
#c.update(2)
|
#c.update(2)
|
||||||
#c.at(loc) \
|
#c.get() \
|
||||||
// Warning: 12-36 `locate` with callback function is deprecated
|
Second: #context c.get()
|
||||||
// Hint: 12-36 use a `context` expression instead
|
]
|
||||||
Second: #locate(loc => c.at(loc))
|
|
||||||
])
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user