Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

sklonenie

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

sklonenie - npm Package Compare versions

Comparing version 0.2.0 to 1.0.0

2

package.json
{
"name": "sklonenie",
"version": "0.2.0",
"version": "1.0.0",
"description": "Declination Russian names",

@@ -5,0 +5,0 @@ "main": "src/index.js",

@@ -27,6 +27,4 @@ Sklonenie.js

)
/* ->
На страницах рукописи Михаила Афанасьевича Булгакова
«Мастер и Маргарита» ученые обнаружили следы морфия
*/
// На страницах рукописи Михаила Афанасьевича Булгакова
// «Мастер и Маргарита» ученые обнаружили следы морфия
```

@@ -51,10 +49,6 @@

console.log(
adel_1['родительный'],
adel_2['родительный']
)
/* ->
* ['Аделя', 'Захаровича', 'Дельвига']
* ['Адели', 'Захаровны', 'Дельвиг']
*/
console.log(adel_1['родительный'])
// ['Аделя', 'Захаровича', 'Дельвига']
console.log(adel_2['родительный'])
// ['Адели', 'Захаровны', 'Дельвиг']
```

@@ -81,5 +75,3 @@

console.log(saltikovSchedrin.lastname['винительный'])
/* ->
* Салтыкова-Щедрина
*/
// Салтыкова-Щедрина
```

@@ -100,5 +92,3 @@

console.log(pavel['именительный'])
/* ->
* Павел
*/
// Павел
```

@@ -120,9 +110,5 @@

console.log(mihaylovich['родительный'])
/* ->
* Михайловича
*/
// Михайловича
console.log(mihalych['родительный'])
/* ->
* Михалыча
*/
// Михалыча
```

@@ -145,9 +131,5 @@

console.log(lermontov['дательный'])
/* ->
* Лермонтову
*/
// Лермонтову
console.log(gyote['предложный'])
/* ->
* Гёте
*/
// Гёте
```

@@ -1,21 +0,21 @@

/** ----------------------------------------------------------------------------
/**
* Буквы алфавита
* @type {Object}
* @type {object}
*/
const CHARS = new Proxy({
CON: 'бвгджзйклмнпрстфхцчшщ', // Согласные
VOW: 'аеёиоуыэюя', // Гласные
// Буквы для специфичных окончаний
ACON: 'гжкхчшщ', // ГлинкИ
BCON: 'бвдзлмнпрстфц', // ЛиндЫ
AVOW: 'аеёоуыэюя', // О НиколаЕ, о ДмитриИ
CCON: 'бвгдзклмнпрстфх', // ДельвигОМ
DCON: 'жйцчшщь', // АбрамовичЕМ
CON: 'бвгджзйклмнпрстфхцчшщ', // Согласные
VOW: 'аеёиоуыэюя', // Гласные
// Буквы для специфичных окончаний
ACON: 'гжкхчшщ', // ГлинкИ
BCON: 'бвдзлмнпрстфц', // ЛиндЫ
AVOW: 'аеёоуыэюя', // О НиколаЕ, о ДмитриИ
CCON: 'бвгдзклмнпрстфх', // ДельвигОМ
DCON: 'жйцчшщь', // АбрамовичЕМ
}, {
get(target, name) {
return target[name].split('')
}
get(target, name) {
return target[name].split('')
}
})
/** ----------------------------------------------------------------------------
/**
* Окончания сокращенных отчеств

@@ -25,8 +25,8 @@ * @type {Array}

const SHORT_MIDDLE_FLEX = CHARS.CON
.filter(item => item !== 'в')
.map(item => item + 'ич')
.filter(item => item !== 'в')
.map(item => item + 'ич')
/** ----------------------------------------------------------------------------
/**
* Константы родов
* @type {Number}
* @type {number}
*/

@@ -36,54 +36,54 @@ const M = 1 << 0 // Мужской

/** ----------------------------------------------------------------------------
/**
* Падежи
* @type {Array}
* @type {Array<string>}
*/
const CASES = [
'именительный', // Есть кто?
'родительный', // Нет кого?
'дательный', // Дать кому?
'винительный', // Винить кого?
'творительный', // Доволен кем?
'предложный', // Думать о ком?
'именительный', // Есть кто?
'родительный', // Нет кого?
'дательный', // Дать кому?
'винительный', // Винить кого?
'творительный', // Доволен кем?
'предложный', // Думать о ком?
]
/** ----------------------------------------------------------------------------
/**
* Индексы частей имени
* @type {Number}
* @type {object}
*/
const NAME = {
FIRST: 0,
MIDDLE: 1,
LAST: 2,
FIRST: 0,
MIDDLE: 1,
LAST: 2,
}
/** ----------------------------------------------------------------------------
/**
* Склоняемые исключения женских имён с мягким знаком на конце
* @type {Array}
* @type {Array<string>}
*/
const EXCEP = [
'любовь',
'адель',
'жизель',
'агарь',
'рахиль',
'руфь',
'суламифь',
'эсфирь',
'юдифь',
'сесиль',
'нинель'
'любовь',
'адель',
'жизель',
'агарь',
'рахиль',
'руфь',
'суламифь',
'эсфирь',
'юдифь',
'сесиль',
'нинель'
].map(item => item.substr(0, item.length - 1))
/** ----------------------------------------------------------------------------
/**
* @exports
*/
module.exports = {
CHARS,
SHORT_MIDDLE_FLEX,
M,
W,
CASES,
NAME,
EXCEP,
CHARS,
SHORT_MIDDLE_FLEX,
M,
W,
CASES,
NAME,
EXCEP,
}

@@ -1,2 +0,2 @@

/** ----------------------------------------------------------------------------
/**
* Filling array

@@ -7,43 +7,43 @@ * @param {Array} array

function fillArray(array, value) {
// Steps 1-2
if (array == null) {
throw new TypeError('array is null or not defined')
}
// Steps 1-2
if (array == null) {
throw new TypeError('array is null or not defined')
}
const O = Object(array)
const O = Object(array)
// Steps 3-5
const len = O.length >>> 0
// Steps 3-5
const len = O.length >>> 0
// Steps 6-7
const start = arguments[1]
const relativeStart = start >> 0
// Steps 6-7
const start = arguments[1]
const relativeStart = start >> 0
// Step 8
let k = relativeStart < 0
? Math.max(len + relativeStart, 0)
: Math.min(relativeStart, len)
// Step 8
let k = relativeStart < 0
? Math.max(len + relativeStart, 0)
: Math.min(relativeStart, len)
// Steps 9-10
const end = arguments[2]
const relativeEnd = end === undefined
? len
: end >> 0
// Steps 9-10
const end = arguments[2]
const relativeEnd = end === undefined
? len
: end >> 0
// Step 11
const final = relativeEnd < 0
? Math.max(len + relativeEnd, 0)
: Math.min(relativeEnd, len)
// Step 11
const final = relativeEnd < 0
? Math.max(len + relativeEnd, 0)
: Math.min(relativeEnd, len)
// Step 12
while (k < final) {
O[k] = value
k++
}
// Step 12
while (k < final) {
O[k] = value
k++
}
// Step 13
return O
// Step 13
return O
}
/** ----------------------------------------------------------------------------
/**
* @exports

@@ -50,0 +50,0 @@ * @default fillArray

const { M, W, CHARS, EXCEP, SHORT_MIDDLE_FLEX } = require('./constants')
/** ----------------------------------------------------------------------------
/**
* Буквы алфавита

@@ -8,3 +8,3 @@ */

/** ----------------------------------------------------------------------------
/**
* Функция подготовки объекта выборки

@@ -15,39 +15,39 @@ * @param {Array} arr

function prepareList(arr) {
const list = {}
const list = {}
// Превращаем массив в объект
for (let i = 0; i < arr.length; i += 3) {
const flex = arr[i + 1][0]
.split(/\s+/g)
.map(item => item.replace(/\./g, ''));
// Превращаем массив в объект
for (let i = 0; i < arr.length; i += 3) {
const flex = arr[i + 1][0]
.split(/\s+/g)
.map(item => item.replace(/\./g, ''));
list[arr[i]] = flex.concat(arr[i + 2])
list[arr[i]] = flex.concat(arr[i + 2])
}
for (let e in list) {
if (e.indexOf(',') === -1) {
continue
}
for (let e in list) {
if (e.indexOf(',') === -1) {
continue
}
const arrMultEnd = e.match(/\[(.+)\](.*)/)
if (arrMultEnd !== null && arrMultEnd.length >= 3) {
const charsMultEnd = arrMultEnd[1]
.split(',')
.map(item => item.replace(/\s+/g, ''))
const arrMultEnd = e.match(/\[(.+)\](.*)/)
if (arrMultEnd !== null && arrMultEnd.length >= 3) {
const charsMultEnd = arrMultEnd[1]
.split(',')
.map(item => item.replace(/\s+/g, ''))
// Создаём новые элементы с одинаковым содержанием
for (let i = 0; i < charsMultEnd.length; i++) {
const postfix = arrMultEnd[arrMultEnd.length - 1] || ''
list[`[${charsMultEnd[i]}]${postfix}`] = list[e]
}
// Создаём новые элементы с одинаковым содержанием
for (let i = 0; i < charsMultEnd.length; i++) {
const postfix = arrMultEnd[arrMultEnd.length - 1] || ''
list[`[${charsMultEnd[i]}]${postfix}`] = list[e]
}
// Удаляем старый элемент с множественной выборкой
delete list[e]
}
// Удаляем старый элемент с множественной выборкой
delete list[e]
}
}
return list
return list
}
/** ----------------------------------------------------------------------------
/**
* Списки окончаний

@@ -57,47 +57,47 @@ * @type {Array}

const FLEX_LISTS = [
// Окончания имён
[
// Окончания И Р Д В Т П пол
`[и]й`, ['й я ю я ем и' ], M,
`[${AVOW}]й`, ['й я ю я ем е' ], M,
`[${CON}]`, ['. а у а ом е' ], M,
`[адел]ь`, ['ь я ю я ем е' ], M,
`[${EXCEP}]ь`, ['ь и и ь ью и' ], W,
`[${CON}]ь`, ['ь я ю я ем е' ], M,
`[${VOW},${BCON}]а`, ['а ы е у ой е' ], W,
`[${ACON}]а`, ['а и е у ой е' ], W,
'[ь]я', ['я и е ю ей е' ], W,
`я`, ['я и и ю ей и' ], W,
`[пав]ел`, ['ел ла лу ла лом ле' ], M,
`[л]ев`, ['ев ьва ьву ьва ьвом ьве'], M,
],
// Окончания имён отчеств
[
// Окончания И Р Д В Т П пол
'[вич]', ['. а у а ем е' ], M,
`[${SHORT_MIDDLE_FLEX}]`, ['. а у а ем е' ], M,
'[вн]а', ['а ы е у ой е' ], W,
`[${CON}]на`, ['на ны не ну ной не'], W,
],
// Окончания фамилий
[
// Окончания И Р Д В Т П пол
'[ин,ен,ев,ов]', ['. а у а ым е' ], M, // Пушкин, Герцен, Медведев, Иванов
'[ин,ен,ев,ов]а', ['а ой ой у ой ой'], W, // Путина, Гребена, Цветаева, Ахматова
'[ск,]ий', ['ий ого ому ого им ом'], M, // Невский, Дикий
'ый', ['ый ого ому ого ым ом'], M, // Гордый
'ая', ['ая ой ой ую ой ой'], W, // Крупская, Боровая
'ой', ['ой ого ому ого ым ом'], M, // Толстой
'я', ['я и и ю ей и' ], M|W, // Берия
`[${ACON}]а`, ['а и е у ой е' ], M|W, // Глинка
`[${BCON}]а`, ['а ы е у ой е' ], M|W, // Линда
'ь', ['ь я ю я ем е' ], M, // Гоголь
`[${VOW}]й`, ['й я ю я ем е' ], M, // Гайдай
`[ых,их,${VOW}]`, ['. . . . . .' ], M|W, // Седых, Гёте
`[${CCON}]`, ['. а у а ом е' ], M, // Дельвиг
`[${DCON}]`, ['. а у а ем е' ], M, // Бах, Абрамович
]
// Окончания имён
[
// Окончания И Р Д В Т П пол
`[и]й`, ['й я ю я ем и' ], M,
`[${AVOW}]й`, ['й я ю я ем е' ], M,
`[${CON}]`, ['. а у а ом е' ], M,
`[адел]ь`, ['ь я ю я ем е' ], M,
`[${EXCEP}]ь`, ['ь и и ь ью и' ], W,
`[${CON}]ь`, ['ь я ю я ем е' ], M,
`[${VOW},${BCON}]а`, ['а ы е у ой е' ], W,
`[${ACON}]а`, ['а и е у ой е' ], W,
'[ь]я', ['я и е ю ей е' ], W,
`я`, ['я и и ю ей и' ], W,
`[пав]ел`, ['ел ла лу ла лом ле' ], M,
`[л]ев`, ['ев ьва ьву ьва ьвом ьве'], M,
],
// Окончания имён отчеств
[
// Окончания И Р Д В Т П пол
'[вич]', ['. а у а ем е' ], M,
`[${SHORT_MIDDLE_FLEX}]`, ['. а у а ем е' ], M,
'[вн]а', ['а ы е у ой е' ], W,
`[${CON}]на`, ['на ны не ну ной не'], W,
],
// Окончания фамилий
[
// Окончания И Р Д В Т П пол
'[ин,ен,ев,ов]', ['. а у а ым е' ], M, // Пушкин, Герцен, Медведев, Иванов
'[ин,ен,ев,ов]а', ['а ой ой у ой ой'], W, // Путина, Гребена, Цветаева, Ахматова
'[ск,]ий', ['ий ого ому ого им ом'], M, // Невский, Дикий
'ый', ['ый ого ому ого ым ом'], M, // Гордый
'ая', ['ая ой ой ую ой ой'], W, // Крупская, Боровая
'ой', ['ой ого ому ого ым ом'], M, // Толстой
'я', ['я и и ю ей и' ], M|W, // Берия
`[${ACON}]а`, ['а и е у ой е' ], M|W, // Глинка
`[${BCON}]а`, ['а ы е у ой е' ], M|W, // Линда
'ь', ['ь я ю я ем е' ], M, // Гоголь
`[${VOW}]й`, ['й я ю я ем е' ], M, // Гайдай
`[ых,их,${VOW}]`, ['. . . . . .' ], M|W, // Седых, Гёте
`[${CCON}]`, ['. а у а ом е' ], M, // Дельвиг
`[${DCON}]`, ['. а у а ем е' ], M, // Бах, Абрамович
]
].map(prepareList)
/** ----------------------------------------------------------------------------
/**
* @exports

@@ -104,0 +104,0 @@ * @default FLEX_LIST

@@ -11,172 +11,172 @@ /**

/** ----------------------------------------------------------------------------
/**
* Получение окончания по выборке
* @param {String} string — строка, содежащая имя, отчество или фамилию
* @param {Number} gender — род (1 или 2)
* @param {Object} name — индекс части имени (FIRST=0/MIDDLE=1/LAST=2)
* @param {string} string — строка, содежащая имя, отчество или фамилию
* @param {number} gender — род (1 или 2)
* @param {object} name — индекс части имени (FIRST=0/MIDDLE=1/LAST=2)
* @return {Array}
*/
function getFlexion(str, g, nameIndex) {
let retArr = [] // Возвращаемый массив
let retArr = [] // Возвращаемый массив
const flexList = FLEX_LISTS[nameIndex]
const flexList = FLEX_LISTS[nameIndex]
for (let e in flexList) {
const eClear = e.replace(/\[|\]/g, '')
const lenWoutEnd = str.length - eClear.length
const ending = str.substr(lenWoutEnd).toLowerCase()
for (let e in flexList) {
const eClear = e.replace(/\[|\]/g, '')
const lenWoutEnd = str.length - eClear.length
const ending = str.substr(lenWoutEnd).toLowerCase()
if (eClear === ending) {
// Если пол не совпадает, идём дальше
const flexGender = flexList[e][flexList[e].length - 1]
if (g && !(flexGender & g)) {
continue
}
if (eClear === ending) {
// Если пол не совпадает, идём дальше
const flexGender = flexList[e][flexList[e].length - 1]
if (g && !(flexGender & g)) {
continue
}
const lenClear = e.replace(/\[.*\]/g, '').length
const woutEnd = str.substr(0, str.length - lenClear)
const lenClear = e.replace(/\[.*\]/g, '').length
const woutEnd = str.substr(0, str.length - lenClear)
for (let i = 0; i < CASES.length; i++) {
retArr[i] = woutEnd + flexList[e][i]
}
for (let i = 0; i < CASES.length; i++) {
retArr[i] = woutEnd + flexList[e][i]
}
break
}
break
}
}
if (retArr.length === 0) {
retArr = fillArray(Array(CASES.length), str)
}
if (retArr.length === 0) {
retArr = fillArray(Array(CASES.length), str)
}
return retArr
return retArr
}
/** ----------------------------------------------------------------------------
/**
* Получение склонений частей имени
* @param {Number} propNum — (FIRST=0/MIDDLE=1/LAST=2)
* @param {String} str — часть имени (имя/отчество/фамилия)
* @param {Number} gender — род
* @param {number} propNum — (FIRST=0/MIDDLE=1/LAST=2)
* @param {string} str — часть имени (имя/отчество/фамилия)
* @param {number} gender — род
* @return {Array} — результат
*/
function getName(nameIndex, str, gender = 0) {
// Если строка не проходит проверку, возвращаем её же
if (!str || typeof str !== 'string')
return fillArray(Array(CASES.length), str + '')
// Если строка не проходит проверку, возвращаем её же
if (!str || typeof str !== 'string')
return fillArray(Array(CASES.length), str + '')
// Получаем список флексий
const flex = FLEX_LISTS[nameIndex]
// Получаем список флексий
const flex = FLEX_LISTS[nameIndex]
// Ищем подходящее окончание из списка
let out
// Ищем подходящее окончание из списка
let out
// Если это фамилия и двойная, склоняем обе части
if (nameIndex === NAME.LAST && str.indexOf('-') > -1) {
let lastNames = str.split('-')
let lastNamesArr = []
// Если это фамилия и двойная, склоняем обе части
if (nameIndex === NAME.LAST && str.indexOf('-') > -1) {
let lastNames = str.split('-')
let lastNamesArr = []
// Получаем склонения каждой части
for (let i = 0; i < lastNames.length; i++) {
lastNamesArr[i] = getFlexion(lastNames[i], gender, NAME.LAST)
}
// Соединяем полученные фамилии в одну
out = lastNamesArr[0].map((item, i) => item + '-' + lastNamesArr[1][i])
} else {
// В остальных случаях прсото склоняем строку
out = getFlexion(str, gender, nameIndex)
// Получаем склонения каждой части
for (let i = 0; i < lastNames.length; i++) {
lastNamesArr[i] = getFlexion(lastNames[i], gender, NAME.LAST)
}
// Соединяем полученные фамилии в одну
out = lastNamesArr[0].map((item, i) => item + '-' + lastNamesArr[1][i])
} else {
// В остальных случаях прсото склоняем строку
out = getFlexion(str, gender, nameIndex)
}
for (let i = 0; i < CASES.length; i++) {
out[CASES[i]] = out[i]
}
for (let i = 0; i < CASES.length; i++) {
out[CASES[i]] = out[i]
}
return out
return out
}
/** ----------------------------------------------------------------------------
/**
* Обработка пола
* @param {?Number|String} g — Род. Может принимать значения: 1 или 2,
* @param {?number|string} g — Род. Может принимать значения: 1 или 2,
* «m» или «w», «man» или «woman»
*/
function getGender(g) {
if (g == null) {
return 0
}
if (g == null) {
return 0
}
if (typeof g === 'number') {
return g >= 0 && g <= 2
? g
: 0
} else if (typeof g === 'string') {
g = g.toLowerCase()
if (typeof g === 'number') {
return g >= 0 && g <= 2
? g
: 0
} else if (typeof g === 'string') {
g = g.toLowerCase()
if (g === 'm' || g === 'man') {
return M
} else if (g === 'w' || g === 'woman') {
return W
}
if (g === 'm' || g === 'man') {
return M
} else if (g === 'w' || g === 'woman') {
return W
}
}
return 0
return 0
}
/** ----------------------------------------------------------------------------
/**
* Получение склонений имени. Экспортируется по-дефолту
* @param {String} firstname — Склоняемое имя
* @param {String} middlename — Склоняемое отчество
* @param {String} lastname — Склоняемая фамилия
* @param {?Number} [gender=0] — Род
* @return {Object}
* @param {string} firstname — Склоняемое имя
* @param {string} middlename — Склоняемое отчество
* @param {string} lastname — Склоняемая фамилия
* @param {?number} [gender=0] — Род
* @return {object}
*/
function full(firstname, middlename, lastname, g = 0) {
const gender = getGender(g)
const gender = getGender(g)
const ret = {
firstname: getName(NAME.FIRST, firstname, gender),
middlename: getName(NAME.MIDDLE, middlename, gender),
lastname: getName(NAME.LAST, lastname, gender),
}
const ret = {
firstname: getName(NAME.FIRST, firstname, gender),
middlename: getName(NAME.MIDDLE, middlename, gender),
lastname: getName(NAME.LAST, lastname, gender),
}
for (let i = 0; i < CASES.length; i++) {
ret[i] = ret[CASES[i]] = [
ret.firstname[i],
ret.middlename[i],
ret.lastname[i],
]
}
for (let i = 0; i < CASES.length; i++) {
ret[i] = ret[CASES[i]] = [
ret.firstname[i],
ret.middlename[i],
ret.lastname[i],
]
}
return ret
return ret
}
/** ----------------------------------------------------------------------------
/**
* Экспорт склонения имени
* @param {String} str — имя
* @param {?Number} gender — род
* @param {string} str — имя
* @param {?number} gender — род
* @return {Array}
*/
function firstname(str, gender) {
return getName(NAME.FIRST, str, gender)
return getName(NAME.FIRST, str, gender)
}
/** ----------------------------------------------------------------------------
/**
* Экспорт склонения отчества
* @param {String} str — отчество
* @param {?Number} gender — род
* @param {string} str — отчество
* @param {?number} gender — род
* @return {Array}
*/
function middlename(str, gender) {
return getName(NAME.MIDDLE, str, gender)
return getName(NAME.MIDDLE, str, gender)
}
/** ----------------------------------------------------------------------------
/**
* Экспорт склонения отчества
* @param {String} str — фамилия
* @param {?Number} gender — род
* @param {string} str — фамилия
* @param {?number} gender — род
* @return {Array}
*/
function lastname(str, gender) {
return getName(NAME.LAST, str, gender)
return getName(NAME.LAST, str, gender)
}
/** ----------------------------------------------------------------------------
/**
* @exports

@@ -194,7 +194,7 @@ * @default full

if (typeof module !== 'undefined' && module.exports != null) {
module.exports = sklonenie
module.exports = sklonenie
} else if (typeof window !== 'undefined') {
window.sklonenie = sklonenie
window.sklonenie = sklonenie
} else {
throw new Error('Невозможно экспортировать модуль')
throw new Error('Невозможно экспортировать модуль')
}

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc