From e40bf22c23f8760b7337d790c5abb6d22fd7458c Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 23 Jan 2025 17:53:49 +0100 Subject: [PATCH] List items are only paragraphs in wide lists --- crates/typst-layout/src/lists.rs | 24 +++++++--- crates/typst-library/src/model/enum.rs | 15 +++++-- crates/typst-library/src/model/list.rs | 13 ++++-- crates/typst-library/src/model/terms.rs | 22 +++++++-- tests/ref/enum-par.png | Bin 0 -> 3521 bytes tests/ref/html/enum-par.html | 36 +++++++++++++++ tests/ref/html/list-par.html | 36 +++++++++++++++ tests/ref/html/terms-par.html | 42 ++++++++++++++++++ tests/ref/issue-5503-enum-in-align.png | Bin 0 -> 421 bytes ...sue-5503-enum-interrupted-by-par-align.png | Bin 1004 -> 0 bytes ...align.png => issue-5503-list-in-align.png} | Bin ...lign.png => issue-5503-terms-in-align.png} | Bin tests/ref/list-par.png | Bin 0 -> 3319 bytes tests/ref/terms-par.png | Bin 0 -> 3892 bytes tests/suite/model/enum.typ | 38 ++++++++++++---- tests/suite/model/list.typ | 38 ++++++++++++---- tests/suite/model/terms.typ | 40 ++++++++++++----- 17 files changed, 262 insertions(+), 42 deletions(-) create mode 100644 tests/ref/enum-par.png create mode 100644 tests/ref/html/enum-par.html create mode 100644 tests/ref/html/list-par.html create mode 100644 tests/ref/html/terms-par.html create mode 100644 tests/ref/issue-5503-enum-in-align.png delete mode 100644 tests/ref/issue-5503-enum-interrupted-by-par-align.png rename tests/ref/{issue-5503-list-interrupted-by-par-align.png => issue-5503-list-in-align.png} (100%) rename tests/ref/{issue-5503-terms-interrupted-by-par-align.png => issue-5503-terms-in-align.png} (100%) create mode 100644 tests/ref/list-par.png create mode 100644 tests/ref/terms-par.png diff --git a/crates/typst-layout/src/lists.rs b/crates/typst-layout/src/lists.rs index 63127474b..f8d910abf 100644 --- a/crates/typst-layout/src/lists.rs +++ b/crates/typst-layout/src/lists.rs @@ -6,7 +6,7 @@ use typst_library::foundations::{Content, Context, Depth, Packed, StyleChain}; use typst_library::introspection::Locator; use typst_library::layout::grid::resolve::{Cell, CellGrid}; use typst_library::layout::{Axes, Fragment, HAlignment, Regions, Sizing, VAlignment}; -use typst_library::model::{EnumElem, ListElem, Numbering, ParElem}; +use typst_library::model::{EnumElem, ListElem, Numbering, ParElem, ParbreakElem}; use typst_library::text::TextElem; use crate::grid::GridLayouter; @@ -22,8 +22,9 @@ pub fn layout_list( ) -> SourceResult { let indent = elem.indent(styles); let body_indent = elem.body_indent(styles); + let tight = elem.tight(styles); let gutter = elem.spacing(styles).unwrap_or_else(|| { - if elem.tight(styles) { + if tight { ParElem::leading_in(styles).into() } else { ParElem::spacing_in(styles).into() @@ -41,11 +42,17 @@ pub fn layout_list( let mut locator = locator.split(); for item in &elem.children { + // Text in wide lists shall always turn into paragraphs. + let mut body = item.body.clone(); + if !tight { + body += ParbreakElem::shared(); + } + cells.push(Cell::new(Content::empty(), locator.next(&()))); cells.push(Cell::new(marker.clone(), locator.next(&marker.span()))); cells.push(Cell::new(Content::empty(), locator.next(&()))); cells.push(Cell::new( - item.body.clone().styled(ListElem::set_depth(Depth(1))), + body.styled(ListElem::set_depth(Depth(1))), locator.next(&item.body.span()), )); } @@ -78,8 +85,9 @@ pub fn layout_enum( let reversed = elem.reversed(styles); let indent = elem.indent(styles); let body_indent = elem.body_indent(styles); + let tight = elem.tight(styles); let gutter = elem.spacing(styles).unwrap_or_else(|| { - if elem.tight(styles) { + if tight { ParElem::leading_in(styles).into() } else { ParElem::spacing_in(styles).into() @@ -124,11 +132,17 @@ pub fn layout_enum( let resolved = resolved.aligned(number_align).styled(TextElem::set_overhang(false)); + // Text in wide enums shall always turn into paragraphs. + let mut body = item.body.clone(); + if !tight { + body += ParbreakElem::shared(); + } + cells.push(Cell::new(Content::empty(), locator.next(&()))); cells.push(Cell::new(resolved, locator.next(&()))); cells.push(Cell::new(Content::empty(), locator.next(&()))); cells.push(Cell::new( - item.body.clone().styled(EnumElem::set_parents(smallvec![number])), + body.styled(EnumElem::set_parents(smallvec![number])), locator.next(&item.body.span()), )); number = diff --git a/crates/typst-library/src/model/enum.rs b/crates/typst-library/src/model/enum.rs index 4dc834ab7..a4126e72c 100644 --- a/crates/typst-library/src/model/enum.rs +++ b/crates/typst-library/src/model/enum.rs @@ -11,7 +11,9 @@ use crate::foundations::{ }; use crate::html::{attr, tag, HtmlElem}; use crate::layout::{Alignment, BlockElem, Em, HAlignment, Length, VAlignment, VElem}; -use crate::model::{ListItemLike, ListLike, Numbering, NumberingPattern, ParElem}; +use crate::model::{ + ListItemLike, ListLike, Numbering, NumberingPattern, ParElem, ParbreakElem, +}; /// A numbered list. /// @@ -226,6 +228,8 @@ impl EnumElem { impl Show for Packed { fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult { + let tight = self.tight(styles); + if TargetElem::target_in(styles).is_html() { let mut elem = HtmlElem::new(tag::ol); if self.reversed(styles) { @@ -239,7 +243,12 @@ impl Show for Packed { if let Some(nr) = item.number(styles) { li = li.with_attr(attr::value, eco_format!("{nr}")); } - li.with_body(Some(item.body.clone())).pack().spanned(item.span()) + // Text in wide enums shall always turn into paragraphs. + let mut body = item.body.clone(); + if !tight { + body += ParbreakElem::shared(); + } + li.with_body(Some(body)).pack().spanned(item.span()) })); return Ok(elem.with_body(Some(body)).pack().spanned(self.span())); } @@ -249,7 +258,7 @@ impl Show for Packed { .pack() .spanned(self.span()); - if self.tight(styles) { + if tight { let leading = ParElem::leading_in(styles); let spacing = VElem::new(leading.into()).with_weak(true).with_attach(true).pack(); diff --git a/crates/typst-library/src/model/list.rs b/crates/typst-library/src/model/list.rs index 1e369d541..d93ec9172 100644 --- a/crates/typst-library/src/model/list.rs +++ b/crates/typst-library/src/model/list.rs @@ -8,7 +8,7 @@ use crate::foundations::{ }; use crate::html::{tag, HtmlElem}; use crate::layout::{BlockElem, Em, Length, VElem}; -use crate::model::ParElem; +use crate::model::{ParElem, ParbreakElem}; use crate::text::TextElem; /// A bullet list. @@ -141,11 +141,18 @@ impl ListElem { impl Show for Packed { fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult { + let tight = self.tight(styles); + if TargetElem::target_in(styles).is_html() { return Ok(HtmlElem::new(tag::ul) .with_body(Some(Content::sequence(self.children.iter().map(|item| { + // Text in wide lists shall always turn into paragraphs. + let mut body = item.body.clone(); + if !tight { + body += ParbreakElem::shared(); + } HtmlElem::new(tag::li) - .with_body(Some(item.body.clone())) + .with_body(Some(body)) .pack() .spanned(item.span()) })))) @@ -158,7 +165,7 @@ impl Show for Packed { .pack() .spanned(self.span()); - if self.tight(styles) { + if tight { let leading = ParElem::leading_in(styles); let spacing = VElem::new(leading.into()).with_weak(true).with_attach(true).pack(); diff --git a/crates/typst-library/src/model/terms.rs b/crates/typst-library/src/model/terms.rs index c91eeb17a..9a2ed6aad 100644 --- a/crates/typst-library/src/model/terms.rs +++ b/crates/typst-library/src/model/terms.rs @@ -8,7 +8,7 @@ use crate::foundations::{ }; use crate::html::{tag, HtmlElem}; use crate::layout::{Em, HElem, Length, Sides, StackChild, StackElem, VElem}; -use crate::model::{ListItemLike, ListLike, ParElem}; +use crate::model::{ListItemLike, ListLike, ParElem, ParbreakElem}; use crate::text::TextElem; /// A list of terms and their descriptions. @@ -116,17 +116,25 @@ impl TermsElem { impl Show for Packed { fn show(&self, _: &mut Engine, styles: StyleChain) -> SourceResult { let span = self.span(); + let tight = self.tight(styles); + if TargetElem::target_in(styles).is_html() { return Ok(HtmlElem::new(tag::dl) .with_body(Some(Content::sequence(self.children.iter().flat_map( |item| { + // Text in wide term lists shall always turn into paragraphs. + let mut description = item.description.clone(); + if !tight { + description += ParbreakElem::shared(); + } + [ HtmlElem::new(tag::dt) .with_body(Some(item.term.clone())) .pack() .spanned(item.term.span()), HtmlElem::new(tag::dd) - .with_body(Some(item.description.clone())) + .with_body(Some(description)) .pack() .spanned(item.description.span()), ] @@ -139,7 +147,7 @@ impl Show for Packed { let indent = self.indent(styles); let hanging_indent = self.hanging_indent(styles); let gutter = self.spacing(styles).unwrap_or_else(|| { - if self.tight(styles) { + if tight { ParElem::leading_in(styles).into() } else { ParElem::spacing_in(styles).into() @@ -157,6 +165,12 @@ impl Show for Packed { seq.push(child.term.clone().strong()); seq.push((*separator).clone()); seq.push(child.description.clone()); + + // Text in wide term lists shall always turn into paragraphs. + if !tight { + seq.push(ParbreakElem::shared().clone()); + } + children.push(StackChild::Block(Content::sequence(seq))); } @@ -168,7 +182,7 @@ impl Show for Packed { .spanned(span) .padded(padding); - if self.tight(styles) { + if tight { let leading = ParElem::leading_in(styles); let spacing = VElem::new(leading.into()) .with_weak(true) diff --git a/tests/ref/enum-par.png b/tests/ref/enum-par.png new file mode 100644 index 0000000000000000000000000000000000000000..ca923a52623a0bbc725b1b61526478894637f8a7 GIT binary patch literal 3521 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 literal 0 HcmV?d00001 diff --git a/tests/ref/html/enum-par.html b/tests/ref/html/enum-par.html new file mode 100644 index 000000000..60d4592b7 --- /dev/null +++ b/tests/ref/html/enum-par.html @@ -0,0 +1,36 @@ + + + + + + + +
+
    +
  1. Hello
  2. +
  3. World
  4. +
+
+
+
    +
  1. +

    Hello

    +

    From

    +
  2. +
  3. World
  4. +
+
+
+
    +
  1. +

    Hello

    +

    From

    +

    The

    +
  2. +
  3. +

    World

    +
  4. +
+
+ + diff --git a/tests/ref/html/list-par.html b/tests/ref/html/list-par.html new file mode 100644 index 000000000..7c747ff44 --- /dev/null +++ b/tests/ref/html/list-par.html @@ -0,0 +1,36 @@ + + + + + + + +
+
    +
  • Hello
  • +
  • World
  • +
+
+
+
    +
  • +

    Hello

    +

    From

    +
  • +
  • World
  • +
+
+
+
    +
  • +

    Hello

    +

    From

    +

    The

    +
  • +
  • +

    World

    +
  • +
+
+ + diff --git a/tests/ref/html/terms-par.html b/tests/ref/html/terms-par.html new file mode 100644 index 000000000..78bc5df16 --- /dev/null +++ b/tests/ref/html/terms-par.html @@ -0,0 +1,42 @@ + + + + + + + +
+
+
Hello
+
A
+
World
+
B
+
+
+
+
+
Hello
+
+

A

+

From

+
+
World
+
B
+
+
+
+
+
Hello
+
+

A

+

From

+

The

+
+
World
+
+

B

+
+
+
+ + diff --git a/tests/ref/issue-5503-enum-in-align.png b/tests/ref/issue-5503-enum-in-align.png new file mode 100644 index 0000000000000000000000000000000000000000..4857e731bbcc4cc780e07103c6bb34d9dc7ef13a GIT binary patch literal 421 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 BaoPX? literal 0 HcmV?d00001 diff --git a/tests/ref/terms-par.png b/tests/ref/terms-par.png new file mode 100644 index 0000000000000000000000000000000000000000..910b5e5da958249b9e9ae56887aa3dab5b190887 GIT binary patch literal 3892 zcmY*cXFMC;8kW>n+Nv2fiWo&z#a@ZpYR{TQky3jTyEa9Gsu`k2Dn?N&Rw+eQ6t!Bj zH1-~imYe_mf4TR=Ip@pyo$x6PYa?YBO{~N)>1Pjt-+*GMhzs*s;7q3hM0O8X9uz&S!7cc!pi@UFF-`;UQ_bm`|@{57BF-E%g-zi#b4$oD%f zXgHm@%p%%u8PprcK%sPS34j=iqA@p$1@9PngW&h;3)a5tVxr2V+4INjdyl!DAMJ6~ z4k(#t(~ATGVRtw3;OAhzj8}hu|AEhPUy^uX;MR2gedi%jJKWjEwb+E zv-(?{USEvvO1SLJFjI@z>T=DSr!Pbl< zgRmEJVP~Oh6g%7M=L&^F0|VcGgI#002W^5?L9cYE#?g{)SZ=Lo)>H{O=Tnuh z&{|?AEH=1~t`&55cek|2f_i#-jEs!L?Qq@0S0I~1KcFI#a*$8+#S{77@H^Cv2?V4dKFe;yeb znVSnc-k3Z;-KCOWx(qwr*|)qRlEkdS*wTtU&cV98SrnZyN`!Du7yf3?xKCJQ>K}>rzmp<^r@L=lcAt(8#9pRGBz=*|pW_$!Hvj$@dvjo=Ef6acpd%Rz z{Z&9XTMj8NhZTQbx9r4edwZuTG`A~;6wG&oh4Z0}?Y*uJk7kZ5Ti=56@%P;o!`8r1 z95U~}cZ%6;*7VNIAiBwd)Ex$0qoX3cRrJFDY^yG#6V@@dRmP8Ad`(RB#z%LC2_7HS z?#IQ>&GO0RY}}r|t*( z)XVy{nZQs3X&xWC=I70?ahE;i^xvKL`re*Dbh7?EhxX{&f@YSOHF0G|?9X41fpqs$ z*2cIv;a}t4-j%u8tL3N575e>t7oXWXvDQ;4`;^V#nE=H73iVdsH$LCpA|vplMJ~Dd z`T9i@sY+s2)BJ){V`2N5e2Qk8YYx}B>`dBGqlJ2vhCTd{i5Iu2wg|KR{TgSb$(3T%<^b zF4ZVTWHH$9yhg8Vh6OfH2@!f#1|pgp#Oi#-!AtUih`F5fs|V04<7pfpB9xd7&MP86 z))k}Wyy9pXKfzD<15ucJ4M2tY>r%&nb?&3!8#@s(;)|jH|Kc zIGAj^?n^Q7B9JFhNB{ADY1CYETb*9sbe8B|AB~>&0oOG5@ddp0@E0R_BLKC%WtV@t zo)3df(#YJj0V{T#CnQ?Sm{31JnhO?c=|_#Q+B+qwRM`L&|&h}SyqA9V7J+V}*rO;Sf0pO<)vwKE|LKZc*-uw)8?=iAk@+#5y zx%d+z7Nao>u)P9q2gHzgla~j^k&WD*Yi7OpfkL5PF~P~wQq^Fzm5F?)D8mL9y|gxl zBRWIP(r9^sAr2jL?W9W{a55!r9wgx!x49KG5z3=08L(k$qh?oCOrmdIyT@*BRxNf^ zK{uT3(_%FIX_*;p0LvVinVAj_4umZI+NG$sbuh>5-M>DVX zR5!bh7ExcIri`fJeb4Y1*aefrb+MQ=8uO0O0RN=@62b^xWWPeovc%=8dE1>|DA~zc zdle=)zG4O!;%7$z3S9Qi5x2KfqX2aReZ*q=Lr-^XI}suL$c(yoO-=Ol^v;4`088v| zoSnVA47e*;W9_Iw+a6r;R}~lEPK3dE!i_WXu17qmnma6;6oQv!Wl)SK#jl61mh0sk zs_iaxMf&?gvW$w~)z|k_h){qmET+~*^3l*(+_h5Ox;5B9z|jkNd~QFT4~HzhAm7S= zeay%INq3Uq1;iV>p0UQ1tGzZ8uZ}9wxD~>bWpWib;t0mZð3J!Q`ss(-k-mX;;$ zv2{brkd`B)S(g=Qm`x_p^xJf~q8wBXjjg5<$!(lR7Z%vHbRa+jVZIhc^TogS_0cvs@#ZjVpN*Ig!k_e=?3}O2k$!sn!oR-U0 zVUBh4=6L2If~bcGT{g)*cN&xP*#Pj=7~xy!?&ug2jnNGK90;3x3*2`JBYWgdHy|Dx zCex#1TU#fPY5dhP&p1_PQ{>*g(DplMrcU1_1W+^c?^3OIXDZtH11}2v?Y02PY(}x% z!~;pHrCV4s!A?uCxOtQ}iA}Ptq<5wU*c!(ZX);wDG32T=Dl`PfsZE|OD$kg=LfRSK zt9%L}tDiD^>mgdTJn^MjCW$}Cc(gV8pd4gvfgXN^qZIzCsve*+C&O#w+JC*T`5UX)+3_AbwP0;;IyyR5x8333eSExO zwieEF2i$MX_UQ|cZmbU5j5vZqyI?4LxRf!zxyrulAX~(O+&}Yb40X)9-EGx;y;A{R zu5?A_$=(b~LBGVC)1%&Tl+J}fD*;iURg4a!DdWEok=R?~m={FvQZHSS7gOqIy}@X(Jth(T6jOJT-XK zg!Sbbc#7Y!vcquSIHt7BG`JVoDgv-AK!qc!GymAvD+Uk!bRpLYnUk{PAP&Expd&1k zV_%B?H2H+V7Y?$#c5R5|>6;y!W{D8U@>?+5tX z73-1&$P%6}9mRkQ=S#d-eea9A>`uM~h*Li5z({GfvX@zqH~u3}|E9se-c$f}*{OaS zZ?Qo7uk*{F{94{(YOl{JMsWqT!UVq+6?IH`F-ctF%f!u1{#N z)t^r;*tAVSGZJZSFZTBGw1TTXy~{MJDpZ*Ls;}*1lttt9E=tjhnEjW08*b88dS&EJ zBvE$xc__>e2#VKP#X9t2Kon^wtaPU#?T`+(TR5vc^%Weh=)tGO%wSIGYKh&Pk&Z02 z&6?*6O;tP-!N+U&;lZcuw>X|bAME;fl$lsC<`V$B!dS{G(n?;sh`arabrem&wH;S zOcg|i(^RGH);&Bt;wxMdfpDU7g13~=O-f30Du|hvr>B|A!&3@>n}Q-=5lW6qC1cl? zNPDKD1b-|EZN&MpDb7t&HOh9rRJ!e6lTzcLMTsV6sFP%l3_Xf++#Ug(U~W!>POF!E zS;4;d`EE@dJo&(TlLa6K1OHFc2_zc4kGvAH(6Jo`a$6#G!(`g(`f4?*k7ND=UUYA0 literal 0 HcmV?d00001 diff --git a/tests/suite/model/enum.typ b/tests/suite/model/enum.typ index 288392d45..7176b04e2 100644 --- a/tests/suite/model/enum.typ +++ b/tests/suite/model/enum.typ @@ -183,22 +183,44 @@ a + 0. #set enum(number-align: horizon) #set enum(number-align: bottom) +--- enum-par render html --- +// Check whether the contents of enum items become paragraphs. +#show par: it => if target() != "html" { highlight(it) } else { it } + +// No paragraphs. +#block[ + + Hello + + World +] + +#block[ + + Hello // Paragraphs + + From + + World // No paragraph because it's a tight enum +] + +#block[ + + Hello // Paragraphs + + From + + The + + + World // Paragraph because it's a wide enum +] + --- issue-2530-enum-item-panic --- // Enum item (pre-emptive) #enum.item(none)[Hello] #enum.item(17)[Hello] ---- issue-5503-enum-interrupted-by-par-align --- -// `align` is block-level and should interrupt an enum -// but not a `par` +--- issue-5503-enum-in-align --- +// `align` is block-level and should interrupt an enum. + a + b -#par(leading: 5em)[+ par] +#align(right)[+ c] + d -#par[+ par] -+ f -#align(right)[+ align] -+ h --- issue-5719-enum-nested --- // Enums can be immediately nested. diff --git a/tests/suite/model/list.typ b/tests/suite/model/list.typ index 96ddf3c18..9bed930bb 100644 --- a/tests/suite/model/list.typ +++ b/tests/suite/model/list.typ @@ -238,6 +238,33 @@ World #text(red)[- World] #text(green)[- What up?] +--- list-par render html --- +// Check whether the contents of list items become paragraphs. +#show par: it => if target() != "html" { highlight(it) } else { it } + +#block[ + // No paragraphs. + - Hello + - World +] + +#block[ + - Hello // Paragraphs + + From + - World // No paragraph because it's a tight list. +] + +#block[ + - Hello // Paragraphs either way + + From + + The + + - World // Paragraph because it's a wide list. +] + --- issue-2530-list-item-panic --- // List item (pre-emptive) #list.item[Hello] @@ -262,18 +289,11 @@ World part($ x $ + parbreak() + parbreak() + list[A]) } ---- issue-5503-list-interrupted-by-par-align --- -// `align` is block-level and should interrupt a list -// but not a `par` +--- issue-5503-list-in-align --- +// `align` is block-level and should interrupt a list. #show list: [List] - a - b -#par(leading: 5em)[- c] -- d -- e -#par[- f] -- g -- h #align(right)[- i] - j diff --git a/tests/suite/model/terms.typ b/tests/suite/model/terms.typ index 23ac6e513..103a8033e 100644 --- a/tests/suite/model/terms.typ +++ b/tests/suite/model/terms.typ @@ -59,6 +59,34 @@ Not in list // Error: 8 expected colon / Hello +--- terms-par render html --- +// Check whether the contents of term list items become paragraphs. +#show par: it => if target() != "html" { highlight(it) } else { it } + +// No paragraphs. +#block[ + / Hello: A + / World: B +] + +#block[ + / Hello: A // Paragraphs + + From + / World: B // No paragraphs because it's a tight term list. +] + +#block[ + / Hello: A // Paragraphs + + From + + The + + / World: B // Paragraph because it's a wide term list. +] + + --- issue-1050-terms-indent --- #set page(width: 110pt) #set par(first-line-indent: 0.5cm) @@ -76,18 +104,10 @@ Not in list // Term item (pre-emptive) #terms.item[Hello][World!] ---- issue-5503-terms-interrupted-by-par-align --- -// `align` is block-level and should interrupt a `terms` -// but not a `par` +--- issue-5503-terms-in-align --- +// `align` is block-level and should interrupt a `terms`. #show terms: [Terms] / a: a -/ b: b -#par(leading: 5em)[/ c: c] -/ d: d -/ e: e -#par[/ f: f] -/ g: g -/ h: h #align(right)[/ i: i] / j: j