From d3620df4c63b5856832b23b26eba71aecd9f543e Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Mon, 16 Dec 2024 08:45:57 -0500 Subject: [PATCH] Add reversed numbering (#5563) --- crates/typst-layout/src/lists.rs | 8 ++++-- crates/typst-library/src/model/enum.rs | 23 +++++++++++++++--- .../ref/enum-numbering-reversed-overriden.png | Bin 0 -> 666 bytes tests/ref/enum-numbering-reversed.png | Bin 0 -> 620 bytes tests/suite/model/enum.typ | 17 +++++++++++++ 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 tests/ref/enum-numbering-reversed-overriden.png create mode 100644 tests/ref/enum-numbering-reversed.png diff --git a/crates/typst-layout/src/lists.rs b/crates/typst-layout/src/lists.rs index 08c2a2f45..0d51a1e4e 100644 --- a/crates/typst-layout/src/lists.rs +++ b/crates/typst-layout/src/lists.rs @@ -74,6 +74,7 @@ pub fn layout_enum( regions: Regions, ) -> SourceResult { let numbering = elem.numbering(styles); + let reversed = elem.reversed(styles); let indent = elem.indent(styles); let body_indent = elem.body_indent(styles); let gutter = elem.spacing(styles).unwrap_or_else(|| { @@ -86,7 +87,9 @@ pub fn layout_enum( let mut cells = vec![]; let mut locator = locator.split(); - let mut number = elem.start(styles); + let mut number = + elem.start(styles) + .unwrap_or_else(|| if reversed { elem.children.len() } else { 1 }); let mut parents = EnumElem::parents_in(styles); let full = elem.full(styles); @@ -127,7 +130,8 @@ pub fn layout_enum( item.body.clone().styled(EnumElem::set_parents(smallvec![number])), locator.next(&item.body.span()), )); - number = number.saturating_add(1); + number = + if reversed { number.saturating_sub(1) } else { number.saturating_add(1) }; } let grid = CellGrid::new( diff --git a/crates/typst-library/src/model/enum.rs b/crates/typst-library/src/model/enum.rs index e0121ba24..eb3c2ea45 100644 --- a/crates/typst-library/src/model/enum.rs +++ b/crates/typst-library/src/model/enum.rs @@ -9,7 +9,7 @@ use crate::foundations::{ cast, elem, scope, Array, Content, NativeElement, Packed, Show, Smart, StyleChain, Styles, TargetElem, }; -use crate::html::{attr, tag, HtmlElem}; +use crate::html::{attr, tag, HtmlAttr, HtmlElem}; use crate::layout::{Alignment, BlockElem, Em, HAlignment, Length, VAlignment, VElem}; use crate::model::{ListItemLike, ListLike, Numbering, NumberingPattern, ParElem}; @@ -127,8 +127,7 @@ pub struct EnumElem { /// [Ahead], /// ) /// ``` - #[default(1)] - pub start: usize, + pub start: Smart, /// Whether to display the full numbering, including the numbers of /// all parent enumerations. @@ -144,6 +143,17 @@ pub struct EnumElem { #[default(false)] pub full: bool, + /// Whether to reverse the numbering for this enumeration. + /// + /// ```example + /// #set enum(reversed: true) + /// + Coffee + /// + Tea + /// + Milk + /// ``` + #[default(false)] + pub reversed: bool, + /// The indentation of each item. #[resolve] pub indent: Length, @@ -217,7 +227,12 @@ impl EnumElem { impl Show for Packed { fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult { if TargetElem::target_in(styles).is_html() { - return Ok(HtmlElem::new(tag::ol) + let mut elem = HtmlElem::new(tag::ol); + if self.reversed(styles) { + elem = + elem.with_attr(const { HtmlAttr::constant("reversed") }, "reversed"); + } + return Ok(elem .with_body(Some(Content::sequence(self.children.iter().map(|item| { let mut li = HtmlElem::new(tag::li); if let Some(nr) = item.number(styles) { diff --git a/tests/ref/enum-numbering-reversed-overriden.png b/tests/ref/enum-numbering-reversed-overriden.png new file mode 100644 index 0000000000000000000000000000000000000000..827f38d1d57648b5a673159ab19f849df0198375 GIT binary patch literal 666 zcmV;L0%iS)P)<7Vw)<{`yZN`diYAYt0Tl?Ym3C?!T&h?0=E}rkz`|ib;=kR<_4gS%oVVGft8U8Eq zH&3N=iUJw@T$7a=F14Eq{;tfUa?A_uRPe0}rXv#V)xO@AB7*f#a4=AAXg_?sbe{0ZV&{VA!30+>8Q1PJb8_`|Kp1AYN_f)wK+NmS4r7=K-t3r~6FasW zZx2zyUrnE-PBdn%lT`5P#9*fc@3^PZ5Pn=+^U{rh=6NDGkxbViloR?(Jj?Vn;WTQB%QgqfyL@F90No;N<8t3EuA~ zoUzV$sx?&ZGZTa`^3#J@EePqU+W=;%;7o7l`sHw`-}T=f|H%u4VTP-PbDj+`Z>a31 z_f&AaE7&e}M1fS#FcCat$FXJEe>EC@(7+Gda%!I(KJB7`F*{zHmBWYqL@=x_q)HWU z1Xh$Ff=Apy$0s56iZRE)8ZQur8Lk#CMx`9;8P>g`f>Y;To)bINfV7PYo^M-Mi@nl> zFsNYk)`lc_`{)5Oc;RZWE>pR2gbcRKL7ga;I@Sa{N)y4$n#Xr>GAMNa&Jl}}7YM@) zR}25n=6~hOeaB!kc&T8=z7xBWF zl<_?P9o**wR6!v%Tiy`DYXAzoxfo`c;r|}~1Cu#{AAX{UQUCw|07*qoM6N<$f?anv Ak^lez literal 0 HcmV?d00001 diff --git a/tests/ref/enum-numbering-reversed.png b/tests/ref/enum-numbering-reversed.png new file mode 100644 index 0000000000000000000000000000000000000000..12d77df45ae3408bddf5f972aa4510d1f077ac8d GIT binary patch literal 620 zcmV-y0+aoTP)0(K(MrbiwL%b*utJx2WZEZHh`Rhp0upkz! zCa$O?(B?GfX^z^~4rn_z=RrC<=M$X$Fz>v1Cg}5Ay}vili-!lkC0L_VLSYJ1ctgO6 zAEKKj34iTL6#C6=%Xw=yKis{eia80w{hqKU-vJ#UH)Ok>gBlPo;*p|-4)ehx% z>wqm;xYHPqN~Pi0Zvt>^fiJ@sL1}hZ7{V)lXOh*RJSlC*x4k02sAUi(08g16aXil5 z9JksS2@|ch`B0z>BB&AO3ZEe1Fh^<{{GXunQ~TUj5kUQow$}MHr4Z zqc=VMH#Zrbm{iM4i)!5OBn*2swOX`9lt%EfA&Q5FKKYT=ZW8DMq44^Gg$SZ4!f>Qe zfirUebUr*0?KR1YA)>Hk-n2YawgIDCfg}