From aef36f39627fdc7151aed0fb7ea110dfbf9cabc2 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 22 Aug 2025 15:04:12 +0200 Subject: [PATCH] Do not consider default ignorables when picking last resort font (#6805) --- crates/typst-library/src/text/font/book.rs | 12 +++++++++--- ...5276-shaping-consecutive-ltr-with-lang.png | Bin 0 -> 179 bytes tests/ref/issue-5490-bidi-invalid-range-2.png | Bin 1496 -> 1596 bytes tests/suite/layout/inline/bidi.typ | 4 ++++ 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 tests/ref/issue-5276-shaping-consecutive-ltr-with-lang.png diff --git a/crates/typst-library/src/text/font/book.rs b/crates/typst-library/src/text/font/book.rs index db100d4f7..c9b8f3065 100644 --- a/crates/typst-library/src/text/font/book.rs +++ b/crates/typst-library/src/text/font/book.rs @@ -7,7 +7,9 @@ use ttf_parser::{PlatformId, Tag, name_id}; use unicode_segmentation::UnicodeSegmentation; use super::exceptions::find_exception; -use crate::text::{Font, FontStretch, FontStyle, FontVariant, FontWeight}; +use crate::text::{ + Font, FontStretch, FontStyle, FontVariant, FontWeight, is_default_ignorable, +}; /// Metadata about a collection of fonts. #[derive(Debug, Default, Clone, Hash)] @@ -99,8 +101,12 @@ impl FontBook { variant: FontVariant, text: &str, ) -> Option { - // Find the fonts that contain the text's first non-space char ... - let c = text.chars().find(|c| !c.is_whitespace())?; + // Find the fonts that contain the text's first non-space and + // non-ignorable char ... + let c = text + .chars() + .find(|&c| !c.is_whitespace() && !is_default_ignorable(c))?; + let ids = self .infos .iter() diff --git a/tests/ref/issue-5276-shaping-consecutive-ltr-with-lang.png b/tests/ref/issue-5276-shaping-consecutive-ltr-with-lang.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7ddb361e4509ee16b41d38cacae3ac67548e15 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^6+kS_0VEhE<%|3RQdOQVjv*Ddl7HAcG$dYm6xi*q zE4Q`c$|J?pk0*PM{{Nrvd)GI=`+kL7xoxrHqa6>etA77DdGTE2|MxOyZCuj3!!y;b z=jIvuZmac8?~cu9D c@kxxC!RJ-`thk#eazU=~boFyt=akR{0N2V%WdHyG literal 0 HcmV?d00001 diff --git a/tests/ref/issue-5490-bidi-invalid-range-2.png b/tests/ref/issue-5490-bidi-invalid-range-2.png index f93b6309b9357530a7d54a360dae4b2743bd9b1b..58f2c40ce8402724912a8d226097a260bfc76073 100644 GIT binary patch delta 1580 zcmV+{2GjZ23%m@FBYy@1NklS zMCU1>6R ziiOXC!`CAaV=Jui{{nVz9t3>0)o8fvyX}L3PpJUtMI4T4pJ*i9qJ`Q<0E2UfFsuqJ zw5t<_8=%h3byO)SkpLVFp*0evosCQl#Ep;*498rkPFyDfYXBswYYx{bT1ov}0QdqX zw1O`3%{c13n19?h5Zo0EJ!5nNaKv$7x!c%cW!|`-&L;;0nddS_!Qz0^sZv+pH3d_= zvL)()V0oB|(x5Z}*!vo=Ocw0r6>>V#^S5^3$oFe*(Bly69a)ZMlUH`ps%$g-k5d+R z>CTMN@Jwo_Du5$xW^5pGr_bgqc{bB?0E#+a@|GExbbl3ne5>W*riVHzcC=UwR>lV# z07#u%L%m;-F>tzlYHW!R+y(jvjQ}*vI6oaa4M2T~Ak2q67%K$-+)wB!o?knjy|(rS zYA1T63c@3Mvm%9HpFUU}^bN$#u}9Lopp-ccnrVXY`{_UXYenFbAB80-HqHMee#8$; zf*gyHe1Gfg>1ppeJ3{o0;l~US7}ep#)Vx~IT+Ax(hVC;TWagr(LJT&%13@PS(LmI4 z#{>Wb;os*a9LQ%7uqLS<0FNExHbgH+r1l$|%Jg?>MOn)@zVNyf}P(Esz+2J`_jYo8Q+S+D! zdTbu+#sHwQnW%no`2LpUpcE1K;5op5^Sq<gq?_|!KpAJ=Y?U-tPb!M zfqkoiu*oAP*p7=aXlKB*FYP2>{aQod$Dhsacwu;_9B31P*QG({=ZzTXi+rI`qfbyK zfPVt8W6lO#M?Wx4pb92NfoMNp^I`+9uu0m7A8d%2*JA-wrg|x_u~?WJR=)O?=W=R zgGFF=x{Q}L06@p|%NPkW67acblKog5j@>Xsa9HLLz#l`GTepefKbvnB3;?IwB!BLe z)nfwKz<&uS%Ufxw%a`7H^rb`7L~vnIumEhDH$IfPhR~B2zcU-0Vms>$pl^l8aBHTm z{e2X^cc8_9>~Q5G)5ALGOM}yd>s$%|_eWP9t4K+z@JaOsw-&Y>sP!>1Y^ZwV0ffbt zm!!Ebu+6EKdevmTe(Z~XG*>(-(|?y%+ti(Yqp(_<-{5ItxGnV35}Y0d@uqTaJdO@CxF3q)FGgI)|qukA8H%N(|QQn%n^a)0*tndFeT zs~?hU-Nkllazq@rsr z#-(_)h}>&TiR#52GHOsH|3~57Mg|(yFX* z9~W;JrY_A_%9e;0`Nrkte&Fi;4-1D45+pm2# zgJpS4Jph2ewi8|P4W__l?tD%Y5j+fNpLHAh*XpaQfFV7At|melU*MTD5xjkz(4sL? zvIwQF?s`bPgZPB-Y+Xeb5gcuRRmtms+%R|0bg|6{ldFRX;m^vpCum6E>Mt|$c?ToE z&U4zjF@M>!5w!1o!o%JD*04x-418Zs0z+}8fL|*C)YmIoM}Uz_p9^ZB=l~h4{}f2R zU`7K`aXs@*`B(oQk$>_s%z)K}T^Nfjjk4jer;=ejqCKtpdp3jH5++8k4#ALqu5I8L zK+Jfx-F~!h)xgCzuo{pVCLdJ^4>;!4Z`yqRylyyIVo0$!!+uk zp9f0z^af(o>2KWYA4H#Bg7J7HjG6>b=Oi)LeBruNoE@H?rmcdmwF%j~)8qwEH?_6fVoc(r!GX!>kX92?jBNm4L=zqO0 znglL$DJW%k!2+-z|0S`dHq};#FS-aAGN|qWv%Y~z2%Ep-(}LYdufD$7YH+b@=p_K! ze&8kWAjH-EDR?oDfIdCgXWG|W9;Wara<3(KaU&53d~w^e1I2}H(flYNpbv*nN}??c z>pNZq0m$IAHkAa%x(dY%dS}H4m48eBQQrz`FWV$`k=A`!FJ@ephg%p{rr+2IpgVSM zc(x3;HimGE=xc6n^IhZ_{}+aK`Off5s7qY^3!ZZ(fluu?l3h*!1EWr2;Ngm9jD>1! zq%e`rfU2oB5b6_XIYcm8{G7eQuE7x1i4!V}haDm!X_;~@84Rsv*a9tc=6~^JBZQX` zo`|=|L*lX4F2}}S0WJ4PE_3<+LI#)4;O2X1NZ{!e^%c{N6>A?Gr=%e*#aOX6%&Oi} z%`#T34l5TZSw@QW;nYW|EF;D0@M0l^i;Wd)!=Wq|E7VvagHLC34_&lJ0~!4oJ$nJW z%+)=VUErC={Ri!|;|ChMz(BJA*aI$oU*P!i#Q|FyX3)|ILnB|oFaj4O9w1B-`HFnU hSBehU0Xtyx^DmcRJZ4mjR`LJ<002ovPDHLkV1jMGxhenv diff --git a/tests/suite/layout/inline/bidi.typ b/tests/suite/layout/inline/bidi.typ index d7601fa1d..103ab6030 100644 --- a/tests/suite/layout/inline/bidi.typ +++ b/tests/suite/layout/inline/bidi.typ @@ -92,3 +92,7 @@ Lריווח #h(1cm) R #text(lang: "ar")[سلام] ], ) + +--- issue-5276-shaping-consecutive-ltr-with-lang --- +#let a = text(lang: "ar")[\u{645}] +#a#a