diff options
| author | +merlan #flirora <uruwi@protonmail.com> | 2024-12-16 08:45:57 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-16 13:45:57 +0000 |
| commit | d3620df4c63b5856832b23b26eba71aecd9f543e (patch) | |
| tree | ed453720634c2da05186680e551e2cb6564eab07 /crates | |
| parent | 7f139517b9ba8cf4f51083d5387971571d1aa950 (diff) | |
Add reversed numbering (#5563)
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/typst-layout/src/lists.rs | 8 | ||||
| -rw-r--r-- | crates/typst-library/src/model/enum.rs | 23 |
2 files changed, 25 insertions, 6 deletions
diff --git a/crates/typst-layout/src/lists.rs b/crates/typst-layout/src/lists.rs index 08c2a2f4..0d51a1e4 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<Fragment> { 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 e0121ba2..eb3c2ea4 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<usize>, /// 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<EnumElem> { fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> { 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) { |
