Comparing version 0.2.0 to 1.0.0
{ | ||
"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 |
216
src/index.js
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
0
0
19975
130