From 56923ee472f1eaa67d3543e19372823139205885 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 2 Dec 2022 15:47:25 +0100 Subject: [PATCH] Multi-part numbering patterns --- Cargo.lock | 1 - library/Cargo.toml | 1 - library/src/basics/list.rs | 19 +++--- library/src/compute/utility.rs | 105 ++++++++++++++++++++------------- src/model/library.rs | 2 +- src/syntax/ast.rs | 2 +- src/syntax/kind.rs | 3 +- src/syntax/tokens.rs | 12 ++-- src/util/eco.rs | 8 +++ tests/ref/compute/utility.png | Bin 34441 -> 34604 bytes tests/typ/basics/enum.typ | 4 +- tests/typ/compute/utility.typ | 15 +++-- 12 files changed, 105 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0bd6322a8..222e1c985 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1182,7 +1182,6 @@ dependencies = [ "unicode-bidi", "unicode-math", "unicode-script", - "unscanny", "xi-unicode", ] diff --git a/library/Cargo.toml b/library/Cargo.toml index e0a0c1f61..92bf84a28 100644 --- a/library/Cargo.toml +++ b/library/Cargo.toml @@ -27,5 +27,4 @@ typed-arena = "2" unicode-bidi = "0.3.5" unicode-math = { git = "https://github.com/s3bk/unicode-math/" } unicode-script = "0.5" -unscanny = "0.1" xi-unicode = "0.3" diff --git a/library/src/basics/list.rs b/library/src/basics/list.rs index f5a589772..16c2ba646 100644 --- a/library/src/basics/list.rs +++ b/library/src/basics/list.rs @@ -44,12 +44,13 @@ impl ListNode { .map(|body| ListItem::List(Box::new(body))) .collect(), ENUM => { - let mut number: usize = args.named("start")?.unwrap_or(1); + let mut number: NonZeroUsize = + args.named("start")?.unwrap_or(NonZeroUsize::new(1).unwrap()); args.all()? .into_iter() .map(|body| { let item = ListItem::Enum(Some(number), Box::new(body)); - number += 1; + number = number.saturating_add(1); item }) .collect() @@ -83,7 +84,7 @@ impl Layout for ListNode { regions: &Regions, ) -> SourceResult { let mut cells = vec![]; - let mut number = 1; + let mut number = NonZeroUsize::new(1).unwrap(); let label = styles.get(Self::LABEL); let indent = styles.get(Self::INDENT); @@ -124,7 +125,7 @@ impl Layout for ListNode { }; cells.push(body.styled_with_map(map.clone())); - number += 1; + number = number.saturating_add(1); } GridNode { @@ -147,7 +148,7 @@ pub enum ListItem { /// An item of an unordered list. List(Box), /// An item of an ordered list. - Enum(Option, Box), + Enum(Option, Box), /// An item of a description list. Desc(Box), } @@ -168,7 +169,7 @@ impl ListItem { Self::List(body) => Value::Content(body.as_ref().clone()), Self::Enum(number, body) => Value::Dict(dict! { "number" => match *number { - Some(n) => Value::Int(n as i64), + Some(n) => Value::Int(n.get() as i64), None => Value::None, }, "body" => Value::Content(body.as_ref().clone()), @@ -234,7 +235,7 @@ impl Label { &self, vt: &Vt, kind: ListKind, - number: usize, + number: NonZeroUsize, ) -> SourceResult { Ok(match self { Self::Default => match kind { @@ -242,10 +243,10 @@ impl Label { ENUM => TextNode::packed(format_eco!("{}.", number)), DESC | _ => panic!("description lists don't have a label"), }, - Self::Pattern(pattern) => TextNode::packed(pattern.apply(number)), + Self::Pattern(pattern) => TextNode::packed(pattern.apply(&[number])), Self::Content(content) => content.clone(), Self::Func(func, span) => { - let args = Args::new(*span, [Value::Int(number as i64)]); + let args = Args::new(*span, [Value::Int(number.get() as i64)]); func.call_detached(vt.world(), args)?.display() } }) diff --git a/library/src/compute/utility.rs b/library/src/compute/utility.rs index 2b04dfd6f..196f83685 100644 --- a/library/src/compute/utility.rs +++ b/library/src/compute/utility.rs @@ -1,8 +1,7 @@ use std::str::FromStr; -use unscanny::Scanner; - use crate::prelude::*; +use crate::text::Case; /// Create a blind text string. pub fn lorem(_: &Vm, args: &mut Args) -> SourceResult { @@ -12,9 +11,9 @@ pub fn lorem(_: &Vm, args: &mut Args) -> SourceResult { /// Apply a numbering pattern to a number. pub fn numbering(_: &Vm, args: &mut Args) -> SourceResult { - let number = args.expect::("number")?; let pattern = args.expect::("pattern")?; - Ok(Value::Str(pattern.apply(number).into())) + let numbers = args.all::()?; + Ok(Value::Str(pattern.apply(&numbers).into())) } /// How to turn a number into text. @@ -28,18 +27,34 @@ pub fn numbering(_: &Vm, args: &mut Args) -> SourceResult { /// - `(I)` #[derive(Debug, Clone, Eq, PartialEq, Hash)] pub struct NumberingPattern { - prefix: EcoString, - numbering: NumberingKind, - upper: bool, + pieces: Vec<(EcoString, NumberingKind, Case)>, suffix: EcoString, } impl NumberingPattern { /// Apply the pattern to the given number. - pub fn apply(&self, n: usize) -> EcoString { - let fmt = self.numbering.apply(n); - let mid = if self.upper { fmt.to_uppercase() } else { fmt.to_lowercase() }; - format_eco!("{}{}{}", self.prefix, mid, self.suffix) + pub fn apply(&self, numbers: &[NonZeroUsize]) -> EcoString { + let mut fmt = EcoString::new(); + let mut numbers = numbers.into_iter(); + + for ((prefix, kind, case), &n) in self.pieces.iter().zip(&mut numbers) { + fmt.push_str(prefix); + fmt.push_str(&kind.apply(n, *case)); + } + + for ((prefix, kind, case), &n) in + self.pieces.last().into_iter().cycle().zip(numbers) + { + if prefix.is_empty() { + fmt.push_str(&self.suffix); + } else { + fmt.push_str(prefix); + } + fmt.push_str(&kind.apply(n, *case)); + } + + fmt.push_str(&self.suffix); + fmt } } @@ -47,22 +62,30 @@ impl FromStr for NumberingPattern { type Err = &'static str; fn from_str(pattern: &str) -> Result { - let mut s = Scanner::new(pattern); - let mut prefix; - let numbering = loop { - prefix = s.before(); - match s.eat().map(|c| c.to_ascii_lowercase()) { - Some('1') => break NumberingKind::Arabic, - Some('a') => break NumberingKind::Letter, - Some('i') => break NumberingKind::Roman, - Some('*') => break NumberingKind::Symbol, - Some(_) => {} - None => Err("invalid numbering pattern")?, - } - }; - let upper = s.scout(-1).map_or(false, char::is_uppercase); - let suffix = s.after().into(); - Ok(Self { prefix: prefix.into(), numbering, upper, suffix }) + let mut pieces = vec![]; + let mut handled = 0; + + for (i, c) in pattern.char_indices() { + let kind = match c.to_ascii_lowercase() { + '1' => NumberingKind::Arabic, + 'a' => NumberingKind::Letter, + 'i' => NumberingKind::Roman, + '*' => NumberingKind::Symbol, + _ => continue, + }; + + let prefix = pattern[handled..i].into(); + let case = if c.is_uppercase() { Case::Upper } else { Case::Lower }; + pieces.push((prefix, kind, case)); + handled = i + 1; + } + + let suffix = pattern[handled..].into(); + if pieces.is_empty() { + Err("invalid numbering pattern")?; + } + + Ok(Self { pieces, suffix }) } } @@ -83,21 +106,22 @@ enum NumberingKind { impl NumberingKind { /// Apply the numbering to the given number. - pub fn apply(self, mut n: usize) -> EcoString { + pub fn apply(self, n: NonZeroUsize, case: Case) -> EcoString { + let mut n = n.get(); match self { Self::Arabic => { format_eco!("{n}") } Self::Letter => { - if n == 0 { - return '-'.into(); - } - n -= 1; let mut letters = vec![]; loop { - letters.push(b'a' + (n % 26) as u8); + let c = b'a' + (n % 26) as u8; + letters.push(match case { + Case::Lower => c, + Case::Upper => c.to_ascii_uppercase(), + }); n /= 26; if n == 0 { break; @@ -108,10 +132,6 @@ impl NumberingKind { String::from_utf8(letters).unwrap().into() } Self::Roman => { - if n == 0 { - return 'N'.into(); - } - // Adapted from Yann Villessuzanne's roman.rs under the // Unlicense, at https://github.com/linfir/roman.rs/ let mut fmt = EcoString::new(); @@ -139,17 +159,18 @@ impl NumberingKind { ] { while n >= value { n -= value; - fmt.push_str(name); + for c in name.chars() { + match case { + Case::Lower => fmt.extend(c.to_lowercase()), + Case::Upper => fmt.push(c), + } + } } } fmt } Self::Symbol => { - if n == 0 { - return '-'.into(); - } - const SYMBOLS: &[char] = &['*', '†', '‡', '§', '¶', '‖']; let symbol = SYMBOLS[(n - 1) % SYMBOLS.len()]; let amount = ((n - 1) / SYMBOLS.len()) + 1; diff --git a/src/model/library.rs b/src/model/library.rs index eee696753..c890fef17 100644 --- a/src/model/library.rs +++ b/src/model/library.rs @@ -60,7 +60,7 @@ pub struct LangItems { /// An item in an unordered list: `- ...`. pub list_item: fn(body: Content) -> Content, /// An item in an enumeration (ordered list): `+ ...` or `1. ...`. - pub enum_item: fn(number: Option, body: Content) -> Content, + pub enum_item: fn(number: Option, body: Content) -> Content, /// An item in a description list: `/ Term: Details`. pub desc_item: fn(term: Content, body: Content) -> Content, /// A mathematical formula: `$x$`, `$ x^2 $`. diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 81ddd596f..3c60acbb8 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -365,7 +365,7 @@ node! { impl EnumItem { /// The explicit numbering, if any: `23.`. - pub fn number(&self) -> Option { + pub fn number(&self) -> Option { self.0.children().find_map(|node| match node.kind() { SyntaxKind::EnumNumbering(num) => Some(*num), _ => None, diff --git a/src/syntax/kind.rs b/src/syntax/kind.rs index b7ee6a793..a7425d70a 100644 --- a/src/syntax/kind.rs +++ b/src/syntax/kind.rs @@ -1,4 +1,5 @@ use std::hash::{Hash, Hasher}; +use std::num::NonZeroUsize; use std::sync::Arc; use crate::geom::{AbsUnit, AngleUnit}; @@ -164,7 +165,7 @@ pub enum SyntaxKind { /// An item in an enumeration (ordered list): `+ ...` or `1. ...`. EnumItem, /// An explicit enumeration numbering: `23.`. - EnumNumbering(usize), + EnumNumbering(NonZeroUsize), /// An item in a description list: `/ Term: Details`. DescItem, /// A mathematical formula: `$x$`, `$ x^2 $`. diff --git a/src/syntax/tokens.rs b/src/syntax/tokens.rs index e0ef2fa1a..e7015bb2e 100644 --- a/src/syntax/tokens.rs +++ b/src/syntax/tokens.rs @@ -1,3 +1,4 @@ +use std::num::NonZeroUsize; use std::sync::Arc; use unicode_xid::UnicodeXID; @@ -395,8 +396,11 @@ impl<'s> Tokens<'s> { self.s.eat_while(char::is_ascii_digit); let read = self.s.from(start); if self.s.eat_if('.') { - if let Ok(number) = read.parse() { - return SyntaxKind::EnumNumbering(number); + if let Ok(number) = read.parse::() { + return match NonZeroUsize::new(number) { + Some(number) => SyntaxKind::EnumNumbering(number), + None => SyntaxKind::Error(ErrorPos::Full, "must be positive".into()), + }; } } @@ -933,8 +937,8 @@ mod tests { t!(Markup["a "]: r"a--" => Text("a"), Shorthand('\u{2013}')); t!(Markup["a1/"]: "- " => Minus, Space(0)); t!(Markup[" "]: "+" => Plus); - t!(Markup[" "]: "1." => EnumNumbering(1)); - t!(Markup[" "]: "1.a" => EnumNumbering(1), Text("a")); + t!(Markup[" "]: "1." => EnumNumbering(NonZeroUsize::new(1).unwrap())); + t!(Markup[" "]: "1.a" => EnumNumbering(NonZeroUsize::new(1).unwrap()), Text("a")); t!(Markup[" /"]: "a1." => Text("a1.")); } diff --git a/src/util/eco.rs b/src/util/eco.rs index 5a4d76293..8f5195044 100644 --- a/src/util/eco.rs +++ b/src/util/eco.rs @@ -368,6 +368,14 @@ impl FromIterator for EcoString { } } +impl Extend for EcoString { + fn extend>(&mut self, iter: T) { + for c in iter { + self.push(c); + } + } +} + impl From for String { fn from(s: EcoString) -> Self { match s.0 { diff --git a/tests/ref/compute/utility.png b/tests/ref/compute/utility.png index 035ce431d19661489f0d69f6cfa8d471fbebfa24..79e3096d4c726c25e95262e30721e0f0cf1cd15b 100644 GIT binary patch delta 18524 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

-mNVD= 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 z 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 diff --git a/tests/typ/basics/enum.typ b/tests/typ/basics/enum.typ index d4c30385f..0c62a2de9 100644 --- a/tests/typ/basics/enum.typ +++ b/tests/typ/basics/enum.typ @@ -12,7 +12,7 @@ --- // Test automatic numbering in summed content. #for i in range(5) { - [+ #numbering(1 + i, "I")] + [+ #numbering("I", 1 + i)] } --- @@ -42,7 +42,7 @@ start: 4, spacing: 0.65em - 3pt, tight: false, - label: n => text(fill: (red, green, blue)(mod(n, 3)), numbering(n, "A")), + label: n => text(fill: (red, green, blue)(mod(n, 3)), numbering("A", n)), [Red], [Green], [Blue], ) diff --git a/tests/typ/compute/utility.typ b/tests/typ/compute/utility.typ index f042c7697..cfc2e8af1 100644 --- a/tests/typ/compute/utility.typ +++ b/tests/typ/compute/utility.typ @@ -32,13 +32,18 @@ #lorem() --- -#for i in range(9) { - numbering(i, "* and ") - numbering(i, "I") +#for i in range(1, 9) { + numbering("*", i) + [ and ] + numbering("I.a", i, i) [ for #i] parbreak() } --- -// Error: 12-14 must be at least zero -#numbering(-1, "1") +// Error: 17-18 must be positive +#numbering("1", 0) + +--- +// Error: 17-19 must be positive +#numbering("1", -1)