2
0
mirror of https://github.com/tenrok/numeralize-ru.git synced 2026-06-14 18:42:34 +03:00

Rewrote how the lib is being built

This commit is contained in:
anotherpit
2023-11-11 00:27:36 -03:00
parent 558659e6f8
commit ad273a8c58
11 changed files with 646 additions and 155 deletions
+130 -88
View File
@@ -2,106 +2,148 @@
Написание числительных на русском языке с учётом пола и падежа.
# Установка
## Использование в NodeJS
```
npm install --save numeralize-ru
```
# API
```javascript
import {numeralize, Case, Gender} from "numeralize-ru";
### `numeralize(number, [gender, [kase, [animate]]])`
Возвращает числительное, соответствующее числу
+ `number` — число, для которого надо записать числительное;
+ `gender` — пол:
+ `Gender.Masculine` — мужской (по умолчанию);
+ `Gender.Feminine` — женский;
+ `Gender.Neuter` — средний;
+ `kase` — падеж (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
+ `Case.Nominative` — именительный (по умолчанию);
+ `Case.Genitive` — родительный;
+ `Case.Dative` — дательный;
+ `Case.Accusative` — винительный;
+ `Case.Instrumental` — творительный;
+ `Case.Prepositional` — предложный;
+ `animate` — являются ли перечисляемые предметы одушевлёнными (влияет на форму винительного падежа некоторых числительных)
```typescript
import {Case, Gender, numeralize, pluralize} from 'numeralize-ru';
numeralize(5122981121);
// мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
numeralize(5122981121, Gender.Feminine);
// женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
numeralize(5122981121, Gender.Neuter);
// средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
numeralize(5122981121, Gender.Masculine, Case.Nominative);
// мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
numeralize(5122981121, Gender.Masculine, Case.Genitive);
// мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
numeralize(5122981121, Gender.Masculine, Case.Dative);
// мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
numeralize(5122981121, Gender.Masculine, Case.Accusative);
// мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
// мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
numeralize(5122981121, Gender.Masculine, Case.Instrumental);
// мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
numeralize(5122981121, Gender.Masculine, Case.Prepositional);
// мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
console.log(numeralize(5122981121, Gender.Masculine, Case.Nominative));
```
### `pluralize(count, one, two, five)`
## Использование с [дореволюционных](https://caniuse.com/?search=ESM) браузерах
Выбирает нужную форму существительного в зависимости от количества.
+ `count` — количество
+ `one` — форма существительного для одного предмета, например, _рубль_;
+ `two` — форма существительного для двух предметов, например, _рубля_;
+ `five` — форма существительного для пяти предметов, например, _рублей_;
```typescript
import {pluralize} from 'numeralize-ru';
pluralize(0, 'рубль', 'рубля', 'рублей');
// 'рублей'
pluralize(1, 'рубль', 'рубля', 'рублей');
// 'рубль'
pluralize(2, 'рубль', 'рубля', 'рублей');
// 'рубля'
pluralize(5, 'рубль', 'рубля', 'рублей');
// 'рублей'
pluralize(11, 'рубль', 'рубля', 'рублей');
// 'рублей'
pluralize(21, 'рубль', 'рубля', 'рублей');
// 'рубль'
pluralize(22, 'рубль', 'рубля', 'рублей');
// 'рубля'
```html
<script src="https://unpkg.com/numeralize-ru/lib/index.browser.js"></script>
<script>
console.log(numeralize.numeralize(5122981121, numeralize.Gender.Feminine));
</script>
```
# Roadmap
## API
+ Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д.
+ Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д.
+ Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д.
```typescript
/**
* Возвращает числительное, соответствующее числу
*
* @param {number} number Целое число, для которого надо записать числительное
*
* @param {Gender} [gender=Gender.Masculine] Пол:
* - {@link Gender.Masculine} мужской (по умолчанию);
* - {@link Gender.Feminine} женский;
* - {@link Gender.Neuter} средний.
*
* @param {Case} [kase=Case.Nominative] Падеж
* (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
* - {@link Case.Nominative} — именительный (по умолчанию);
* - {@link Case.Genitive} — родительный;
* - {@link Case.Dative} — дательный;
* - {@link Case.Accusative} — винительный;
* - {@link Case.Instrumental} — творительный;
* - {@link Case.Prepositional} — предложный.
*
* @param {boolean} [animate=false] Являются ли перечисляемые предметы одушевлёнными
* (влияет на форму винительного падежа некоторых числительных)
*
* @example
* // мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
* numeralize(5122981121);
*
* @example
* // женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
* numeralize(5122981121, Gender.Feminine);
*
* @example
* // средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
* numeralize(5122981121, Gender.Neuter);
*
* @example
* // мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
* numeralize(5122981121, Gender.Masculine, Case.Nominative);
*
* @example
* // мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
* numeralize(5122981121, Gender.Masculine, Case.Genitive);
*
* @example
* // мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
* numeralize(5122981121, Gender.Masculine, Case.Dative);
*
* @example
* // мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
* numeralize(5122981121, Gender.Masculine, Case.Accusative);
*
* @example
* // мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
* numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
*
* @example
* // мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
* numeralize(5122981121, Gender.Masculine, Case.Instrumental);
*
* @example
* // мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
* numeralize(5122981121, Gender.Masculine, Case.Prepositional);
*/
declare function numeralize(
number: number,
gender: Gender = Gender.Masculine,
kase: Case = Case.Nominative,
animate: boolean = false
): string;
# См.также
/**
* Выбирает нужную форму существительного в зависимости от количества.
*
* @param {number} count Количество
* @param {string} one Форма существительного для одного предмета, например, «рубль»;
* @param {string} two Форма существительного для двух предметов, например, «рубля»;
* @param {string} five Форма существительного для пяти предмета, например, «рублей»;
*
* @example
* // 'рублей'
* pluralize(0, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубль'
* pluralize(1, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубля'
* pluralize(2, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рублей'
* pluralize(5, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рублей'
* pluralize(11, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубль'
* pluralize(21, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубля'
* pluralize(22, 'рубль', 'рубля', 'рублей');
*/
declare function pluralize(count: number, one: string, two: string, five: string): string
```
## Спонсорство
[Стать первым спонсором проекта](https://github.com/sponsors/anotherpit)
## Roadmap
+ [ ] Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д.
+ [ ] Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д.
+ [ ] Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д.
## См.также
+ Подробно о склонении числительных в русском языке с примерами: http://numeralonline.ru/
+392 -2
View File
@@ -1,17 +1,18 @@
{
"name": "numeralize-ru",
"version": "2.0.0",
"version": "2.0.0-alpha.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "numeralize-ru",
"version": "2.0.0",
"version": "2.0.0-alpha.1",
"license": "MIT",
"devDependencies": {
"@types/mocha": "^10.0.2",
"@typescript-eslint/eslint-plugin": "^6.8.0",
"@typescript-eslint/parser": "^6.8.0",
"esbuild": "^0.19.5",
"eslint": "^8.51.0",
"mocha": "^10.2.0",
"ts-mocha": "^10.0.0",
@@ -40,6 +41,358 @@
"node": ">=12"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz",
"integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz",
"integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz",
"integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz",
"integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz",
"integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz",
"integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz",
"integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz",
"integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz",
"integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz",
"integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz",
"integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==",
"cpu": [
"loong64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz",
"integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==",
"cpu": [
"mips64el"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz",
"integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==",
"cpu": [
"ppc64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz",
"integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==",
"cpu": [
"riscv64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz",
"integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==",
"cpu": [
"s390x"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz",
"integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz",
"integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz",
"integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz",
"integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz",
"integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz",
"integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz",
"integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -855,6 +1208,43 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"node_modules/esbuild": {
"version": "0.19.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz",
"integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==",
"dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/android-arm": "0.19.5",
"@esbuild/android-arm64": "0.19.5",
"@esbuild/android-x64": "0.19.5",
"@esbuild/darwin-arm64": "0.19.5",
"@esbuild/darwin-x64": "0.19.5",
"@esbuild/freebsd-arm64": "0.19.5",
"@esbuild/freebsd-x64": "0.19.5",
"@esbuild/linux-arm": "0.19.5",
"@esbuild/linux-arm64": "0.19.5",
"@esbuild/linux-ia32": "0.19.5",
"@esbuild/linux-loong64": "0.19.5",
"@esbuild/linux-mips64el": "0.19.5",
"@esbuild/linux-ppc64": "0.19.5",
"@esbuild/linux-riscv64": "0.19.5",
"@esbuild/linux-s390x": "0.19.5",
"@esbuild/linux-x64": "0.19.5",
"@esbuild/netbsd-x64": "0.19.5",
"@esbuild/openbsd-x64": "0.19.5",
"@esbuild/sunos-x64": "0.19.5",
"@esbuild/win32-arm64": "0.19.5",
"@esbuild/win32-ia32": "0.19.5",
"@esbuild/win32-x64": "0.19.5"
}
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+9 -7
View File
@@ -1,17 +1,18 @@
{
"name": "numeralize-ru",
"version": "2.0.0-alpha.1",
"version": "2.0.0-alpha.2",
"description": "Russian numerals",
"type": "module",
"exports": {
".": {
"types": "./lib/types/index.d.ts",
"require": "./lib/cjs/index.js",
"import": "./lib/esm/index.js",
"default": "./lib/esm/index.js"
"types": "./lib/index.d.ts",
"require": "./lib/index.js",
"import": "./lib/index.js",
"default": "./lib/index.js",
"browser": "./lib/index.browser.js"
}
},
"main": "lib/cjs/index.js",
"main": "lib/index.js",
"files": [
"lib/",
"LICENSE.md",
@@ -22,7 +23,7 @@
"dev": "ts-mocha src/**.spec.ts -w --watch-files 'src/**.ts'",
"test": "ts-mocha src/**.spec.ts",
"lint": "eslint src/*",
"build": "rm -rf ./lib && tsc --build ./tsconfig.amd.json ./tsconfig.cjs.json ./tsconfig.esm.json ./tsconfig.types.json ./tsconfig.umd.json",
"build": "rm -rf ./lib && tsc --build && esbuild ./lib/index.js --outfile=lib/index.browser.js --format=iife --global-name=numeralize",
"prepublish": "npm run lint && npm run test && npm run build"
},
"keywords": [
@@ -42,6 +43,7 @@
"@types/mocha": "^10.0.2",
"@typescript-eslint/eslint-plugin": "^6.8.0",
"@typescript-eslint/parser": "^6.8.0",
"esbuild": "^0.19.5",
"eslint": "^8.51.0",
"mocha": "^10.2.0",
"ts-mocha": "^10.0.0",
+1 -1
View File
@@ -1,4 +1,4 @@
import {Case, Gender, numeralize} from "./index";
import {numeralize, Gender, Case} from "./index";
import * as assert from "assert";
describe(numeralize.name, () => {
+112 -19
View File
@@ -112,24 +112,6 @@ const LARGES = [
)
] as const;
/**
* Pluralize noun according to count, e.g. `pluralize(42, 'рубль', 'рубля', 'рублей')`
*/
export function pluralize(count: number, one: string, two: string, five: string): string {
count = Math.floor(Math.abs(count)) % 100;
if (count > 10 && count < 20) {
return five;
}
count = count % 10;
if (1 === count) {
return one;
}
if (count >= 2 && count <= 4) {
return two;
}
return five;
}
function small(number: number, gender: Gender, kase: Case, animate: boolean): string {
// Zero
if (0 === number) {
@@ -172,7 +154,117 @@ function small(number: number, gender: Gender, kase: Case, animate: boolean): st
}
/**
* Numeralize number
* Выбирает нужную форму существительного в зависимости от количества.
*
* @param {number} count Количество
* @param {string} one Форма существительного для одного предмета, например, «рубль»;
* @param {string} two Форма существительного для двух предметов, например, «рубля»;
* @param {string} five Форма существительного для пяти предмета, например, «рублей»;
*
* @example
* // 'рублей'
* pluralize(0, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубль'
* pluralize(1, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубля'
* pluralize(2, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рублей'
* pluralize(5, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рублей'
* pluralize(11, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубль'
* pluralize(21, 'рубль', 'рубля', 'рублей');
*
* @example
* // 'рубля'
* pluralize(22, 'рубль', 'рубля', 'рублей');
*/
export function pluralize(count: number, one: string, two: string, five: string): string {
count = Math.floor(Math.abs(count)) % 100;
if (count > 10 && count < 20) {
return five;
}
count = count % 10;
if (1 === count) {
return one;
}
if (count >= 2 && count <= 4) {
return two;
}
return five;
}
/**
* Возвращает числительное, соответствующее числу
*
* @param {number} number Целое число, для которого надо записать числительное
*
* @param {Gender} [gender=Gender.Masculine] Пол:
* - {@link Gender.Masculine} мужской (по умолчанию);
* - {@link Gender.Feminine} женский;
* - {@link Gender.Neuter} средний.
*
* @param {Case} [kase=Case.Nominative] Падеж
* (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
* - {@link Case.Nominative} — именительный (по умолчанию);
* - {@link Case.Genitive} — родительный;
* - {@link Case.Dative} — дательный;
* - {@link Case.Accusative} — винительный;
* - {@link Case.Instrumental} — творительный;
* - {@link Case.Prepositional} — предложный.
*
* @param {boolean} [animate=false] Являются ли перечисляемые предметы одушевлёнными
* (влияет на форму винительного падежа некоторых числительных)
*
* @example
* // мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
* numeralize(5122981121);
*
* @example
* // женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
* numeralize(5122981121, Gender.Feminine);
*
* @example
* // средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
* numeralize(5122981121, Gender.Neuter);
*
* @example
* // мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
* numeralize(5122981121, Gender.Masculine, Case.Nominative);
*
* @example
* // мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
* numeralize(5122981121, Gender.Masculine, Case.Genitive);
*
* @example
* // мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
* numeralize(5122981121, Gender.Masculine, Case.Dative);
*
* @example
* // мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
* numeralize(5122981121, Gender.Masculine, Case.Accusative);
*
* @example
* // мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
* numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
*
* @example
* // мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
* numeralize(5122981121, Gender.Masculine, Case.Instrumental);
*
* @example
* // мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
* numeralize(5122981121, Gender.Masculine, Case.Prepositional);
*/
export function numeralize(
number: number,
@@ -214,3 +306,4 @@ export function numeralize(
// Return
return result.join(' ');
}
-7
View File
@@ -1,7 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "umd",
"outDir": "./lib/amd/"
}
}
-7
View File
@@ -1,7 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "./lib/cjs/"
}
}
-7
View File
@@ -1,7 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "es2020",
"outDir": "./lib/esm/"
}
}
+2 -2
View File
@@ -46,13 +46,13 @@
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
/* Emit */
"declaration": false,
"declaration": true,
/* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./", /* Specify an output folder for all emitted files. */
"outDir": "./lib", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
-8
View File
@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./lib/types",
"declaration": true,
"emitDeclarationOnly": true
}
}
-7
View File
@@ -1,7 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "umd",
"outDir": "./lib/umd/"
}
}