summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaim A <227396+naim94a@users.noreply.github.com>2023-04-01 17:05:06 +0300
committerGitHub <noreply@github.com>2023-04-01 16:05:06 +0200
commit66a22b555544694d99b8d710fdd2edb9f8deae8a (patch)
tree0c833a881cb3de8befac3264226be2581efd1439
parented79ecbb44a3132f23e3bd4d797009b5c3282fe3 (diff)
Hebrew numbering (#446)
-rw-r--r--library/src/meta/numbering.rs58
-rw-r--r--tests/ref/meta/numbering.pngbin8235 -> 39055 bytes
-rw-r--r--tests/typ/meta/numbering.typ9
3 files changed, 66 insertions, 1 deletions
diff --git a/library/src/meta/numbering.rs b/library/src/meta/numbering.rs
index 0827e160..07796981 100644
--- a/library/src/meta/numbering.rs
+++ b/library/src/meta/numbering.rs
@@ -215,7 +215,7 @@ impl FromStr for NumberingPattern {
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;
+ handled = c.len_utf8() + i;
}
let suffix = pattern[handled..].into();
@@ -255,6 +255,7 @@ enum NumberingKind {
Letter,
Roman,
Symbol,
+ Hebrew,
}
impl NumberingKind {
@@ -265,6 +266,7 @@ impl NumberingKind {
'a' => NumberingKind::Letter,
'i' => NumberingKind::Roman,
'*' => NumberingKind::Symbol,
+ 'א' => NumberingKind::Hebrew,
_ => return None,
})
}
@@ -276,6 +278,7 @@ impl NumberingKind {
Self::Letter => 'a',
Self::Roman => 'i',
Self::Symbol => '*',
+ Self::Hebrew => 'א',
}
}
@@ -360,6 +363,59 @@ impl NumberingKind {
let symbol = SYMBOLS[(n - 1) % SYMBOLS.len()];
let amount = ((n - 1) / SYMBOLS.len()) + 1;
std::iter::repeat(symbol).take(amount).collect()
+ },
+ Self::Hebrew => {
+ if n == 0 {
+ return '-'.into();
+ }
+
+ let mut fmt = EcoString::new();
+ 'outer: for &(name, value) in &[
+ ('ת', 400),
+ ('ש', 300),
+ ('ר', 200),
+ ('ק', 100),
+ ('צ', 90),
+ ('פ', 80),
+ ('ע', 70),
+ ('ס', 60),
+ ('נ', 50),
+ ('מ', 40),
+ ('ל', 30),
+ ('כ', 20),
+ ('י', 10),
+ ('ט', 9),
+ ('ח', 8),
+ ('ז', 7),
+ ('ו', 6),
+ ('ה', 5),
+ ('ד', 4),
+ ('ג', 3),
+ ('ב', 2),
+ ('א', 1),
+ ] {
+ while n >= value {
+ match n {
+ 15 => fmt.push_str("ט״ו"),
+ 16 => fmt.push_str("ט״ז"),
+ _ => {
+ let append_geresh = n == value && fmt.is_empty();
+ if n == value && !fmt.is_empty() {
+ fmt.push('״');
+ }
+ fmt.push(name);
+ if append_geresh {
+ fmt.push('׳');
+ }
+
+ n -= value;
+ continue;
+ },
+ }
+ break 'outer;
+ }
+ }
+ fmt
}
}
}
diff --git a/tests/ref/meta/numbering.png b/tests/ref/meta/numbering.png
index 036889e3..998efe57 100644
--- a/tests/ref/meta/numbering.png
+++ b/tests/ref/meta/numbering.png
Binary files differ
diff --git a/tests/typ/meta/numbering.typ b/tests/typ/meta/numbering.typ
index ecc3bdbf..cf8104ed 100644
--- a/tests/typ/meta/numbering.typ
+++ b/tests/typ/meta/numbering.typ
@@ -12,3 +12,12 @@
---
// Error: 17-19 number must be at least zero
#numbering("1", -1)
+
+---
+#set text(lang: "he")
+
+#for i in range(9, 21, step: 2) {
+ numbering("א.", i)
+ [ עבור #i]
+ parbreak()
+}