Skip to content

Instantly share code, notes, and snippets.

@AMD-NICK
Created June 20, 2020 18:32
Show Gist options
  • Save AMD-NICK/24859d91918136ef0f304ff440adb76e to your computer and use it in GitHub Desktop.
Save AMD-NICK/24859d91918136ef0f304ff440adb76e to your computer and use it in GitHub Desktop.
Функция для Garry's Mod, склоняющая русские слова (винительный, дательный и тд..). Тамада - тамаду/тамаде/тамадой и тд. Использует правила с github.com/petrovich. В текущей реализации хромает качество исполнения, но скрипт работает. Специально для t.me/gmodev
--[[-------------------------------------------------------------------------
2019.01.16
Урезанный класс для склонения русских слов
https://github.com/petrovich/petrovich-php
В оригинале работает с именами
Полезные ссылки:
https://petroleks.ru/gramota/13.php
https://pymorphy2.readthedocs.io/en/latest/
https://github.com/petrovich/petrovich-rules/tree/master
Изучил вопрос и провозился с кодом ради того,
чтобы автоматически склонять слово "Управляющий"
при упоминания меня в чате t.me/trigon_chat :)
---------------------------------------------------------------------------]]
-- Имеют набор правил
-- gender, test, mods (первое male, female, androgynous)
-- test = {"ший","щий","жий","ний"}, (пример)
-- mods = {"--его","--ему","--его","-м","--ем"} (пример)
local subgroups = {} -- exceptions, suffixes
local function loadRules()
http.Fetch("https://raw.githubusercontent.com/petrovich/petrovich-rules/master/rules.json",function(json)
local t = util.JSONToTable(json)
subgroups = t.lastname -- lastname, firstname и middlename
end)
end
local function findRuleInSubgroup(rus_word, t, gender)
for _,rules in ipairs(t) do -- rules[test/gender/mods]
if rules.gender ~= gender then continue end
for _,test in ipairs(rules.test) do
-- print("test", test)
if rus_word:sub(-#test) == test then -- щий
return rules.mods --, rules.gender, test
end
end
end
end
MORPH_ACCUSATIVE = 1 -- винительный | Кого? Что?
MORPH_DATIVE = 2 -- дательный | Кому? Чему?
MORPH_GENITIVE = 3 -- родительный | Кого? Чего?
MORPH_INSTRUMENTAL = 4 -- творительный | Кем? Чем?
MORPH_NOMENATIVE = 5 -- именительный | Кто? Что?
-- Управляющий > Управляющему
function Petrovich(rus_word, form, gender)
-- exceptions, suffixes (первой может не быть)
for _,subgroup in pairs(subgroups) do
local mods = findRuleInSubgroup(rus_word, subgroup, gender or "male")
if mods then
local mod = mods[form]
local off,pref = mod:match("(%-*)(.*)")
local suff = rus_word:utf8sub(1,-(#off + 1)) -- Управляю
return suff .. pref
end
end
end
timer.Simple(1, loadRules)
-- timer.Simple(2,function()
-- for _,word in ipairs({"Тамада", "Прокурор", "Администратор", "Управляющий"}) do
-- print( Petrovich(word, MORPH_DATIVE) )
-- end
-- end)
@AMD-NICK
Copy link
Author

Выложил по ненадобности

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment