summaryrefslogtreecommitdiff
path: root/library
diff options
context:
space:
mode:
authorSteamedFish <69167+SteamedFish@users.noreply.github.com>2023-04-06 21:50:15 +0800
committerGitHub <noreply@github.com>2023-04-06 15:50:15 +0200
commitebb995fecaa90baf000db043f4b25ec302c09000 (patch)
treec9b6324f28df9a9f85f00cbee0ccc76b40247ebc /library
parent4ba3b9da8046b31118b259d0a773f0528a82c6ae (diff)
Add Chinese numbering (#565)
Diffstat (limited to 'library')
-rw-r--r--library/Cargo.toml1
-rw-r--r--library/src/meta/numbering.rs22
2 files changed, 22 insertions, 1 deletions
diff --git a/library/Cargo.toml b/library/Cargo.toml
index 0b754dd2..15460269 100644
--- a/library/Cargo.toml
+++ b/library/Cargo.toml
@@ -33,3 +33,4 @@ unicode-math-class = "0.1"
unicode-script = "0.5"
unicode-segmentation = "1"
xi-unicode = "0.3"
+chinese-number = { version = "0.7", default-features = false, features = ["number-to-chinese"] }
diff --git a/library/src/meta/numbering.rs b/library/src/meta/numbering.rs
index aed2a9e3..f0a1c34e 100644
--- a/library/src/meta/numbering.rs
+++ b/library/src/meta/numbering.rs
@@ -1,5 +1,6 @@
use std::str::FromStr;
+use chinese_number::{ChineseCase, ChineseCountMethod, ChineseVariant, NumberToChinese};
use ecow::EcoVec;
use crate::prelude::*;
@@ -214,7 +215,8 @@ impl FromStr for NumberingPattern {
};
let prefix = pattern[handled..i].into();
- let case = if c.is_uppercase() { Case::Upper } else { Case::Lower };
+ let case =
+ if c.is_uppercase() || c == '壹' { Case::Upper } else { Case::Lower };
pieces.push((prefix, kind, case));
handled = c.len_utf8() + i;
}
@@ -257,6 +259,7 @@ enum NumberingKind {
Roman,
Symbol,
Hebrew,
+ Chinese,
HiraganaIroha,
KatakanaIroha,
}
@@ -270,6 +273,7 @@ impl NumberingKind {
'i' => NumberingKind::Roman,
'*' => NumberingKind::Symbol,
'א' => NumberingKind::Hebrew,
+ '一' | '壹' => NumberingKind::Chinese,
'い' => NumberingKind::HiraganaIroha,
'イ' => NumberingKind::KatakanaIroha,
_ => return None,
@@ -284,6 +288,7 @@ impl NumberingKind {
Self::Roman => 'i',
Self::Symbol => '*',
Self::Hebrew => 'א',
+ Self::Chinese => '一',
Self::HiraganaIroha => 'い',
Self::KatakanaIroha => 'イ',
}
@@ -432,6 +437,21 @@ impl NumberingKind {
}
fmt
}
+ Self::Chinese => {
+ let chinesecase = match case {
+ Case::Lower => ChineseCase::Lower,
+ Case::Upper => ChineseCase::Upper,
+ };
+
+ match (n as u8).to_chinese(
+ ChineseVariant::Simple,
+ chinesecase,
+ ChineseCountMethod::TenThousand,
+ ) {
+ Ok(chinesestring) => EcoString::from(chinesestring),
+ Err(_) => '-'.into(),
+ }
+ }
}
}
}