summaryrefslogtreecommitdiff
path: root/library/src/shared
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-11-26 16:59:20 +0100
committerLaurenz <laurmaedje@gmail.com>2022-11-26 17:13:31 +0100
commit0579fd4409375aaa9fd8e87a06fd59097b5fcd97 (patch)
tree0ccf1d6218806b11d83998d568ae1fb0570c67b7 /library/src/shared
parent9db6e533cd8a1d925a7daad92e1b99e6f98ac773 (diff)
Reorganize library base
Diffstat (limited to 'library/src/shared')
-rw-r--r--library/src/shared/mod.rs2
-rw-r--r--library/src/shared/numbering.rs139
2 files changed, 0 insertions, 141 deletions
diff --git a/library/src/shared/mod.rs b/library/src/shared/mod.rs
index 55522190..f54241cf 100644
--- a/library/src/shared/mod.rs
+++ b/library/src/shared/mod.rs
@@ -2,8 +2,6 @@
mod behave;
mod ext;
-mod numbering;
pub use behave::*;
pub use ext::*;
-pub use numbering::*;
diff --git a/library/src/shared/numbering.rs b/library/src/shared/numbering.rs
deleted file mode 100644
index 739edafe..00000000
--- a/library/src/shared/numbering.rs
+++ /dev/null
@@ -1,139 +0,0 @@
-use std::str::FromStr;
-
-use typst::model::{castable, Value};
-use typst::util::{format_eco, EcoString};
-use unscanny::Scanner;
-
-/// A numbering pattern for lists or headings.
-#[derive(Debug, Clone, Eq, PartialEq, Hash)]
-pub struct NumberingPattern {
- prefix: EcoString,
- numbering: NumberingKind,
- upper: bool,
- 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)
- }
-}
-
-impl FromStr for NumberingPattern {
- type Err = &'static str;
-
- fn from_str(pattern: &str) -> Result<Self, Self::Err> {
- 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 })
- }
-}
-
-castable! {
- NumberingPattern,
- Expected: "numbering pattern",
- Value::Str(s) => s.parse()?,
-}
-
-/// Different kinds of numberings.
-#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
-pub enum NumberingKind {
- Arabic,
- Letter,
- Roman,
- Symbol,
-}
-
-impl NumberingKind {
- /// Apply the numbering to the given number.
- pub fn apply(self, mut n: usize) -> EcoString {
- 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);
- n /= 26;
- if n == 0 {
- break;
- }
- }
-
- letters.reverse();
- 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();
- for &(name, value) in &[
- ("M̅", 1000000),
- ("D̅", 500000),
- ("C̅", 100000),
- ("L̅", 50000),
- ("X̅", 10000),
- ("V̅", 5000),
- ("I̅V̅", 4000),
- ("M", 1000),
- ("CM", 900),
- ("D", 500),
- ("CD", 400),
- ("C", 100),
- ("XC", 90),
- ("L", 50),
- ("XL", 40),
- ("X", 10),
- ("IX", 9),
- ("V", 5),
- ("IV", 4),
- ("I", 1),
- ] {
- while n >= value {
- n -= value;
- fmt.push_str(name);
- }
- }
-
- 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;
- std::iter::repeat(symbol).take(amount).collect()
- }
- }
- }
-}