Code Monkey home page Code Monkey logo

lvovich's Introduction

Lvovich (Львович) - JS library to inflect people names, cities names in Russian

npm codecov coverage Travis npmtrends Commitizen friendly TypeScript compatible

0 сторонних зависимостей, может работать как на сервере, так и в браузере.

Этот пакет для:

  • склонения названий городов (работает для большинства составных названий: Санкт-Петербург, Ростов-на-Дону и пр.)
  • определения пола по имени фамилии и отчеству
  • склонения падежей русских имен, фамилий и отчеств

Может использоваться как в браузере, так и на сервере. Нет никаких зависимостей и работает в оффлайне. Самое то:

  • для генерации красивых писем с mjml
  • для генерации PDF c @react-pdf
  • для генерации SEO-заголовков c головой на плечах
  • чтоб по максимуму избавиться от Уважаемый(-ая), когда есть ФИО но нет пола

Минифицированный размер пакета 20KB, gzipped 6KB. Бедные, бедные иностранцы - им надо загрузить в голову 20 килобайт правил и уметь быстро ими пользоваться в разговорной речи. Ужос!

PS. Если вдруг вы ищете список всех городов и сел с гео-координатами России, Белоруси и Украины - их можно найти в формате csv на сайте https://maps.vlasenko.net/.

Live Demo

Cклонение названий городов

import { cityIn, cityFrom, cityTo } from 'lvovich';

cityIn(name: string, gender?: GenderStrT): string - в каком городе живете/находитесь? (предложный падеж)

  cityIn('Санкт-Петербург'); // вернет `Санкт-Петербурге`

cityFrom(name: string, gender?: GenderStrT): string - из какого города приехали? (родительный падеж)

  cityFrom('Санкт-Петербург'); // вернет `Санкт-Петербурга`

cityTo(name: string): string - в какой город направляетесь? (направительный или посылательный падеж :)

  cityTo('Санкт-Петербург'); // вернет `Санкт-Петербург`
  cityTo('Москва'); // вернет `Москву`

Определения пола по имени фамилии и отчеству

import { getGender, getFirstnameGender, getLastnameGender, getMiddlenameGender } from 'lvovich';

Методы определения пола возвращают тип GenderStrT:

  • male - мужской,
  • female - женский,
  • androgynous - может быть и мальчиком и девочкой
  • null - не удалось определить пол

getGender(fio: FioT): ?GenderStrT - передаете ФИО, получаете пол

Входящий аргумент fio являеется объектов со следующими необязательными полями:

type FioT = {
  first?: ?string,
  last?: ?string,
  middle?: ?string,
}
  getGender({ last: 'Друзь', first: 'Саша', middle: 'Петрович' }); // вернет `male`
  getGender({ first: 'Саша' }); // вернет `androgynous`, т.к. может быть мальчик или девочка
  getGender({ first: 'Саша', middle: 'Петровна'  }); // вернет `female`
  getGender({ last: 'Абуова', first: 'Андрей' }); // вернет `null`, ну нафиг гадать т.к. вроде фамилия женская и имя мужское.

getFirstnameGender(str: string): ?GenderStrT - вернет пол для Имени

  getFirstnameGender('Павел'); // вернет `male`
  getFirstnameGender('Анна'); // вернет `female`
  getFirstnameGender('Саша'); // вернет `androgynous`
  getFirstnameGender('аааа'); // вернет `null`

getLastnameGender(str: string): ?GenderStrT - вернет пол для Фамилии

  getLastnameGender('Градский'); // вернет `male`
  getLastnameGender('Таптыгина'); // вернет `female`
  getLastnameGender('Борейко'); // вернет `androgynous`
  getLastnameGender('аааа'); // вернет `null`

getMiddlenameGender(str: string): ?GenderStrT - вернет пол для Отчества

  getMiddlenameGender('Павлович'); // вернет `male`
  getMiddlenameGender('Петрова'); // вернет `female`
  getMiddlenameGender('иваново'); // вернет `null`
  getMiddlenameGender('аааа'); // вернет `null`

Cклонения падежей русских имен, фамилий и отчеств

import { incline, inclineFirstname, inclineLastname, inclineMiddlename } from 'lvovich';

Падежи (тип DeclentionStrT):

  • nominative - именительный (кто? что?)
  • genitive - родительный (кого? чего?)
  • dative - дательный (кому? чему?)
  • accusative - винительный (кого? что?)
  • instrumental - творительный (кем? чем?)
  • prepositional - предложный (о ком? о чем?)

incline(person: LvovichPersonT, declension?: DeclentionStrT): LvovichPersonT - просклонять по падежам

Если не указан declension, то будет использован винительный падеж.

  incline({ first: 'Саша', last: 'Иванов' }, 'dative');
  // вернет { first: 'Саше', last: 'Иванову', gender: 'male' }

  incline({ first: 'Паша' }, 'instrumental');
  // вернет { first: 'Пашей', gender: 'male' })

Тип LvovichPersonT для incline(person: LvovichPersonT) является объектом с необязательными полями:

{
  first?: ?string,
  last?: ?string,
  middle?: ?string,
  gender?: ?GenderStrT,
}

inclineFirstname(str: string, declension?: DeclentionStrT, gender?: GenderStrT): string - просклонять Имя по падежам

Если пол gender не указан, то будет запущено автоопределение, если не указано склонение declension то будет применен винительный падеж.

  inclineFirstname('Павел', 'genitive'); // вернет 'Павла'
  inclineFirstname('Женя', 'instrumental'); // вернет 'Женя'
  inclineFirstname('Женя', 'instrumental', 'male'); // вернет 'Женей'
  inclineFirstname('Женя', 'instrumental', 'female'); // вернет 'Женей'

inclineLastname(str: string, declension?: DeclentionStrT, gender?: GenderStrT): string - просклонять Фамилию по падежам

  inclineLastname('Иванова', 'genitive'); // вернет 'Ивановой'
  inclineLastname('Петросян', 'instrumental'); // вернет 'Петросян'
  inclineLastname('Петросян', 'instrumental', 'male'); // вернет 'Петросяном'

inclineMiddlename(str: string, declension?: DeclentionStrT, gender?: GenderStrT): string - просклонять Отчество по падежам

  inclineMiddlename('Львович', 'genitive'); // вернет 'Львовича'

Установка

Через npm:

npm install lvovich

Или в браузере:

<script src="https://cdn.jsdelivr.net/npm/lvovich/dist/lvovich.min.js"></script>
<script>
  var city = 'Москва';
  document.writeln('Найдено в ' + lvovich.cityIn(city) + '<br/>');
  document.writeln('Из ' + lvovich.cityFrom(city) + '<br/>');
  document.writeln('Еду в ' + lvovich.cityTo(city) + '<br/>');
</script>

Разработчику

Сборка новой версии пакета происходит автоматически через semantic-release и Travis. Ваши изменения я могу опубликовать хоть с телефона.

От вас просто необходимо склонировать репозиторий, внести изменения в код и открыть Pull Request.

Клонирование репозитория и установка модулей:

git clone https://github.com/nodkz/lvovich.git
cd lvovich
yarn install

Тесты находятся в директории src/__tests__. Запуск тестов:

yarn test

Лицензия

MIT

В основу этого пакета лег код и правила из petrovich-js. Код был переписан и оптимизирован, часть правил была расширена. API полностью был изменен, и стал использовать camelCase.

lvovich's People

Contributors

aaa123eee avatar akasybe avatar alxrm avatar beraliv avatar bgdshka avatar borodayev avatar dependabot[bot] avatar fend25 avatar gltronred avatar kglazkov avatar kojoru avatar nodkz avatar redvi avatar sanchexas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lvovich's Issues

Хельсинки

Добрый день! На данным момент Хельсинки склоняются так:
image

Правильные склонения:
— Говорят, что хорошо в Хельсинки.
— Ну что, поехали в Хельсинки?
— Пора валить из Хельсинки!

и в целом Хельсинки не склоняется

PR - #58

Шушары

image

Говорят, что хорошо в Шушарах.
Ну что, поехали в Шушары?
Пора валить из Шушар!

Ошибки при склонении

  1. На сегодняшний день название города Кемерово склоняется и имеет падежи (официально).
  2. Ошибки в падежах населенных пунктов, начинающихся со слова "Верхняя". cityTo возвращает "Верхняю", cityIn возвращает "Верхняя" вместо "Верхней". Как минимум, стоит проверить "Верхняя Пышма", "Верхняя Салда", "Верхняя Тура". В каких именно содержаться ошибки сейчас не назову, так как на данный момент поправлено костылями.

Module not found

Здравствуй, @kojoru !
В файле mjs/index.mjs импорты пытаются найти файлы с расширением js, которых нет. Из-за этого возникает ошибка и проект, в котором я хотел использовать Ваш пакет, не собирается
http://take.ms/5VIWe

в качестве базы список слов в дательном падеже

Можно ли использовать? фамилий на грамоты много все написаны в В.П. а мне надо перевести в поздравляем "Кого Чего"
не посдскажете как (это не ишью, просто вопрос, не ответите, то и не важно, закрою через неделю. Спасибо!

Гузерипль

screenshot 2019-01-07 at 12 07 55

Говорят, что хорошо в Гузерипле.
Ну что, поехали в Гузерипль?
Пора валить из Гузерипля.

SyntaxError

В двух браузерах вылетает синтаксическая ошибка, которая блокирует работу всего приложения.
Использовал только функцию cityFrom.

Safari версия 10.0.2 (12602.3.12.0.1) (http://take.ms/cWT3H)
safari1002

IE11 Описание ошибки - Синтаксическая ошибка. Место ошибки в коде: (https://prnt.sc/l75o22)
ie11

Теля-Авива

Павел, доброго здоровьица!)

Проблема с Тель-Авивом и, думаю, другими городами с подобным написанием.

Список городов за 3 октября из демки

Кто сможет помочь добавить правил для кривых склонений? Загруз дикий у меня сейчас, не знаю когда смогу сам пофиксить.
Правила не сложно добавлять, вот хороший пример
https://github.com/nodkz/lvovich/pull/6/files
Спасибо большое за помощь!

Правильно склоняются:

Красная Поляна в Красной Поляне to Красная Поляну из Красной Поляны
красный боец в красном боеце to красный боец из красного боеца
Ропша в Ропше to Ропшу из Ропшы
стрый в стром to стрый из строго
Актау в Актау to Актау из Актау
Барнаул в Барнауле to Барнаул из Барнаула
Бель в Беле to Бель из Беля
Боровичи в Боровичах to Боровичи из Боровичей
великие луки в великих луках to великие луки из великих луков
Владимир в Владимире to Владимир из Владимира
Екатеринбург в Екатеринбурге to Екатеринбург из Екатеринбурга
Жопа в Жопе to Жопу из Жопы
Залупа в Залупе to Залупу из Залупы
Калязин в Калязине to Калязин из Калязина
Комсомольск-на-Амуре в Комсомольске-на-Амуре to Комсомольск-на-Амуре из Комсомольска-на-Амуре
Красноармейск в Красноармейске to Красноармейск из Красноармейска
Краснодар в Краснодаре to Краснодар из Краснодара
Краснощеково в Краснощеково to Краснощеково из Краснощеково
Красный Боец в Красном Боеце to Красный Боец из Красного Боеца
Красный май в Красном мае to Красный май из Красного мая
Красный Яр в Красном Яре to Красный Яр из Красного Яра
николаевск-на-амуре в николаевске-на-амуре to николаевск-на-амуре из николаевска-на-амуре
новосиб в новосибе to новосиб из новосиба
Обухов в Обухове to Обухов из Обухова
Оскемен в Оскемене to Оскемен из Оскемена
Павел в Павле to Павел из Павла
Пески-Речицкие в Песках-Речицких to Пески-Речицкие из Песков-Речицких
питер в питере to питер из питера
Порча в Порче to Порчу из Порчи
пушкино в пушкино to пушкино из пушкино
Саша в Саше to Сашу из Сашы
Симферополь в Симферополе to Симферополь из Симферополя
Тюрли в Тюрли to Тюрли из Тюрли
Усть-Камменогорск в Усть-Камменогорске to Усть-Камменогорск из Усть-Камменогорска
уфа в уфе to уфу из уфы
Удомля в Удомле to Удомля из Удомли
тарасовка в тарасовке to тарасовку из тарасовки
Бельтны в Бельтнах to Бельтны из Бельтнов
Великие Кочаны в Великих Кочанах to Великие Кочаны из Великих Кочанов
Вышний Волочек в Вышнем Волочке to Вышний Волочек из Вышнего Волочка
Гавнарь в Гавнари to Гавнарь из Гавнари
шереметьево в шереметьево to шереметьево из шереметьево
Душанбе в Душанбе to Душанбе из Душанбе
Екат в Екате to Екат из Еката
Иванов в Иванове to Иванов из Иванова
Казахстане в Казахстане to Казахстане из Казахстане
Каменский в Каменском to Каменский из Каменского
Кемерово в Кемерово to Кемерово из Кемерово
Красный в Красном to Красный из Красного
Москва в Москве to Москву из Москвы
Коломинск в Коломинске to Коломинск из Коломинска
Ново-Ебенёва в Ново-Ебенёве to Ново-Ебенёву из Ново-Ебенёвы
пидр в пидре to пидр из пидра
Питер в Питере to Питер из Питера
ропша в ропше to ропшу из ропшы
Освенцим в Освенциме to Освенцим из Освенцима
Санкт-Петербург в Санкт-Петербурге to Санкт-Петербург из Санкт-Петербурга
Саратов в Саратове to Саратов из Саратова
тбилиси в тбилиси to тбилиси из тбилиси
Тальяти в Тальяти to Тальяти из Тальяти
Ульща в Ульще to Ульщу из Ульщи
Утрехт в Утрехте to Утрехт из Утрехта
Южно-сахаск в Южно-сахаске to Южно-сахаск из Южно-сахаска
щелково в щелково to щелково из щелково

Неправильно

Жордрехт в Жордрехт to Жордрехт из Жордрехт
Камень-на оби в Камени-на оби to Камень-на оби из Камени-на оби
Гримм в Гримм to Гримм из Гримм
норильский никель в норильском никель to норильский никель из норильского никель
чебоксары в чебоксары to чебоксары из чебоксары
Бельцы в Бельцы to Бельцы из Бельцы
Гленц в Гленц to Гленц из Гленц
Дордрехт в Дордрехт to Дордрехт из Дордрехт
верхние киги в верхних киги to верхние киги из верхних киги
Кёльн в Кёльн to Кёльн из Кёльн
минеральные воды в минеральных воды to минеральные воды из минеральных воды
Ситтард-Гелен в Ситтарде-Гелене to Ситтард-Гелен из Ситтарда-Гелена
Урочище зеленая роща в Урочище зеленой роще to Урочище зеленая рощу из Урочища зеленой рощи
Утрехт в Утрехт to Утрехт из Утрехт
Шушары в Шушары to Шушары из Шушары
Апелдорн в Апелдорн to Апелдорн из Апелдорн
дмитрове в дмитрове to дмитрове из дмитрове
Камень-на-оби в Камени-на-оби to Камень-на-оби из Камени-на-оби
Киев в Киевом to Киев из Киева

Санёк

Имя Санёк в родительском падеже (кого?/чего?) склоняется как Санёка.

Когда-то пришлось мануально модифицировать petrovich.js и вставлять туда правило для окончания имени на -ёк:

{
    "gender": "male",
    "test": [
        "ёк"
    ],
    "mods": [
        "--ька",
        "--ьку",
        "--ька",
        "--ьком",
        "--ьке"
    ]
},

После этого всё ок:

Жду кого — Санька.
Дам кому — Саньку.
Вижу кого — Санька.
Горжусь кем — Саньком.
Думаю о ком — Саньке.

Анадырь

image

Говорят, что хорошо в Анадыре.
Пора валить из Анадыря.

Также проблемы:
Львы, Охотничья (Щучья и т.д.), Площадь (Снежедь и т.д.), Крючок, Приют (Луч, Медведь), Алтынай.

A tuple type element list cannot be empty.

Problems with Angular 6 compilation. A tuple type element list cannot be be empty. inclineRules.d.ts (27,74)
export type DeclentionModsT = [string, string, string, string, string] | [];

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you can benefit from your bug fixes and new features again.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can fix this 💪.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here are some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


No npm token specified.

An npm token must be created and set in the NPM_TOKEN environment variable on your CI environment.

Please make sure to create an npm token and to set it in the NPM_TOKEN environment variable on your CI environment. The token must allow to publish to the registry https://registry.npmjs.org/.


Good luck with your project ✨

Your semantic-release bot 📦🚀

Крым

Отдаёт "в Крыме" вместо "в Крыму". Нестандартный случай, конечно.

it('correct declension for RU cities', () => {
  // test failed
  expect3fn(`Крым, Крыму, Крыма, Крым`)
})

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.