From db24f4adfc8d14482e9dccf4155e431506ab19ee Mon Sep 17 00:00:00 2001
From: PgBiel <9021226+PgBiel@users.noreply.github.com>
Date: Sat, 16 Mar 2024 06:24:45 -0300
Subject: [PATCH 01/55] Remove grid usize overflow tests (#3687)
---
tests/typ/layout/grid-positioning.typ | 26 --------------------------
1 file changed, 26 deletions(-)
diff --git a/tests/typ/layout/grid-positioning.typ b/tests/typ/layout/grid-positioning.typ
index 5461fb1c5f..228fadf713 100644
--- a/tests/typ/layout/grid-positioning.typ
+++ b/tests/typ/layout/grid-positioning.typ
@@ -203,29 +203,3 @@
// Robert got grade B on other exams.
..(table.cell(y: 4, fill: aqua)[B],) * 2,
)
-
----
-// Error: 5:3-5:39 cell position too large
-#grid(
- columns: 3,
- rows: 2em,
- fill: (x, y) => if calc.odd(x + y) { red.lighten(50%) } else { green },
- grid.cell(y: 6148914691236517206)[a],
-)
-
----
-// Error: 5:3-5:46 cell position too large
-#table(
- columns: 3,
- rows: 2em,
- fill: (x, y) => if calc.odd(x + y) { red.lighten(50%) } else { green },
- table.cell(x: 2, y: 6148914691236517206)[a],
-)
-
----
-// Error: 3:3-3:45 cell would span an exceedingly large position
-// Hint: 3:3-3:45 try reducing the cell's rowspan or colspan
-#grid(
- columns: 500,
- grid.cell(rowspan: 6148914691236517206)[a]
-)
From b279b9d21490333958ea79ca4d882f70c9bff529 Mon Sep 17 00:00:00 2001
From: A-Walrus <58790821+A-Walrus@users.noreply.github.com>
Date: Sat, 16 Mar 2024 11:25:40 +0200
Subject: [PATCH 02/55] Fix all cargo doc warnings (#3684)
---
crates/typst-render/src/lib.rs | 2 +-
crates/typst/src/layout/inline/mod.rs | 2 +-
crates/typst/src/math/root.rs | 2 +-
crates/typst/src/visualize/color.rs | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/crates/typst-render/src/lib.rs b/crates/typst-render/src/lib.rs
index 5d116e4958..e9dd3fbf04 100644
--- a/crates/typst-render/src/lib.rs
+++ b/crates/typst-render/src/lib.rs
@@ -1080,7 +1080,7 @@ impl OutlineBuilder for WrappedPathBuilder {
}
}
-/// Additional methods for [`Length`].
+/// Additional methods for [`Abs`].
trait AbsExt {
/// Convert to a number of points as f32.
fn to_f32(self) -> f32;
diff --git a/crates/typst/src/layout/inline/mod.rs b/crates/typst/src/layout/inline/mod.rs
index 16da1539fd..a574cd09fd 100644
--- a/crates/typst/src/layout/inline/mod.rs
+++ b/crates/typst/src/layout/inline/mod.rs
@@ -1415,7 +1415,7 @@ fn reorder<'a>(line: &'a Line<'a>) -> (Vec<&Item<'a>>, bool) {
/// How much a character should hang into the end margin.
///
/// For more discussion, see:
-/// https://recoveringphysicist.com/21/
+///
fn overhang(c: char) -> f64 {
match c {
// Dashes.
diff --git a/crates/typst/src/math/root.rs b/crates/typst/src/math/root.rs
index 90d3111b22..6a76044529 100644
--- a/crates/typst/src/math/root.rs
+++ b/crates/typst/src/math/root.rs
@@ -50,7 +50,7 @@ impl LayoutMath for Packed {
/// Layout a root.
///
/// TeXbook page 443, page 360
-/// See also: https://www.w3.org/TR/mathml-core/#radicals-msqrt-mroot
+/// See also:
fn layout(
ctx: &mut MathContext,
styles: StyleChain,
diff --git a/crates/typst/src/visualize/color.rs b/crates/typst/src/visualize/color.rs
index 365a069554..309619debb 100644
--- a/crates/typst/src/visualize/color.rs
+++ b/crates/typst/src/visualize/color.rs
@@ -32,7 +32,7 @@ pub type Luma = palette::luma::Lumaa;
/// This is a minimal CMYK profile that only contains the necessary information
/// to convert from CMYK to RGB. It is based on the CGATS TR 001-1995
/// specification. See
-/// https://github.com/saucecontrol/Compact-ICC-Profiles#cmyk.
+/// .
static CMYK_TO_XYZ: Lazy> =
Lazy::new(|| Profile::new_from_slice(typst_assets::icc::CMYK_TO_XYZ, false).unwrap());
From babe44c5d674b1eb37594b908ca858fa84992b4a Mon Sep 17 00:00:00 2001
From: frozolotl <44589151+frozolotl@users.noreply.github.com>
Date: Tue, 19 Mar 2024 10:36:30 +0100
Subject: [PATCH 03/55] Fix color documentation (#3688)
---
crates/typst/src/visualize/color.rs | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/crates/typst/src/visualize/color.rs b/crates/typst/src/visualize/color.rs
index 309619debb..185e990b7a 100644
--- a/crates/typst/src/visualize/color.rs
+++ b/crates/typst/src/visualize/color.rs
@@ -117,13 +117,12 @@ static TO_SRGB: Lazy = Lazy::new(|| {
/// columns: 9,
/// gutter: 10pt,
/// ..colors.map(name => {
-/// let c = eval(name)
-/// let cp = c.components()
-/// let x = cp.sum() / cp.len()
-/// set text(fill: white) if x < 50%
-/// set square(stroke: black) if c == white
+/// let col = eval(name)
+/// let luminance = luma(col).components().first()
+/// set text(fill: white) if luminance < 50%
+/// set square(stroke: black) if col == white
/// set align(center + horizon)
-/// square(size: 50pt, fill: c, name)
+/// square(size: 50pt, fill: col, name)
/// })
/// )
/// ```
@@ -736,7 +735,7 @@ impl Color {
///
/// ```example
/// // note that the alpha component is included by default
- /// #(rgb(40%, 60%, 80%).components() == (40%, 60%, 80%, 100%))
+ /// #rgb(40%, 60%, 80%).components()
/// ```
#[func]
pub fn components(
From 15d01c49f5b6796605204d334084f71a995156ff Mon Sep 17 00:00:00 2001
From: frozolotl <44589151+frozolotl@users.noreply.github.com>
Date: Fri, 22 Mar 2024 13:35:02 +0100
Subject: [PATCH 04/55] Fix warnings introduced by rust 1.77 (#3754)
---
crates/typst-cli/src/main.rs | 2 +-
crates/typst-pdf/src/page.rs | 4 +---
crates/typst/src/layout/inline/mod.rs | 8 ++++----
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/crates/typst-cli/src/main.rs b/crates/typst-cli/src/main.rs
index da0a57fd55..c8bd391442 100644
--- a/crates/typst-cli/src/main.rs
+++ b/crates/typst-cli/src/main.rs
@@ -26,7 +26,7 @@ use crate::timings::Timer;
thread_local! {
/// The CLI's exit code.
- static EXIT: Cell = Cell::new(ExitCode::SUCCESS);
+ static EXIT: Cell = const { Cell::new(ExitCode::SUCCESS) };
}
/// The parsed commandline arguments.
diff --git a/crates/typst-pdf/src/page.rs b/crates/typst-pdf/src/page.rs
index 0342e9fe68..590ee90570 100644
--- a/crates/typst-pdf/src/page.rs
+++ b/crates/typst-pdf/src/page.rs
@@ -316,9 +316,7 @@ impl PdfPageLabel {
return None;
};
- let Some((prefix, kind, case)) = pat.pieces.first() else {
- return None;
- };
+ let (prefix, kind, case) = pat.pieces.first()?;
// If there is a suffix, we cannot use the common style optimisation,
// since PDF does not provide a suffix field.
diff --git a/crates/typst/src/layout/inline/mod.rs b/crates/typst/src/layout/inline/mod.rs
index a574cd09fd..d79dcba49c 100644
--- a/crates/typst/src/layout/inline/mod.rs
+++ b/crates/typst/src/layout/inline/mod.rs
@@ -189,7 +189,7 @@ enum Segment<'a> {
/// Horizontal spacing between other segments.
Spacing(Spacing),
/// A mathematical equation.
- Equation(&'a Packed, Vec),
+ Equation(Vec),
/// A box with arbitrary content.
Box(&'a Packed, bool),
/// Metadata.
@@ -205,7 +205,7 @@ impl Segment<'_> {
Self::Box(_, frac) => {
(if frac { SPACING_REPLACE } else { OBJ_REPLACE }).len_utf8()
}
- Self::Equation(_, ref par_items) => {
+ Self::Equation(ref par_items) => {
par_items.iter().map(MathParItem::text).map(char::len_utf8).sum()
}
Self::Meta => 0,
@@ -521,7 +521,7 @@ fn collect<'a>(
frame.meta(styles, false);
}
full.extend(items.iter().map(MathParItem::text));
- Segment::Equation(elem, items)
+ Segment::Equation(items)
} else if let Some(elem) = child.to_packed::() {
let frac = elem.width(styles).is_fractional();
full.push(if frac { SPACING_REPLACE } else { OBJ_REPLACE });
@@ -592,7 +592,7 @@ fn prepare<'a>(
items.push(Item::Fractional(v, None));
}
},
- Segment::Equation(_, par_items) => {
+ Segment::Equation(par_items) => {
for item in par_items {
match item {
MathParItem::Space(s) => items.push(Item::Absolute(s)),
From b2fb64f79cf8774015a15658e3c2e62b9f2f4442 Mon Sep 17 00:00:00 2001
From: Laurenz
Date: Fri, 22 Mar 2024 14:30:47 +0100
Subject: [PATCH 05/55] Pin CI Rust version (#3763)
---
.github/workflows/ci.yml | 6 ++++--
.github/workflows/release.yml | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 730bf75f83..6322e402f1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -29,7 +29,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
+ - uses: dtolnay/rust-toolchain@1.77.0
- uses: Swatinem/rust-cache@v2
- run: cargo test --workspace --no-fail-fast
@@ -38,7 +38,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
+ - uses: dtolnay/rust-toolchain@1.77.0
+ with:
+ components: clippy, rustfmt
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --workspace --all-targets --all-features
- run: cargo fmt --check --all
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c62ad56dbd..4e855064e5 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -37,7 +37,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
+ - uses: dtolnay/rust-toolchain@1.77.0
with:
target: ${{ matrix.target }}
From 3a5a4d9227f25ac9863b0af8e242b39bef71ae9c Mon Sep 17 00:00:00 2001
From: Leedehai <18319900+Leedehai@users.noreply.github.com>
Date: Sat, 23 Mar 2024 07:53:17 -0400
Subject: [PATCH 06/55] Exclude bots from the doc's contributor list (#3731)
---
docs/src/contribs.rs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/docs/src/contribs.rs b/docs/src/contribs.rs
index 58a730e222..d9824c39ae 100644
--- a/docs/src/contribs.rs
+++ b/docs/src/contribs.rs
@@ -9,6 +9,7 @@ use crate::{Html, Resolver};
/// Build HTML detailing the contributors between two tags.
pub fn contributors(resolver: &dyn Resolver, from: &str, to: &str) -> Option {
let staff = ["laurmaedje", "reknih"];
+ let bots = ["dependabot[bot]"];
// Determine number of contributions per person.
let mut contributors = HashMap::::new();
@@ -26,7 +27,10 @@ pub fn contributors(resolver: &dyn Resolver, from: &str, to: &str) -> Option = contributors
.into_values()
- .filter(|c| !staff.contains(&c.login.as_str()))
+ .filter(|c| {
+ let login = c.login.as_str();
+ !staff.contains(&login) && !bots.contains(&login)
+ })
.collect();
// Sort by highest number of commits.
From 784488c5225534ee7e3848df186d059cb6cbeed5 Mon Sep 17 00:00:00 2001
From: frozolotl <44589151+frozolotl@users.noreply.github.com>
Date: Sat, 23 Mar 2024 12:54:50 +0100
Subject: [PATCH 07/55] Escape path and entrypoint in `typst init` output
(#3753)
---
Cargo.lock | 7 +++++++
Cargo.toml | 1 +
crates/typst-cli/Cargo.toml | 1 +
crates/typst-cli/src/init.rs | 12 ++++++++++--
4 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index e054eacee9..9c94d559c8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2131,6 +2131,12 @@ dependencies = [
"unsafe-libyaml",
]
+[[package]]
+name = "shell-escape"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
+
[[package]]
name = "simd-adler32"
version = "0.3.7"
@@ -2605,6 +2611,7 @@ dependencies = [
"serde",
"serde_json",
"serde_yaml 0.9.32",
+ "shell-escape",
"tar",
"tempfile",
"toml",
diff --git a/Cargo.toml b/Cargo.toml
index 689cb8f9d8..439d3edf41 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -93,6 +93,7 @@ semver = "1"
serde = { version = "1.0.184", features = ["derive"] }
serde_json = "1"
serde_yaml = "0.9"
+shell-escape = "0.1.5"
siphasher = "1"
smallvec = { version = "1.11.1", features = ["union", "const_generics", "const_new"] }
stacker = "0.1.15"
diff --git a/crates/typst-cli/Cargo.toml b/crates/typst-cli/Cargo.toml
index 57251a64a0..65803a1dde 100644
--- a/crates/typst-cli/Cargo.toml
+++ b/crates/typst-cli/Cargo.toml
@@ -51,6 +51,7 @@ semver = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
serde_yaml = { workspace = true }
+shell-escape = { workspace = true }
tar = { workspace = true }
tempfile = { workspace = true }
toml = { workspace = true }
diff --git a/crates/typst-cli/src/init.rs b/crates/typst-cli/src/init.rs
index 01fdb02f0c..b0446bd1ea 100644
--- a/crates/typst-cli/src/init.rs
+++ b/crates/typst-cli/src/init.rs
@@ -104,11 +104,19 @@ fn print_summary(
out.set_color(&gray)?;
write!(out, "> ")?;
out.reset()?;
- writeln!(out, "cd {}", project_dir.display())?;
+ writeln!(
+ out,
+ "cd {}",
+ shell_escape::escape(project_dir.display().to_string().into()),
+ )?;
out.set_color(&gray)?;
write!(out, "> ")?;
out.reset()?;
- writeln!(out, "typst watch {}", template.entrypoint)?;
+ writeln!(
+ out,
+ "typst watch {}",
+ shell_escape::escape(template.entrypoint.to_string().into()),
+ )?;
writeln!(out)?;
Ok(())
}
From c5dcd220c1d99e07b5736b6bbae4687aa82d3f55 Mon Sep 17 00:00:00 2001
From: Ana Gelez
Date: Mon, 25 Mar 2024 14:32:02 +0100
Subject: [PATCH 08/55] Fix smart quotes in PDF outline (#3790)
---
crates/typst/src/text/smartquote.rs | 16 ++++++++++++++--
tests/ref/bugs/3662-pdf-smartquotes.png | Bin 0 -> 11950 bytes
tests/typ/bugs/3662-pdf-smartquotes.typ | 12 ++++++++++++
3 files changed, 26 insertions(+), 2 deletions(-)
create mode 100644 tests/ref/bugs/3662-pdf-smartquotes.png
create mode 100644 tests/typ/bugs/3662-pdf-smartquotes.typ
diff --git a/crates/typst/src/text/smartquote.rs b/crates/typst/src/text/smartquote.rs
index dbcca6dc34..4bb5ca019f 100644
--- a/crates/typst/src/text/smartquote.rs
+++ b/crates/typst/src/text/smartquote.rs
@@ -2,7 +2,9 @@ use ecow::EcoString;
use unicode_segmentation::UnicodeSegmentation;
use crate::diag::{bail, StrResult};
-use crate::foundations::{array, cast, dict, elem, Array, Dict, FromValue, Smart, Str};
+use crate::foundations::{
+ array, cast, dict, elem, Array, Dict, FromValue, Packed, PlainText, Smart, Str,
+};
use crate::layout::Dir;
use crate::syntax::is_newline;
use crate::text::{Lang, Region};
@@ -26,7 +28,7 @@ use crate::text::{Lang, Region};
/// # Syntax
/// This function also has dedicated syntax: The normal quote characters
/// (`'` and `"`). Typst automatically makes your quotes smart.
-#[elem(name = "smartquote")]
+#[elem(name = "smartquote", PlainText)]
pub struct SmartQuoteElem {
/// Whether this should be a double quote.
#[default(true)]
@@ -85,6 +87,16 @@ pub struct SmartQuoteElem {
pub quotes: Smart,
}
+impl PlainText for Packed {
+ fn plain_text(&self, text: &mut EcoString) {
+ if self.double.unwrap_or(true) {
+ text.push_str("\"");
+ } else {
+ text.push_str("'");
+ }
+ }
+}
+
/// State machine for smart quote substitution.
#[derive(Debug, Clone)]
pub struct SmartQuoter {
diff --git a/tests/ref/bugs/3662-pdf-smartquotes.png b/tests/ref/bugs/3662-pdf-smartquotes.png
new file mode 100644
index 0000000000000000000000000000000000000000..c272a8ffd58124166f9b0637a89d3f4dddb3746c
GIT binary patch
literal 11950
zcmb8VbySqm*Y|x5APgm-NFy~vha%k|F&9X8gAO7gAl;0FO2beBQZh(`64D`xl+@7O
zDBWEz_j;aty}x(e&-2H7);epi>#ViU_22jG{rT>2Ee#b?B03@f07yZEq7DE+@NV}s
z^!5OFa5pj$0QfyXMR`5%$<3jDwV^i*9eWm86WK#wEi4B
z+qe>IvfLGyUT{-{vV@W=eArrKVWWTrE5Gr^J@)4$fpogOX}NhiP1kQ9JVWs@h4dB+y
zwKl@O?G#e;fm->;FIQl_Wd`T4yU
zREiUZDhAOS2|C>U>i4<3-_>n+g?a*R=bb#+v1Ot4ngUr6sV=VUr{yp6D2u6vdjl92
zh)_{7Uw}j1C%JsIzK>bu$jWiGn^>zUDvAyOMVCN`cX}_C*qg0sPSHOk?dX!d@{Pjw
z6&3T;bBZqnq}Ve?HMgO~8gX=&CZQ7;z(iAHBz%$Awy$~hp>H``Jx%sGkFWmXQ#%8`
zc7p44Ne1f$UJjoctdT=NWTsGo+tHM;Ar4xy+t;az4v9;#GJJkizfa
z(%rM6FlH^VBPsp$3wrOq(2rUnjDp%zq*|1GbU0mM_+qjVp8WmqI66@#1#-HIgzs3t
z@wU0Adw$__&uVrRe6n_#Eg>s$vwG&%cQR9F$*$QaJ!ei8gX8JYLD_1|24<~9vl*-{
zv!cZVyErr6J$_i5EULQB+1(4{X{!8KRUR;6My55Q_vtRiKeu)D8>&)XP=ohbFRP&H
z5>Jjp{{;|nyeVD^)&HqgQk?LH#gj0-0;H0X@yvX`3<2|qf#v1=J|z`0B5)Kvp4jk4$s!XZ+4cBww2DgO#7LkS^^`hJ)73G?=v6#
z|NJ%uohlSK&Vt>~(lC~QW5OXdAUT>&QWA$*q^Og(yOT;`OUMD))T49;5K~x|cGjGj
zexq6Oj}^SBSc
zf;IY0bNlD7n{SY4Lmi$jRtF_m4Y#6_kpd%1xWXRd`m}|1mI=PV)%pZ;?>FwLbcH0P
z9je7T_uf3A-9Y-Qhsjaq(>zNIsFCDpY99tof|o}AgstK{j%WiO$*%Ym1ylApgAanh
zD9iyUNu+c~)uC0vziEf8T`$2jvahyKI0JK+VF-Fs2jKWS$VW7^;wqCw6z8uM;$lxJ
z?)V}%_%CsSh}v&SfC_I*JQ10SQN^(fEDR7td7!HXa~!;OO+;oc;78@`sY86mnM`G+
zCjhcW%?}b)5O0r=IrDL%>RLyS(jgB-UAj(pv`Orx7k75s>^ayiO
z8_wQ&G_=J#$+6TgM7K6GWhV4nL=&@6Cbg0Cro)4^$D#@p)I
z$WYZkal?N`?q5Jt23PF$?}n~;rj5XKd=*O?R>FX>jeu)8w~(3{<>vkMhf0G69{&)f
z*Xe2<-Q9r)O34QzXSmnwp&K)@m`yZ?WO2!hf%}maQ2t
zZ{4Gt>%EQU^zCHr<7BQ1N-a6^M1=|6caF#iW+Hw$Jctc3t6zUbO(*^Y^V8#5(_>C|
z(Yl~a&3l|p+@o_T@skIa`F7Z|+O$uHjcyhlijOFs;obl7zXA&d>!+yUmNmT(nBt&o
zFLKX-QO-v|I+Bw1OX%?XW```oFfuWr#V_?6rH
z$$Y%8rs!mEzrHb9>Xo~cdR(m=?;KbZuV<-%Sra#1?1+sIBzuED{hkgr`T|zStEE8r
z4;MwjhA8vm!|S4xb4}Rny%T3hxT*5D`P>;Lkc4t%o2UJ9#P#*Z2zeq?tN6s!U1kKK
zW5InEdu$X998=88!R1wfNO|hQ|C4qLUu$KK1y)d?-lC{#zx+*wE;?RS5&C_~Kzh3@
z^WXJ-D4C4_t1?>Qu=Yc`HeJR&sE#5>IfxaC^;DID65}Qe6}O4d8s{e=@Nc|CdIsO6
zrGDha?YhGDU6=M?_R#JwijiY8lH8665zJYieabn1dRVffQta^$Q+q?(SfRQ<{&2d`
zfmPnGem;V}bVP5tmp#tLyd$v|CWO2w*pH_z4`f&QsX{X=MiM4M~)?
z8G53I^F2;;KGkstmuE?5sX&<${PF}kGV)s#5hx9zO6GPD-+bru1exnHPbQkO<
zXtbZkW-dPkY2VgiU0d&c?trH?Jbf*ARb@9M5jV{-;W_Ojeu$zB8fN9=O7!RCeA&zNiM&H53`njT(pkU3zYRMMn573V?b<|;hPWtNiAr_!
z8LS-i{ipV&O0`JCwS>}|rN`s)%gqO4zczE)1^1ytVBXj*2h)|r2gGgtOvhHUJHb+)
z7r;E&P-z@PIGnyllbPul&3+$PK!nP%cQmY0#PIzl%-C_KIs&$49FX2UWW1llALZik
zyQGeosxO_f(GnXoKXE|C_fgWp_alrk^>{|~hbTNZI;6odN#l64Qc4-k8q&hJoA2b2
z>iS685$bUA??o&i)kiN-`MV442%Pq_w?sb?
zx`I72-n}C44pfYvmXU@Y<$gbQ&G;}*u9rHTSt-xkJ!-b^yIpgN_8;c@8GR{r>-94U
zrQ^tCj3#8c9`3jFNUfh!Hv2eINlON83+I}?Ps2?+Q%R}o-^(g~&f2Anu7Uuw;fb3&
zn?p~yCn8lipY2D$G9ZsE1kZvq!7#>1?Qt9|cz%*m0mZ2>~lL)udv}pMK`su7m7w3LM+pNV|
zz0pzatKuknq{_HyFzj!qTsE$?X7OgGOj!EEL`>WfTiWWM&ljXu>q>K`qs7Xrn-zV;
zhpK}t3g>xgn%!wZs>-6xyo-NzziKY`DA$gZNT9sZh3T2oH)pt7U0Y%g7vb%5_?eB#
z(U|@iqaebN>4E1br-{4&UM7gxuy#o*f&AtfRKVZW_u7$4_;m*~8(r6d^xsqPW_>20
z*xB0qjZ?U~7{c*mFQ`}{?lpkT3JQHh-|3JvIv`^^Y!HpKNyGVRg&9*cnOFb{J{PyiYS6%81QMP?B
zMW4Is&AM0JTR{OvYqrIh$77|(+b~I4MtQIO)=oK^yH?q-Eyw_O4s=F(`Zw5)st_Rk
z;e(iW244PqLr|=wW{QnJdl1yJ5Q=nXZ4Li=M-C2}5L!7hgjxiJkdrj>(L!(E0tJ4c
zV_B@Oja+&gYC9RU-xkqgx%+x6g6<&Dy*PMHMxn*CeRkt1gh*Q1=hX}|FVcpvM*Dv4mINe;xo_}1LF^fj{aL-H
z^2h5!m@s=C;&?s&QXQKTV;R`^qBY35HDIH<@sSsmWE<+^x8icU7DjC(e;9*haopGK^H
za&lM!u_wA7n)2wR{0&8AbYRFug8PR5x7YXp=k!)P%cc19Kc`>>jl1l@
z;a034q5mW7S}N97+x_S?xN|em@=7g-&d{UIv5S%aor}*voHd)um6ZD~JJ>@wcU|
z>nlsh_FC2j9GBsM)}zR&_x}0c&qIK){)0}M6%%MmbDtWzYpOJ*sy2)aq}uk?BrFU+
zcy@JkuQpPOY~I=dV%6Zlf*5N8@q1=tVMAfu)}$^myiRy}hBy+26pc*h;dgq>N#*Na
z@Wnd9&bC_~S_D+sZw;v;PEsv(SZYl9-_M)9doroMFaB)Tvzf$O>^IoJr=Cbj(I*0K
z$RbR3bXDr(*!r7(g}A&xR-UZK5~f6zk=j2TcYO7cA?(?PQM1n-NrmOTm7kLaDHxs}
z-;s~J8S4y(gH98Y1BE83X<0U>IlL7Pa@`gprK(fA&G$utc1q=9!u7)B?1V+N7{UUV8nuE}p}8sc3RuWk4xZFuZHoOS2OIDaVze^|IniDF%-
z(r|^MP000&UizhxPLNfa-gF(s$Jg>+p!pV5f*v?kBQkyksX*F2&M&6dntp@-Arou+
zW|h32TfypqU*0FEp$=BkBu&m&1@Ri?qa%yTLG$N_c9f3C67E3kGKix!=q;Npktr)g#m&*55g6fL?(WKIp1nKsyC|)xIsO
z6Wo#;RB?=W>}b09(0X?f@Z2$!0($ss=e@xKmxylm&z3mMfc0+XR*9qMTkY~GX0dkvJuvMCnYjY@oT`MWmn
zF@y>E1pS{Ldo11qCk5Y_xa&L?pcWi;%Yf2kQ*`|^$Ff{#w0IBWK|zE`!}F{N)OM0Ci%*XBJkp#+z`vt
zm#P7-pt7Xzi1V~V*25Yml`0Cu>$?l1X%JFTwT_meu>(!ouq~Pi*C=;Cxtacx&cW2?
zQu_dzy+$Nu{Z+@i_wL`Hp3q~nT8;~Y^i0Oew&S!wQ`zFFrTWbox+8E)R`n7{ITkomsR*^uH#?$#+@rt1!l-$?NQDhxyeejZ!NC3K)tgdkg0~G
zoM`KS$3?>72e_^=@^
z7N6~I4Tzo1vN8CzJYZ_BdoL!AEJ!tGayu%ZH)~2wUq^&g1v8Lsk9fons
zLSKqSQcq}fOhFJ9?gJk#fr^zIr)j@F>oaMT<%6XAuTCy0j(^E}lm6o{-=E6V!c(H?
z^wZOU%ehaD$M!SDP+JRn(KxV%&
zz$ul-&$#f>0)5no3m=bR_fZZYtvxwozv=fb+X{P^^n;pTDZq+X0f+`_TKhnpTq8
zm%E>kz{LQ~SY#Dbp=u#qPN{s-3ov+ZLrs@7cDF&mDdd6k3WNdu#6XR_%?>Rei%(_t
zjm`bqHk2oXn4l3dzkB-&Mb|ISMLF&RyaxUO2-iG@jF+)^EN1y`l%9{#EQE@+b3dNU
zl>7sM7+J4SQdr1Qf!h!4Pft8rWjiKI=-X+HcTwxz?1K#W%4P
zz}7hCb=yrP(IeZcI?qI7dj;!pvx8wxf2Z9k0e{D1b?GmvM7?UO0i3<8l{0bfp~$Bb
zQ-8fZ-%!VtDo6+#SGnW0QqGjyG>ZG1`ZBd1+lG^0n?6DN2XyIktqRkTy3Qiyqs<+N
z7J3^ZL>+k0sTbuI=K+IA9-FFqF5t#Ep5=uUpl3{RtYV3Cdi^dL35oOC7G7JHT=qNQ
z$hR6~(;42UgXumK*|4RTF^U%{goc8gbn`;d140g7-cNyjML}
zw(q~TIBMk;jc^-68Q9i_FV+r3E|mI|_4^s)nh$GTuFNkQ@Lp;rZH~D9bn5wMZPi{h
zQf$EO<>^qTI#OgV(9B_r
zdH+U0oq<}IUjv|bJqGn9FAE(`d#xX9S
z%*^)>J{7yV`>u7uZ4V1B=#>So7Ae}=^>vYyZZ7LGps8|sOq}%8YS+&%uer@(58TvD
z&l&<(zA1*fYy>R#D)iWjfRp+xN~wU!WSE*V*;H*FZ$h|dsP?$kksc7xw8{1CBO1!CcH4OhC0|
zwa8zEZo|laTWM9#F*KsjuIUcrkZ%K|mftv_vkr@orar7yJou=Ud`Lz_#I5L>#So42
z71ZIch`PV9#uhn*mQ|w%Yy56umawt+{*B42guw+TpGJsd@^*Yl(xcGw&M#PZT)tb9
z70;X3QOf!IcRDpN&c4NAEMg6{hTEmOR&hSDKtw^i6~2TgSMI#c#NL9eJT2l>4r}P-
z(%#E`J$N%|d@&nk#L>O%41gQd(MQYnyxQgptH&jH$nsAg%>lnsbWMTj16T*YImLh3DO=xY8=dLnTfG>bwHc
zVMQ0scUp_Tk9;4ZZ*8P$FJYg5qgS7qf=uv>P*twKgY2>VY@hE#!5_8TAUV?%AT=|t
zt7B>+70@`n_QnF+%}RyM&3vOh^#oUZwV00lQ73np=MhdZ;{@J`0@K}CuI<&er6rra
zZ#LE5XWo9hDML=%v%kY==@#W}cS7sqT=au`LqlHnkqIfiul>e}1l-VCtA1{!dNY|Fs_L
z=i7(}Tk6<@k5)6{2EG!UIEAgB>N;Z@yPeSim#}zjGFUZvX-`nLm(Eg={7a
zQbRWX(!4*pMMSUx%Qxo{T*usy4E%u(8wv}rhooNV%PzEeZTH$!ddZ3()VPr)#`V!a
z%WiOXmH_r1PIBr8&Tt>yoA3X^m;yZD-PMIU2fZ<}iq~Wi=R@4*8>3(zc#}tVoEM3NeADE?(+V#N^woGIj`lYYpKb
zS4|-CnBh>Phv02!Yu8{rd=Mf-2}-lc2CK|xgSr$#BeHB)7CTHi9ON>1yYDw-UR#h^
z6+JvE4*KAJLt616(=o8yWlck-B5~>Mw~B+e-;$ObNt)4BKTdSprS^gdniGU5<)mpd
zEH)&dso=KTL&^!`*z=Gk*by83de?W?Y|KNX8n_QrQ^WEBq>MuiwEQ#AdhO$Vr+2>g
zNJBYSJ|V^>zo0Y33}lmk`tBV*6a4y3Jr`J%6(7)Zr0
z56|)$Qo`sDBz`Ue3g~TT$>&2$3S>^>o=^7^h${4>U{~vVv-)s#JicAF1F!YbGNUzG5x73y
zOxAFh_u<@
z3>^(CvqfJ|K_wx)Sly|2MBx+*3+5oj!g)hm`S|jy`=}A$;gJSky+11mT4|RJ^gr@G
z(VnH>W<&USuQ=5EMd*ELA0}akN?G8QC7E|_%csB
zAX`3#zY-pOyqE5_V4j@|JIbG`coIGENLxmeMkV>1Y6>Ed3(OMJIC<3lX09dW-85@^
zBkr;{ryU>aNYF$*knKv|*DQ{|j;$2QW5E5GmEn+ux+i8}=5Z?Zdsy$CuXBr
zpe}T;CBZzfvGjpz5Gm)FNY!eUZFn
z0;Z|&r$2u2yEfh&)AJCuQrw_(3uiRW*SVlMPIB2%g1AmOSV6!6wnmRmDyAJ7U;a1}
zg(?ic$0ELVCKRe0+lQlz*D7uo?snfea{0Bi(}z321-o*n8O&Mw4$CBQCui;=$`o^T
zp43OZzolJroD7){6r^C)gV%|Ov>|{C252O_NohY0X2TJA>yBH6!J?TbER;tpu^mqt
z@<+1JPztJq5;}V8!lknxlt3=*YH{4t!jmIk(uqj`%ntxht`{OMueM@z4tUAn4k$><
zDY@ea;=7DnUh(~f@3L|APyfmZ0LC5f!3^+3U5CD+5XOibmosO`gBgU`buIQS=ID3{
zebCXPLN=#BDJUmKLom*a9Kp&a0Ft(X9_8E>iC#tKt;{@scFS^df5TF5vN3~pc8{u>
z+3ZB(S^{J!r3-(3V9vT}#gbQfz1k5Tj97be^;KVxXio5Y>e~iW=it7@i{o);
zLSym$DXtE9Zsibx`<0Kw;%w7Pl~Y+;R+w+-0jz=DBeV&SQJsW7Zdk|dtlfO6qbzoK
zo(`Yo*Di4(bK7e-dn@?=!%wonSJ1=2q)&I)%t%J&DEEBcMPvUlgd9o{H(c&h1iBuW
z7kW1sifw>}sbhlDHTa$dmcwkfhSH{hu1JB-3enr080?ax%yMx=4f{hs%r_b?yUT{R
z@<|3=79FibK>D)`yqyUxt8JL-Xc|>MafOPNJ|GwxT(q)};TjXI#Va8Hsf|IBKUuC%89yAQJ
zcoP%NAV3>{oWPvc|I-lpzJgyd8RVSniyri3xDsGy@QmSz-d?z_WKdG(@nq9&^t4E?
zyi-!mh6GT~l+-NTs^20KDH%5^+Fr+yRj$7o)aFOIw2U|au9RF@xh#VTUfQsLjIkL$
zKb7LemkEpua(2L{bG)`u<+YjVgV6~%=#@fRl<>G|d-$+~%EQ4aC0oy!Qo1y>y}_oy
z(XFTMLa&yY)_iR@?Y&=_Q;q=rf<{9<5Ik8;&u%Na{}uZKlxZwDokAtlxZ>BaZ5nriqQUE>fJyLJ189?@OIEM)DrS64)X(0MyyjiD7seO|?CIXuSFV>)sA3&JtNkTP%;EX4O#q2Z-uclCA1dXc6K5J0=
zrI^Pl+d*q!#nKRkyR2+fjKntm72J*tB|@llI=v`j&W)cKum){`e9Ytj!r(<55)
z#@YN#8xarVkpa{$EwDl|+TDRSiSsfO8;hqJ|JzZr1o_@#(X%+JAiDSYt46KRNDCMT
z0;`Xv4SZPjEN1)3{70b(hU`;^o}HCf++F5qcX3kV(V~r1J7YLV3gL}wl7NkY>xvbz
zxB9gKoUcmN{AI^&bgm!ON$YYX!S&QIsq
z_>%HFExh(cyR=>@He;oDB6s41Wa9uGAqfsU4P*2li64^#85l$QfNe6=j>bT$BcKz-
zK-7Ab9;vR2+v<>E!O#{B>e~KEW0ZQm{}41eZ9gggd03E6>=!iYGpye}*IoGJ@1IZg
zV2tlkGq2zKe6I`FlB@F!-4NUURN)u<>Y!v)&u@-rnKBN2C2K#@L|>17n)snBiV$V@
zzg|+GU=NhoFW9CN?avf{om|&5W9IdrBRKy-ES`nlu(nm}KfxFMQ)hbf`KT_Kf8Bqt
zjozGOL1BmKoQzH?+c~QmO?9*;X|8|0+q37ndvWAsTSN`m;gfr27cxq9fB
zLhZRZ3xF8$sl+^ByoAhe$*`y*_z>G3pLnX?-P4k3otdO+6&X{Ab2|HF63l?l{IvGo
zs2p$sFEqv(Bjg{$+fnhi`Qd8#RO=zYfplg=og}utlc4AueeG{Sxb~1(l^a>NRKbDu
zDC;x)FIvH~`WANefeY)YrUq9Eec^%jJBc^&7EbO%^6fJ3F`Loql^Y%9#4w#c-#Le`
zUy-w_c>S*8H!d$>Tv%wnbCs5yf*Epaz>7}0Tf;NrSiE_4tz9R|Q`IYmVRb9;T7Qcz
zFEo|W`z-(Q{`}P6`+^N`bf4Mow7&6p`-}sgTb(-L>aRlFb)`cl3Q&QhV8wRn%ikB<
zE#3c~e8~_VPIrDMOVgL4=mjyYYSW6jfrPRTP$EzS{3Yo*7xW>
zj{Gr3@F^pdn;4U%?Zo`^F&GV~C1P-vpV_gjQI{IQlN+A$2u>YsjB!j-4+#WP^V&r$
zz5Ob3_U<{G9uBsrAnwJa7ZdOoUL5v`LhtI8YEl?a4a
z7;BwGn*-2yYbOCK47QIIq6yH~CCwHokjo
zuc2xcc{qaNH(eI2N~hS1jtA){8OM|
ze>L;P=HT}aw6ciZY=!y;S-Qx%uFiPeyLKW`WA5Cq{BOhR=SGHWR6V8OPm969lb0Kc
zIb`@{O{Gq~Ce?OBMLxPy9lba81E0J4c%o$;XTEzxveUbZNoK%hKk0c@#eDx`AslqR
z8`F;P1V2M_yCl(r$O`>?N(gW^F={lf@|I)Vb^VMSj@aP|XLV;!P>+t=`t`SY&NP8r
zVYnt0agvznOwy8`n6ltFcGt1NN_dR5_m1&@&*}Y#NSHDF`19Y3_wAMJKTYRfpF{O9
Q|22pXDrqQ|DOd&nKga`d=>Px#
literal 0
HcmV?d00001
diff --git a/tests/typ/bugs/3662-pdf-smartquotes.typ b/tests/typ/bugs/3662-pdf-smartquotes.typ
new file mode 100644
index 0000000000..36dc8a15d7
--- /dev/null
+++ b/tests/typ/bugs/3662-pdf-smartquotes.typ
@@ -0,0 +1,12 @@
+// Smart quotes were not appearing in the PDF outline, because they didn't
+// implement `PlainText`
+// https://github.com/typst/typst/issues/3662
+
+---
+= It's "Unnormal Heading"
+= It’s “Normal Heading”
+
+#set smartquote(enabled: false)
+= It's "Unnormal Heading"
+= It's 'single quotes'
+= It’s “Normal Heading”
\ No newline at end of file
From cdd8d167cf70c859f933dd93fb41a7e967d64663 Mon Sep 17 00:00:00 2001
From: Ana Gelez
Date: Mon, 25 Mar 2024 17:51:35 +0100
Subject: [PATCH 09/55] Better handle large numbers from external data files
(#3791)
Co-authored-by: Martin Haug
---
Cargo.lock | 2 +-
Cargo.toml | 2 +-
crates/typst/src/foundations/int.rs | 9 ++++++++-
crates/typst/src/loading/cbor.rs | 3 +++
crates/typst/src/loading/json.rs | 17 +++++++++++------
crates/typst/src/loading/yaml.rs | 3 +++
tests/typ/bugs/3363-json-large-number.typ | 8 ++++++++
7 files changed, 35 insertions(+), 9 deletions(-)
create mode 100644 tests/typ/bugs/3363-json-large-number.typ
diff --git a/Cargo.lock b/Cargo.lock
index 9c94d559c8..8215e9e48d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2630,7 +2630,7 @@ dependencies = [
[[package]]
name = "typst-dev-assets"
version = "0.11.0"
-source = "git+https://github.com/typst/typst-dev-assets?tag=v0.11.0#e0ef7ad46f28a440c41bc8e78563ace86cc02678"
+source = "git+https://github.com/typst/typst-dev-assets?rev=ee8ae61cca138dc92f9d818fc7f2fc046d0148c5#ee8ae61cca138dc92f9d818fc7f2fc046d0148c5"
[[package]]
name = "typst-docs"
diff --git a/Cargo.toml b/Cargo.toml
index 439d3edf41..cf0050487c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -26,7 +26,7 @@ typst-svg = { path = "crates/typst-svg", version = "0.11.0" }
typst-syntax = { path = "crates/typst-syntax", version = "0.11.0" }
typst-timing = { path = "crates/typst-timing", version = "0.11.0" }
typst-assets = "0.11.0"
-typst-dev-assets = { git = "https://github.com/typst/typst-dev-assets", tag = "v0.11.0" }
+typst-dev-assets = { git = "https://github.com/typst/typst-dev-assets", rev = "ee8ae61cca138dc92f9d818fc7f2fc046d0148c5" }
az = "1.2"
base64 = "0.22"
bitflags = { version = "2", features = ["serde"] }
diff --git a/crates/typst/src/foundations/int.rs b/crates/typst/src/foundations/int.rs
index ef21f7853a..7b6c02638f 100644
--- a/crates/typst/src/foundations/int.rs
+++ b/crates/typst/src/foundations/int.rs
@@ -261,7 +261,14 @@ macro_rules! unsigned_int {
($($ty:ty)*) => {
$(cast! {
$ty,
- self => Value::Int(self as _),
+ self => if let Ok(int) = i64::try_from(self) {
+ Value::Int(int)
+ } else {
+ // Some u64 are too large to be cast as i64
+ // In that case, we accept that there may be a
+ // precision loss, and use a floating point number
+ Value::Float(self as _)
+ },
v: i64 => v.try_into().map_err(|_| {
if v < 0 {
"number must be at least zero"
diff --git a/crates/typst/src/loading/cbor.rs b/crates/typst/src/loading/cbor.rs
index ddf559f33f..bce0927122 100644
--- a/crates/typst/src/loading/cbor.rs
+++ b/crates/typst/src/loading/cbor.rs
@@ -14,6 +14,9 @@ use crate::World;
/// equivalents, null-values (`null`, `~` or empty ``) will be converted into
/// `{none}`, and numbers will be converted to floats or integers depending on
/// whether they are whole numbers.
+///
+/// Be aware that integers larger than 263-1 will be converted to
+/// floating point numbers, which may result in an approximative value.
#[func(scope, title = "CBOR")]
pub fn cbor(
/// The engine.
diff --git a/crates/typst/src/loading/json.rs b/crates/typst/src/loading/json.rs
index aae1f4ad5b..8e829594b0 100644
--- a/crates/typst/src/loading/json.rs
+++ b/crates/typst/src/loading/json.rs
@@ -9,13 +9,18 @@ use crate::World;
/// Reads structured data from a JSON file.
///
-/// The file must contain a valid JSON object or array. JSON objects will be
-/// converted into Typst dictionaries, and JSON arrays will be converted into
-/// Typst arrays. Strings and booleans will be converted into the Typst
-/// equivalents, `null` will be converted into `{none}`, and numbers will be
-/// converted to floats or integers depending on whether they are whole numbers.
+/// The file must contain a valid JSON value, such as object or array. JSON
+/// objects will be converted into Typst dictionaries, and JSON arrays will be
+/// converted into Typst arrays. Strings and booleans will be converted into the
+/// Typst equivalents, `null` will be converted into `{none}`, and numbers will
+/// be converted to floats or integers depending on whether they are whole
+/// numbers.
///
-/// The function returns a dictionary or an array, depending on the JSON file.
+/// Be aware that integers larger than 263-1 will be converted to
+/// floating point numbers, which may result in an approximative value.
+///
+/// The function returns a dictionary, an array or, depending on the JSON file,
+/// another JSON data type.
///
/// The JSON files in the example contain objects with the keys `temperature`,
/// `unit`, and `weather`.
diff --git a/crates/typst/src/loading/yaml.rs b/crates/typst/src/loading/yaml.rs
index 501e306665..d578eda4cd 100644
--- a/crates/typst/src/loading/yaml.rs
+++ b/crates/typst/src/loading/yaml.rs
@@ -17,6 +17,9 @@ use crate::World;
/// whether they are whole numbers. Custom YAML tags are ignored, though the
/// loaded value will still be present.
///
+/// Be aware that integers larger than 263-1 will be converted to
+/// floating point numbers, which may give an approximative value.
+///
/// The YAML files in the example contain objects with authors as keys,
/// each with a sequence of their own submapping with the keys
/// "title" and "published"
diff --git a/tests/typ/bugs/3363-json-large-number.typ b/tests/typ/bugs/3363-json-large-number.typ
new file mode 100644
index 0000000000..57d37f1b90
--- /dev/null
+++ b/tests/typ/bugs/3363-json-large-number.typ
@@ -0,0 +1,8 @@
+// Big numbers (larger than what i64 can store) should just lose some precision
+// but not overflow
+// https://github.com/typst/typst/issues/3363
+// Ref: false
+
+#let bignum = json("/assets/data/big-number.json")
+
+#bignum
\ No newline at end of file
From 2c6b69ff6d078439e6c3018e901d6bbbb614419a Mon Sep 17 00:00:00 2001
From: Ran Luo
Date: Tue, 2 Apr 2024 04:22:00 +0800
Subject: [PATCH 10/55] Fix compression of punctuation marks at line start of
end (#3744)
---
crates/typst/src/layout/inline/shaping.rs | 2 --
tests/ref/layout/par-justify-cjk.png | Bin 69916 -> 89706 bytes
tests/typ/layout/par-justify-cjk.typ | 13 +++++++++++++
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/crates/typst/src/layout/inline/shaping.rs b/crates/typst/src/layout/inline/shaping.rs
index c346233e30..82a33f9b09 100644
--- a/crates/typst/src/layout/inline/shaping.rs
+++ b/crates/typst/src/layout/inline/shaping.rs
@@ -189,14 +189,12 @@ impl ShapedGlyph {
self.x_offset -= amount;
self.x_advance -= amount;
self.adjustability.shrinkability.0 -= amount;
- self.adjustability.stretchability.0 += amount;
}
/// Shrink the width of glyph on the right side.
pub fn shrink_right(&mut self, amount: Em) {
self.x_advance -= amount;
self.adjustability.shrinkability.1 -= amount;
- self.adjustability.stretchability.1 += amount;
}
}
diff --git a/tests/ref/layout/par-justify-cjk.png b/tests/ref/layout/par-justify-cjk.png
index a9baf14c5b32fc895c95cdffb648f72eb2b52bf5..25adfcb25fa4733797319ac72b280db508aa19b0 100644
GIT binary patch
literal 89706
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