diff --git a/package.json b/package.json index 771f73f..c03aacf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "lvovich", "version": "0.0.0-semantic-release", - "description": "GraphQL schema builder from different data sources with middleware extensions.", + "description": "Library to decline people & city names in Russian, and to detect gender by name", "engines": { "node": ">= 6" }, diff --git a/src/city.d.ts b/src/city.d.ts index 860db87..f24ce22 100644 --- a/src/city.d.ts +++ b/src/city.d.ts @@ -6,5 +6,5 @@ export function cityIn(name: string, gender?: GenderStrT): string; // родительный, из какого города приехали? export function cityFrom(name: string, gender?: GenderStrT): string; -// в какой город направляетесь? +// винительный, в какой город направляетесь? export function cityTo(name: string): string; diff --git a/src/city.js b/src/city.js index c63706b..d33ead2 100644 --- a/src/city.js +++ b/src/city.js @@ -11,14 +11,14 @@ import { applyRule, applyMod, } from './inclineRules'; +import type { DeclentionT } from './inclineRules'; import { inclineFirstname } from './incline'; import { frozenWords, frozenParts, frozenPartsAfter, cityRules } from './rules/cityRules'; import type { GenderStrT } from './gender'; constantizeGenderInRules(cityRules); -// предложный, в каком городе живете/находитесь? -export function cityIn(name: string, gender?: GenderStrT) { +function declineTo(name: string, wordCase: DeclentionT, gender?: GenderStrT) { if (isFrozen(name, frozenWords)) return name; return name .split(/(\s|-)/g) @@ -27,33 +27,25 @@ export function cityIn(name: string, gender?: GenderStrT) { const rule = findRule(part, ANDROGYNOUS, cityRules); if (rule) { - return applyRule(rule, part, PREPOSITIONAL); + return applyRule(rule, part, wordCase); } - return inclineFirstname(part, PREPOSITIONAL, gender) || part; + return inclineFirstname(part, wordCase, gender) || part; }) .join(''); } +// предложный, в каком городе живете/находитесь? +export function cityIn(name: string, gender?: GenderStrT) { + return declineTo(name, PREPOSITIONAL, gender); +} + // родительный, из какого города приехали? export function cityFrom(name: string, gender?: GenderStrT) { - if (isFrozen(name, frozenWords)) return name; - return name - .split(/(\s|-)/g) - .map((part, i, parts) => { - if (isFrozenPart(part, i, parts)) return part; - - const rule = findRule(part, ANDROGYNOUS, cityRules); - if (rule) { - return applyRule(rule, part, GENITIVE); - } - - return inclineFirstname(part, GENITIVE, gender) || part; - }) - .join(''); + return declineTo(name, GENITIVE, gender); } -// в какой город направляетесь? +// винительный, в какой город направляетесь? export function cityTo(name: string) { if (!name) return name; return name