###
self reference:
adverb: наречие
adjective: прилагательное
verb: глагол
preposition: предлог

падежи:
nominative:      именительный
genitive:        родительный
dative:          дательный
accusative:      винительный
instrumental:    творительный
prepositional:   предложный


###

if "undefined" is typeof global
    window.lastName                 ||= {}
    window.lastName.plugins         ||= {}
    window.lastName.plugins.ru      ||= {}
    window.lastName.plugins.ru.words  = {}
    exports                           = window.lastName.plugins.ru.words
    util                              = window.lastName.util
else
    exports                           = module.exports
    util                              = require "../../util"


((exports, util) ->
  exports.adverbs = adverbs = ["абсолютно", "адски", "азартно", "активно", "аспидно", "баснословно", "бдительно", "безапелляционно", "безбожно", "безвозвратно", "безгранично", "безжалостно", "беззаветно", "беззастенчиво", "безмерно", "безмятежно", "безнадежно", "безоговорочно", "безраздельно", "безропотно", "безудержно", "безукоризненно", "безумно", "безупречно", "безусловно", "безустанно", "безутешно", "бескомпромиссно", "бесконечно", "беспардонно", "бесповоротно", "беспощадно", "беспредельно", "беспрекословно", "бесследно", "бессовестно", "бесстыдно", "бесчеловечно", "бешено", "бурно", "вдребезги", "вконец", "вовсю", "всемерно", "всесторонне", "всецело", "всячески", "высоко", "глубоко", "горько", "горячо", "грубо", "густо", "диаметрально", "дико", "досконально", "досыта", "дотошно", "дьявольски", "жарко", "жгуче", "железно", "жестко", "жестоко", "живо", "жизненно", "жутко", "запоем", "запредельно", "зверски", "здорово", "злостно", "идеально", "излишне", "изрядно", "изумительно", "исключительно", "исступленно", "истово", "истошно", "исчерпывающе", "кардинально", "катастрофически", "категорически", "клятвенно", "колоссально", "крайне", "крепко", "кристально", "кровно", "крупно", "круто", "люто", "максимально", "мертвецки", "мучительно", "навзрыд", "нагло", "наглухо", "наглядно", "наголову", "надежно", "надрывно", "назубок", "намертво", "наотрез", "напрочь", "нарочито", "насквозь", "настоятельно", "насущно", "начисто", "небывало", "невероятно", "невиданно", "невообразимо", "невыносимо", "невыразимо", "недопустимо", "неизмеримо", "неимоверно", "неистово", "немилосердно", "немыслимо", "необыкновенно", "необычайно", "неописуемо", "неопровержимо", "непомерно", "непоправимо", "непостижимо", "непримиримо", "непробудно", "непроходимо", "неразрывно", "несказанно", "неслыханно", "несметно", "несравненно", "нестерпимо", "неудержимо", "неузнаваемо", "неуклонно", "неукоснительно", "неустанно", "неусыпно", "неутешно", "неутомимо", "нещадно", "оглушительно", "ожесточенно", "ослепительно", "основательно", "остро", "откровенно", "открыто", "отлично", "отменно", "отчаянно", "очень", "панически", "патологически", "пламенно", "плотно", "по-настоящему", "по-собачьи", "подлинно", "подчеркнуто", "позарез", "поистине", "полностью", "поразительно", "порядком", "порядочно", "потрясающе", "предельно", "прекрасно", "преступно", "прилично", "примитивно", "принципиально", "приторно", "пронзительно", "радикально", "разительно", "редкостно", "резко", "рекордно", "свято", "серьезно", "сильно", "слепо", "смертельно", "совершенно", "совсем", "страстно", "страшно", "строго", "строго-настрого", "существенно", "твердо", "тяжело", "тяжко", "убийственно", "удивительно", "ужасающе", "ужасно", "фанатически", "фанатично", "фантастически", "феноменально", "хорошенько", "хорошо", "чертовски", "чрезвычайно", "чрезмерно", "чудовищно", "широко", "шумно", "щедро", "ярко", "яростно", "непрерывно", "нередко", "немного", "близко", "далеко", "давно", "довольно", "действительно", "недалеко", "недавно", "обычно", "однажды", "отовсюду", "особенно", "рядом", "снова", "быстро", "медленно"]

  exports.unions = unions = ["а", "а именно", "абы", "аж", "ажно", "аки", "али", "аль", "аще", "благо", "будто", "ведь", "всё", "всё-таки", "все-таки", "где", "где-то", "да", "дабы", "даже", "дотоле", "едва", "если", "ж", "же", "зане", "зато", "зачем", "и", "или", "именно", "иначе", "инда", "итак", "как", "как бы", "как то", "как-то", "каков", "какой", "когда", "коли", "коль", "который", "куда", "ли", "либо", "лишь", "ль", "настолько", "нежели", "ни", "но", "однако", "откуда", "поелику", "пока", "покамест", "покаместь", "понеже", "поскольку", "после того как", "пота", "потому", "потому как", "потому что", "почём", "почему", "поэтому", "правда", "притом", "причём", "просто", "пусть", "раз", "разве", "сиречь", "сколько", "следовательно", "словно", "столько", "так как", "также", "теперь", "то", "то есть", "тож", "только", "только что", "хоть", "хотя", "хуле", "чем", "что", "чтоб", "чтобы", "чуть", "яко", "якобы"]

  exports.prepositions = prepositions = ["в", "во", "за", "меж", "между", "на", "не в", "не за", "о", "об", "обо", "под", "подо", "включая", "невзирая на", "несмотря на", "по", "по-за", "про", "с", "сквозь", "со", "спустя", "через", "чрез", "благодаря", "вдоль по", "вопреки", "вслед", "к", "ко", "лицом к", "навстречу", "наперекор", "наперерез", "по направлению к", "по отношению к", "подобно", "применительно к", "смотря по", "согласно", "сродни", "судя по", "при", "без", "без ведома", "безо", "близ", "близко от", "в виде", "в зависимости от", "в качестве", "в лице", "в отличие от", "в отношении", "в преддверии", "в продолжение", "в результате", "в роли", "в силу", "в течение", "в целях", "ввиду", "вглубь", "вдоль", "взамен", "вместо", "вне", "внизу", "внутри", "внутрь", "возле", "вокруг", "впереди", "впредь до", "вроде", "вследствие", "для", "до", "за вычетом", "за исключением", "за счёт", "заместо", "из", "из-за", "из-под", "изнутри", "изо", "исходя из", "кроме", "кругом", "мимо", "на виду у", "на глазах у", "на предмет", "наверху", "накануне", "наподобие", "напротив", "насупротив", "насчёт", "начиная с", "не без", "не считая", "недалеко от", "независимо от", "ниже", "обок", "около", "окромя", "округ", "от", "от имени", "от лица", "относительно", "ото", "по линии", "по мере", "по поводу", "по причине", "по случаю", "поблизости от", "поверх", "под видом", "под эгидой", "подле", "позади", "помимо", "поперёк", "после", "посреди", "посредине", "посредством", "прежде", "при помощи", "против", "путём", "ради", "с ведома", "с помощью", "с точки зрения", "с целью", "сверх", "свыше", "сзади", "снизу", "среди", "средь", "супротив", "у", "в связи с", "в соответствии с", "вслед за", "лицом к лицу с", "над", "надо", "наряду с", "перед", "передо", "по сравнению с", "по-над", "пред", "предо", "рядом с", "следом за"]

  exports.prepositionSimple = ["в", "во", "за", "меж", "между", "на", "не в", "не за", "о",
  "об", "обо", "под", "подо"]


  exports.prepositionAcusative = ["в", "включая", "во", "за", "на", "не в", "не за", "невзирая на", "несмотря на", "о", "об", "обо", "по", "по-за", "под", "подо", "про", "с", "сквозь", "со", "спустя", "через", "чрез"]

  exports.prepositionDative = ["благодаря", "вдоль по", "вопреки", "вслед", "к", "ко", "лицом к", "навстречу", "наперекор", "наперерез", "по", "по направлению к", "по отношению к", "подобно", "применительно к", "смотря по", "согласно", "сродни", "судя по"]


  exports.prepositionPrepositional = ["в", "во", "на", "не в", "о", "об", "обо", "по", "при"]

  exports.prepositionGenetive = ["без", "без ведома", "безо", "близ", "близко от", "в виде", "в зависимости от", "в качестве", "в лице", "в отличие от", "в отношении", "в преддверии", "в продолжение", "в результате", "в роли", "в силу", "в течение", "в целях", "ввиду", "вглубь", "вдоль", "взамен", "вместо", "вне", "внизу", "внутри", "внутрь", "возле", "вокруг", "впереди", "впредь до", "вроде", "вследствие", "для", "до", "за вычетом", "за исключением", "за счёт", "заместо", "из", "из-за", "из-под", "изнутри", "изо", "исходя из", "кроме", "кругом", "меж", "между", "мимо", "на виду у", "на глазах у", "на предмет", "наверху", "накануне", "наподобие", "напротив", "насупротив", "насчёт", "начиная с", "не без", "не считая", "недалеко от", "независимо от", "ниже", "обок", "около", "окромя", "округ", "от", "от имени", "от лица", "относительно", "ото", "по линии", "по мере", "по поводу", "по причине", "по случаю", "поблизости от", "поверх", "под видом", "под эгидой", "подле", "позади", "помимо", "поперёк", "после", "посреди", "посредине", "посредством", "прежде", "при помощи", "против", "путём", "ради", "с", "с ведома", "с помощью", "с точки зрения", "с целью", "сверх", "свыше", "сзади", "снизу", "со", "среди", "средь", "супротив", "у"]


  exports.prepositionInstrumental = ["в связи с", "в соответствии с", "вслед за", "за", "лицом к лицу с", "меж", "между", "над", "надо", "наряду с", "не за", "перед", "передо", "по сравнению с", "по-над", "под", "подо", "пред", "предо", "рядом с", "с", "следом за", "со"]


  exports.prepositionWithSingleCase = ["без", "без ведома", "безо", "благодаря", "близ", "близко от", "в виде", "в зависимости от", "в качестве", "в лице", "в отличие от", "в отношении", "в преддверии", "в продолжение", "в результате", "в роли", "в связи с", "в силу", "в соответствии с", "в течение", "в целях", "ввиду", "вглубь", "вдоль", "вдоль по", "взамен", "включая", "вместо", "вне", "внизу", "внутри", "внутрь", "возле", "вокруг", "вопреки", "впереди", "впредь до", "вроде", "вслед", "вслед за", "вследствие", "для", "до", "за вычетом", "за исключением", "за счёт", "заместо", "из", "из-за", "из-под", "изнутри", "изо", "исходя из", "к", "ко", "кроме", "кругом", "лицом к", "лицом к лицу с", "мимо", "на виду у", "на глазах у", "на предмет", "наверху", "навстречу", "над", "надо", "накануне", "наперекор", "наперерез", "наподобие", "напротив", "наряду с", "насупротив", "насчёт", "начиная с", "не без", "не считая", "невзирая на", "недалеко от", "независимо от", "несмотря на", "ниже", "обок", "около", "окромя", "округ", "от", "от имени", "от лица", "относительно", "ото", "перед", "передо", "по линии", "по мере", "по направлению к", "по отношению к", "по поводу", "по причине", "по случаю", "по сравнению с", "по-за", "по-над", "поблизости от", "поверх", "под видом", "под эгидой", "подле", "подобно", "позади", "помимо", "поперёк", "после", "посреди", "посредине", "посредством", "пред", "предо", "прежде", "при", "при помощи", "применительно к", "про", "против", "путём", "ради", "рядом с", "с ведома", "с помощью", "с точки зрения", "с целью", "сверх", "свыше", "сзади", "сквозь", "следом за", "смотря по", "снизу", "согласно", "спустя", "среди", "средь", "сродни", "судя по", "супротив", "у", "через", "чрез"]

  exports.prepositionWith2Cases = ["в", "во", "за", "меж", "между", "на", "не в", "не за", "о", "об", "обо", "под", "подо"]

  exports.prepositionWith3Cases = ["по", "с", "со"]

  # source http://isle-poem.ru/linguistics/109-pronouns.html
  # and more
  exports.personals = personals = exports.personalPronouns = personalPronouns = ["вам", "вами", "вас", "вы", "его", "ей", "ему", "ею", "её", "её", "им", "ими", "их", "мы", "нам", "нами", "нас", "него", "ней", "нему", "нею", "неё", "ним", "ними", "них", "нём", "он", "она", "оне", "они", "оно", "тебе", "тебя", "тобой", "тобою", "ты", "я", ]

  exports.possessivePronouns = possessivePronouns = ["мой", "мои", "наш", "наши", "твой", "ваш", "твои", "ваши", "её", "его", "их", "любое", "свой", "свои", "себя"]

  exports.undefinedPronouns = undefinedPronouns = ["некто", "нечто", "несколько"]

  exports.interrogativePronouns = interrogativePronouns =   ["кто", "кого", "кому", "чему", "кем", "кой", "ком", "какой", "какая", "какое", "какие", "который", "которая", "которое", "которые", "сколько", "скольких", "скольким", "сколькими", "чей", "чья", "чье", "чьё", "чьем", "чьему", "каков", "какова", "каково", "каковое", "каковые", "каковых", "куда", "когда", "зачем", "почему"]

  exports.allPronouns = [].concat [interrogativePronouns, undefinedPronouns, possessivePronouns, personalPronouns]...

  exports.particles = particles = ["бы", "б", "бывало","не", "ни", "ли", "неужели", "разве", "вот", "вон", "именно", "только", "лишь", "почти", "даже", "же", "ведь", "уж", "все-таки", "все", "бишь", "вишь", "таки", "нехай", "дескать", "ин", "ишь", "мол", "небось", "сём"]

  # based on http://www.ranks.nl/stopwords/russian.html
  exports.stopWords = stopWords = ["алло", "более", "больше", "будем", "будет", "будете", "будешь", "буду", "будут", "будь", "бы", "бывает", "бывь", "был", "была", "были", "было", "быть", "важная", "важное", "важные", "важный", "ваш", "ваша", "ваше", "ваши", "вверх", "вдали", "вдруг", "везде", "весь", "вниз", "вон", "восемнадцатый", "восемнадцать", "восемь", "восьмой", "вот", "впрочем", "времени", "время", "все", "всегда", "всего", "всем", "всеми", "всему", "всех", "всею", "всю", "всюду", "вся", "второй", "г", "говорил", "говорим", "говорит", "говорю", "год", "года", "году", "дальше", "даром", "два", "двадцатый", "двадцать", "две", "двенадцатый", "двенадцать", "двух", "девятнадцатый", "девятнадцать", "девятый", "девять", "дел", "дела", "дело", "день", "десятый", "десять", "долго", "должно", "другая", "другие", "других", "другое", "другой", "е", "есть", "еще", "ещё", "жизнь", "занят", "занята", "занято", "заняты", "затем", "здесь", "значит", "имел", "имела", "имели", "имело", "иметь", "имя", "иногда", "каждая", "каждое", "каждые", "каждый", "каждый", "кажется", "какая", "кем", "кого", "ком", "кому", "конечно", "которая", "которого", "которое", "которой", "котором", "которому", "которую", "которые", "которым", "которых", "кто", "кто-то", "лет", "лучше", "людей", "люди", "м", "мало", "меля", "менее", "меньше", "меня", "место", "миллионов", "мира", "мне", "много", "многочисленная", "многочисленное", "многочисленные", "многочисленный", "мной", "мною", "мог", "могут", "мож", "может", "можно", "можхо", "мои", "мой", "мор", "мочь", "моя", "моё", "назад", "наиболее", "наконец", "начал", "начала", "начали", "наш", "наша", "наше", "наши", "не", "нее", "нельзя", "нем", "несколько", "нет", "нибудь", "низко", "никогда", "никуда", "ничего", "ну", "нужно", "нх", "один", "одиннадцатый", "одиннадцать", "одного", "одной", "опять", "отсюда", "первый", "пожалуйста", "позже", "пор", "пора", "потом", "почти", "процентов", "пятнадцатый", "пятнадцать", "пятый", "пять", "рано", "раньше", "рф", "сам", "сама", "сами", "самим", "самими", "самих", "само", "самого", "самой", "самом", "самому", "саму", "свое", "своего", "своей", "свои", "своих", "свой", "свою", "себе", "себя", "сегодня", "седьмой", "сейчас", "семнадцатый", "семнадцать", "семь", "сих", "скажет", "скажут", "сказал", "сказала", "сказали", "сказать", "слишком", "сначала", "собой", "собою", "спасибо", "стал", "стала", "стали", "стало", "суть", "т", "та", "так", "такая", "такие", "такое", "такой", "там", "твой", "твоя", "твоё", "те", "тем", "теми", "тех", "тогда", "того", "тоже", "том", "тому", "тот", "тою", "третий", "три", "тринадцатый", "тринадцать", "ту", "туда", "тут", "тысяч", "уж", "уже", "ук", "уметь", "хотел", "хотела", "хотели", "хотеть", "хотим", "хочешь", "хочу", "часто", "чаще", "чего", "человек", "человека", "чему", "четвертый", "четыре", "четырнадцатый", "четырнадцать", "шестнадцатый", "шестнадцать", "шестой", "шесть", "эта", "эти", "этим", "этими", "этих", "это", "этого", "этой", "этом", "этому", "этот", "эту"]


  ###
  Extract russian words.
  Update result.counter.stop_words_total (incremental) and result.counter.stop_words_persent.


  @param {String} text Source text
  @param {Object} result Resulting object, that contain fields:
                 ru.words      : Dict of russian words and count of occurrences for each
                 ru.reg_words  : Dict of russian immutable words and count of occurrences
                 ru.stop_words : Dict of russian stop words and count of occurrences
  @param {Object} opts Options, :default {}
                 opts.replaceStopWords : Replace stop words with new array, :default false
                 opts.stopWords        : Array of stop words, :default []
  ###
  exports.preFilter = (text, result, opts={}) ->
    result.ru    ||= {}
    words          = []
    reg_words      = []
    stop_words     = []

    if opts.replaceStopWords
      swArray  = opts.stopWords || []
    else
      swArray  = util.merge stopWords, opts.stopWords || []
    for s in result.misc.sentences || []
      reduce   = s.toLowerCase().split(" ").filter (wrd) -> /^[-\.\d]{0,}[а-яё]+[-\.\dа-яё]{0,}$/ig.test(wrd)
      for w in reduce
        if w in swArray
          stop_words.push w
        else if w in unions or w in personals or w in adverbs or w in prepositions
          reg_words.push w
        else
          words.push w
    result.ru.words       = util.arrayToDict words
    result.ru.reg_words   = util.arrayToDict reg_words
    result.ru.stop_words  = util.arrayToDict stop_words


    result.counters.stop_words_total ||= 0
    result.counters.stop_words_total  += stop_words.length
    result.counters.stop_words_persent = result.counters.stop_words_total / result.counters.words_total

)(exports, util)