russian-nouns-js
    DefinitelyTyped icon, indicating that this package has TypeScript declarations provided by the separate @types/russian-nouns-js package

    1.2.5 • Public • Published

    npm version MIT License


    Logo

    RussianNounsJS

    A JavaScript library that declines nouns.

    View Demo · Run Tests · Report Bug · Wiki

    Table of Contents
    1. Installation
    2. Usage
    3. References

    Installation

    Frontend

    <script src="RussianNouns.js"></script>

    or (without AMD)

    <!-- from the same domain -->
    <script type="module" src="myscript.js"></script>
    import 'RussianNouns.js';

    or (in a Web Worker)

    importScripts('RussianNouns.js');

    Backend

    npm i --save russian-nouns-js
    
    const RussianNouns = require('russian-nouns-js');

    Android

    First of all, here is my app.

    You may use this library in your apps too. With an invisible WebView.

    private WebView jsEngine;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        this.jsEngine = findViewById(R.id.webView);
        this.jsEngine.getSettings().setJavaScriptEnabled(true);
        this.jsEngine.loadUrl("file:///android_asset/yourWrapper.html");
    }
    
    jsEngine.evaluateJavascript(jsCommand, value -> {
        // Result callback.
    });
    
    <!doctype html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <script src="file:///android_asset/RussianNouns.min.js"></script>
        <!-- your code -->
    </head>
    <body>
    
    </body>
    </html>
    

    I cannot guarantee high performance with this approach. Use it wisely. For instance, you should not instantiate RussianNouns.Engine every time you run a command.

    Usage

    The basics

    RussianNouns.CASES;
    // [
    //     "именительный",
    //     "родительный",
    //     "дательный",
    //     "винительный",
    //     "творительный",
    //     "предложный",
    //     "местный"
    // ]
    
    // Grammatical gender is a noun class system in Russian.
    RussianNouns.Gender;
    // {
    //     FEMININE: "женский",
    //     MASCULINE: "мужской",
    //     NEUTER: "средний",
    //     COMMON: "общий"
    // }
    
    const rne = new RussianNouns.Engine();
    
    rne.decline({text: 'имя', gender: 'средний'}, 'родительный');
    // [ "имени" ]
    
    rne.decline({text: 'имя', gender: 'средний'}, 'творительный');
    // [ "именем" ]
    
    const Gender = RussianNouns.Gender;
    const Case = RussianNouns.Case;
    
    let coat = RussianNouns.createLemma({
        text: 'пальто',
        gender: Gender.NEUTER,
        indeclinable: true
    });
    
    rne.decline(coat, Case.GENITIVE);
    // [ "пальто" ]
    
    RussianNouns.getDeclension(coat);
    // -1
    
    let mountain = RussianNouns.createLemma({
        text: 'гора',
        gender: Gender.FEMININE
    });
    
    RussianNouns.CASES.map(c => {
        return rne.decline(mountain, c);
    });
    // [
    //     ["гора"]
    //     ["горы"]
    //     ["горе"]
    //     ["гору"]
    //     ["горой", "горою"]
    //     ["горе"],
    //     ["горе"]
    // ]
    
    rne.pluralize(mountain);
    // [ "горы" ]
    
    RussianNouns.CASES.map(c => {
        return rne.decline(mountain, c, 'горы');
    });
    
    // [ 
    //     [ 'горы' ]
    //     [ 'гор' ]
    //     [ 'горам' ]
    //     [ 'горы' ]
    //     [ 'горами' ]
    //     [ 'горах' ]
    //     [ 'горах' ]
    // ]
    
    RussianNouns.getDeclension(mountain);
    // 2
    
    RussianNouns.getSchoolDeclension(mountain);
    // 1
    
    let way = RussianNouns.createLemma({
        text: 'путь',
        gender: Gender.MASCULINE
    });
    
    RussianNouns.getDeclension(way);
    // 0
    
    let scissors = RussianNouns.createLemma({
        text: 'ножницы',
        pluraleTantum: true
    });
    
    rne.pluralize(scissors);
    // [ 'ножницы' ]
    
    RussianNouns.CASES.map(c => {
        return rne.decline(scissors, c);
    });
    // [
    //     [ 'ножницы' ]
    //     [ 'ножниц' ]
    //     [ 'ножницам' ]
    //     [ 'ножницы' ]
    //     [ 'ножницами' ]
    //     [ 'ножницах' ]
    //     [ 'ножницах' ] 
    // ]

    Stress dictionary tuning

    let кринж = RussianNouns.createLemma({
        text: 'кринж',
        gender: Gender.MASCULINE
    });
    
    const rne = new RussianNouns.Engine();
    
    rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжем" ]
    
    // Change of stresses.
    // Before the hyphen, there are singular settings.
    // After the hyphen are the plural settings.
    // The letter number in the settings is the case number in CASES.
    // S — Stress is on the stem only.
    // s — Stress is more often on the stem.
    // b — Stress can be both on the stem and the ending equally.
    // e — Stress is more often on the ending.
    // E — Stress is on the ending only.
    rne.sd.put(кринж, 'SEESESE-EEEEEE');
    
    rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжом" ]
    
    rne.sd.put(кринж, 'SEESbSE-EEEEEE');
    rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжем", "кринжом" ]
    
    rne.sd.put(кринж, 'SEESsSE-EEEEEE');
    rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжем", "кринжом" ]
    
    rne.sd.put(кринж, 'SEESeSE-EEEEEE');
    rne.decline(кринж, Case.INSTRUMENTAL);  // [ "кринжом", "кринжем" ]

    A complex example

    const rne = new RussianNouns.Engine();
    
    const  = (word, caseNumber) => {
        const c = RussianNouns.CASES[caseNumber - 1];
        return rne.decline(word, c)[0];
    };
    
    const  = (word, caseNumber) => {
        const c = RussianNouns.CASES[caseNumber - 1];
        const result = rne.decline(word, c);
        return result[result.length - 1];
    };
    
    const ⰃⰃ = (word, caseNumber) => {
        const c = RussianNouns.CASES[caseNumber - 1];
        const pluralForm = rne.pluralize(word)[0];
        return rne.decline(word, c, pluralForm)[0];
    };
    
    const L = RussianNouns.createLemma;
    const Gender = RussianNouns.Gender;
    const cap = (str) => str[0].toUpperCase() + str.substring(1);
    
    // -----------------------------------------------
    
    // Александр Сергеевич Пушкин
    // Зимний вечер (фрагмент)
    
    const буря = L({text: 'буря', gender: Gender.FEMININE});
    const мгла = L({text: 'мгла', gender: Gender.FEMININE});
    const небо = L({text: 'небо', gender: Gender.NEUTER});
    const вихрь = L({text: 'вихрь', gender: Gender.MASCULINE});
    
    const зверь = L({text: 'зверь', gender: Gender.MASCULINE, animate: true});
    const дитя = L({text: 'дитя', gender: Gender.NEUTER, animate: true});
    
    const кровля = L({text: 'кровля', gender: Gender.FEMININE});
    const солома = L({text: 'солома', gender: Gender.FEMININE});
    
    const путник = L({text: 'путник', gender: Gender.MASCULINE, animate: true});
    const окошко = L({text: 'окошко', gender: Gender.NEUTER});
    
    console.log(`${cap((буря, 1))} ${(мгла, 5)} ${(небо, 4)} кроет,
    ${cap(ⰃⰃ(вихрь, 4))} снежные крутя;
    То, как ${(зверь, 1)}, она завоет,
    То заплачет, как ${(дитя, 1)},
    То по ${(кровля, 3)} обветшалой
    Вдруг ${(солома, 5)} зашумит,
    То, как ${(путник, 1)} запоздалый,
    К нам в ${(окошко, 4)} застучит.`);
    
    // Буря мглою небо кроет,
    // Вихри снежные крутя;
    // То, как зверь, она завоет,
    // То заплачет, как дитя,
    // То по кровле обветшалой
    // Вдруг соломой зашумит,
    // То, как путник запоздалый,
    // К нам в окошко застучит.
    
    // -----------------------------------------------
    
    // Николай Степанович Гумилев
    // Рассказ девушки (фрагмент)
    
    const ворота = L({text: 'ворота', pluraleTantum: true});
    const тень = L({text: 'тень', gender: Gender.FEMININE});
    const ель = L({text: 'ель', gender: Gender.FEMININE});
    const снег = L({text: 'снег', gender: Gender.MASCULINE});
    const высота = L({text: 'высота', gender: Gender.FEMININE});
    
    console.log(`* * *
    Я отдыхала у ${ⰃⰃ(ворота, 2)}
    Под ${(тень, 5)} милой, старой ${(ель, 2)},
    А надо мною пламенели
    ${cap(ⰃⰃ(снег, 1))} неведомых ${ⰃⰃ(высота, 2)}.`);
    
    // * * *
    // Я отдыхала у ворот
    // Под тенью милой, старой ели,
    // А надо мною пламенели
    // Снега неведомых высот.

    References

    • Современный русский язык. Морфология - Камынина А.А., Уч. пос. 1999 - 240 с.
    • Russian grammar (English Wikipedia)
    • OpenCorpora (Russian text corpus)
    • К семантике русского локатива ("второго предложного" падежа) - Плунгян В. А., Семиотика и информатика. - Вып. 37. - М., 2002. - С. 229-254

    Please take the survey to make this library better.

    Install

    npm i russian-nouns-js

    DownloadsWeekly Downloads

    120

    Version

    1.2.5

    License

    MIT

    Unpacked Size

    180 kB

    Total Files

    7

    Last publish

    Collaborators

    • georgy7